Spawn Claude Code, Codex or any CLI as a real PTY/TUI tile. Pan, zoom, arrange them however you want. Status flips Configuring → Working → Done live from the session itself — no edges or wiring.
nyx canvas · sprint-14
claudeOpus 4.7 · writing4m
you
>
claudeOpus 4.7
writing task
reading src/server/auth.ts
mapping attack surface
drafting patch (6 files)
✓ ready · +142 −38 · 6 files
codexGPT 4.5 · writing2m
you
>
codexGPT 4.5
idle
pulling last 24h OpenTelemetry spans
spotting 3 N+1 queries in middleware
drafting parallel fetch
✓ root cause · p95 → 210ms projected
terminalzsh · ~/projects/nyx3 cmds
$pnpm install
→Lockfile is up to date · resolving…
→Progress: resolved 847, reused 847
✓Done in 3.2s
$git status
On branch feat/auth-hardening
Changes not staged for commit:
modified: src/server/auth.ts
modified: src/server/middleware.ts
$pnpm test src/server/auth
✓auth › rateLimit › blocks > 5 tries (42ms)
✓auth › login › logs attempt (18ms)
✓2 passed · 0 failed · 0.71s
$▊
browserlocalhost:3000pick mode
‹
›
↻
◆localhost:3000/admin/orders
pick
Orders
Q4 · last 30 days
Revenue
$184,209
+12.4%
Orders
2,847
+6.1%
Refunds
28
−3.2%
Daily revenue
↗ 12.4%
Order
Total
Status
Ago
#8421 · Klein
$248.00paid2m
#8420 · Reyes
$189.50paid8m
#8419 · Tanaka
$92.00pending11m
#8418 · Andersson
$418.70paid24m
tr[8420]→agent
review6 files · +142 −38unreviewed
export async function login(email) {
- const user = await db.users.find({ email });
+ await rateLimit.check(email);
+ const user = await db.users.find({ email });
+ await audit.log("login.attempt", { email });
return sign(user);
}
◈ 2 agents · 3 tiles · workspace / sprint-14
● working · 2✓ ready · 1zoom 28% · fit
[ §02 ]Worktrees
Tab juggling ends here.
You know the dance: stash, cd, checkout, npm install, hope nothing breaks. Three tabs deep into a fix, your editor is two branches behind.Worktrees give every branch its own folder. Drop them on the canvas as zones — agents work side by side, each in their own working directory.
Hit the shortcut, a tile spawns where the agent runs, where the output shows, or where you review the diff. Every tile is resizable, connectable, persists per workspace.
agent— live preview
you
>
claudeOpus 4.7
writing task
reading src/server/auth.ts
mapping attack surface
drafting patch (6 files)
✓ ready · +142 −38 · 6 files
01 · agent
Spawn any CLI agent as a real PTY session. Slash commands and prompts stay native.
[ §03 ]Focus mode
Hit ⌘⏎ Canvas folds into a split pane.
Pair one tile with one agent. Everything else collapses. The real Focus layout is a resizable split — drag the divider, hit Esc to exit.↻ auto-demo · click to drive
terminal— zsh
$pnpm install
→Lockfile is up to date · resolving…
→Progress: resolved 847, reused 847
✓Done in 3.2s
$git status
On branch feat/auth-hardening
Changes not staged for commit:
modified: src/server/auth.ts
modified: src/server/middleware.ts
$pnpm test src/server/auth
✓auth › rateLimit › blocks > 5 tries (42ms)
✓auth › login › logs attempt (18ms)
✓2 passed · 0 failed · 0.71s
$▊
browser— localhost
‹
›
↻
◆localhost:3000/admin/orders
pick
Orders
Q4 · last 30 days
Revenue
$184,209
+12.4%
Orders
2,847
+6.1%
Refunds
28
−3.2%
Daily revenue
↗ 12.4%
Order
Total
Status
Ago
#8421 · Klein
$248.00paid2m
#8420 · Reyes
$189.50paid8m
#8419 · Tanaka
$92.00pending11m
#8418 · Andersson
$418.70paid24m
tr[8420]→agent
todo— sprint 14
Add rate limit to /login
Ship audit log for auth⟳ running
Write e2e tests
Deploy to staging
chat— codex
you
why is /login slow?
◈ codex
three sync db calls in middleware. i'll parallelize.
diff— +14 −6
export async function login(email) {
- const user = await db.users.find({ email });
+ await rateLimit.check(email);
+ const user = await db.users.find({ email });
+ await audit.log("login.attempt", { email });
return sign(user);
}
notes— sprint 14
sprint 14
auth refactor · observability · ship friday
"the tool for people who ship"
editor— auth.ts
1
export const runAgent = async (task: Task) => {
2
const spec = await parse(task);
3
const plan = await claude.think(spec);
4
// stream diff back to canvas
5
return stream(plan, { canvas, review: true });
6
};
agent— claude
you
>
claudeOpus 4.7
writing task
reading src/server/auth.ts
mapping attack surface
drafting patch (6 files)
✓ ready · +142 −38 · 6 files
◯ canvas · hit ⌘⏎ to focus the two centered tiles
[ §04 ]Diff review
Review your agent like a pull request.
Leave inline comments. Click Send Review. The agent reads your feedback and iterates — no copy-paste.
diff— auth.ts +14 −6
1export async function login(email, pwd) {
2+ const blocked = await rateLimit(req.ip);
3+ if (blocked) return tooMany();
4 const user = await User.findOne({ email });
5- if (!user) throw new Error("nope");
6+ if (!user) return invalid();
7 const ok = await bcrypt.compare(pwd, user.hash);
Claude Code, Codex and Gemini CLI out of the box. Any CLI agent that runs in a terminal works — Nyx spawns it as a real PTY/TUI session inside a tile. Slash commands, confirmations and manual input all stay native.
Nyx itself runs locally — your code, tiles and workspaces stay on your machine. The agents it spawns (Claude Code, Codex, Gemini) are online CLIs, so they need internet to reach their providers.
Early access is live right now — download the macOS build and try it for 14 days. Windows and Linux follow after the Mac version stabilises.
$29 once — you own it forever. Includes all future updates, runs on 3 devices, and kicks in after a 14-day free trial (no card needed to start).
Three devices per license. Laptop, desktop, work machine — all from one key.
Yes — 14-day free trial, no credit card needed. Just download, run it, decide later.
All future updates are included for free once you own a license — new tiles, new features, bug fixes, all of it. No separate "pro tier", no upgrade paywall.
[ §08 ]Launch updates
Stay in the loop.
Drop your email — we'll ping you about major releases, roadmap milestones, and occasional build notes. One list. No spam.