DHS · Direct Handoff Suite

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.

The DHS icon: a suitcase with an arrow cut through it
0.2.0 is out. The file core is verified bit for bit on five Linux distributions and on Windows 11, and applications now travel too: what is installed, its configuration, and an install plan for the other side, matched against a database of 759 applications. Early days still: keep the original drive intact until you have restored a package yourself and looked at the result.

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.

1

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.

2

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.

3

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.

  dhs scan --dest /run/media/you/SSD
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.

WhatBudgetToday
CLI binary, stripped≤ 15 MiB4.2 MiB Linux · 4.5 MiB Windows
Background processes, services, daemonszerozero
Telemetry, "anonymous statistics", auto-updaterzerozero
Network calls at runtimezerozero
Runtime to install on the destinationnonenone
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

  PowerShell
> 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/.

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.

  build
$ 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.