Skip to content
dinhanhthiPublic

About

Sync your AI stuff and keep it away from your main codebase.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

Dotlore logo

Dotlore

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.

Screenshot

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.

✨ Features

  • 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.

🔄 How it works

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.

🗑️ Trash

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).

☁️ Cloud folders

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".

🛠️ Tech stack

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)

🚀 Development

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:check

Tip

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.

Cargo build cache

Rust builds go to an external SSD, not the internal disk: dev, test, clippy, rust-analyzer and scripts/build.sh. On each new Mac:

  1. Create ~/.cargo/config.toml with the dev profile only (no target-dir):

    [profile.dev]
    opt-level = 1
    split-debuginfo = "off"
    incremental = false
    
    [profile.dev.package."*"]
    debug = "line-tables-only"
    incremental = false
  2. 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
  3. Delete any old src-tauri/target directory.

  4. Run cargo install cargo-sweep, then pnpm sweep:cargo from 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.

📦 Build

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.

🌐 Website

The landing page at dotlore.dinhanhthi.com is static HTML in website/, deployed on every push to main.

🤝 Contributing

See CONTRIBUTING.md for the invariants the engine depends on.

📄 License

MIT

About

Sync your AI stuff and keep it away from your main codebase.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages