be is a revision control system that works with abstract syntax trees, not
lines of text. It parses source files into ASTs using tree-sitter, stores them
in a key-value database (RocksDB), and diffs/merges at the level of functions,
classes, statements, and other structural units. Everything is URI-addressed.
The storage layer is pluggable, the architecture is open and extensible.
The core command language is HTTP-alike (get, post, etc).
be post # commit worktree to repo
be get # checkout repo to worktree
be diff # AST-level diff of local changes
be cat file.c#fn.Scan # CSS selector: function(s) named Scan
be grep needle # trigram-indexed search
be come feature # switch branch
be fit feature # merge branch
Dependencies: C compiler, cmake, librocksdb, libsodium, libcurl, liblz4.
# Ubuntu/Debian
sudo apt install clang ninja-build librocksdb-dev libsodium-dev libcurl4-gnutls-dev liblz4-dev
# macOS
brew install rocksdb libsodium curl lz4 ninja
# Build
cmake -B build -DCMAKE_BUILD_TYPE=Release -GNinja
ninja -C build be/be
cp build/be/be ~/.local/bin/
| Directory | What it does |
|---|---|
be/ |
CLI and core: post/get/diff/grep/cat, branching, milestones, sync |
ast/ |
Tree-sitter AST parsing (BAST) and CSS-like structural selectors |
json/ |
BASON binary JSON coding; BIFF N-way tree diff and merge |
rdx/ |
Replicated Data eXchange format — mergeable CRDTs, version vectors |
abc/ |
ABC C dialect — slices, buffers, typed records, no pointer arithmetic |
mark/ |
Deterministic Markdown dialect with a fixed Ragel grammar |
js/ |
JavaScriptCore bindings for scripting |
scripts/ |
CI and build automation |