[English] • 简体中文 • 繁體中文 • 日本語 • 한국어 • Français • Español • Русский • العربية
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.
Why noa
| Challenge | Git | noa |
|---|---|---|
| Concurrent writes | Lock files, merge conflicts | Per-agent JSONL append-only logs |
| Agent identity | user.name/email per repo | Workspace-scoped agent_id |
| Partial contributions | All changes in working tree | Agent logs only touched files |
| Iteration tracking | Rebase/squash destroys history | Immutable snapshot chain per workspace |
| Multi-agent merge | Three-way text merge | Merge snapshots, file-level conflicts |
| Git compatibility | N/A | System git CLI bridge |
Table of Contents
- Why noa
- Architecture
- Installation
- Quick Start
- Commands
- Git Integration
- Compatibility
- API (libnoa)
- Building from Source
- Related Projects
- License
Architecture
graph TD
subgraph WT["Working Tree (.git + .noa coexist)"]
direction LR
subgraph NOA[".noa/"]
DB["noa.redb<br/>(embedded KV store)"]
LOGS["agent-logs/"]
HEAD["HEAD"]
CFG["config"]
end
end
subgraph DB["noa.redb Tables"]
direction LR
BLOBS["blobs<br/>(content-addressed)"]
TREES["trees<br/>(directory snapshots)"]
SNAPS["snapshots<br/>(metadata + hash chain)"]
WS["workspaces<br/>(agent partitions)"]
REFS["refs<br/>(symbolic pointers)"]
end
subgraph LOGS["agent-logs/"]
direction LR
DL["default.log<br/>(main workspace)"]
F1["feat-*.log<br/>(feature workspaces)"]
end
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
flowchart LR
A["noa snapshot"] --> B["build tree"]
B --> C["export files to working tree"]
C --> D["git add -A"]
D --> E["git commit"]
E --> F["git push"]
Pull Workflow
flowchart LR
A["git pull"] --> B["read HEAD commit"]
B --> C["import tree into noa (via gix)"]
C --> D["create snapshot"]
D --> E["update workspace head"]
Clone Workflow
flowchart LR
A["git clone"] --> B["import tree into noa"]
B --> C["create default workspace"]
C --> D["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.