Cross-platform dotfiles manager. Rust binary. Config-driven.
A vault for your dotfiles — clone, deploy, and keep in sync across Linux, macOS, and Windows. Part of the kryptic.sh suite.
- Single binary manages dotfiles end-to-end on Linux / macOS / Windows.
- Replaces
stowwith a copy-based deploy: files are copied from the repo to their destinations (mtime and, on Unix, file mode preserved). krypt never creates symlinks. A manifest records a sha256 of every destination so drift is detectable. - Replaces ad-hoc bash orchestrators (
.update/.setup) via a declarative.krypt.tomlschema and a step runner with predicate gating. - Interactive first-run wizard via
[prompts.*]blocks. - Cross-distro package install abstraction (pacman, apt, dnf, brew, scoop, winget).
- Post-update and post-setup lifecycle hooks with
command_exists:/platform:/env:/file_exists:predicates. - Generic
krypt <group> <name>dispatcher — any[[command]]entry in.krypt.tomlis reachable as a subcommand without binary changes.
Pre-1.0 and moving. See CHANGELOG.md for what shipped in each release, and the releases page for the current version. Roadmap and open work live in issues.
paru -S krypt-bin # Arch (AUR)
brew trust --tap kryptic-sh/tap # macOS: Homebrew skips untrusted taps
brew install kryptic-sh/tap/kryptWindows — the release workflow renders a Scoop manifest into kryptic-sh/scoop-bucket:
scoop bucket add kryptic-sh https://github.com/kryptic-sh/scoop-bucket
scoop install kryptEvery tagged release also attaches prebuilt archives (plus .sha256 sidecars)
for six targets: x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl,
aarch64-unknown-linux-gnu, x86_64-apple-darwin, aarch64-apple-darwin,
x86_64-pc-windows-msvc.
Every channel installs a binary named krypt on your $PATH.
crates.io trails this repo.
cargo install krypt-cliworks but installs an older build. Publishingkrypt-coreandkrypt-cliis currently paused: theirgixdependency points at themxaddict/gitoxidefork (forstash+mergeplumbing), whichcargo publishrejects. Thepublish-cratesjob in.github/workflows/ci.ymlhas those two lines commented out and will be restored once the upstream gitoxide change lands. For the current version, use AUR / Homebrew / Scoop / a release archive.
The
kryptcrate name on crates.io is held by an unrelated, unmaintained project (Stupremee/krypt) — we publish the bin askrypt-clifor now. If/when the name transfers (see #37),cargo install kryptwill become the canonical install command.
Building from source needs the toolchain pinned in
rust-toolchain.toml; the workspace MSRV is Rust
1.95 (rust-version in Cargo.toml).
First run, against a freshly cloned repo:
krypt init https://github.com/you/dotfiles # clone to ${XDG_CONFIG}/krypt/repo
krypt deps # install [[deps]] packages
krypt setup # interactive [prompts.*] wizard
krypt link # deploy: copy files to destinationsThen, day to day:
krypt update # pull the repo, re-run link, run post-update hooks
krypt doctor # diagnosticNotes on that sequence:
- Every command finds the repo the same way:
--config(or--repo-path) when given, else.krypt.tomlin the current directory, else the repokrypt initrecorded in the tool config. So afterinitthey run from anywhere;cdinto another checkout to work on that one instead.krypt updatealways uses the recorded repo. krypt setuponly runs the wizard. It reads[prompts.*]sections, asks the questions, and writes the answers to the[[template]]destinations that name those sections. It does not install packages and does not deploy — runkrypt depsandkrypt linkyourself.krypt initclones over HTTPS only; SSH remotes are not supported (krypt init --help).
Useful subcommands:
| Command | Effect |
|---|---|
krypt validate |
parse .krypt.toml, report schema errors |
krypt paths |
print every resolved ${VAR} for this host |
krypt diff |
compare deployed files to the manifest: clean / drifted / missing |
krypt adopt |
copy edits made to deployed files back into the repo |
krypt adopt <path>... |
adopt those files: edits if deployed, else import as new |
krypt unlink / relink |
delete manifest-tracked destinations / unlink then link again |
krypt notify <title> <body> |
platform-correct desktop notification |
krypt menu |
list [[command]] group = "menu" entries |
krypt menu <name> |
run a menu's steps |
krypt <group> <name> |
generic dispatcher for any group |
krypt battery {report,log,clear} |
built-in battery state utility |
krypt adopt with no paths walks the manifest and copies every deployed file
you edited in place back to its repo source, except [[template]] destinations:
those hold per-machine values (your git identity, a monitor layout) that do not
belong in the template, so one is adopted only when you name it. Given paths, it
does that for the deployed ones and imports the others as new repo files,
printing the [[link]] block to paste. adopt-edits is an alias for it.
If you have an existing stow-based dotfiles repo with .update / .setup bash
scripts and you want to convert it: see
docs/migrating-from-bash.md. Step-by-step
walkthrough with the conceptual mapping (stow → [[link]], .update →
krypt update, rofi launcher scripts → [[command]] entries, etc.).
Worked example: mxaddict/dotfiles —
Arch + Hyprland, driven end-to-end from one .krypt.toml.
Four-crate Cargo workspace:
| Crate | Role |
|---|---|
krypt-cli |
Binary (krypt) — clap dispatch, thin |
krypt-core |
Engine: config, paths, include, copy, manifest, deploy, tool_config, init, update, adopt, doctor, setup, runner, predicate, notify, dispatch, battery |
krypt-pkg |
Package manager abstraction (pacman, apt, dnf, brew, scoop, winget, plus cargo install for cargo: entries) |
krypt-platform |
Placeholder for cfg-gated OS abstractions — currently exposes only a version constant |
See CONTRIBUTING.md or open an issue / PR.
MIT. See LICENSE.