Sync your AI stuff and keep it away from your main codebase.
Download · Website · Intro video · GitHub · Releases · Contributing
Note
macOS is the current priority. Windows and Linux are coming soon.
Dotlore syncs the AI-agent config your projects git-ignore (.claude/, CLAUDE.md, .agents/, docs/, ~/.claude) between your own Macs. Files stay where they are: nothing is moved, symlinked, or added to your project's git history.
- Files stay put — never moved, never symlinked, never added to git history.
- Project folders — each project is a folder with an include-list of entries to sync.
- Cloud folder, not a cloud API — sync through any folder your cloud app keeps in sync: iCloud Drive, Google Drive, Dropbox, OneDrive, Box, MEGA, …
- Immutable bundles — each Mac publishes its own git bundle; nothing in the cloud is rewritten.
- Conflicts without markers — the newer commit wins; the other version is kept as a sibling file.
- Desktop + menu bar — a three-column window and a compact status item.
Each project gets a private staging git repo under ~/Library/Application Support/dotlore/. Dotlore copies the include-list into it, commits, and publishes an immutable git bundle to its own device folder in the cloud:
<cloud>/dotlore/<slug>/devices/<device-id>/000001.bundle
Other Macs fetch and merge those bundles with the system git. On overlapping edits the newer commit wins, and the other version is kept as <stem>.conflict-<device>-<blob>.<ext>, so nothing is lost.
When one Mac deletes a file and another restores it, the later of the two wins, and a tie keeps the file. Edits always beat deletes. A delete counts from when Dotlore sees it: a file deleted while Dotlore is not running counts from the next launch, so keep Dotlore running (login item on) and keep your Macs' clocks set automatically. Update Dotlore on every Mac before relying on this: an older version can still let an older delete win.
Global settings (seed patterns, ignore defaults, sensitive patterns, size limits) sync as small write-once snapshots under <cloud>/dotlore/_settings/, so a new Mac picks them up automatically.
Each project can also have its own ignore list (project menu → "Ignore list…"). It adds ignores on top of the global never-list and syncs with the project. A ! line re-includes a path the never-list ignores, but sensitive files (Settings → sensitive patterns, plus .credentials.json, auth.json, .claude.json and its copies under backups/) are never re-included. Update Dotlore on every Mac before using it: older versions ignore the project list or its ! lines.
Before a sync deletes or overwrites a file, Dotlore keeps the old version in a local trash that is never synced. Files you delete yourself on this Mac are kept there too, as they were at the last sync (later edits are not kept):
~/Library/Application Support/dotlore/trash/<slug>/<YYYY-MM-DD>/<HHMMSS>/<path>
Open "Trash" in the sidebar to preview, compare, and restore a file, a folder, or a whole sync. The trash is capped at 500 MB by default (Settings → Sync → "Trash size limit"); past the cap, the oldest syncs are removed first.
Restore from history — each project also keeps a history of its synced versions on this Mac, so you can bring back an earlier version of a file or a file that was deleted. Right-click a file and choose "History…" to see its versions, or open a project's "More" menu and choose "Deleted files…". The history is local to this Mac and is lost by "Wipe cloud data", by recovering a project, and when a project is removed and then added or linked again (its staging repo is archived to recovery).
Dotlore only needs a folder that a cloud app syncs to every Mac; it never talks to the cloud service itself.
- Listed automatically — iCloud Drive, and every account mounted under
~/Library/CloudStorage(Google Drive, Dropbox, OneDrive, Box, Proton Drive, …). - Any other folder — pick it with "Other…", e.g. a MEGA sync folder or a legacy
~/Dropbox. - Requirements — the folder must support hard links; FUSE-style drives such as pCloud Drive may refuse to publish, and Dotlore shows the error.
- Upload status — the footer's "Synced to cloud" is iCloud-only; other folders show "Synced".
| Layer | Technology |
|---|---|
| Engine | Rust in src-tauri/, driving the system git |
| App | Tauri 2; React 19 + TypeScript + Vite in src/ |
| UI | Tailwind CSS v4, shadcn/ui |
| Editor | CodeMirror 6 (@codemirror/merge for conflicts) |
Prerequisites: Rust 1.89+, Node.js 20+, pnpm, git, and the Tauri prerequisites for macOS.
pnpm install
pnpm tauri dev # desktop app
pnpm mockapp:dev # browser UI with a mocked backend — http://localhost:38422
pnpm test
pnpm format:checkTip
pnpm tauri dev stores its state in ~/Downloads/dotlore-dev (override with DOTLORE_HOME), so it can run beside an installed copy.
That also gives it its own device identity, so point it at a separate cloud folder — see A dev run has its own state directory.
Rust builds go to an external SSD, not the internal disk: dev, test, clippy, rust-analyzer and scripts/build.sh. On each new Mac:
-
Create
~/.cargo/config.tomlwith the dev profile only (notarget-dir):[profile.dev] opt-level = 1 split-debuginfo = "off" incremental = false [profile.dev.package."*"] debug = "line-tables-only" incremental = false
-
Point this repo at the SSD:
cp .cargo/config.toml.example .cargo/config.toml # gitignored; set the volume path if it differs mkdir -p /Volumes/Thi2TB/cargo-target/dotlore -
Delete any old
src-tauri/targetdirectory. -
Run
cargo install cargo-sweep, thenpnpm sweep:cargofrom time to time.
With the SSD unplugged, builds fail instead of writing to the internal disk. After you replug it, the cache is reused. Without the repo-root .cargo/config.toml, builds use src-tauri/target. Why, and troubleshooting: CONTRIBUTING.md.
export TAURI_SIGNING_PRIVATE_KEY="$(cat ~/.tauri/dotlore.key)"
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD="…"
pnpm build # → <target>/release/bundle/{macos/Dotlore.app, dmg/*.dmg}<target> is /Volumes/Thi2TB/cargo-target/dotlore with the SSD config above, or src-tauri/target without it.
The signing key is required because the build also produces signed updater artifacts. pnpm tauri dev does not need it.
To build the signed and notarized release bundle without typing any secret (they come from the Keychain), run pnpm release --expect-version <version> --build-only. pnpm release --expect-version <version> also tags and publishes the release from this Mac. Setup and runbook: .github/release-setup.md.
The landing page at dotlore.dinhanhthi.com is static HTML in website/, deployed on every push to main.
See CONTRIBUTING.md for the invariants the engine depends on.
