Personal dotfiles for an Arch + Hyprland workstation. Managed by
krypt — every install / update /
template-seed / hook is declared in .krypt.toml instead of a tangle of bash.
Sleek modern Wayland setup. Hyprland tiling, Fish shell, Neovim + LazyVim,
TokyoNight throughout. Config is data: .krypt.toml and its included files
describe what lives where, what packages to install, and what commands the user
can invoke. krypt does the work; bash scripts only exist when the logic is
genuinely shell-shaped.
- Distro: Arch Linux (or derivative). Cross-distro deps are stubbed — expand
[[deps]] apt = […]/dnf = […]in.krypt/deps.tomlto extend. - Display server: Wayland (Hyprland). X11 unsupported.
- CPU/GPU: x86_64, any modern Wayland-capable GPU (tested on AMD).
- CLI bootstrap:
git,bash,curl. Everything elsekrypt setupinstalls.
- Font: Hack Nerd Font (
ttf-hack-nerd). - Cursor:
Breeze_Light(breeze). - GTK theme:
adw-gtk-theme. - Icon theme: system default.
- WM: Hyprland — Wayland tiling compositor.
- Shell: Fish.
- Terminal: Alacritty.
- Editor: Neovim + LazyVim.
- Bar: Waybar.
- Launcher: pikr — vim-like fuzzy picker.
- Notifications: swaync.
- File Manager: Nautilus.
- Browser: Vieb.
- Screenshot: Grimblast.
- System monitor: btop.
- Prompt: Starship.
| Platform | Command |
|---|---|
| Arch | paru -S krypt-bin |
| macOS | brew install kryptic-sh/tap/krypt |
| Any | cargo install krypt-cli |
| Manual | grab a binary from GH Releases |
Verify: krypt --version should report 0.2.0 or newer.
krypt init https://github.com/mxaddict/dotfiles
krypt setup # interactive: seeds templates, prompts for identity, installs deps
krypt link # symlink the tree into $HOMEkrypt setup is the wizard pass — runs the [prompts.*] blocks defined in
.krypt.toml (git identity, hypr defaults, keyboard layout), seeds templates,
then triggers krypt deps to install packages.
krypt update # pull repo, install missing deps, run post-update hooks
krypt update --dry-run # show plan, change nothing
krypt update --skip-hooks # skip nvim/tmux/dconf/bat/etc. plugin syncsHooks declared in .krypt.toml ([[hook]] when = "post-update") cover:
- mkdir essential
$HOMEdirs +~/.local/log - fisher / nvim Lazy / tpm plugin syncs
- bat cache rebuild, tldr cache refresh
- dconf load from
dconf/user.ini hyprctl reload(gated on hyprland running)
krypt init accepts any HTTPS / SSH git URL. Point it at your fork.
If you used .files before krypt landed (.update / .setup bash scripts):
paru -S krypt-bin(or your platform's install)git -C ~/.files pullkrypt update— replaces the old.updatechain; reloads hyprland if active- Existing
~/.config/hypr/{apps,input,monitors,hyprpaper}.confetc. stay untouched (gitignored, krypt does not overwrite seeded files)
Bash scripts in .local/bin/.* (e.g. .menu-power, .kanata, t) stay on
disk — krypt invokes them via [[command]] entries. They get full
shellcheck + ft=bash treatment instead of being inlined into TOML strings.
The Hyprland keybinds in hyprland.lua now invoke krypt menu <name> instead
of the scripts directly. Same for waybar on-click handlers.
krypt setup seeds these from *.template.* files on first run. Re-running is
safe — krypt only seeds files that don't exist yet.
| Template (repo) | Destination | Purpose |
|---|---|---|
.gitconfig.local.template | ~/.gitconfig.local | Name, email, GPG |
.config/hypr/apps.template.lua | ~/.config/hypr/apps.lua | Terminal, browser, file manager |
.config/hypr/input.template.lua | ~/.config/hypr/input.lua | Keyboard layout |
.config/hypr/monitors.template.lua | ~/.config/hypr/monitors.lua | Monitor positions |
.config/hypr/hyprpaper.template.conf | ~/.config/hypr/hyprpaper.conf | Wallpaper |
~/.gitconfig.local— identity + signing.~/.config/hypr/monitors.lua—hyprctl monitorsto discover names.~/.config/hypr/apps.lua— terminal / browser / file manager defaults.~/.config/hypr/input.lua— changekb_layoutif not US.
Optional:
~/.config/hypr/workspaces.lua— pin workspaces to monitors.~/.config/hypr/hyprpaper.conf— wallpaper path..codex/config.toml,.config/opencode/opencode.json— Ollama host.
$mod = Super (Windows key). Every menu binding invokes krypt menu <name>
or another krypt subcommand — see .krypt/commands.toml for the underlying
step.
| Bind | krypt invocation | Action |
|---|---|---|
$mod + return / c | — | Alacritty |
$mod + b | — | Browser |
$mod + e | — | Nautilus |
$mod + space | krypt menu apps | App launcher |
$mod + r | krypt menu calc | qalculate picker |
$mod + . | krypt menu emoji | Emoji picker |
$mod + w | krypt menu wifi | WiFi picker |
$mod + a | krypt menu audio | wiremix |
$mod + u | krypt menu bluetooth | bluetui |
$mod + t | krypt menu time | Timezone picker |
$mod + escape | krypt menu top | btop |
$mod + shift + m | krypt menu power | Power picker |
$mod + n / +S+n | — | swaync toggle / dismiss |
ctrl + shift + k | krypt kanata toggle | Toggle kanata.service |
| Bind | krypt invocation |
|---|---|
$mod + ctrl + j | krypt menu autofill -- auth |
$mod + ctrl + k | krypt menu autofill -- user |
$mod + ctrl + l | krypt menu autofill -- pass |
$mod + ctrl + ; | krypt menu autofill -- otp |
| Bind | Action |
|---|---|
$mod + p / Print | Screenshot region (grimblast) |
$mod + shift + p | Screen record (kooha) |
$mod + ctrl + p | Color picker |
$mod + m | Lock screen |
| Bind | Action |
|---|---|
$mod + q | Close active |
$mod + f | Maximize |
$mod + shift + f | True fullscreen |
$mod + v | Toggle floating |
$mod + s | Toggle split direction |
$mod + h/j/k/l | Focus left/down/up/right |
$mod + shift + h/j/k/l | Move window |
ctrl + arrows | Resize |
$mod + tab | Cycle windows |
| Bind | Action |
|---|---|
$mod + 1..9,0 | Switch to workspace 1..10 |
$mod + shift + 1..0 | Move window to workspace |
$mod + LMB drag | Move window |
$mod + RMB drag | Resize window |
XF86Audio* and XF86MonBrightness* wired via swayosd-client.
$mod + up/down/left/right doubles as volume +/-/mute. Add shift for mic.
Top-level .krypt.toml declares [meta], [paths], [prompts.*], and
[[template]] entries, and includes three sub-files:
| File | Holds |
|---|---|
.krypt/links.toml | [[link]] symlink rules (stow replacement) |
.krypt/deps.toml | [[deps]] groups: cross-distro package mappings |
.krypt/commands.toml | [[command]] group=… name=… — every krypt <group> <name> invocation |
[[hook]] when = "post-update" entries live in the top-level .krypt.toml.
To add a new menu (e.g. krypt menu screenshot):
- Add
[[command]] group = "menu" name = "screenshot" steps = […]to.krypt/commands.toml. - (Optional) Add the Hyprland bind in
.config/hypr/hyprland.lua:hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd("krypt menu screenshot")). krypt validate— fail fast on config errors.
Scripts in .local/bin/ are intentionally named with a leading . (e.g.
.menu-apps, .kanata). Hidden from ls but show with ls -A. Keeps the
user's interactive PATH visually clean while still being invocable from
.krypt.toml.
See CONTRIBUTING.md for commit style, naming, lint.
MIT — see LICENSE.
