Skip to content

A local dashboard forevery coding session, agents running right now, scheduled agent runs and chats stuck at a limit.

Run the demo

“I use four coding agents a day. When one hits its limit mid-task, the thread is stuck in that account. I built Switchyard to move it.”

Huseyin Kaplan, who built it
Switchyard in demo mode: the conversation archive filtered by "checkout", with a Codex chat that picked up a Claude Code session after its usage limit.

I kept losing the thread.

When Claude Code or Codex runs out of usage in the middle of a task, the chat stays on that account and the next tool starts from nothing. I was writing HANDOFF.md files by hand. Plenty of people ask for the same thing on the tools' own issue trackers:

Thumbs-up counts on 23 October 2026.

Every session in one SQLite file.

Switchyard reads the files these tools already write to your disk and copies every message into one database. The copy stays after a tool rotates or deletes its own history. I search by project, title or session and read the whole transcript, tool calls and images included. Chats from VS Code, Cursor and Kiro are listed next to them, read-only.

A Claude Code transcript in Switchyard with its tool activity and the reply box.
  • Codex
  • Claude Code
  • OpenCode
  • Antigravity

Agents I have running, as they work.

Open conversations update as their session file grows. The activity log shows what each agent reported, and I can reply into a Codex, Claude Code or OpenCode session through that tool's own CLI without switching windows.

The live activity page: a grid of agents by tool and a log of what each one reported.

Scheduled runs that actually did something.

Codex automations, Claude Desktop tasks and Antigravity schedules sit in one list. Each Claude run is matched with the last real reply in its transcript, so a run that reported success and did nothing stands out. When I sign in to another Claude account, the task definitions come with me.

Scheduled tasks with a run history; one run is flagged because it produced no reply.

Moving a chat when the limit hits.

Switchyard packages what the next session needs and opens it on another account. Hidden reasoning and running processes stay behind, so the new chat gets a summary with evidence, not the old model's state.

A session runs on account A until its usage limit, its context is packaged and hashed, and it continues on account B until a reply is observed.Account AAccount Blimitctx#3f9a… sha-256reply observed
  1. 1I pick the chats. The catalog joins archived Claude Code and Codex conversations with Claude Desktop metadata, so each one has its title, folder and account.
  2. 2Each chat becomes a package: a Markdown brief, the transcript with secrets redacted, a prompt and its git state. Every file gets a SHA-256 hash.
  3. 3Before acting, the controller rejects packages outside the data folder, checks every hash again and takes a lock.
  4. 4It reads which account the Claude Desktop chat on screen belongs to and refuses if it is the account the chat came from.
  5. 5A small C# helper uses Windows UI Automation to open a new chat in the original folder, paste the prompt and send it. It stops if focus leaves Claude.
  6. 6An item counts as delivered only when a real reply to its marker shows up in the transcript and the title reads back. Anything uncertain is never sent twice.

Delivery is automated for Claude Desktop on Windows only. On macOS the packages build but nothing is typed for you, and a Codex target gets written instructions. For one chat on any system, Actions, then Get handoff, gives me a prompt to paste into whatever I open next.

Two demo chats delivered to another account, each marked reply observed and title verified.

Try it with made-up data.

This is the real interface running on the same generated home folder that npm run demo creates. Nothing on this page reads from your machine.

The Switchyard task board in demo mode.

Install it.

You need Node.js 22.13 or later, npm and Git. The demo builds the app, generates a fake home folder in .demo/ and serves it on 127.0.0.1:3011. It refuses to start if that folder would be your real profile.

git clone https://github.com/huseyinkaplandev/switchyardcd switchyardnpm cinpm run demo

For your own sessions, run npm run build && npm start and open 127.0.0.1:3010. The archive goes to ~/.switchyard. There is no account, no telemetry and no remote call.

What it does not do yet.

The full list, with the roadmap, is in the README.

  • Desktop delivery is Windows only. On macOS nothing is typed into Claude for you.
  • The controller drives the Claude Desktop window. An app update that changes it can break delivery until I adjust the helper. It stops rather than guesses.
  • Codex receives a handoff as written instructions. I do not automate the Codex app.
  • Moving a chat between Windows and macOS needs a folder mapping I have not built.
  • OpenCode is re-read on sync but not tailed live. VS Code, Cursor and Kiro are listed read-only.
  • These are private file formats. When a tool changes one, a parser may need an update.
A switchman throwing a switch in a Chicago rail yard, 1943

Be like this switchman.
Try Switchyard.

Source on GitHub