Running Argon: requirements, configuration, storage, retention, and migration. Everything here reflects what the code does today.
-
MongoDB as a replica set. Write capture uses change streams with pre-images, which MongoDB serves only on replica sets. A single-node replica set is fine:
docker run -d --name argon-mongo -p 27017:27017 mongo:7 --replSet rs0 docker exec argon-mongo mongosh --quiet --eval \ 'rs.initiate({_id:"rs0", members:[{_id:0, host:"localhost:27017"}]})'
-
Connection. Every Argon process (CLI, API server, MCP server, proxy) reads
MONGODB_URI(defaultmongodb://localhost:27017) and keeps its metadata in theargon_waldatabase: the log (wal_log), branches, projects, LSN counters, snapshot manifests, merge plans, pins. Checked-out branches get physical databases namedargon_br_<branch-id>on the same deployment.
| Process | Run | Purpose |
|---|---|---|
argon watch -p P -b B |
one per checked-out branch you write to | captures direct writes into the WAL (resume tokens: it recovers writes made while it was down) |
go run ./api (or the built binary) |
one | REST control plane; supervises ingesters for the sandboxes it creates; PORT (default 8080) |
argon mcp |
per agent client | MCP server over stdio; supervises ingesters for its sandboxes |
argon proxy --listen :27018 |
optional | stable project~branch connection strings |
argon sandbox sweep -p P |
cron | reap expired sandboxes (pinned ones are skipped loudly) |
argon gc -p P |
cron | reclaim covered, out-of-retention WAL entries |
Snapshots are content-addressed, zstd-compressed chunks (~4 MB), deduplicated across branches and snapshots. Where chunks live is chosen by environment:
ARGON_SNAPSHOT_STORE |
Additional variables | Notes |
|---|---|---|
mongodb (default) |
— | chunks in argon_wal.wal_snapshot_chunks; zero setup |
s3 (cloud default) |
ARGON_S3_BUCKET (required), ARGON_S3_PREFIX (default argon/chunks), ARGON_S3_ENDPOINT (MinIO/R2/Ceph), plus standard AWS_* credentials |
recommended for cloud deployments |
filesystem |
ARGON_SNAPSHOT_DIR (required) |
self-hosted disks |
Snapshots happen automatically (roughly every 1,000 entries per branch,
plus immediately after imports); argon snapshot create forces one. GCS
is not yet a backend.
argon gc -p P --retention 168h deletes WAL entries that are all of:
covered by a snapshot every future reader can use, older than the
retention window, below every live child's fork-point coverage, and below
every pin's coverage. Consequences, stated plainly:
- No snapshot → nothing is ever deleted, no matter how old.
- Reclaiming entries ends time-travel/audit/undo below the cutoff — that is what a retention window means; pick it accordingly (default 7 days).
- Pins punch permanent holes: a pinned state stays materializable forever until the pin is deleted.
- Deleting a branch reclaims its entries, snapshots and unshared chunks immediately (deletion is refused while the branch has live children or pins).
--dry-run reports what would be deleted, per branch and collection.
v1 logged updates as expressions and re-executed them on replay, which was not deterministic. The v2 materializer refuses v1 data entries with an error naming the fix:
argon migrate-wal --project myapp --dry-run
argon migrate-wal --project myappMigration rewrites entries in place (parents before children, LSNs preserved), is idempotent, and needs no downtime for readers of already- migrated branches.
argon status reports connectivity and system health; argon metrics
prints performance counters (operation rates, latencies, error rates). The
services log ingester lifecycle events and snapshot/GC warnings to stderr;
wal.Monitor runs periodic health checks inside every long-lived process.
Argon passes credentials through MONGODB_URI untouched. With the wire
proxy, clients must set authSource=admin explicitly (the URI database is
a branch alias, not a real database SCRAM can run against).