Concepts

What Oak is

Oak is a purpose-built VCS designed for agent-driven development. It's the thing your coding agent (Claude Code, Codex, Cursor, etc.) can use to store code and assets.

Oak doesn't run agents. Bring your own. What Oak gives you is the storage and collaboration layer underneath: branch-per-session workflows and lazy mounts for large repos.

Oak ships today for macOS on Apple Silicon and Linux x86_64.

Organizations

An organization is the owner of repositories. Every account gets a personal organization (named after your username); you can also create shared organizations for teams and companies.

The organization is also the deduplication boundary for storage. Blobs and chunks are shared across every repo within the same organization, so a binary asset committed to two repos in the same org is stored once. Storage and bandwidth quotas are accounted at the organization level.

Repository URLs are <organization>/<repo> โ€” for example oakspace/oak.

Branches and descriptions

The unit of work in Oak is a branch, not a commit. oak init and oak clone auto-create a personal feature branch off main โ€” you never work directly on main locally. This matches how agents work: one branch per session, merged when the session is done.

Commits on feature branches have no commit message. Instead, the branch description is the source of truth for what a change introduces. Create a branch with oak switch -c <name> and set its description with oak desc "...".

Merging a feature branch into main produces a single squash commit whose message is the branch description. The squash commit retains a pointer to the original branch tip, so the pre-squash history stays reachable for tooling. Direct pushes to main are refused.

Working with agents

Oak doesn't run agents โ€” bring your own (Claude Code, Codex, Cursor, etc.). The model below is what keeps an agent-driven workflow tidy:

  • One branch per session. oak clone and oak init already drop you onto a personal feature branch off main. Start each agent run on its own branch so a session you don't like can be abandoned without touching main. Branches are cheap by design.
  • Have the agent set the branch description. Commits carry no message, so oak desc "..." is the source of truth for what the change does โ€” and it becomes the squash-merge message on main. Ask the agent to write it for a reviewer, not as a list of touched files.
  • Give the agent the docs. Use the Copy page button at the top of this page to paste the concepts and CLI reference straight into your agent's context, so it knows the commit workflow before it starts.
  • Agent commits, you merge. Let the agent commit on the feature branch and stop there. Review the diff and run the merge to main yourself โ€” merging is a human decision.
  • Mount large repos instead of cloning them. For monorepos, oak mount gets the agent editing in seconds rather than waiting on a full pull.

Oak makes no AI calls on your behalf and never trains on your code. Whatever agent you bring is its own integration with its own privacy posture.

Lazy mounts

oak mount lets a working tree live on top of a remote repository without a full local clone. Files materialize lazily through a FUSE filesystem as you touch them, so you can work against a multi-gigabyte monorepo with seconds-to-first-edit instead of waiting for a full pull.

Edits go into a virtual branch backed by a local mount cache. The overlay (modified, deleted, and renamed paths) is the active commit โ€” the logical commit you're amending as you edit. oak commit finalizes that active commit onto the virtual branch; oak push sends it upstream.

Inside a mounted directory, top-level commands (oak status, oak commit, oak log, oak diff) automatically route to the mount-aware code path, so mounted and locally-cloned repos feel identical at the command level.

Mount requires the CLI built with --features mount plus a FUSE backend installed โ€” macFUSE on macOS, libfuse on Linux. See Setting up mount permissions below for the one-time setup.

Setting up mount permissions

Lazy mounts rely on a FUSE filesystem, which needs a one-time permission grant per machine. The CLI must also be built with --features mount.

macOS (macFUSE)

  1. Install macFUSE: brew install macfuse.
  2. macFUSE installs a system extension that macOS blocks until you approve it. Open System Settings โ†’ Privacy & Security, scroll to the Security section, and click Allow next to the message about system software from the macFUSE developer being blocked.
  3. Reboot once when prompted โ€” the kernel extension only loads after a restart. After rebooting, oak mount oak/oak works.

Linux (libfuse)

  1. Install FUSE: sudo apt install fuse3 on Debian/Ubuntu (use your distro's equivalent elsewhere).
  2. If your agent or editor runs as a different user โ€” or in a sandbox โ€” and needs to see into the mount, enable user_allow_other by uncommenting that line in /etc/fuse.conf.
  3. On distros that gate FUSE behind a group, make sure your user is a member (commonly the fuse group), then re-log so the membership takes effect.

Verify the setup with oak mount oak/oak followed by oak mount list. If the mount fails to attach, the error almost always points back at one of the steps above.

Git import and export

oak clone <gitrepo> is the import path from git into Oak. When the argument looks like a git remote URL, Oak shells out to git clone, initializes an Oak repository in the destination directory, then replays the cloned git history into Oak on main. By default the destination directory is derived from the git repo name; pass a destination path as the second argument to choose it yourself.

The CLI's oak export <dest> command is the local counterpart: replay your Oak history into a fresh git repo on disk. This is the documented escape hatch โ€” your data is never trapped in Oak's format.

oak clone <gitrepo> replays git history into Oak, while oak export replays Oak history back into git. Push code with oak push.

Data portability

The trust story is the export path above: any Oak repo can be replayed into a fully-functional git repo at any time with oak export.

If you want to leave, you can โ€” with full history intact.