krypt
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.
What it does
- 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 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.
Status
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.
Install
Windows — the release workflow renders a Scoop manifest into kryptic-sh/scoop-bucket:
Every 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).
Usage
First run, against a freshly cloned repo:
Then, day to day:
Notes on that sequence:
krypt deps,krypt setup, andkrypt linkread.krypt.tomlfrom the current directory by default — hence thecd. Pass--config <repo>/.krypt.tomlto run them from elsewhere. (krypt setupalso falls back to the repo path recorded in the tool config.)krypt updatefinds the repo through the tool config written byinit, so it needs no flag.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 <path> |
import an existing file into the repo, print a [[link]] block |
krypt adopt-edits |
copy hand-edits on drifted destinations back into the repo |
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 |
adopt and adopt-edits are different tools: adopt <path> brings a file that
krypt does not manage yet into the repo, while adopt-edits walks the manifest
and pulls edits you made in place on already-deployed files back to their repo
sources.
Migrating from stow + bash
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.
Architecture
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 |
Contributing
See CONTRIBUTING.md or open an issue / PR.
License
MIT. See LICENSE.