ΛRC

AI-forward coordination substrate

Docs, Stories, Tasks, Status is a byproduct of Intent.

click to copy curl -fsSL https://arc.daystra.com/install.sh | sh

What is Arc

Arc is a version control system built for the age of AI agents. Instead of staging, committing, and pushing, Arc captures continuous snapshots of your working directory as you code. Every meaningful change is recorded automatically — no ceremony, no context switching.

Traditional VCS was designed around a human workflow: think about what changed, stage it, write a message, commit, push. That made sense when one person typed code into one file at a time. It breaks down when an AI agent is rewriting four files in parallel, a second agent is running tests, and you're reviewing the output — all in the same minute.

Arc replaces that ceremony with a continuous, observable substrate. Changes flow in. History accumulates. Agents and humans query it when they need context. Nobody stops to commit.

Quick Start

Starting a new project? Two steps — install, then point Arc at the project. The daemon starts capturing immediately.

# 1. Install
curl -fsSL https://arc.daystra.com/install.sh | sh

# 2. Initialize in any project
cd my-project
arc init

# That's it. arc init sets up everything:
#   .arc/             — snapshot database + object store
#   .arcignore        — default ignore patterns
#   .mcp.json         — MCP server config (auto-discovered by Claude Code)
#   .claude/settings.local.json — wildcard MCP permissions (zero friction)
#   .claude/skills/   — arc-source-control skill for agent onboarding

# First moves
arc status                                  # check capture is live
arc snapshots                               # see what changed
arc snapshot diff 20 25
arc intent declare "Add user authentication"

# Send feedback to the Arc team
arc feedback --bug "something broke"
arc feedback --feature "would love arc diff --stat"

Joining a project that already lives on a relay? One command. Which one depends on where the relay is:

# On the new machine — install once
curl -fsSL https://arc.daystra.com/install.sh | sh

# Filesystem relay — clone straight from the mounted path (no JSON, no credential)
arc clone /Volumes/backup/arc          # creates the project dir, pulls history, writes files

# R2 relay — owner mints a JSON invite, you clone with it
#   owner runs:  arc relay invite --relay my-arc --out invite.json   (share it like a password)
arc clone --bundle invite.json         # creates the project dir, pulls history, writes files

cd  && arc status             # you're current — full history, files on disk

# Already ran `arc init` in a directory there? Wire the relay in instead of cloning:
arc remote add /Volumes/backup/arc --pull       # filesystem
arc remote add --bundle invite.json --pull      # R2
arc sync pull --materialize                      # writes the project files to disk

How It Works


Relay Sync

A relay is the safe, off-machine copy of your substrate — every snapshot, intent, and signed record. More than a backup: one relay gives you durable redundancy, keeps a second machine current, and brings a fresh clone up to speed. Pushes are incremental and content-addressed; restoring — or standing up a new machine — is a single arc clone.

# Set up a relay — an off-machine copy. Two ways:
arc remote add /Volumes/backup/arc                       # local volume, NAS, home server — just a path
arc relay provision --backend r2 --bucket my-arc --push  # Cloudflare R2 — one command: bucket + scoped token + wired

# Receive it on any machine — ONE command: init + wire + pull + materialize
arc clone /Volumes/backup/arc                            # filesystem — no credential needed
arc clone --bundle invite.json                           # R2 — from a read-only invite

# Share an R2 relay: mint a read-only invite, hand it over like a password
arc relay invite --relay my-arc --out invite.json

Where it lives is your call:


Worktrees, Snapshots, and the Timeline

Arc's mental model is a base timeline with worktree spurs. Snapshots chain. Worktrees fork off the chain when you declare an intent and merge back when you finish.

base timeline integration target — where work lands after merge #810 #811 #812 #813 #814 (merge A) #815 (merge B) wt A · 1st wt A · last fork @ #811 worktree A — intent #27 abandoned ✕ worktree B — intent #25 (no merge) base snapshot merge snapshot worktree snapshot abandoned spur

The Agent Architecture

Arc ships with an MCP (Model Context Protocol) server that gives AI agents structured, native access to history and state. No shell parsing. The MCP entry point (arc mcp-server) and the daemon (arc serve) run as separate processes — see Multi-Terminal Sessions for how that unlocks running multiple agents on one project.

Architecture diagram — agents → MCP → core → storage
Claude Code Primary integration Cursor / Windsurf MCP compatible GitHub Copilot No MCP support yet MCP Protocol (stdio) arc mcp-server (per session) → arc serve (daemon) arc_context arc_snapshot_now arc_query_changes arc_intent_declare Arc Core Snapshots · Intents · Diffs · Config · Identity SQLite Metadata, events, intents Object Store BLAKE3 content Config & Keys TOML + Ed25519 all stored in .arc/ — single directory, no external dependencies

Multi-Terminal Sessions

Arc runs multiple Claude Code sessions against the same project simultaneously. Each session gets its own MCP server process; all coordinate through a single daemon (arc serve) that owns the file watcher, capture pipeline, and singleton lock. The daemon is a separate process, kernel-enforced singleton via flock(2) — multi-daemon races are impossible by structure, not by policing.

How it's wired — sessions, sockets, and the singleton lock
Claude Code Session A · Terminal 1 Claude Code Session B · Terminal 2 Claude Code Session C · Terminal 3 stdio · MCP arc mcp-server JSON-RPC client arc mcp-server JSON-RPC client arc mcp-server JSON-RPC client Unix socket · JSON-RPC · .arc/daemon.sock arc serve — daemon file watcher · capture pipeline · intent registry flock(LOCK_EX, .arc/daemon.pid) — one per project, kernel-enforced reads + writes .arc/state.db SQLite metadata .arc/objects/ BLAKE3 content .arc/daemon.sock RPC transport N sessions · N MCP servers · 1 daemon per project

Multi-session has been stable across several releases. Long-lived deployments and very-large concurrent fleets are still earning miles; file an arc feedback if behavior surprises you.

Zero-Friction Agent Setup

arc init wires everything agents need in one command:

How an agent session works: When Claude Code (or any MCP-compatible agent) connects to your project, it discovers Arc's tools automatically. The first thing it typically calls is arc_context — which returns the project's current state: active intents, recent snapshots, config, and hints about what tools to call next. From there, the agent can query history, declare intents, take snapshots, and navigate diffs — all without shelling out to a CLI.

Agent Compatibility

Arc is model-agnostic and provider-agnostic. It doesn't care which AI is driving — it just needs the agent to speak MCP.

Where it stands with OpenAI, Gemini, Grok, Copilot

The Human Experience

Arc is agent-first but not agent-only. As a solo developer, here's what changes:

The Story Reads Itself

Arc is built for the agents — but what changed, and why is the question that belongs to the human. Every team answers it four times over: a wiki for how it fits together, a task board for what was planned, a story for why it mattered, and the source for what actually happened. Four tools, four copies of the truth, four chances to drift — and a standing human tax to keep them in sync. They rot because they're hand-curated: the moment the code moves, every other copy is stale.

Arc collapses the four. The source already holds the snapshots and the intents — so the story is generated from them, never re-typed; the task is the intent you declared; the wiki writes itself. Nothing to reconcile, because there is only one source — and the narrative is read from it on demand, so it cannot go stale.

That's arc recap — one question-shaped command for the human in the loop:

arc recap last-week                  # what shipped, grouped by intent
arc recap last-30d                   # a month at a glance
arc recap --path crates/arc-core     # what changed in one corner, and which functions

It answers straight from the substrate — the intents that landed, the files that moved, the functions touched — deterministically, with no model in the loop and nothing to curate. The standup write-up, the "what did we do last week," the cold-start briefing for whoever (or whatever) joins next: one query, always current, because the substrate is the only thing it reads.

Narration

Arc can automatically narrate your snapshots using AI — human-readable descriptions of what changed and why, without you writing a single commit message. Pluggable: Anthropic, OpenAI, Gemini, Grok, or local Ollama. You pick the backend. It's off by default — nothing leaves your machine until you turn it on. When enabled, narration sends each snapshot's change context to the backend you choose: a cloud provider receives your diffs, while the local Ollama option keeps everything on-machine.

Provider list and config example

Configure in ~/.arc/config.toml or per-project in .arc/config.toml:

[narration]
mode = "auto"
base_url = "http://localhost:11434/v1"   # Ollama
model = "llama3.2"

The Hidden macOS Spotlight Tax Paid by Devs

If your Mac fan spins up when nothing seems to be running, it's probably mdworker_shared — Spotlight's sandboxed importer worker, spawned by mds to read every file the indexer wants to know about. Spotlight indexes everything by default — including the gigabytes of build output, dependency caches, and AI-agent-generated churn that nobody ever searches for by name. Every solo dev running AI agents on a Mac is paying this tax. Most don't know to look.

Arc thinks about this at the systems level, not just the source-control level. arc init drops a .metadata_never_index sentinel in .arc/ automatically — tells Spotlight to skip the substrate's high-churn content-addressed object store. arc doctor flags drift if the sentinel goes missing; arc doctor --restore-path-inert --commit re-drops it. The same instinct mitigates antivirus CPU on the same hot paths (AV exclusion is per-app in System Settings rather than per-path, but the FSEvents budget they compete for is the same one).

The asymmetry to know about (and how to fix it once)

The sentinel only prevents new Spotlight indexing. If Spotlight has already indexed your .arc/objects/ tree (likely if you've been running Arc for a while), you need to erase the existing index once:

mdutil -E /path/to/your/project/.arc
mdutil -s /path/to/your/project/.arc   # verify status

Without that erase step you'll keep paying CPU on already-indexed content even with the sentinel in place.

The bigger offenders aren't always Arc-managed

Build-output and dependency directories chew far more Spotlight CPU than .arc/ ever will. Drop the same sentinel in the ones your project uses:

touch node_modules/.metadata_never_index    # JS/TS
touch target/.metadata_never_index          # Rust
touch .venv/.metadata_never_index           # Python
touch vendor/.metadata_never_index          # Go, Ruby, PHP/Composer
touch _build/.metadata_never_index          # Elixir
touch build/.metadata_never_index           # generic / Java / Swift
touch .gradle/.metadata_never_index         # Gradle
touch DerivedData/.metadata_never_index     # Xcode

# Erase any existing index for those dirs (one-time):
mdutil -E node_modules target .venv vendor _build build .gradle DerivedData 2>/dev/null

Want the recursive, repo-aware version? This bash script walks a project root and drops the sentinel for you. It uses always-safe names (node_modules, .venv, __pycache__, etc.) plus sibling-marker checks for generic names (e.g. target/ only when there's a Cargo.toml next door, vendor/ only with go.mod/Gemfile/composer.json). Supports --dry-run and refuses to scan / or $HOME without --force.

On other operating systems (this is not just a macOS problem)

Spotlight isn't unique. Every desktop OS ships a background indexer that walks high-churn build dirs by default:

The other CPU sink — on every platform — is your antivirus or EDR agent. If mdworker_shared (or its equivalent) is quiet but the fans are still loud, the AV is scanning every file your tools touch. On managed laptops the exclusion lives in your org's security console (CrowdStrike Falcon, SentinelOne, Sophos, Defender for Endpoint, Jamf Protect, Carbon Black, Trellix); on personal machines, the AV's own UI. The Spotlight sentinel only solves half the problem when an agent is also watching.


Feedback

Arc is built to be run by agents — so let the agent file the report. When Claude Code hits a rough edge (a confusing tool, a missing capability, something that broke), it can log it without leaving the session, from the CLI or the arc_feedback MCP tool:

Every entry lands in ~/.arc/feedback.md and, once you opt in, syncs to the Arc team. We read all of it and work it — the friction your agent hits is what shapes the roadmap.

Update anytime with arc update. Pin a specific version with VERSION=0.9.30 curl -fsSL https://arc.daystra.com/install.sh | sh.


How agents discover Arc on session start

When Claude Code (or any MCP-compatible agent) opens a project, it looks for .mcp.json in the project root. Arc's entry points it at arc mcp-server, which connects to the project's daemon (auto-spawning one if needed). From there:

Known setup notes — permissions, config locations, upgrades

macOS (Apple Silicon) · MIT License · Built by humans and agents, tracked by Arc

Copied to clipboard

A Cybercussion Interactive, LLC project