- Rust 84.4%
- Python 8.3%
- PowerShell 7.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .cargo | ||
| .claude | ||
| .forgejo/workflows | ||
| assets | ||
| crates/outbird | ||
| docs | ||
| marketing | ||
| public | ||
| release | ||
| resources | ||
| scripts | ||
| src | ||
| vendor/outlook-pst | ||
| .gitattributes | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| HANDOFF-gui-redesign-2.0.md | ||
| README.md | ||
| rustfmt.toml | ||
| THIRD-PARTY-NOTICES.md | ||
hypersuite
One Windows exe for three tools — with a GUI, and their full command lines:
| Tool | What it does | |
|---|---|---|
hypersuite index … |
hyperindex | Indexes drives (metadata + BLAKE3 checksum) into SQLite, finds duplicate files and folders, enriches photos (capture date, offline GPS place), plans/applies a photo library, pre-filters music for beets. |
hypersuite file … |
hyperfiler | Consolidates everything indexed into one canonical, self-describing tree: plan → review → apply → verify → quarantine → purge, plus semantic find. Photo/Music/Documents/Video/Other. |
hypersuite mail … |
Outbird | Converts Outlook PST files into Thunderbird mbox trees, or installs them straight into a Thunderbird profile (with backup). |
Double-click hypersuite.exe for the window. Everything it needs ships inside
the one file — the multilingual document model, PDFium, Tesseract OCR with
seven languages, and fpcalc — and is unpacked once per version to
%LOCALAPPDATA%\hypersuite\runtime\ (checked file by file against SHA-256).
No installer, no runtime DLLs, no download, no Python, no WSL.
The window
Double-clicking opens the launcher: three cards, each starting one app in its own window and process — Scan and Sort can run side by side.
| App | Tool | Asks for |
|---|---|---|
| Scan | hyperindex | which folders (default: your Documents, Pictures, Music, Videos, Desktop; Downloads off) — the database is automatic |
| Sort | hyperfiler | nothing required: target <X>:\hypersuite on the fixed drive with the most free space, all five classes; Plan → Review → Apply → Verify |
| Outbird | Outbird | the PST file (suggested from Outlook's folders and the index); destination: Thunderbird's default profile |
Everything else — whole drives, exclusions, duplicate reports, photo
enrichment and library, beets pre-filter, mirror mode, OCR, AI sorting, PST
hand-over, quarantine/purge/find, mbox export, dry runs — is under
Advanced in each app. Defaults are marked ● Auto and worked out again
at every start; change one and it turns Manual and is kept (click the chip
to go back to Auto). Settings live in %LOCALAPPDATA%\hypersuite\settings.json.
- Database:
%USERPROFILE%\HyperindexDB\<HOST>-<user>-db\index.db, shared by Scan and Sort. Before a scan the folders are counted (no hashing); if the database's drive can't hold files × 736 bytes × 1.5 + 1 GB, a dialog proposes<X>:\HyperindexDB\<HOST>-<user>-db\on the drive with the most free space. "Open existing…" picks up an older database (its file count, drives and last scan show under the path) and takes over the folders and options its last scan ran with; "Recently used…" lists the last five. If a scan in it never finished, Scan offers Continue (hyperindex scan --resume). - Language: German or English (
DE | ENin the launcher and every app), starting from the Windows display language. Command-line output stays English. - The launcher footer has the bundled Tools and About.
Screenshots: docs/screenshots/ (German and English). hypersuite gui --app scan (or sort, mail) opens one app directly; 1.x's --tab names still work.
Every button runs hypersuite <tool> … as a child process and streams its
output; progress bars for scan, apply and quarantine are read from the index
database while the child writes it.
The GUI contains no pipeline logic of its own.
Command line
hypersuite index scan E:\ --db D:\index.db
hypersuite file plan D:\Library --db D:\index.db
hypersuite mail export C:\mail\archive.pst --root-name ""
hypersuite tools --verify
hypersuite <tool> --help shows each tool's full help. The exe is a windowed
program, so cmd does not wait for it — use start /wait hypersuite … in
cmd and batch files; in PowerShell hypersuite … | Out-Host.
Building
Prerequisites: Rust (stable, MSVC), Visual Studio Build Tools, Windows SDK
(rc.exe, signtool.exe), and the sibling repositories ../hyperindex and
../hyperfiler (path dependencies).
powershell -ExecutionPolicy Bypass -File scripts\stage-assets.ps1 # once: ~260 MB to E:\hypersuite-assets\payload
powershell -ExecutionPolicy Bypass -File scripts\build-release.ps1 # build (paths remapped), leak check, sign, release\ + SHA256SUMS
python scripts\gen-notices.py # after dependency changes
build-release.ps1 rewrites this machine's paths in the binary
(--remap-path-prefix, /PDBALTPATH) and refuses to finish if the exe still
contains the user profile path, the workspace path or internal names. It also
builds release\third-party-sources.zip (scripts\third-party-sources.ps1:
the GPL/LGPL sources of the bundled tools, pinned by SHA-256).
A plain cargo build --release still works for local testing.
HYPERSUITE_ASSETS_DIR points the build at another staging directory;
HYPERSUITE_EMBED_ASSETS=0/1 forces embedding off/on (default: release only).
Debug builds come without assets and are fast to link.
Tests: cargo test --workspace. The Outbird golden test against a real PST and
its independent readpst reference conversion is opt-in:
set OUTBIRD_GOLDEN_PST=...\outbird\Tamimed.pst
set OUTBIRD_GOLDEN_REF=...\outbird\Tamimed-thunderbird
cargo test -p outbird --release --test golden_tamimed -- --ignored --nocapture
Signature
Releases are signed with a self-signed certificate, CN=hypersuite (github.com/namshubs/hypersuite)
(release/hypersuite-codesign.cer, SHA-256 in SHA256SUMS.txt). Until a
machine trusts it, Windows reports the signature as untrusted and SmartScreen
warns once ("More info" → "Run anyway"). To trust it on a machine (admin):
certutil -addstore Root hypersuite-codesign.cer
certutil -addstore TrustedPublisher hypersuite-codesign.cer
Layout
src/main.rs— dispatch: no arguments → GUI,index/file/mail/tools→ command linesrc/console.rs— borrowing the parent console for the command-line half of a GUI exesrc/payload.rs— the embedded asset zip: unpack, verify, environment variablessrc/gui/— launcher and the three apps (launcher.rs,scan.rs,sort.rs,mail.rs), shared look (theme.rs), settings, Windows facts (sysinfo.rs), texts DE/EN (i18n.rs); design:docs/redesign-2.0-mockup.htmlcrates/outbird/— Outbird, ported from Python to Rust on Microsoft'soutlook-pstvendor/outlook-pst/— that crate, with four fixes found on real data (HYPERSUITE-PATCHES.md)build.rs,resources/— icon, version info, manifest, payload resource, fonts (Figtree, Unbounded; OFL)scripts/— asset staging, signing, notices, window screenshots (screenshot.ps1)
Public releases (GitHub)
Source and history stay here. The public repository github.com/namshubs/hypersuite
is a separate repo that only ever receives the whitelisted files in public/
(README, LICENSE, CHANGELOG, SECURITY, docs/, .github/) and the release
assets — never source, never this history, no mirror, no git remote.
powershell -ExecutionPolicy Bypass -File scripts\publish-github.ps1 -DryRun # whitelist, leak check, notes preview
powershell -ExecutionPolicy Bypass -File scripts\publish-github.ps1 # asks for the GitHub token (hidden), never stores it
The release notes are the version's section in public/CHANGELOG.md.
.forgejo/workflows/publish-github.yml does the same from a Forgejo runner
(manual trigger, secret GH_RELEASE_TOKEN), taking the assets from the
Forgejo release. The public docs must not mention this server, its domain or
internal paths; both the script and the workflow check for that.
License
Sustainable Use License 1.0 (n8n's text, unchanged) since 2.1.4; 2.1.3 was
Apache License 2.0. public/LICENSE and public/NOTICE (copyright, not open
source, use at your own risk) are both shown in the program's About; third
parties in THIRD-PARTY-NOTICES.md. The source stays private; contributors
get access by invitation (see "About the source code" in public/README.md).
Release notes on both servers end with scripts/release-footer.md.