Tungsten Run many AI coding agents at once, without losing track of them.
Download for macOS Tabs hide things. A canvas doesn't. Tungsten gives every coding agent a real terminal on an infinite canvas, and its own git worktree if you want one, with your .env files copied over and dependencies installed before it starts.
Zoom out and the whole fleet is in front of you. You see the branch each agent is on, what it has changed, its pull request and whether its tests pass. Zoom in and it's just a shell. The diff, the commit history and a live preview of the dev server open beside the terminal that made them, and a terminal glows when its agent is waiting on you.
Works with , and , launched from the dock with your Claude and Codex plan limits in view. Anything else runs in a plain terminal.
Infinite canvas Launch in a worktree Review the work Live preview Watch the fleet Claude profiles
▐▛███▜▌ Claude Code v2.1.173
▝▜█████▛▘ Opus 5.5 · Claude Max
▘▘ ▝▝ ~/.tungsten/worktrees/acme-web/steady-ridge
> the checks link on the PR panel 404s. fix it and add a regression test
⏺ I'll trace where the checks URL is built and compare it with what
GitHub actually serves.
⏺ Search (pattern: "details_url|buildChecks", path: "src")
⎿ Found 3 files
⏺ Read (src/integrations/github/checks.ts)
⎿ Read 112 lines
⏺ Found it. The builder links /check-runs/{id} , which only exists in
the API; the web UI serves /runs/{id} .
⏺ Update (src/integrations/github/checks.ts)
⎿ Updated src/integrations/github/checks.ts with 1 addition and 1 removal
86 export function buildChecksDetailUrl(run: CheckRun): string {
87 - return `${run.repoUrl}/check-runs/${run.id}`
87 + return `${run.repoUrl}/runs/${run.id}`
88 }
⏺ Write (src/integrations/github/checks.test.ts)
⎿ Wrote 19 lines to src/integrations/github/checks.test.ts
⏺ Bash (pnpm test checks)
⎿ ✓ src/integrations/github/checks.test.ts (2 tests) 41ms
Test Files 1 passed (1)
Tests 2 passed (2)
⏺ Bash (pnpm lint)
⎿ (No content)
⏺ Bash (pnpm typecheck)
⎿ (No content)
⏺ Fixed. Check rows now link /runs/{id} , and checks.test.ts pins the
URL shape so the API path can't come back. Tests, lint and typecheck
pass.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
>
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
? for shortcuts
×
2 files +20 -1
src/integrations/github/checks.ts +1 -1 Edit 84 84 85 85 /** GitHub's own page for one check run. */ 86 86 export function buildChecksDetailUrl(run: CheckRun): string { 87 return `${run.repoUrl}/check-runs/${run.id}` 87 return `${run.repoUrl}/runs/${run.id}` 88 88 }
src/integrations/github/checks.test.ts +19 -0 Edit 1 import { describe, expect, it } from 'vitest' 2 import { buildChecksDetailUrl, type CheckRun } from './checks' 3 4 const run = { 5 id: 1842, 6 repoUrl: 'https://github.com/acme/acme-web', 7 } as CheckRun 8 9 describe('buildChecksDetailUrl', () => { 10 it('links the run page, not the API path', () => { 11 expect(buildChecksDetailUrl(run)).toBe( 12 'https://github.com/acme/acme-web/runs/1842', 13 ) 14 }) 15 16 it('never builds a /check-runs/ link', () => { 17 expect(buildChecksDetailUrl(run)).not.toContain('/check-runs/') 18 }) 19 })
×
fix/checks-detail-link9
fix/checks-detail-link refactor: name the checks URL builder Ada Park 12m 8c41e2a fix: open checks from the PR panel Ada Park 40m 3fa9d1c origin/fix/checks-detail-link feat: link each check row to GitHub Ada Park 3h b72e0f4 origin/main main Merge pull request #1838 from acme/fix/webhook-retry Jun Ito 1d e15c9a3 fix: back off webhook retries exponentially Jun Ito 1d 9a7f3c2 chore: bump next to 16.3.5 dependabot[bot] 2d 40d2b18 # v0.14.0 feat: saved carts behind a flag Sam Ortiz 3d c3e8a51 fix: round cart totals once, at the end Sam Ortiz 4d 71b0d9e feat: cart recovery email Jun Ito 6d 0e4f6aa ×
4 checks
test 2.1s lint 1.3s typecheck 1.7s build
×
http://localhost:3000/
acme Shop Saved Account Cart (2) Your cart Field jacket Olive · M $148.00
Merino crew Oat · M $86.00
+ Add the canvas tote Subtotal $234.00
Shipping Free
Total $234.00
Checkout Saved carts sync across devices.
×
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
>
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
? for shortcuts
×
New Claude session New Pi session New Codex session
Worktrees Skills
Claude usage 5-hour 58% · resets in 2h 14m Weekly 41% · resets Thu Default profile
Codex usage 5-hour 52% · resets in 3h 2m Weekly 37% · resets Sat
Every session is a real terminal on one plane. Drag panes by their header, pinch or ⌘-scroll to zoom, ⌘F to fit everything.
Open this page on a bigger screen to try the demo. Forged by Vinayak