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

Keep AI files, folders, and any custom patterns out of the repository without losing them. Dotlore syncs them across your machines through your own cloud — iCloud, Google Drive, Dropbox, OneDrive, MEGA, or any folder your cloud app syncs.

macOS is the current priority. Windows & Linux are coming soon.

What it does

  • Files stay put: not moved, not symlinked, not added to the project's git history.
  • A project is a folder with a synced include-list. .claude/, CLAUDE.md, .agents/, docs/, and ~/.claude are entries inside it.
  • Sync through any local folder your cloud app keeps in sync — a folder path, not a cloud API.
  • Each Mac publishes an immutable git bundle. Nothing in the cloud folder is rewritten or deleted.
  • Conflicts: the newer commit wins on every device; the loser's bytes stay beside it as a sibling file.
  • Desktop app, menu bar status item, and a CLI (add, sync, status, daemon).

How it works

Both Macs share one folder that a cloud app (iCloud, Google Drive, Dropbox, OneDrive, …) already syncs. Each writes its own history there and reads the other's.

  1. A change becomes a commit

    • Chosen entries go into a private git repo at ~/Library/Application Support/dotlore/.
    • A save becomes a commit. File watch, or a poll every 30 seconds.
  2. That commit is the next bundle

    <cloud>/dotlore/<project>/
      manifest.json
      devices/
        <this Mac>/
          000001.bundle
          000002.bundle
        <other Mac>/
          000001.bundle
    • One new file, in this Mac's devices/<id>/. Left as written.
    • Inside: commits of the include-list — file contents, plus the path list.
    • 000001.bundle is the full snapshot. Later files hold only the commits since.
  3. The other Mac reads it back

    • The cloud folder copies the new file across.
    • The other Mac fetches bundles it has not applied, in order, and writes the merge back with system git.
    • The first link on the second Mac reads every bundle already there.
    • Same file on both Macs: the newer commit wins. The other copy stays as CLAUDE.conflict-<device>-<hash>.md.

Sync rules

What Dotlore syncs, when, and what happens when Macs disagree.

What gets synced
  • Each project has an include-list of entries: a file such as CLAUDE.md, or a folder such as .claude/ or docs/.
  • A new project starts from the patterns AI tools use: AGENTS.md, .cursor/, .mcp.json, .github/copilot-instructions.md, and more. Add or remove entries at any time.
  • Agent homes such as ~/.claude can be added as projects too.
  • The include-list syncs with the project, so every Mac tracks the same entries.
When a sync runs
  • A file change starts a sync after 2 seconds of quiet, or 5 seconds at most while you keep typing.
  • A poll every 30 seconds picks up anything the watcher missed.
  • A Mac that was offline catches up on its own when its cloud folder syncs again: bundles are never rewritten, so nothing goes missing in between.
Editing the same file on two Macs
  • Edits to different lines merge on their own.
  • Edits to the same lines: the newer commit wins on every Mac. The other version stays beside it as CLAUDE.conflict-<device>-<hash>.md.
  • No conflict markers are ever written into your files.
Deleting a file
  • A delete syncs like any change. Each other Mac moves its copy to its local trash first.
  • Edit versus delete: the edit always wins, and the file comes back on the Mac that deleted it.
  • Delete versus restore: the later of the two wins, and a tie within 5 seconds keeps the file.
  • A delete counts from when Dotlore sees it. A file deleted while Dotlore is not running counts from the next launch, so keep the login item on.
Trash and history
  • Before a sync deletes or overwrites a file, the old version goes to a local trash. Files you delete yourself go there too.
  • The trash is never synced, and is capped at 500 MB by default: past the cap, the oldest syncs go first.
  • Every project also keeps its synced versions on this Mac. Right-click a file → "History…" to bring back an earlier version, or "More" → "Deleted files…" for a file that is gone.
Ignore lists
  • A global never-list keeps agent state out of every project: sessions, logs, caches, node_modules/, .DS_Store, *.log, and similar.
  • Each project can add its own ignore list on top (project menu → "Ignore list…"). It uses .gitignore syntax and syncs with the project.
  • A ! line re-includes a path the never-list ignores, for one project only.
  • Ignoring a tracked file stops syncing it. The file stays on disk.
Sensitive files
  • Names that often hold secrets, such as .env, *.pem, *.key and credentials*, are marked sensitive and need your confirmation before they are tracked.
  • Edit the sensitive patterns in Settings → Sensitive, or mark a single file from its context menu.
  • A ! line never re-includes a sensitive file. .credentials.json, auth.json and .claude.json are always left out.
Size limits and symlinks
  • Files over 50 MB are skipped, and Dotlore shows which ones.
  • Tracking a folder over 200 MB asks for confirmation first.
  • Change both limits in Settings → "Size limits".
  • Symlinks are never followed and never replaced.
What happens in the cloud folder
  • Each Mac only adds new bundle files to its own folder. Nothing there is rewritten or deleted.
  • Settings (patterns, ignore defaults, sensitive patterns, size limits) sync as small snapshots, so a new Mac picks them up.
  • The one exception is Settings → "Wipe cloud data", which asks first and removes the whole dotlore folder.