paw is a Go-based dotfiles manager for Linux, macOS, and WSL.
brew tap alexcatdad/tap
brew install alexcatdad/tap/pawpaw init https://github.com/yourusername/dotfiles
paw install
paw statuspaw init <repo>paw installpaw linkpaw unlinkpaw statuspaw drift status|applypaw syncpaw push [message]paw updatepaw rollbackpaw backup list|restore|cleanpaw auditpaw scaffoldpaw doctorpaw migrate-ts-configpaw completion [bash|zsh|fish]paw man
paw is native-only TOML. No runtime TS/JS execution.
version = 1
layout = "hybrid"
[packages]
common = ["ripgrep", "fzf"]
darwin = ["ghostty"]
linux_apt = ["git", "curl"]
linux_brew = []
wsl_apt = ["git", "curl"]
wsl_brew = []
[ignore]
paths = [".zshrc.local", ".gitconfig.local"]
[backup]
enabled = true
max_age = 30
max_count = 5
[hooks]
post_install = "echo installed"
[overrides]
"extras/ssh-config" = { target = ".ssh/config", platform = ["darwin", "linux", "wsl"] }Store managed files under home/ and paw links them into $HOME:
home/.zshrc -> ~/.zshrc
home/.config/git/config -> ~/.config/git/config
home/.config/starship.toml -> ~/.config/starship.toml
Use [overrides] for exceptions and conditional links.
Inspect and import drift from your current machine back into the repo.
paw drift status
paw drift status --json
paw drift apply
paw drift apply --scope filespaw drift statusexits with code5when drift exists (cron/CI alerting).paw drift applyupdates repo files only and does not stage or commit.- Use
paw pushafter apply when you want to commit and publish changes. - Package drift uses deterministic Homebrew export rewrite for
home/.config/homebrew/Brewfile.
- Hooks are shell command strings and run with user permissions.
- Paths are validated to stay inside
$HOME(targets) and repo (sources). - Package names are validated before shell execution.
Deterministic Linux CI/local run:
./scripts/test/docker-ci.shCoverage stage gate (65, 80, 90) and package minima:
COVERAGE_STAGE=65 ./scripts/test/coverage-check.shQuality checks (formatting, vet, lint, shell/workflow lint, and security gate):
./scripts/test/quality-check.shSecurity gate policy blocks HIGH/CRITICAL findings and warns on lower severities.
Autofix command for local parity with CI bot:
./scripts/test/quality-fix.sh- Releases are automatic on push to
mainusing conventional commits:feat:=> minor bumpfix:,perf:,refactor:=> patch bump!/BREAKING CHANGE=> major bumpdocs:,ci:,chore:,test:,style:=> no release
- Release assets are published to GitHub Releases.
- Homebrew formula
alexcatdad/tap/pawis updated automatically from release assets.
MIT