noa is an AI-native distributed version control system. It coexists with .git — git manages source code, noa manages AI agent iteration data — with per-agent zero-lock JSONL logs, snapshot-based history, and full git protocol compatibility.
Table of Contents
- Why noa
- Architecture
- Installation
- Quick Start
- Commands
- Git Integration
- Compatibility
- API (libnoa)
- Building from Source
- Related Projects
- License
Why noa
Traditional git treats all contributors the same — human or AI. But AI agents have fundamentally different needs:
| Challenge | Git's answer | noa's answer |
|---|---|---|
| Concurrent writes | Lock files, merge conflicts | Per-agent JSONL append-only logs |
| Agent identity | Config user.name/email per repo | Workspace-scoped agent_id with per-agent partitions |
| Partial contributions | One commit = all changes in working tree | Agent logs only the files it actually touched |
| Iteration tracking | Rebase/squash destroys history | Immutable snapshots chain per workspace |
| Multi-agent merge | Three-way merge on text | Merge snapshots, detect file-level conflicts |
| Git protocol compatibility | N/A | System git CLI bridge for clone/push/pull/fetch |
Architecture
┌─────────────────────────────────────────────┐
│ Working Tree (.git/ + .noa/ coexist) │
│ │
│ .noa/ │
│ ├── noa.redb ← embedded KV store │
│ │ ├── blobs (content-addressed) │
│ │ ├── trees (directory snapshots) │
│ │ ├── snapshots (metadata + hash chain)│
│ │ ├── workspaces (agent partitions) │
│ │ └── refs (symbolic pointers) │
│ ├── agent-logs/ │
│ │ ├── default.log (main workspace) │
│ │ └── feat-*.log (feature workspaces) │
│ ├── HEAD ← active workspace │
│ └── config ← remotes, settings │
└─────────────────────────────────────────────┘
Core concepts:
- Workspace: An isolated linear namespace for one agent. Each has its own JSONL log.
- Snapshot: A point-in-time record of a workspace tree (SHA-256 content-addressed blobs + trees).
- Agent Log: Append-only JSONL file recording atomic file operations (
write,delete,rename) with blob IDs and timestamps. - Merge: Three-way merge of two workspace snapshots against their common base.
Installation
From GitHub Releases
# Download the latest release binary for your platform:
# https://github.com/celestia-island/noa/releases
From Source (Requires Rust 1.85+)
# Binaries: target/release/noa, target/release/noa-server
As a Library (Cargo)
[]
= { = "https://github.com/celestia-island/noa" }
Note: The package name on crates.io is libnoa (the name noa was already taken). The binary is still named noa.
Quick Start
Initialize in an existing git repo
Create agent workspaces and iterate
# Agent A works on auth feature
# Agent writes to its agent log
# (AI agents write JSONL directly; here is a manual example)
# Save the workspace state
Merge features and sync with git
Commands
Workspace Management
Snapshot Management
Remote Operations
Repository Operations
Git Integration
noa uses the system git CLI for all network operations. This ensures 100% compatibility with any git remote.
Push Workflow
noa snapshot → build tree → export files to working tree → git add -A → git commit → git push
Pull Workflow
git pull → read HEAD commit → import tree into noa (via gix) → create snapshot → update workspace head
Clone Workflow
git clone → import tree into noa → create default workspace → setup .gitignore
Key Design Decisions
- Export is additive: Only files in the noa snapshot are written to the working tree. Existing git-tracked files not in the snapshot are left unchanged.
- Import uses gix: For local tree traversal (no network needed). Network operations use system
gitCLI. .noa/auto-gitignored:noa initappends.noa/to.gitignoreso agent data never leaks into git history.
Compatibility
Platforms Tested
| Provider | Protocol | Push | Pull | Clone | LFS |
|---|---|---|---|---|---|
| GitHub | HTTPS, SSH | ✓ | ✓ | ✓ | ✓ |
| Bitbucket | HTTPS, SSH | ✓ | ✓ | ✓ | ✓ |
| GitLab | HTTPS, SSH | ✓ | ✓ | ✓ | ✓ |
| Local bare repo | file:// | ✓ | ✓ | ✓ | ✓ |
| SVN | svn:// | Import only | — | --svn |
— |
Git LFS
noa automatically detects Git LFS repositories:
noa clone: runsgit lfs install+git lfs pullfor LFS-tracked reposnoa push: runsgit lfs push --allafter git pushnoa pull: runsgit lfs pullafter git pull- LFS pointer files are imported as regular blobs into noa
SVN
This does svn export trunk → git init → noa import. It's a one-time import — for incremental sync, use svn export + noa snapshot create on a schedule.
Bitbucket
Both SSH (git@bitbucket.org:ws/repo.git) and HTTPS (https://user@bitbucket.org/ws/repo.git) URLs are supported natively through the git bridge.
API (libnoa)
libnoa exposes a Rust API for embedding noa functionality into other tools:
use Repository;
use SnapshotEngine;
use FileAgentLog;
// Open a repository
let repo = open?;
// Create a workspace
let ws_mgr = repo.workspace_manager?;
ws_mgr.create.await?;
// Build a snapshot from agent logs
let engine = new
.with_repo_root;
let snapshot = engine.compute.await?;
// Export snapshot to git
export_noa_to_git.await?;
See tests/smoke.rs and tests/compat.rs for more usage examples.
Building from Source
# Prerequisites: Rust 1.85+, git, pkg-config (optional for LFS/SVN)
# Build
# Output: target/release/noa (CLI), target/release/noa-server (API server)
# Run tests
# Start the noa server
NOA_PORT=3000 NOA_DB_PATH=/data/noa/server.redb
Related Projects
| Project | Relationship |
|---|---|
| entelecheia | Multi-agent orchestration platform. Consumes noa for agent workspace versioning. |
| tairitsu | WASM component model framework. Future: noa client as WASM component. |
| kirino | Zero-trust auth/RBAC. Used by noa-server for authentication. |
License
Apache-2.0. See LICENSE.