Cross-platform dotfile synchronization tool. Track config files across machines using a git-backed repository with platform-aware entries, change detection via SHA256 hashing, and both one-shot and continuous sync modes.
curl -fsSL https://raw.githubusercontent.com/yelsed/dots/master/install.sh | shGrab the latest binary for your platform from the Releases page:
| Platform | Asset |
|---|---|
| Linux (x86_64) | dots-x86_64-unknown-linux-gnu.tar.gz |
| macOS (Apple Silicon) | dots-aarch64-apple-darwin.tar.gz |
| Windows | dots-x86_64-pc-windows-msvc.zip |
Extract and move the binary somewhere on your PATH (e.g. ~/.local/bin).
cargo install --git https://github.com/yelsed/dots.gitClone an existing dotfiles repo or create a new one:
dots init # Create ~/dotfiles from scratch
dots init git@github.com:you/dotfiles.git # Clone existing repo (SSH — recommended)
dots init https://github.com/you/dotfiles.git # Clone existing repo (HTTPS — requires GIT_USERNAME/GIT_PASSWORD)SSH vs HTTPS: SSH is recommended. HTTPS clones require
GIT_USERNAMEandGIT_PASSWORDenv vars (use a GitHub Personal Access Token as the password). SSH uses your local key (~/.ssh/id_ed25519or~/.ssh/id_rsa) or SSH agent automatically.
Start tracking a config file or directory:
dots add ~/.bashrc
dots add ~/.config/nvim -P linux,macosPush local changes to the repo, or pull remote changes to your system:
dots push # Copy tracked changes to repo, commit, push
dots pull # Pull remote changes, interactively applyRun a background watcher that auto-syncs on file changes and periodically polls the remote:
dots watch
dots watch --poll-interval 15 # Poll every 15 minutesSee what's changed across all tracked entries:
dots statusCopy all platform-relevant configs from the repo to your system:
dots link
dots link --force # Overwrite existing filesConfiguration lives at ~/dotfiles/dots.toml (override with DOTS_REPO env var).
[repo]
path = "~/dotfiles"
remote = "git@github.com:you/dotfiles.git"
[[entries]]
source = "~/.bashrc"
repo_path = "bashrc"
platforms = ["linux", "macos"]
[[entries]]
source = "~/.config/nvim"
repo_path = "nvim"
platforms = ["linux", "macos"]| Variable | Purpose |
|---|---|
DOTS_REPO |
Override default repo path (~/dotfiles) |
GIT_USERNAME |
HTTPS auth username (not needed for SSH) |
GIT_PASSWORD |
HTTPS auth password/token (use a GitHub PAT, not your account password) |
cargo build # Debug build
cargo build --release # Release build
cargo run -- status # Run directly