Move your whole working environment to a new operating system.
Windows to Linux, Linux to Windows, one distribution to another, one Windows version to the next. Your files, your settings and the list of your applications go into one portable package on an external drive — and come back out on the other side.
No cloud. No account. No network. No AI. A binary of a few megabytes.
Three steps, one drive
DHS builds a migration package on an SSD or a USB stick. Install the new system, plug the drive back in, and take everything with you.
Pack, on the old system
DHS scans your home, tells you how much it will take before writing a byte, then writes the package: encrypted, split into 3.5 GiB volumes so it fits any drive, FAT32 included.
Carry it
The package is just files on your drive. It never touches a server. A lost drive is not a leak: everything in it is encrypted with your passphrase, and your secrets are not even in it unless you say so.
Restore, on the new one
DHS verifies every checksum, shows you the plan, and only then writes — beside existing files, never over them. Anything it cannot place goes under ~/DHS-restored/.
The estimate comes first
One command tells you what would be saved, how much space it takes at each compression level, and whether it fits on the drive you plugged in. Nothing is written until you say so.
System Arch Linux (amd64) Roots /home/you/Documents /home/you/Pictures … To include 44.0 GiB in 68 000 files (scanned in ~1 s) Excluded 6.2 GiB --all brings them back target 5.9 GiB · build artifacts node_modules 237 MiB · dependencies, restored by npm install Secrets 1.2 MiB in 9 files excluded by default; --secrets includes them Composition binary 20.0 GiB 46% incompressible 11.8 GiB 27% stored, not compressed text 2.4 GiB 6% Level 2 · Balanced Estimate 27.4 GiB – 34.4 GiB ~3 min on 8 cores Volumes 10 × 3.5 GiB Destination /run/media/you/SSD 64.0 GiB free of 119 GiB exFAT ✓ Fits, with 29.6 GiB to spare.
Why DHS
It handles someone's entire digital life — documents, photos, keys. So it is built around a few rules that are not up for negotiation.
Bit for bit, or nothing
Every file is hashed with SHA-256 when packed and checked again before it is committed at restore time. A file that does not verify is not written. No lossy trick, however much it would save.
Encrypted by default
The whole package is encrypted with a passphrase (age, scrypt). Secrets — SSH and GPG keys, browser passwords, tokens — stay out unless you opt in, and then get a passphrase of their own.
Never overwrites
Restoring keeps what is already there; the restored copy lands beside it with a (DHS) suffix. Every destructive choice is explicit, and --dry-run shows the plan without touching anything.
Honest about interruptions
A yanked cable or a dead battery leaves a package that says it is incomplete — a journal records how far it got. It never leaves a half-written package that looks valid.
Nothing leaves your drive
No cloud, no account, no telemetry, no updater, no network code at all. The application database is compiled into the binary, so DHS works on a machine that has never been online.
Small, on purpose
One static binary of about 4 MiB, no runtime to install on the freshly installed destination, zero background processes. Three compression levels, from plain ZIP to LZMA2, all yours to choose.
Budgets, not suggestions
Bloat is a failure mode we plan against. These thresholds live in the project rules, and the current build has to stay under them.
| What | Budget | Today |
|---|---|---|
| CLI binary, stripped | ≤ 15 MiB | 4.2 MiB Linux · 4.5 MiB Windows |
| Background processes, services, daemons | zero | zero |
| Telemetry, "anonymous statistics", auto-updater | zero | zero |
| Network calls at runtime | zero | zero |
| Runtime to install on the destination | none | none |
| Cold start | < 100 ms | ~10 ms |
No AI, by design
DHS is a deterministic system tool: it reads, packs, verifies, restores. You can predict exactly what it does. Applications are matched across platforms through a human-curated database with exact identifiers — not through guessing. If an app is not in the database, DHS says so and lists it in the report. It does not invent an equivalent.
Nothing runs blind
At restore time, DHS shows exactly what it would install, from which source and with which commands. You approve the plan once; then it runs. Nobody should execute root commands generated from a file on a stick without reading them first — so DHS does not ask you to.
Get it
0.2.0 is the first regular release. Files, application configuration and the install plan, on Windows and Linux, with a graphical interface on both. Detection on Windows has run only under its unit tests so far; if it misses something you have installed, say so on GitHub.
Windows
> irm https://dhs-suite.vercel.app/install.ps1 | iex
That installs the command-line tool. For the graphical interface take the Windows archive below: it holds dhs.exe and dhs-gui.exe, two files that run from any folder with nothing installed.
The installer picks the build for your processor, checks it against the SHA-256 sums published with the release, unpacks it under your own profile and puts it on your PATH. No administrator rights, nothing left running. To pin a version, create a script block instead: & ([scriptblock]::Create((irm https://dhs-suite.vercel.app/install.ps1))) -Version 0.2.0
Direct downloads
Version 0.2.0, straight from the GitHub release. Arch users: dhs-cli and dhs-gui from the AUR recipe in packaging/aur/.
- Windows, 64-bit —
dhs.exeanddhs-gui.exedhs_0.2.0_windows_amd64.zip3.3 MiB - Windows on ARMdhs_0.2.0_windows_arm64.zip3.0 MiB
- Debian, Ubuntu, Mint —
.debdhs_0.2.0_amd64.deb1.7 MiB - Debian, Ubuntu on ARM —
.debdhs_0.2.0_arm64.deb1.5 MiB - Fedora, RHEL, openSUSE —
.rpmdhs-0.2.0-1.x86_64.rpm1.9 MiB - Fedora, openSUSE on ARM —
.rpmdhs-0.2.0-1.aarch64.rpm1.7 MiB - Any Linux, installing nothing — AppImageDHS-0.2.0-x86_64.AppImage2.9 MiB
- Linux, plain archivedhs_0.2.0_linux_amd64.tar.gz2.2 MiB
- Linux on ARM, plain archivedhs_0.2.0_linux_arm64.tar.gz2.0 MiB
- Sourcedhs-0.2.0-source.tar.gz555 KiB
- Checksums for everything aboveSHA256SUMS931 B
Check what you downloaded against the SHA256SUMS published beside it, with sha256sum -c SHA256SUMS --ignore-missing. Or build from source, in one command and with no extra toolchain, even for Windows.
$ git clone https://github.com/Necta14/dhs && cd dhs $ go build -ldflags="-s -w" -o dhs ./cmd/dhs # Linux $ GOOS=windows go build -ldflags="-s -w" ./cmd/dhs # Windows, from Linux $ ./dhs scan --dest /run/media/you/SSD $ ./dhs backup --dest /run/media/you/SSD --name laptop $ ./dhs verify /run/media/you/SSD/laptop.dhs $ ./dhs restore /run/media/you/SSD/laptop.dhs --dry-run
Every command takes --json for scripts and front ends; DHS_LANG=ro switches the messages to Romanian. A Linux GUI prototype (GTK4 + libadwaita) lives in gui/linux/ and drives the same binary — the logic is in one place, the interface is a shell over it.
Documentation
Everything is in the repository, in English, with Romanian translations under docs/ro/.
README.mdWhat it does, how to build it, the current statusdocs/ARCHITECTURE.mdThe package format, the module layout, the CLI surfacedocs/COMPRESSION.mdThe three levels, the estimate, the research on extreme compressiondocs/TESTING.mdHow the test session works, across five distributionsdocs/LICENSE-CHOICE.mdWhy Apache-2.0, and why no ethical-use clauseVALUES.mdWhat the project believes, said publicly