dotman is a tiny Rust-based dotfiles deployer for my personal macOS/Linux environment. It uses a Dotbot-like ordered YAML config to link files, create directories, and run setup commands.
- Rust toolchain with Cargo
- GNU Make
- Git
- curl
- fish shell
Build the deployer:
make buildPreview the deployment:
make deploy DRY_RUN=1Deploy dotfiles:
make deployPreview bootstrap steps:
make bootstrap DRY_RUN=1Run bootstrap steps:
make bootstrapSkip shell commands such as plugin sync:
make deploy EXCEPT=shellRun only link steps:
make deploy ONLY=linkDeployment steps live in dotman.yaml. Bootstrap steps live in
dotman.bootstrap.yaml.
Supported directives:
defaultslinkcreateshellclean: planned / dry-run placeholder
Example:
- defaults:
link:
create: true
relink: true
relative: true
shell:
stdout: true
stderr: true
- link:
~/.config/fish: config/fish
~/.config/nvim: config/nvim
- create:
- ~/.config/fish/local.d
- shell:
- command: fish -lc 'type -q fisher; or curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source; and fisher update'
description: Install and sync fish pluginsField reference:
defaults.link.create: create missing parent directories for link targets.defaults.link.relink: replace an existing symlink when it points somewhere else.defaults.link.backup: move an existing conflicting target aside before linking.defaults.link.relative: create relative symlinks.defaults.shell.stdout: inherit stdout from shell commands.defaults.shell.stderr: inherit stderr from shell commands.link: maps target paths to source paths. A link item can also usepathplus per-itemcreate,relink,backup,relative, andifoverrides.create: creates directories, following existing symlinked path components.shell.command: command to run throughsh -c.shell.description: human-readable label shown in logs.shell.if: shell condition that must succeed before the command runs.shell.stdout/shell.stderr: per-command output overrides.clean: parsed and shown in dry-runs, but non-dry-run cleanup is not implemented yet.
Machine-specific paths, tokens, and temporary tool setup should stay out of the shared repository.
Fish loads local-only files from:
~/.config/fish/local.d/*.fish
For first-time setup on a new machine, follow docs/new-machine.md.
bin/: user scripts linked into~/.local/binconfig/: tracked source dotfilesdocs/: setup notes and manual checklistsdotman.yaml: deploy stepsdotman.bootstrap.yaml: bootstrap stepspackages/: package manifests and install helperssrc/: Rust deployer sourcetests/: CLI integration tests
make lint
make test
make ci