dotkeeper

Keep every machine in sync

Real-time P2P file sync powered by Syncthing. Automatic git backup on schedule. One binary, zero config servers.

dotkeeper
$ dotkeeper init --name laptop --slot 0
[dotkeeper] machine: laptop (slot 0)
[dotkeeper] Syncthing identity generated
[dotkeeper] device ID: KFZZ7TP-GH5OLNL-WNSTHWQ-...

$ dotkeeper add ~/Documents/project ~/dotfiles
[dotkeeper] added: project → ~/Documents/project (git: yes)
[dotkeeper] added: dotfiles → ~/dotfiles (git: yes)
[dotkeeper] config updated

$ dotkeeper install-timer
[dotkeeper] timer installed (daily, slot 0, systemd)

$ dotkeeper status
=== Machine ===
  Name: laptop
  Slot: 0

=== Syncthing (embedded, API 127.0.0.1:18384) ===
  Status: running
  Peers: 1
  Folders: 3

=== Repos ===
  project:  ~/Documents/project [ok, git, syncthing]
  dotfiles: ~/dotfiles [ok, git, syncthing]

=== Git Backup Timer ===
  Status: active

How it works

1

Initialize

dotkeeper init on your first machine. Generates a Syncthing identity and creates your config.

2

Join

dotkeeper join <ID> on other machines. Config syncs automatically via Syncthing.

3

Add repos

dotkeeper add ~/project starts syncing. Files propagate in real-time. Git backs up on schedule.

Features

Zero infrastructure

No cloud server, no VPN, no SSH tunnel. Machines find each other via Syncthing's discovery network and connect peer-to-peer.

Single binary

Syncthing is compiled into the dotkeeper binary. Download, run, done. No separate Syncthing installation, no conflicts with existing setups.

Git history

Scheduled git auto-commit and push. Every change is versioned. Roll back to any point in time. Works with your existing remotes.

Conflict-free by design

Syncthing handles real-time sync. Git timers are staggered per machine (slot offsets) so pushes never collide.

Cross-platform

Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD. Platform-native service management: systemd, launchd, Task Scheduler, cron.

Privacy-first

No telemetry, no crash reporting, no usage tracking. Syncthing's full network stack for connectivity, with all reporting disabled.

Architecture

  Machine A                          Machine B
  +-----------------+                +-----------------+
  | dotkeeper       |  Syncthing     | dotkeeper       |
  |   embedded ST --|---(P2P sync)---|--  embedded ST  |
  |   git timer   --|---> remote <---|--  git timer    |
  +-----------------+                +-----------------+
        |                                   |
   ~/.config/dotkeeper/              ~/.config/dotkeeper/
     machine.toml (local)              machine.toml (local)
     config.toml  (synced)             config.toml  (synced)

Isolated Syncthing

Runs on its own ports (API: 18384, sync: 12000, discovery: 11027). Never touches your existing Syncthing installation.

Three-file config

machine.toml — local identity, never synced. config.toml — shared settings, synced via Syncthing. dotkeeper.toml — per-repo breadcrumb, tracked in git.

Smart .stignore

Auto-generated ignore patterns: build artifacts, lockfiles, editor state, SQLite journals. Syncs what matters, skips what doesn't.

Install

Download binary

Grab the latest release for your platform:

Download from GitHub

Arch Linux (AUR)

yay -S dotkeeper-bin

Build from source

git clone https://github.com/julian-corbet/dotkeeper
cd dotkeeper
make install

Requires Go 1.22+ and git.

Commands

dotkeeper initInitialize this machine
dotkeeper join <ID>Join an existing setup
dotkeeper add <path>Add repos to sync
dotkeeper remove <name>Remove a repo from sync
dotkeeper pairApply config to Syncthing
dotkeeper syncRun git backup now
dotkeeper statusShow full status
dotkeeper install-timerInstall scheduled git backup
dotkeeper startStart embedded Syncthing
dotkeeper stopStop Syncthing service