Stop choosing between polyrepo chaos and monorepo migration.
Code Federation gives you the unified-codebase experience without restructuring your repositories. Federate now; un-federate any time.
- ├─ .github/base
- ├─ api/
- │ ├─ billing/api-protos
- │ └─ user.protoapi-protos
- ├─ gen/
- │ └─ user.pb.gogenerated-go
- ├─ web/
- │ ├─ Home.tsxweb-app
- │ └─ styles.cssweb-app
- ├─ BUILDbuild-infra
- ├─ MODULE.bazelbuild-infra
- └─ README.mdbase
Polyrepo or monorepo. Both are broken.
Every engineering organization eventually faces the same fork in the road. Both paths cost.
Polyrepo
closeFragmented- closeDuplicated tooling and CI
- closeGovernance impossible to enforce
- closeCross-repo changes take days
Monorepo migration
timerCostly- closeMulti-quarter migration project
- closeCustom build infrastructure
- closeTooling breaks at scale
Code Federation
checkReversible- check_circleOne unified workspace
- check_circleNo migration. Your repos stay put.
- check_circleReversible at any time
A federated layer over the repos you already have.
Code Federation composes any number of repositories into a virtual monorepo — mounted, not cloned. Developers see one tree. Changes route back to native commits in each upstream.
-
layers
Federation
ComponentComposes any number of upstream repositories into a virtual monorepo, and routes outbound changes back to each one through a Federated PR.
-
cloud_sync
Federated Remote Workspace
ComponentA per-user state layer that holds your edits, branches, and index against the virtual monorepo. Materialized lazily; nothing on disk by default.
-
terminal
gitfs
Local clientA thin FUSE client that mounts a Workspace as a local directory. Your IDE, your git CLI, and your scripts work against it unchanged.
-
shield
Governance
PropertyNot a separate product. Every API publishes structured events, every Workspace runs as an authenticated principal, and the layer model lets platform teams own paths across repositories by construction.
-
smart_toy
Agent context
PropertyBecause the whole federation mounts as one real directory, coding agents like Copilot, Claude Code, Cursor, and others get a 360° view across every repository — not just the one you cloned. See how →
Federation
A virtual monorepo composed of upstream repositories arranged as layers. The Federation API defines the stack and its order; on commit, a routing file fans changes back to the right upstream.
Layers stack like a Docker image: the topmost layer wins on conflicts; lower layers contribute everything the top hasn’t claimed. Platform teams own shared paths — build configuration, CI definitions, schemas — while individual teams own everything else in their own repositories.
Developers see a single tree with the full commit history of every layered repository merged into one DAG. They branch, commit, and push as they would in any Git repository, without knowing how many repositories are underneath.
Upstream repositories as layers
Top wins on conflict.
One tree, one history
Resolved files, tagged by source layer.
- ├ .github/L0
- ├ api/
- │ ├ billing/L1
- │ └ user.protoL1
- ├ web/
- │ ├ Home.tsxL2
- │ └ styles.cssL2
- ├ BUILDL0
- ├ MODULE.bazelL0
- └ README.mdL3
FEDERATION.sky fans out to upstreams
First rule that matches wins.
Hover a layer to see what it contributes and where it lands. The Federation API defines what stacks; FEDERATION.sky defines where commits go on the way out. Unmatched files fall to the Federated PR’s default repository.
The Federated PR lifecycle
-
1Plan. Code Federation generates a deterministic rollout plan — exactly which commits, trees, and blobs will be written to which repositories. If anything changes underneath, the plan is rejected and a new one is required.
-
2Rollout. Code Federation writes the planned commits directly to the target branch of each upstream repository. Reviews happen once, in the Federated PR.
-
3Speculative rollout (coming soon). For organizations that require upstream review on each repository, Code Federation can instead open native pull requests in each upstream and merge them when their preconditions are met.
One change. Three repositories. One review.
A protobuf API definition with artifacts in three repositories. Today: three PRs, three reviews, manual sequencing — and a coding agent that can only see one of them at a time. With Code Federation, the whole change (and the agent driving it) works across all three:
Mount the Workspace
Three upstream repositories — api-protos, build-infra, generated-go — layered into one Workspace, mounted as a local directory.
Edit the source you own
Add a name field. Update the BUILD rule. Two files, two repositories — the generated gen/user.pb.go comes next, server-side.
Server tasks regenerate artifacts on save Coming soon
Reactive, server-side. When you save a .proto (not commit), a task subscribed to that path runs in the Workspace API, regenerates gen/user.pb.go, and materializes it back into your mount — like CI, but at save granularity and against your in-progress edits.
Not CI. CI runs after a push and writes to artifacts. Server tasks run on save, inside the Workspace API, and write directly into your in-progress working tree. The Federated PR (Step 05) still fans the generated file out to generated-go on rollout — you just didn’t have to author it.
Commit — gitfs moves objects upstream
A commit moves your three working-tree edits from the per-user Workspace API (mutable WIP) into the shared Repository API (immutable, content-addressed) — the same way git push moves local commits to a remote.
Open a Federated PR
FEDERATION.sky routes each file in the commit to its destination upstream. Each routed group becomes a per-repository diff inside one PR.
Rollout — click to run
After approval, the PR rolls out as native commits in each upstream. Hit Run rollout to watch it land.
Federated Remote Workspace
A per-user state layer on top of the virtual monorepo. Mounted, not cloned. Your laptop becomes a thin client.
Committed objects are shared, content-addressed, and immutable; your edits, branches, and index are private. The Workspace mounts as a local FUSE filesystem — git status, git add, git commit, your IDE all work unchanged. Nothing is on disk by default. Objects materialize lazily as you read.
No multi-terabyte clones.
Large monorepos that would refuse to clone — or take hours to do so — mount in seconds. Working tree size is bounded by what you actually touch.
Portable across devices.
Your in-progress work lives server-side. Open your laptop in the morning, mount the same Workspace on a different machine in the afternoon, finish the commit from a third device. Nothing to copy, nothing to lose.
Faster onboarding.
A new engineer doesn’t run git clone, make bootstrap, or fight a toolchain. They authenticate, mount the Workspace, and start reading code.
A Workspace, end to end
From creating a codebase to pushing a commit — plus a glimpse of what’s next.
Create a Workspace, then mount it
Same shape as a Federated PR: pick the codebase, name the Workspace. The server allocates per-user state (HEAD, branch refs, an empty index) against the existing virtual monorepo — no bytes copied yet. Then one CLI command attaches a FUSE filesystem at a local path.
- folder.git/created
- description.git/HEADwritten
- description.git/configwritten
- folder.git/refs/heads/created
- folder.git/objects/info/ · pack/created
- description.git/packed-refswritten
- description.git/indexwritten
Listing a directory materializes its tree
First, attach a FUSE filesystem at a local path. Then run ls and the kernel asks gitfs for that path. gitfs fetches just the tree metadata from the Repository API — entries, modes, object IDs — never the file content. The kernel returns the listing; nothing is on disk yet.
- ├ api/listed
- │ ├ billing/not fetched
- │ └ user.protonot fetched
- ├ BUILDnot fetched
- ├ FEDERATION.skynot fetched
- ├ gen/not fetched
- └ README.mdnot fetched
Blobs download only when you read them
Open api/user.proto in your editor: the kernel asks for content, gitfs requests the blob by content-address from the Repository API and streams it back. Once fetched, it’s cached for re-reads. Working tree size grows only with what you touch.
- ├ api/listed
- │ ├ billing/not fetched
- │ └ user.protodownloaded · 412 B
- ├ BUILDnot fetched
- ├ web/listed
- │ └ Home.tsxdownloaded · 2.4 KB
- └ README.mdnot fetched
Push commits to the virtual monorepo
Save uploads your edit to the Workspace API. git commit turns staged edits into a commit; its blobs and trees move into the Repository API as content-addressed objects — the same way git push moves local commits to a remote.
How gitfs merges the two APIs
The Repository API serves immutable, content-addressed objects. The Workspace API serves your private, in-progress state — including a per-user .git/ directory. gitfs materializes both and lets Workspace API objects override Repository API objects wherever their paths overlap.
- .git/user-only
- .git/HEADuser-only
- .git/indexuser-only
- api/user.protooverrides
- BUILDWIP edit
- api/user.protoshadowed
- api/billing/
- gen/user.pb.go
- web/Home.tsx
- README.md
- W.git/user-only
- Wapi/user.protoWIP edit overrides shared
- Rapi/billing/
- WBUILDWIP edit
- Rgen/user.pb.go
- Rweb/Home.tsx
- RREADME.md
Built for governance
The federated layer is the right place to enforce policy. Repository-level permissions on GitHub and GitLab cannot express “this team can read everything in api/ but only modify api/billing/” — they were never meant to.
Code Federation’s architecture is built around what governance requires: every mutation publishes a structured event, every Workspace runs in the context of an authenticated identity, and the layer model lets platform teams own shared paths across repositories.
Event-sourced
Every mutation across the Federation, Repository, and Workspace APIs publishes a structured event. The audit trail is a property of the system, not a feature you turn on.
Identity-aware
Every Workspace, every Federated PR, every routing decision happens in the context of an authenticated principal. There is no “anonymous read” path to file content.
Layer-bound ownership
Because layers stack with explicit priority, the platform layer can own paths that tenant layers cannot override. Ownership is enforced by composition, not by convention.
Per-path ACLs, file-level audit logs, and policy enforcement at routing time grow naturally on these foundations — not bolted on later.
Coding agents work better with a 360° view.
Copilot, Claude Code, Cursor, and others are scoped to the repository you opened. The definitions, build rules, and callers they need often live in a repository they can’t see — so they guess. Code Federation mounts every upstream as one tree, giving the agent the whole picture.
Repo-scoped agent
errorPartial context- ✗Guesses at APIs and types that actually live in another repo
- ✗Can’t open the build rule that compiles the change
- ✗A cross-repo edit stops dead at the repository boundary
Federation-mounted agent
check_circle360° context- ✓Reads the real definition across every upstream, not a guess
- ✓Follows types and callers straight through repo boundaries
- ✓Edits and commits span repos, landing in one Federated PR
Agents are only as good as the context they can reach. Because Code Federation composes your repositories into one virtual tree — and mounts it as a real directory through gitfs — any agent that works in a folder now works across your whole infrastructure. No new integration to build; the 360° view is just the filesystem.
Why not submodules, or a monorepo?
Code Federation is a new shape. Compare against the alternatives.
Monorepo migration
A multi-quarter project. Custom build infrastructure (Bazel at scale). Tooling that breaks above a certain size — git status, IDE indexers, CI. Often shelved before completion.
The unified experience without the migration. Existing repositories stay where they are. Reversible at any time by dissolving the Workspace.
Git submodules
Submodule state is managed by every consumer by hand. Updates are manual, two-step, easy to forget. No unified history. Generated artifacts and cross-repo refactors are painful.
Cross-repository composition is invisible to consumers. They see one tree, one history. Routing on commit replaces the submodule update dance.
Git subtree
History bloat. Updates require subtree-aware commands. Pushing changes back upstream is awkward.
No history copying. Each upstream repository remains the source of truth; Code Federation routes commits back to it natively.
Shallow / partial clones
Still per-repository. Misses objects you suddenly need. Tools and CI pipelines often don’t cope well. Doesn’t address fragmentation across repositories.
No clone at all. Objects materialize lazily as you read them. The unit of composition is many repositories, not one.
VFSForGit / EdenFS
Designed for the single-monorepo case. Not federated across repositories. Operationally heavy.
Same mount mechanic, extended to a virtual monorepo composed of multiple existing upstream repositories with routing back to each.
Bazel workspaces
Solves builds, not the developer experience of working across repositories. Doesn’t unify source, doesn’t unify reviews, doesn’t unify history.
Sits on top of Bazel rather than replacing it. The virtual monorepo unifies the source view; Bazel still owns the build graph.
What’s next
Code Federation is in alpha. Here’s what we’re working on, in rough order. Status badges reflect implementation state, not commitment to ship.
Speculative rollout strategy
BuildingFan out a Federated PR as native pull requests in each upstream repository, with per-repository review and approval before merge.
Web Console rebuild
BuildingA redesigned web console for managing codebases, Workspaces, and Federated PRs — with first-class views of routing rules, rollout status, and audit events.
macOS support
BuildingFirst-class FUSE mount on macOS, on par with the Linux implementation.
Reactive task execution
DesigningServer-side build and codegen pipelines that respond to file events in your Workspace and write generated artifacts back into the mount.
Per-path access control
DesigningFine-grained ACLs at the path level, enforced uniformly across federated repositories.
File-level audit log
DesigningQueryable, immutable log of who accessed which path, when, and through what action.
Agent integration & MCP server
DesigningA Model Context Protocol server that exposes the virtual monorepo — resolved tree, routing rules, and layer ownership — so coding agents can navigate and change your whole infrastructure with full context, not just the mounted filesystem.
VS Code extension
ExploringA workspace-aware editor extension that surfaces routing, sync state, and Workspace operations directly in the IDE.
Issue and release federation
ExploringExtending federation beyond source files to issues, releases, and tags across upstream repositories.
If something on this list is critical to your team, let us know in the waitlist form. We prioritize based on real adoption signal.
Get early access
Share your email; we’ll follow up to understand your use case before granting access.