Familiar, simple, effective, portable, and robust.
Every checkpoint records the full state of your project. Storage is flexible — works locally out of the box, or wire it into your product or system to give users version control. Embed it in a shared backend and it becomes a living monorepo: many users, each on their own branch of one workspace, with live co-editing per branch.
How it works
Every checkpoint is a full snapshot of your project — a manifest mapping each file to its content hash. Identical content is stored once. Branches are just pointers. Merging finds the common ancestor and diffs every file at the line level.
Files are hashed with SHA-256. Same content across branches or checkpoints is never duplicated.
Myers diff algorithm, same as Git. Conflict markers when both branches touch the same lines.
Every checkpoint is self-contained — a complete map of your project. File blobs are delta-compressed automatically, with hashes always based on full content.
SQLite on disk by default. Implement two interfaces to run against PostgreSQL, S3, or anything else.
Programmatic API
As well as working on your local filesystem, Arc exports pure functions that take a storage backend as their first argument — so you can embed it in a web app, a build tool, or a collaborative editor.
CLI reference
Install from npm, initialize, and create your first checkpoint.
Sync your project to a remote server with arc sync. For hosting, use arc-host — a lightweight zero-dependency server.
Motivation
Arc started from a question: what would version control look like if designed as a library first, with the full feature set built in from the start?
RCS, CVS, Subversion, Git — each generation kept what worked and rethought what didn't. Arc carries forward the operations that proved essential and leaves behind the complexity that accumulated along the way.
Data lives in a database, not loose files on disk. Content-addressed blobs, atomic writes, and structured storage mean there's no equivalent of a broken packfile or dangling object. Your history stays intact.
Undo and squash refuse to cross fork points or merge boundaries. Your working tree is always on disk as a safety net. Operations that could lose work simply won't run.
SQLite on disk, PostgreSQL on a server, a custom adapter in the browser. Same API, same operations. Pure JavaScript with zero npm dependencies — runs wherever Node does.
Embed version control directly in your product. Let users save, branch, and undo inside a web app, a design tool, a game editor — anywhere state changes over time.
The entire core is a handful of JavaScript modules. No compiled binaries, no opaque internals. You can read the whole thing.