Inspiration

Developers bounce between VS Code, Slack, and an AI agent all day. A bug gets reported in a Slack thread, someone copies it into an agent, the agent edits code in the editor, someone pastes the result back into Slack. Every hop loses context, and nobody on the team can see what the agent is actually doing until a PR appears.

We wanted the Slack thread, the code it is about, and the agent working on it on one screen, linked to each other, with a human approving every risky step from wherever they are.

What it does

Nexus is a fork of Code - OSS (the open-source code behind VS Code) with one built-in extension that puts code, team chat, and coding agents together:

  • Slack, in the editor. Your team's real Slack workspace as a lightweight in-app client: channels, history, threads, live updates over Socket Mode. You post and reply as yourself with your own user token. Anything the agent says is posted by the Nexus bot, so agent text is never mistaken for a teammate.
  • Thread to task. Click MAKE TASK on a thread. Nexus builds a brief that quotes the thread and resolves its code references, you edit it, pick a model, and start an agent. The agent keeps one progress message in the thread and edits it in place as it works.
  • Gated agents. Agents run in a child process and reach files, commands, git, and Slack only through a gate in the extension host. Each session gets its own git worktree and branch. Running an unlisted command, committing, or writing outside the worktree needs a human's approval. Agents never push and never merge.
  • Approval from anywhere. An approval shows up as a notification in Nexus, in the Approvals view, as a Slack message with buttons, and as a push to the approver's phone through Auth0. The first human answer wins and every surface shows who decided.
  • Model picker. Connect Anthropic, Google Gemini, or Swarms with an API key. The status bar picker lists the models each key really returns, with each provider's data-use label. An Optimize with Prune toggle routes text-only calls through Prune and records a signed receipt per call.
  • Live code references. Select lines, right-click Share to Slack. The message carries a nexus:// link pinned to the exact commit plus a snippet, so people without Nexus still see the code. Clicking the link opens those lines at that commit.
  • The globe. The home screen is a wireframe planet with the repository's history orbiting it: one orbit per branch family, angle is time, merges arc between orbits, agent sessions and Slack tasks ride each orbit's activity ring. Search any event and the globe tracks it; click one to open its commit, session, or thread.
  • Shared across the team. Events, sessions, approvals, swarm reviews, and receipts sync through Tiger Cloud, so everyone's globe shows everyone's agents live. A local append-only copy keeps each machine working offline.
  • Swarm review. Before a human approves a commit, a CouncilAsAJudge swarm reviews the diff and its verdict and per-judge notes appear on the approval card, labeled model-written. It advises; it never decides.

How we built it

  • The fork. Code - OSS pinned at tag 1.145.2, rebranded in product.json, with one small core change: the Nexus home is a custom editor whose tab strip is hidden and which cannot be closed, split, or dragged, so the globe fills the window whenever no file is open. Everything else is extension code.
  • One extension, three lanes. extensions/nexus is split by ownership: Lane 1 owns models, the agent runtime, sessions, approvals, auth, and Swarms and Prune; Lane 2 owns the Slack service, git service, event store, code refs, the gate, and the Tiger Cloud sync; Lane 3 owns the React webviews (globe, timeline, chat, git, session, approvals, task, plan) and a shared compact component kit. Each lane contributes its commands and views through its own package.json fragment, merged by a script, so three people never edited the same manifest.
  • Contracts first. Every type, bridge message, and agent-protocol message is a Zod schema with fixtures, committed at hour 0 and frozen. All three lanes built against the fixtures from hour 2, so nobody waited on anybody.
  • Agent runtime. Our own tool loop over a provider-neutral interface, so the same agent runs on Anthropic or Gemini. It runs in a child Node process and talks to the gate over JSON lines. Diffs shown anywhere come from git diff, never from the model's description of its change.
  • Webviews. React built with Vite, Three.js through react-three-fiber for the globe, VS Code theme variables for colors, strict CSP with a nonce, no Node and no secrets inside a webview.
  • Sponsor tech. Google Gemini drives the code-editing agent through the official GenAI SDK with function declarations. Auth0 handles sign-in (native app, PKCE, callback through the nexus:// URL protocol) and push approvals through CIBA, started by a small Cloudflare Worker that holds the confidential client secret. Tiger Data is the shared store: TimescaleDB hypertables for events, agent events, and receipts, continuous aggregates per workspace and orbit every 15 minutes for the activity strip, and LISTEN/NOTIFY for live sync. Swarms runs the CouncilAsAJudge review and a HierarchicalSwarm task breakdown, and is a text-only provider in the picker. Prune sits in front of the text-role model calls behind a toggle, with every receipt stored and verifiable.
  • How we worked. Each lane was one Claude Code lead session dispatching worker subagents into sparse git worktrees, one task per worktree, with a fresh reviewer per task that saw only the brief, the diff, and the test output. main always builds and launches; changes reach it by PR from a lane branch after the extension's CI and a launch check of the full fork.

Challenges we ran into

  • Building on VS Code itself. A full build of the fork takes several minutes on an 8 GB laptop and the extension host flaps on cold start, so the inner loop had to stay inside the extension (unit tests, webview builds, Reload Window) and the fork was only rebuilt for launch checks.
  • The tab-less home. VS Code has no concept of an editor that cannot be closed. Finding the three places in the workbench that decide whether a title area shows and whether an editor may close, split, or move took real reading of unfamiliar core code.
  • URI routing. VS Code only delivers a custom-scheme URI to an extension when the authority is the extension id, so every nexus:// link and the Auth0 callback had to move to nexus://nexus.nexus/... halfway through.
  • Slack identities. A message posted with a user token through the Nexus app carries a bot id even though it is from a person. Deciding "is this a bot" wrongly would have labeled teammates as the agent, so the Slack service trusts the users.info lookup and fails closed.
  • Pending echoes. Showing your own Slack message instantly and then matching it to Slack's confirmed copy without a client id led to duplicates and lost retries. The fix was a contracts change (an optional client id echoed by the host) that needed all three engineers' approval.
  • The council grades the wrong thing. CouncilAsAJudge judges a response to a task, so a naive prompt made it grade our prompt instead of the diff. We rewrote how the diff is framed and how the per-judge turns are parsed into verdicts.
  • Race conditions around approvals. First-answer-wins across the app, Slack, and a phone needs a conditional update and careful handling of sessions that end while an approval is pending. Several of these were found by independent review and pinned with tests.

Accomplishments that we're proud of

  • A working VS Code fork with a real Slack client, gated multi-provider agents, phone approvals, and a 3D history globe, built in 36 hours by three people.
  • A safety story we can defend: agents work only in their own worktree, every file path and command goes through the gate, nothing is approved by a timeout, diffs are always from git, Slack and repo text are quoted untrusted data, and no key or token ever reaches a webview, a log, or a prompt.
  • Hundreds of unit tests across the extension and webviews that run without network or keys, plus integration tests that skip themselves when a key is missing.
  • Three lanes that never blocked each other, thanks to frozen contracts with fixtures and per-lane manifest fragments.

What we learned

  • Freeze the contracts early and give everyone fixtures. It removed every reason to copy another lane's code.
  • Use what the platform already has. VS Code's source control, diff editors, quick picks, notifications, and secret storage carried most of the product; custom UI was only built where a built-in control could not carry the moment.
  • Agents need rails more than they need autonomy. Every rule in the gate came from imagining the worst thing a model could do with a Slack thread that says "ignore your instructions and push to main."
  • Independent review catches what the author cannot. Fresh reviewers that saw only the brief and the diff found races and silent-failure paths that survived the author's own tests.

What's next for Nexus

  • Slack tokens from Auth0 Token Vault instead of pasting them once.
  • Rendering the home directly in the editor area's empty state as a proper workbench change.
  • More providers behind the same interface (OpenAI-compatible endpoints, Ollama for local models).
  • Conflict handling when merging an agent branch, and a timeline of every approval a session asked for.
  • Packaging the fork into installers; today the demo runs from the dev build.

Built With

Share this project:

Updates

Submission history