Skip to content
Dotfile sync for macOS and Linux

Your dotfiles, the same everywhere.

Edit a config file on any of your Macs or Linux machines, and within minutes every other machine has it. When two machines change the same file, dotsync keeps both versions and asks you which to keep.

Install
curl -fsSL https://raw.githubusercontent.com/pungoyal/dotsync/main/install.sh | sh

Verifies the checksum and signed build provenance. Other ways to install

laptop
git config --global alias.st status
dotsync sync
  sent      ~/.gitconfig
dotsync: 1 sent — pushed 51c7e02

on its next scheduled sync, the desktop installs it

desktop
git config --global alias.st
status
Set up once

Three commands, then you forget about it

Connect each machine to a private git repository, choose your files once from any machine, and go back to editing them as usual.

on each machine
dotsync init git@github.com:you/dotfiles.git      # clone, first sync, start the background agent
dotsync add ~/.gitconfig ~/.config/fish ~/.config/nvim   # once, from any machine
dotsync doctor                                    # check git access, the agent and every file
The model

One rule decides what happens to every file

For each file, every machine remembers the version it last agreed on with the others. Comparing against that version shows who changed the file, so there’s always exactly one right move.

What dotsync does with a file, by where it changed since the machines last agreed
Unchanged on other machinesChanged on another machine
Unchanged hereUnchanged here and elsewhereNothing to doEvery machine already has this version.Changed only on another machineInstalled hereThis machine's copy is backed up first.
Changed hereChanged only hereSent everywherePushed, then installed by every other machine.Changed here and on another machineConflictNothing is touched. You pick a version with one command.

See deletions, first syncs and every edge case, with an interactive explorer →

Why dotsync

Careful by design

Most dotfile managers are deployment tools: you edit a source copy, then apply it everywhere. dotsync is a synchronizer: you edit the real file, and it takes care of the rest.

  • Both ways, automatically

    Edit the real file on any machine. A background job on each machine syncs every five minutes by default. Adding and removing files works from any machine too.

    The background agent
  • Backed up before it’s replaced

    Every local file dotsync replaces or deletes is copied aside first, and every synced version stays in git history.

    Safety guarantees
  • Conflicts, never guesses

    When two machines change the same file, dotsync keeps both versions untouched and asks you. It never merges and never picks a winner.

    Resolve conflicts
  • Secrets stay on the machine

    Private keys, cloud credentials and tokens pasted into a config file are held back before they reach the repository.

    Keep secrets out
  • Offline for a month? Fine.

    Changes wait while the remote is unreachable. A machine that comes back catches up, and still spots conflicts.

    How sync works
  • Nothing new to run

    One static binary, git, and a private repository on any git host. No server to run, no service to sign up for, no daemon.

    Design decisions
Visibility

Always know where you stand

dotsync status shows every managed file, what’s about to change on this machine, and anything that needs you.

laptop
dotsync status
dotsync on laptop: git@github.com:you/dotfiles.git (main @ 1c049fe)
last sync: 2026-09-21T11:16:09+05:30 (ok)
automatic sync: launchd agent loaded

SOURCE            TARGET                      STATUS      DESCRIPTION
fish/config.fish  ~/.config/fish/config.fish  ok          Fish shell configuration
gitconfig         ~/.gitconfig                CONFLICT    Git identity and aliases
nvim              ~/.config/nvim/             1 incoming  Neovim
                                              - ~/.config/nvim/init.lua: download

conflicts (neither version has been changed):
  ~/.gitconfig  since 2026-09-21T11:16:09+05:30
  inspect: dotsync diff <path>    settle: dotsync resolve <path> --keep local|remote
  (to merge by hand, edit the local file, then --keep local)
Honest fit

Is it the right tool for you?

A good fit if you

  • use two or more Macs or Linux machines
  • want your configuration to simply be the same on all of them
  • would rather never run a command to keep them in sync

Look elsewhere if you need

Compare dotsync with chezmoi, yadm, GNU Stow and Mackup →

Where to next