NyxNyx
canvastilesfocuspricingdownloadbuyfaq
14-day free trialDownload ↓
[ §§ ] — Shipped

Changelog

last updated · 2026-06-02

Everything that’s shipped. Newest first.

0.7.3 — Reliability, performance & multi-agent

A large batch on top of 0.7.2. Your work is much harder to lose, the canvas stays smooth with lots of tiles, multi-agent workflows get real orchestration, and the renderer is meaningfully hardened.

  • Atomic saves + backup recovery. Workspace layout and settings are written atomically (temp file → rename), so a crash or full disk mid-save can’t corrupt your canvas or wipe your preferences. If a workspace file is ever damaged, Nyx restores the last known-good copy from a sidecar backup instead of opening an empty canvas.
  • Settings no longer clobbered. A write that touches one setting can no longer wipe unrelated ones (theme, fonts, install id). And “Reset Workspace” on the crash-recovery screen now actually resets the on-disk workspace.
  • Save errors are visible. If a file can’t be written you get a clear error instead of a false “saved” indicator.
  • Smoother canvas with many tiles. Clicking or dragging a tile on a busy canvas (20+ tiles) used to re-render every tile; now only the one you touched updates.
  • PTY daemon crash isolation. One bad output frame or listener can no longer take down every live terminal at once — it’s contained to a single session.
  • Multi-agent orchestration. Broadcast one prompt to every agent in a worktree group at once; spawn an agent with a task straight from ⌘K (ask claude fix the build); and a global agent inbox that shows agents working across all workspaces.
  • Security hardening. Filesystem writes from the renderer are confined to folders/files you’ve opened; the browser tile can’t grab camera/mic/location by default; the local-file protocol only serves images; and the embedded browser’s devtools bridge is locked to browser tiles.
  • Reduced motion. Nyx now honors the OS “Reduce motion” setting across all animations.

0.7.2 — Hotfix: Windows PTY spawn + worktree click

Cleanup pass on the 0.7.1 Windows fixes. Eight users in Sentry were still hitting Failed to spawn 'C:\Program Files\…': File not found: because the 0.7.1 quoting workaround broke node-pty’s native ConPTY file check. Plus a couple of worktree UX polish items that landed in the same cycle.

  • PTY spawn works again on Windows for paths with spaces. 0.7.1 wrapped the shell path in double quotes before handing it to node-pty to try and fix the 'C:\Program' truncation users saw on 0.7.0. That actually made things worse — node-pty’s native ConPTY layer checks the file via GetFileAttributesW(filename) and there’s no Windows API that accepts a literal-quoted path. It would fail with File not found: and the path it printed was empty. Now we pass the raw path; node-pty quotes it correctly for CreateProcessW’s command line via its own argsToCommandLine. Affects every default Windows shell (pwsh.exe) and every agent CLI installed under C:\Program Files\….
  • PTY daemon protocol bumped 1 → 2. Nyx keeps the daemon alive across auto-updates so terminal sessions survive a restart — but that meant a user who installed 0.7.1 and then auto-updated could still be talking to the old daemon with the broken quoting. The version bump kills the stale daemon on startup and spawns a fresh one from the new code. No user action needed.
  • Clicking any tile in a worktree zone switches Source Control to that worktree. Pre-0.7.2 only agent tiles triggered the switch — clicking on a terminal or any other tile linked to a worktree left the SC sidebar stuck. Now any tile with a worktree association switches.
  • Clicking an agent / terminal / script / diff tile outside a worktree zone switches Source Control back to main. Context-agnostic tiles (Editor, Browser, Notes, Chat, Image, Todo) stay sticky — they don’t carry a git context and shouldn’t blow away the worktree you were just working in.
  • Claude Code icon in Settings → Agent Permissions is now the real Anthropic icon. Was rendering as a purple Gemini sparkle because the icon map lookup used a different key than the agent type string.
  • Stale fs watcher errors no longer crash the main process. Windows fs.watch can throw UNKNOWN: unknown error, watch from inside its native ReadDirectoryChangesW callback when the watched directory becomes unavailable (USB unmount, network share drop, antivirus locking). Without an error handler this bubbled up as an uncaught exception. Now we log + close the dead watcher and let the next workspace mount re-attach.
  • “Previous session crashed” no longer fires for sleep / hibernate / OS reboot. With keepDaemonAlive=true (default), closing the window leaves Nyx running in the background. If the OS later kills the background process — sleep then reboot, Task Manager end-task, hibernate — the heartbeat is the only marker and looks like a crash. 43 users in Sentry were filing these as error. Now: heartbeat older than 5 minutes is treated as “ended without quit” and logged to console instead of pinging Sentry. Real mid-session crashes still report normally.
  • Shutdown marker write has a fallback. Atomic write + fsync + rename can fail on Windows (antivirus, OneDrive sync, transient FS lock) and was silently swallowed, contributing to the false-positive case above. Now falls back to a plain writeFileSync if atomic fails.

0.7.1 — Windows feedback round

First batch of fixes from real Windows users on 0.7.0. Headline change is a hidden V8 string-slice leak in the PTY socket buffer that was OOM-crashing the main process on long agent sessions.

  • Codex now launches when installed under C:\Program Files\…. The resolver found codex.cmd correctly, but node-pty.spawn handed the unquoted path to CreateProcessW, which split on the first space — every user hit “Failed to spawn ‘C:\Program’”. Fix: wrap Windows paths with spaces in double quotes before spawn. Affects every agent CLI, not just Codex.
  • Shortcuts render Ctrl on Windows / Linux, ⌘ on macOS. Settings, voice onboarding, browser tooltips, the full keyboard shortcuts overlay — all platform-aware now. Switched to a single formatter so future shortcuts stay in sync.
  • Random Russian popup gone. Voice errors (whisper binary missing, model download failures, todo agent badge tooltip) leaked through in their original language. All English-only now.
  • Settings overlay no longer crashes with “Cannot read properties of undefined (reading ‘icon’)”. Happened to users whose persisted active category was renamed or removed in a previous Nyx version. Now self-heals on first render.
  • Browser tile flicker on Windows. When an agent or terminal was open next to a browser tile, the tile strobed. Three defensive fixes: 300 ms gate before the Cmd / Ctrl-hold pan overlay mounts (was flashing on every Ctrl-shortcut), stable callback refs so parent re-renders don’t reattach all webview listeners, memoized webview style object so unrelated re-renders don’t restyle the <webview>.
  • Main process OOM on Windows. A user reported RSS growing 1.6 → 4.3 GB in 15 minutes, then crash. V8 string slice returns a SlicedString view that internally references the parent ConsString rope — in a hot buf += chunk; buf = buf.slice(remainder) loop the parent is never freed. Switched both endpoints (main process and daemon) to Buffer accumulators with explicit copies; the PTY fallback session buffer is now an array of small chunks with lazy stringification only on attach.
  • Sentry visibility. Renderer crashes used to be invisible (the SDK init had integrations: [] which disabled GlobalHandlers, and the error boundary only logged to console). Both fixed — render errors and uncaught exceptions now reach Sentry with full React component stack. IPC handler errors also forwarded to Sentry with the channel name as a tag.
  • Memory monitor. Every 60 s a breadcrumb with rss / heapUsed / heapTotal is attached to the session. Any crash or exception arrives with the last ~30 minutes of RSS curve. When RSS crosses 2 GB Nyx also writes a .heapsnapshot to ~/.nyx/diag/ for retainer analysis.
  • Codex full-auto toggle added to Settings → Agents. Symmetric with the existing Claude one — launches with --ask-for-approval never --sandbox danger-full-access. Default on, same as Claude’s.
  • Unified Agent Permissions section. Claude Code and Codex toggles now live under one section with per-agent rows. Scales to future per-agent permission overrides.

0.7.0 — Windows is here

Nyx now runs on Windows 11 with full feature parity to macOS — every agent, every tile, every keyboard shortcut. macOS gets a long list of polish from the 0.6.x beta cycle baked into one stable release.

🆕 Windows support (GA)

  • Native PTY + agents — Claude Code, Codex, Droid, OpenCode, Gemini, Hermes all launch from a Windows PTY (pwsh → powershell → cmd fallback chain).
  • NSIS installer with .exe direct download. Auto-update through the same channel-aware in-app flow as macOS.
  • PowerShell shell integration — nyx-pwsh.ps1 adds OSC 133 prompt markers and command tracking to pwsh and powershell.
  • Proper taskbar icon — multi-resolution ICO embedded, no more blurry Electron atom in Alt+Tab.
  • Ctrl+C / Ctrl+V work correctly in Terminal and Agent tiles. No double-paste, no clipboard fights with the Electron edit menu.
  • Cross-platform path handling — workspace paths, agent CLI resolution (PATHEXT), worktree management, .gitignore, Layout Templates all normalize correctly on \ and /.

🚀 macOS polish

  • Agent picker fixed. On a GUI-launched Electron, PATH was missing /opt/homebrew/bin — Nyx would hide every built-in agent and Claude tiles fell back to a Gemini icon. PTY always handled this via login shell; the availability check now defers to it.
  • Git panel polish — checkout errors on a clean tree finally surface as toasts; locked branches in other worktrees group under IN WORKTREES with a friendly tooltip; BranchBar updates instantly after checkout; kebab menu no longer disappears.
  • Updater hygiene — stale pending/ cache is wiped on startup when it points at the currently-installed version. No more silent “you’re stuck on this build” scenarios.
  • Codex 2.1 / Claude 2.1 status detection — idle / working / done / waiting events fire correctly after the upstream CLI changes.
  • Settings overlay — Cmd+, opens a full-screen search-first overlay (Linear / Raycast UX) with 8 categories and 13 unified primitives.

🐛 Cross-platform fixes

  • Claude OAuth code form shows up even when a different backend is selected.
  • Codex ~/.codex/config.toml trust block is idempotently rewritten on upgrade — no more duplicate key errors.
  • Agent stays correctly idle / done when you return to a workspace after it finished.
  • Hermes hooks no longer fail on sh -c wrappers — Nyx rewrites them to absolute node paths on Windows.
  • File tree and search respect .gitignore with normalized POSIX paths.
  • shell.openExternal errors surface as toasts instead of crashing the IPC handler.

⚙️ Under the hood

  • Unified CI release pipeline — one tag push builds both platforms in parallel and publishes to the stable channel atomically. No more manual publish-release.mjs.
  • Channel-aware auto-update is now symmetric for macOS and Windows — both pull from CF Worker feed URLs.

0.6.5 — Upgrade reliability: Codex starts, auto-update unblocks

A small bug-fix release that unblocks two things users hit while upgrading from 0.5.0 to 0.6.4.

  • Codex starts again after upgrades. Recent Codex (0.130+) writes its own [hooks.state."…"] block to ~/.codex/config.toml whenever you press Trust this hook in the TUI. The 0.6.4 startup routine wrote a second wrapped block on top — TOML rejects duplicate section headers and Codex refused to launch. Nyx now recognises and rewrites those Codex-managed entries instead, idempotent on every restart.
  • Auto-update no longer silently stalls. After a successful in-app update, ~/Library/Caches/nyx-app-updater/pending/ was left with the just-installed ZIP, so electron-updater treated that as “an update is already pending” and stopped reaching out to GitHub — users could sit on an old build for weeks without seeing a single banner. On startup Nyx now wipes that stale pending cache when it points at the currently-installed version (or older), while preserving genuine pending downloads waiting for install after a crash.
  • Fixes: the “Paste the OAuth code” form in Settings → AI & Voice now appears even when a different agent backend is selected (previously hidden, leaving Claude login impossible).

0.6.4 — New Settings, reliable agent status, polish

A big visual overhaul of Settings and a long list of agent / canvas / sidebar fixes — including the working-dot regression on the latest Claude Code 2.1 and Codex 0.130.

  • Settings overlay redesign — Cmd+, opens a full-screen overlay with a search-first UX (Linear / Raycast style). 35+ settings indexed, fuzzy-ranked, ↑↓ to nav, Enter jumps and flashes the highlight ring. Eight categories (Appearance, Agents, AI & Voice, Browser, Notifications, Account, Advanced, About) with unified toggle / radio / slider / number-input primitives and one motion-token language. Reduced-motion respected throughout.
  • Hide built-in agents — a new Agents toggle removes Claude / Codex / Gemini / Hermes / Droid / OpenCode from the AgentPicker if you only work with custom CLI agents.
  • Worktree-aware terminal cwd — drop a layout template (or any tile) onto a worktree zone and the new tiles open with cwd already pointing at the worktree path, not the main repo root.
  • Working-dot fixed for Claude Code 2.1 / Codex 0.130. Recent agent CLI releases stopped reaching our status pipeline: Claude detaches hook subprocesses from /dev/tty (so the OSC 777 escape failed with ENXIO), and Codex made user-level hooks default-untrusted while renaming codex_hooks to hooks. The bridge now walks the parent PID chain to find the real PTY, and Nyx computes the SHA-256 trust hash for every managed Codex hook and writes it under [hooks.state] in config.toml. The bridge also exits immediately so each Codex hook stays under the 300 ms reveal threshold — no more hook: Stop flashes between turns. Stale _source: "nyx-state-policy" blocks (Claude bash hooks) left over in ~/.codex/hooks.json are stripped on every enable.
  • Fixes: worktree zone toolbar inverse-scale capped at 2× (no more orange ghost at zoom-out); agents spawned from a tile outside a worktree zone no longer auto-link into the zone; canvas selection dot doesn’t linger after deleting selected tiles; RepoPicker dropdown renders through a portal (not clipped in a narrow sidebar); GitLogPanel refreshes on worktree context switch; todo delete button shows up as the row slides in; agent badge stays hidden while a soft-closed tile is in the undo window; orphan agent records cleaned up when soft-closed tiles age out of their 60 s undo TTL.

0.6.3 — Multi-repo workspaces (stable)

The multi-repo workspace work that landed in 0.6.2 beta is now stable. Open a folder with multiple git repos inside (or a repo that itself contains nested repos) and Nyx treats each one as a first-class context: its own Source Control panel, its own worktree zones, its own branch in the header.

🪐 Umbrella monorepo

If the workspace folder itself is a git repo and contains nested git repos (think docs/scripts at the root + app/, landing/, server/ inside), Nyx discovers all of them. The root joins the picker alongside the children — no more silent skip of nested packages.

  • Discovery (BFS depth ≤ 3) with realpath canonicalization, so macOS /tmp/X and /private/tmp/X line up with what git worktree list returns. No more phantom “Worktree was removed manually” toasts when nothing was actually removed.
  • Performance-aware — node_modules, .git, .worktrees, dist, build are skipped at every level. A 50-package monorepo scans in under a second.

🎨 Repo identity everywhere

Each repo gets a deterministic colour (hash of its path) and that colour shows up consistently across the whole UI: Source Control header chip, worktree-zone toolbars on the canvas, the Worktrees and Agents panels in the sidebar, and the HUD pills above the canvas. Switch repos and every surface updates in lockstep.

🪢 Worktrees per repo, not per workspace

Worktrees now belong to their parent repo. The Source Control CONTEXT switcher only shows worktrees of the active repo — pick app, you only see app/.worktrees/*, never the ones under landing. The same scoping applies to the WorktreeToggle picker in the agent launcher. Reconcile runs per-repo on workspace switch and gracefully skips repos that fail to list (transient git locks no longer wipe your tile linkage).

🧭 Auto-switching that doesn’t fight you

Click an agent inside a worktree zone — Source Control switches to that repo and worktree atomically, no half-frame flicker. Click an agent on the main canvas — Source Control reverts to the active repo’s main branch. Click empty canvas — sticky, your last context stays put (no surprise resets on accidental clicks). Pin the SC repo and the auto-switcher backs off — your pick wins.

🖥️ Terminals start in the right place

Create a terminal inside a worktree zone (or drag one into it) and the shell opens directly in the worktree path. Drop a file onto that terminal — the path is resolved against the worktree, not the main repo.

🛠️ Stability

  • Commit button in Source Control no longer flickers Nothing to commit → Commit All while switching contexts. The label transitions smoothly with the same easing as the header branch chip.
  • Toast stack no longer enters an infinite re-measure loop when several toasts of different heights stack up (this could crash the renderer when closing orphan agent tiles after a worktree delete).
  • Sticky per-workspace state — active repo + pin survive workspace switches reliably.
  • Removing a worktree no longer wipes the panel. Previously, deleting a worktree from the sidebar briefly cleared every other worktree in the list — they reappeared after the next background refresh, but the flicker was alarming. The store now updates locally after the backend confirms the delete, no full re-list.

0.6.1 — Hotfix for 0.6.0 startup crash

If 0.6.0 wouldn’t start with Cannot find module 'module-details-from-path', this is the fix. Same recipe as the ms packaging issue we patched in 0.5.1 — a transitive @sentry/node dependency that pnpm linked in dev but electron-builder didn’t pack into the asar. Pinned it as an explicit dependency in 0.6.1.

Update with curl -fsSL https://api.getnyx.dev/install.sh | bash (the in-app update pill won’t appear because the previous build can’t even start).

0.6.0 — Agents control your browser tile

Open a browser tile next to a Claude / Codex / Droid / OpenCode session, ask it to “log into Linear and pull yesterday’s issues”, and watch the cursor move, click, and type — in your tile, against your already-signed-in session, no extra Chrome window. The browser tile becomes an agent tool: same window you use, same cookies, with a visible cursor so you see what the agent does.

🪄 Browser control out of the box

A new nyx-browser MCP server is auto-registered for Claude Code, Codex, and Droid. The agent gets 19 tools — navigate, click, type, fill, extract, explore, assert, act, screenshot, shortcut, select, scroll, hover, wait_for, get_text, state, eval_js, console_logs, resize_tile.

  • Visible cursor + per-tile overlay — every action is shown live: agent-coloured cursor moves with rAF, click ripple, typing caret. Snappy 40ms moves, single executeJavaScript round-trip per action so the cursor keeps up in real time.
  • Auto-create browser tile — when the agent navigates with no browser tile open, Nyx spawns one near the agent tile with an Undo toast.
  • Per-agent tile binding — two agents launched side by side don’t fight over one browser. Each is sticky-bound to its first tile for the lifetime of the session.
  • Self-healing selectors — when .btn-primary no longer exists because someone renamed it to .button-primary, Nyx’s resolver retries with [class*="primary"]. When the resolver still fails, the error includes the top 5 closest matches so the agent self-corrects without sending a full DOM snapshot back.

🔥 Token-efficient by design

Industry browser MCPs ship full DOM snapshots back to the LLM on every step — Microsoft’s own docs put it at ~114K tokens per typical task. Nyx ships structured tools instead.

  • explore — {forms, navigation, primary, secondary} view of the page in under 2K tokens. Agent looks once, picks the form it needs, fills it.
  • act — multi-step macros in one call: [click "Sign in", type "...", click "Submit"].
  • extract — {table | list | attrs | text}. The agent gets just the data, never the surrounding chrome.
  • screenshot — visible viewport saved to a temp PNG (max 1280px wide), agent gets {path, width, height, bytes}. No more 2 MB base64 strings blowing up the LLM context window.

Typical task drops from ~114K tokens to ~6–10K. Same outcome, an order of magnitude cheaper.

🛜 Sign in once, every tile stays logged in

Every browser tile in Nyx shares one persistent profile — sign into GitHub once, every tile and every agent is signed in.

  • Quick Sites in the toolbar overflow menu — categorised dropdown for GitHub, GitLab, Vercel, Linear, Jira, Asana, Slack, Discord, Gmail, Claude, ChatGPT, Perplexity, Notion, Figma, Google Docs.
  • Settings → Browser Sessions — list of every domain with cookies, auto-grouped into “Signed in” vs “Visited”. Sign out per-domain or clear everything.

📱 Device emulation

A user-agent picker in the browser-tile overflow menu — Desktop / iPhone / Android / iPad / Desktop 1280 / Desktop 1920. Picking a non-default preset resizes the tile to that device’s typical viewport (so CSS @media breakpoints fire) and swaps the User-Agent so SSR sites (Next, Astro, SvelteKit) serve mobile/tablet markup. Agents can resize the tile programmatically too via nyx_browser_resize_tile.

✨ HMR visual link

When Vite or Webpack pushes a hot update, the browser tile flashes a green border with HMR · path/file.tsx chip. Yellow for full-reload, red for build error. Lets you see “agent edited code → preview updated” as one motion.

🎯 Click-to-edit (Bolt/Lovable-style)

Inspect Mode (⌘⇧I) gets a Send → button. Pick an element, type “make this 16px instead of 14”, press Shift+Enter — the agent gets a clean prompt with Edit PrimaryButton at src/components/Button.tsx:17 directly. Source path auto-resolved via React fiber’s _debugSource.

🎭 Force agents into the Nyx tile (default ON)

Claude Code 2.1 ships its own claude-in-chrome skill plus the Anthropic Playwright plugin — both spawn separate Chromium windows. Nyx now turns them off when launching agents from inside Nyx, so the only browser tool the agent sees is nyx-browser MCP. Toggle in Settings → Agent Browser Control.

🎬 Playwright bridge (opt-in)

Got a Playwright suite in your project? Nyx becomes its browser — no code changes.

$ pnpm test:e2e
[nyx-shim] chromium.launch() → connectOverCDP(http://127.0.0.1:9333/)
✓ login.spec.ts (3 tests)

A small --require shim auto-rewrites chromium.launch() calls to connectOverCDP against the Nyx tile that’s already on the canvas. Authenticated sessions from Quick Sites come along for free.

🩹 Stability

  • Two Nyx instances no longer collide on the MCP socket — pid-aware path lets main + worktree dev runs coexist.
  • Browser tile crash recovery — render-process-gone clears overlay state and unbinds CDP target so agents get a clean error instead of a dead handle.
  • Cursor click coordinates fixed — closes a long-standing 5px-right / 3px-down systematic offset.

1875 / 1875 tests · TypeScript strict clean · 76 commits since 0.5.2.

0.5.2 — Close-tile undo + Discord Rich Presence

Two QoL wins people kept asking for: Cmd+W is now safe (PTY survives, 60s recovery via ⌘K), and Nyx can show what you’re building in your Discord profile. Plus polish across terminal rendering, anonymous error tracking, and trackpad zoom.

🔁 Close-tile undo

Close a tile by accident? Cmd+W / Cmd+X / × now soft-close — a 5 second Closed X [Undo] toast lets you snap it back. Missed the toast? Cmd+K → Recently closed keeps the tile around for 60 seconds. PTY sessions and tile state are preserved during the recovery window — agents keep streaming, the editor keeps your scroll position.

🎮 Discord Rich Presence

Nyx can show what you’re building in your Discord profile — editing src/auth.ts, browsing localhost:3000, or Claude Code · refactoring auth — with the agent’s status (working / idle / done) and an icon for the active agent.

  • Per-tile presence — switches automatically as you focus a different tile. Workspace name and active agent appear as the secondary line.
  • Spotify-style timer — resets when you switch file / agent. Prefer “I’ve been at this for 4 hours” instead? Toggle off Reset timer on activity change to show uptime since Nyx started.
  • Three independent toggles — workspace name, agent label, file/URL details. Pick what you share.
  • Off by default. Settings → Discord. Requires the Discord desktop app running locally — no servers in between, no cloud, presence stays on your machine.

🖱 Cmd + Scroll zoom in trackpad mode

Hold ⌘ and scroll the trackpad to zoom — Figma-style, anchored to the cursor. Works alongside pinch-to-zoom and shift-to-pan without conflicts; the focus-aware bypass that protects scroll-inside-tile is suppressed only while ⌘ is held.

🛰️ Anonymous error tracking

Nyx now reports unhandled errors and crashes anonymously so we can fix them before you have to file a report.

  • What’s reported automatically: unhandled exceptions, native crashes (Crashpad), renderer-unresponsive (rainbow wheel), previous-session-crashed, daemon health issues, Restart-agent overlay, agents stuck for >5 minutes.
  • What’s never sent: file contents, license keys, agent prompts, terminal output, your real email or IP. Stack traces have your home directory replaced with ~.
  • Anonymous correlation: a random per-install ID lets us tie your bug report (via Send Feedback) to the actual error on the server side. No personal info attached.
  • Opt out anytime: Settings → Privacy → “Anonymous error reports” toggle.

🩺 Send Feedback now attaches diagnostics

The “Attach diagnostics” checkbox in Send Feedback (on by default) bundles a sanitized snapshot of app state — version, OS, daemon status, recent console output, and license-key-redacted config — alongside your message. Makes “it doesn’t work” actionable.

🖥️ Terminal rendering polish

Several long-standing artifacts in xterm tiles fixed:

  • Unicode 11 widths for emoji / CJK / ambiguous chars (Claude/Codex tables no longer drift).
  • Font load timing — first fit waits for document.fonts.ready, no off-by-N column measurement.
  • Workspace-switch ghost cells — daemon now hands the renderer the snapshot’s cols/rows so cursor position aligns.
  • Pan-zoom emoji stays sharp at zoom ≤ 1.05 (composited layer); at zoom > 1.05 DOM scales as vector — crisp at zoom-in.
  • NyxFitAddon ±1 cell tolerance — subpixel jitter no longer reflows the buffer.

🐛 Polish

  • Agent Inbox — stuck cards no longer linger after an agent finishes; working-session timing is measured correctly.
  • PTY daemon hardening — defensive error handling around daemon events and socket-data dispatch; fewer obscure crashes when events arrive out of order.
  • Bundles the ms transitive-dep fix that landed mid-0.5 line — updates from earlier 0.5.x betas still start cleanly.

1771 / 1771 tests · TypeScript strict clean · source maps uploaded to Sentry so future stack traces show real file names instead of minified positions.

0.5.0 — Worktree Orchestration

Run multiple AI agents in parallel, each isolated in its own git worktree, all visible on one canvas. Ship 4 features at once without git stash, branch swaps, or losing context. The biggest release since 0.4.0 — 152 commits, 1696 tests, 9 rounds of pre-merge audit.

🌿 Worktree zones on canvas

  • One agent → one worktree. Toggle ”🌿 Isolated worktree” in AgentLauncher / TodoTile / right-click menu — Nyx creates <repo>/.worktrees/<slug> + branch + spawns the agent with cwd=worktreePath. Each worktree shares the main repo’s .git/ but has its own working tree, so file changes from one agent never leak into another.
  • Visual zones group your work. A dashed accent border + branch chip auto-renders around any cluster of tiles linked to the same worktree. Drag the zone to move all members at once. Click the chip to fit all in viewport. One color per branch.
  • Quick actions per zone. ZoneToolbar surfaces 📄 Diff Review, ▶ Dev Preview, 💾 Commit & Push, 🔀 Open PR, 📁 Reveal in Finder, plus dropdown for local merge / squash / detach.
  • Send-to-agent stays scoped. TodoTile, PromptEditor, Browser inspect, and Diff send-review all restrict the existing-agent picker to the current zone — no accidental cross-branch dispatch.

🧭 Sidebar Worktrees panel

A new panel in the sidebar rail lists all worktrees, grouped by Active / Idle, with the main repo as a card on top. Each entry expands to show linked agents and tiles. Branch chip + diff stats per worktree. Right-click → Detach with optional “Also delete branch”. Source Control auto-switches as you click between zones.

🎯 Header pill + HUD

  • WorkspaceTitle pill in the header shows workspace icon | active branch | +/− diff stats always visible. Branch chip stays visible as you switch worktrees, diff stats cross-fade in when changes appear.
  • HUD pills per worktree group — one pill per group with active agents, showing status dot, agent count, branch label. Hover any pill to see the agents in that group. Click to switch Source Control context to that worktree.
  • Smooth cross-fade transitions when switching workspaces — icon, name, branch, diff, and HUD pills animate synchronously through a single React commit. No jank when sidebar Source Control re-renders.

▶ Auto Dev Preview per worktree

Click ▶ in a zone toolbar — Nyx detects your dev command from package.json / Cargo.toml / pyproject.toml / Makefile and spawns a ScriptTile + BrowserTile pair, scoped to that worktree’s cwd. Browser auto-navigates to the localhost URL printed in stdout. Auto-restarts after app reload. If you remove the worktree mid-flight, the dev preview emits a clean error instead of silently launching in $HOME.

🔀 One-click PR

The “Open PR” button in the zone toolbar pushes your branch and opens a GitHub or GitLab PR draft pre-filled from your last commit message — no terminal round-trip.

🔧 Under the hood

  • 9 new IPC methods (worktree.create / list / remove / status / merge / openPR / detectDevCommand / commit / changesStatus) + workspaceConfig.get/set for per-workspace dev preview config.
  • Per-wsRoot mutex serializes git worktree create / remove / merge across all UI surfaces. No more .git/worktrees registry corruption.
  • App-level git/worktree bootstrap — state loads on app start, not on first sidebar SC mount.
  • Path traversal guard + slug validation before any git worktree add.
  • Reconcile on workspace load — orphan tiles auto-cleanup, no false “tile detached” toasts.
  • Migration — legacy agents with agentConfig.worktree from previous versions are auto-linked to the new worktree zones via linkedWorktreeId backfill. No data loss.
  • 10s timeout on read-only git ops protects status badges from hangs on network drives / NFS / dead remotes.

🐛 Polish

Plus 45+ UX polish fixes from 9 audit rounds — animation jank, race conditions, drag-listener cleanup, undo/redo + worktree fields, copy/paste field stripping, in-flight guards, typed error messages (git_timeout, concurrent_git_op, detached_head), custom-agent icons in worktree HUDs, popover width caps, and live CDP smoke validation.

1696 / 1696 tests · TypeScript strict clean · Claude Code v2.1.126 prompt detection updated.

0.4.7 — Custom CLI agents (Beta) + per-tile font sizes

A long-requested feature: bring your own CLI agent. Anything that runs in a terminal — copilot, aider, your own wrappers — can now be a first-class agent on the canvas with its own name, icon, and one-click launch.

🧩 Custom CLI agents (Beta)

Settings → Custom Agents (Beta) — add as many as you want. Each saved agent gets:

  • Name and command — anything resolvable on your PATH. copilot, aider, mods, your own ~/bin/myagent script, whatever.
  • Icon — pick from 6 built-in presets (terminal, code, robot, star, bolt, globe) or upload your own PNG/SVG (≤256 KB).
  • Base CLI (optional) — if your tool behaves similarly to Claude Code / Codex / Droid / OpenCode, pick it here. Nyx uses native hooks for those agents to track state (working / idle / waiting). Without Base CLI, status is detected by terminal-output heuristics — works, just less precise.

Saved custom agents show up everywhere built-in agents do: AgentLauncher, AgentPicker (LAUNCH NEW + send-to-existing), Todo bulk picker (Set All + per-todo dropdown), header HUD with their custom icon, sidebar AgentPanel, and the Inbox.

Send prompts from Todo, Browser inspect, or Diff review — they paste into the agent’s input and submit reliably even for CLIs that don’t respect raw \r after bracketed paste (we dispatch a synthetic Enter through xterm so the CLI sees a real keystroke, just like you typed it).

Hooks pill per agent. Each saved agent shows a small badge in the list — Hooks ✓ (green) when Base CLI is set to a hooks-supported agent, Heuristic (gray) otherwise — so you can see at a glance which of your agents are configured optimally.

Why “Beta”? Some CLIs don’t expose hooks the way built-in agents do, and we can’t guess every CLI’s --resume flag. The Add Agent flow shows a one-time onboarding modal explaining the limits clearly:

  • Status detection uses heuristics unless Base CLI is set.
  • Native notifications are limited.
  • Conversation history doesn’t restore after a full app restart (next launch starts a fresh session).

These will improve over time. The disclaimer in Settings is honest about what’s polished vs. rough.

🔤 Per-tile font size settings

Settings → Appearance → Font Sizes — Terminal / Agent / Editor / Diff each get their own size. Changes apply in real time without reload, sizes persist across restarts. Crank agent font up to 16px for legibility while keeping shells dense at 13px.

🐛 Bug fixes

  • Claude Code v2.1+ startup detection. New TUI in Claude Code 2.1 changed its initial prompt — the heuristic detector was missing the interactiveReady transition and showing “Preparing session…” indefinitely. Splash → ready transition is back to ~1s.
  • Custom agent icon in header HUD. The active-agents row at the top was using the template default icon instead of the agent’s actual saved icon.
  • Custom agent launch reliability. “Preparing session…” overlay disappears as soon as the CLI prints its first byte. Initial task delivery uses a universal “launch CLI bare → wait for input box → paste-and-submit” flow instead of guessing the CLI’s prompt-flag syntax (which previously made Copilot error out with Did you mean: copilot -i "..."?). Submit Enter for unknown CLIs goes through xterm’s synthetic-keypress path.

0.4.6 — Voice-to-text + ChatGPT subscription backend

Two big additions: local voice dictation in any text input (press ⌘D), and your existing ChatGPT Plus/Pro subscription can now power Nyx’s AI features instead of (or alongside) Claude.

🎙️ Voice-to-text — press ⌘D anywhere

Local dictation via Whisper Large v3 Turbo, runs entirely on your machine — no cloud, no internet required after the one-time model download.

  • Tap ⌘D to start, tap again to stop. Or switch to Hold to talk in Settings.
  • A floating recording pill with a live waveform appears at the bottom-center while you speak. ~1s after you finish, your words appear in the focused input. Esc cancels.
  • Works in every text input: PromptEditor (Todo), Agent and Terminal tiles (PTY with bracketed paste — no accidental submit), ChatTile, NotesTile, EditorTile (code and markdown), Command Palette, Diff comments, Browser annotations, every Settings field. Falls back to last input or clipboard if nothing is focused.
  • Settings → Voice: model picker (Tiny / Base / Small / Medium / Large v3 Turbo / Large v3), customizable hotkey, Tap-to-toggle vs Hold-to-talk, language (auto-detect or 98 manual), mic picker + RMS test bar.
  • Privacy: audio runs through whisper.cpp on your own machine, kept in memory only, discarded immediately after transcription. No cloud calls. No telemetry.
  • First-time setup: the first ⌘D without a downloaded model opens an onboarding modal — Set up · 1 min downloads ~575 MB and prompts for microphone permission.
  • Platform support: macOS Apple Silicon (Metal + CoreML) and Windows x64. Intel Mac and Linux are planned.
  • Heads up — focus split moved: the existing ⌘D / ⌘⇧D (split pane horizontal/vertical) has moved to ⌘\ / ⌘⇧\ to free up ⌘D for voice. Matches VS Code and Cursor.

🤖 ChatGPT subscription as an AI backend

If you have ChatGPT Plus or Pro, you can now power Nyx’s AI features through your ChatGPT subscription instead of (or alongside) Claude. Smart agent labels, AI commit messages, and markdown rewrite all switch globally with one click.

  • Sign in with ChatGPT in Settings → AI Features. Login opens in your browser and returns automatically — no API key, no copy-paste, no monthly bill on top of your existing subscription.
  • Three backends, one switch. Pick Claude, Codex (ChatGPT), or Local LLM — applies globally to smart titles, AI commit messages, and the markdown rewrite popover.
  • Codex models. Choose between gpt-5.5 and gpt-5.4 per cloud backend. Claude side keeps Haiku / Sonnet / Opus.
  • Onboarding picks all three. First-run modal now offers Claude, Codex, and Local side-by-side.
  • Auto-fallback that tells you what happened. When the cloud is unreachable or returns an error, Nyx silently falls back to your Local LLM if it’s downloaded. When both cloud and local are unavailable, a specific error toast explains why (auth, subscription, network, server). Persistent badges next to your email in Settings call out auth or subscription problems.

✨ Polish

  • Quieter terminals. When an agent or terminal tile isn’t focused, its cursor now hides completely instead of showing an outlined rectangle. With several agents on the canvas, only the active one has a visible cursor — less visual noise, easier to spot which tile you’re typing in.

🧩 Under the hood

  • All three AI features now route through a single dispatcher (ai-backend-service). Removes ~250 lines of duplicated logic across the labeler, commit-message, and markdown-rewrite paths.
  • ChatGPT’s backend requires SSE streaming — Nyx now reads and accumulates the stream server-side, so non-streaming features (labels, commit messages) work identically to the streaming ones (markdown rewrite).
  • Settings migration: existing labelBackend config keys are migrated to the new aiBackend field automatically. No re-login needed.

0.4.5 — Stability patch

Fixes on top of 0.4.4.

  • Workspace tiles no longer disappear when switching back to an existing workspace after creating a new one
  • “Keep agents running” default now correctly applies on first launch after upgrading from an older version

0.4.4 — Sessions that survive

Your agents now keep working when you close Nyx, and your conversations come back exactly where you left them after a full restart. The PTY daemon runs as a proper background service — like Docker Desktop or Ollama — and a menu bar icon shows what’s still running.

  • Background daemon — Nyx’s terminal/agent backend now lives outside the app window. Cmd+Q hides Nyx but agents keep running in the background. Auto-update no longer kills your sessions. Daemon shuts itself down when nothing is active (5-min timeout, configurable).
  • Menu bar icon — when Nyx is closed but agents are working, a Nyx icon appears in your menu bar with a Telegram-style counter showing how many are active. Click to see which agents in which workspace, click any of them to jump straight into Nyx focused on that tile. Quit Nyx fully from there too.
  • Conversation resume after full quit — completely close Nyx, reopen days later, and your Claude / Codex / Droid / OpenCode / Gemini / Hermes conversations pick up from the last message. Each agent’s CLI native session is captured on first launch and reattached on the next one. No copy-paste, no /sessions slash commands.
  • Native notifications — when an agent needs your input (permission prompt, plan to approve), errors out, or finishes — you get a macOS notification. Click → Nyx opens to that exact tile. Toggle each event type in Settings → Notifications.
  • Daemon health watchdog — if the background daemon ever crashes (OOM, system kill), Nyx detects it within ~30s, automatically respawns, and shows a Restart button on each affected tile. Your conversation history is preserved.
  • Auto-suspend idle agents — agents sitting idle in inactive workspaces are suspended after 1 hour (configurable: 30m / 1h / 2h / 6h / 24h / off). Resume is automatic when you switch back. Saves ~150–300 MB per suspended agent.
  • Settings → Sessions — pick whether agents keep running after closing Nyx (default on), and how long the daemon idles before shutting down.

Fixes: Cmd+Q no longer kills agents when you have active work; tray counter no longer shows stale status when the app is hidden; workspace deletion properly cleans up agent snapshots; daemon auto-shutdown timer now actually wired through to the daemon.

0.4.3 — Markdown Live Preview, AI rewrite, Send to agent

Markdown files now feel native. Live preview as you type, full GFM support, and two new AI-powered actions baked into every markdown tile.

  • Live preview for .md, .markdown, .mdx — Obsidian-style rendering inline. Headings, bold, italic, strike, links, lists, tables, code blocks all formatted right where you type. The line your cursor is on shows the raw markdown so you can edit freely.
  • GFM tables you click into — full table editing with inline **bold**, *italic*, `code` rendering inside cells. Hover the table → MD button toggles to source mode for full text editing across cells.
  • Real task lists — - [ ] and - [x] render as clickable checkboxes. Toggle with one click.
  • Ordered lists & bullets always visible — numbered items keep their numbers (1. 2. 3.) on every line, bullets render as •. No more guessing where you are.
  • ✨ AI rewrite for any selection — select text, hit the ✨ button. 7 quick presets (Beautify / Concise / Grammar / Clarity / EN / Formal / custom) stream a rewrite directly into the document, replacing your selection. Toggle Original ↔ AI to compare; Keep, Discard, or Retry. Backed by Claude Haiku, with local Qwen2.5 as fallback.
  • ➤ Send to agent — new button in the markdown footer. With selection → sends selection; without → sends whole document. Pick an existing agent or launch a new one. Write a prompt or spec in clean markdown, ship it to your agent in one click.
  • Tokyo Night-inspired code highlighting in markdown code blocks. Strings clearly readable on dark backgrounds, comments muted, no clashing colors.
  • Source view toggle — ⌘⇧V flips between Live and Source for the whole file. The file on disk is always plain markdown.

Beyond markdown, 0.4.3 also brings:

  • Multi-scope AI commit messages — pick exactly which staged scopes to include before generating the commit message; resizable composer textarea so long messages don’t crowd the modal.
  • Send terminal / script selection to agent — highlight any output in a Terminal or Script tile and dispatch it straight into your agent (existing or new) with one click.
  • Copy Path / Copy Relative Path in the file explorer context menu — right-click any file or folder.
  • --dangerously-skip-permissions toggle for Claude Code in Settings → Agents, for users who want Claude to act without per-action confirmations.

Fixes: click in markdown puts the cursor exactly where you click — even past tables, code blocks, and --- dividers; H1–H6 headings align to the same left edge regardless of # count; Cmd+Z routes to CodeMirror history (used to delete the tile); code blocks wrap long lines; large files (>1MB) auto-open in Source mode for performance; scroll position survives focus mode, zoom, and hibernation; pinch-zoom no longer fights the editor.

0.4.2 — Turn your todo list into parallel agents

The todo tile got a lot bigger. Group tasks into sections, drag them across tiles, and most importantly — shift-click any number of todos and dispatch them as parallel agents in one click.

  • Sections inside the todo tile — group tasks into named, collapsible sections. Drag-reorder sections, drag tasks between them. Inbox stays pinned at top so quick captures don’t need a section first.
  • Multi-select → fan out into agents. ⇧+Click any number of tasks → floating action bar with two options:
    • → 1 agent bundles all selected todos into one prompt and sends to a single agent (new or existing).
    • → N agents spawns one agent per task, each in its own tile next to the todo, agent type pickable per task. When an agent finishes, its todo auto-checks itself.
  • Cross-tile drag — drag a todo between todo tiles, drag the whole inbox onto another tile to merge, drop files from the file tree onto a row to attach as screenshots.
  • Click row → prompt editor; shift-click → multi-select. Single-click any active task to open the prompt editor with full text + image staging. Shift-click switches to selection mode for batch dispatch.
  • Smart placement for batch agents. When you spawn N agents from a todo list they stack in a column next to the parent tile (right side first, left if right is taken) instead of scattering.
  • Recently completed stays visible — done todos sort by completion time, most recent on top.
  • Fixes: agent shells now inherit your full PATH from the login shell (nvm/pyenv/asdf-installed CLIs just work); workspace switch keeps focus mode + running agents alive; creating a workspace from a folder no longer kills running agents; shift-drag snap-zone is rock-steady (no more flicker); batch-launch no longer leaks orphan PTY daemons; auto-update checks every 30 minutes plus on focus regain; cleaner update flow (legacy banner removed); strikethrough on completed todos finally renders the same on every row.

0.4.1 — New look, new ways to launch agents

A visual refresh and a handful of small features that make day-to-day work smoother.

  • New brand identity — fresh app icon, splash screen, favicon, and OG image. Same Nyx, sharper face.
  • Open Agent Here — right-click any folder in the file tree to spawn an agent (Claude / Codex / Gemini / Droid / OpenCode / Hermes) already cd’d into that subfolder. The tile shows the working directory as a pill in its header.
  • Project indicator in the header. The active workspace now appears as a chip in the app header so you always know which project you’re in without opening the sidebar. Right-click the chip for the workspace context menu.
  • Double-click tile header → Focus mode. Faster than the keyboard shortcut. Same gesture to come back.
  • Drag-and-drop files into Terminal & Agent tiles. Drop from Finder or from the sidebar file tree — paths get inserted as quoted args.
  • Fixes: terminal/agent tiles got a polish pass (no more scrollbar gutter, brighter text, edge-to-edge); ESC closes the Todo prompt editor; “Delete project” is now “Remove project” so it’s clear we’re not deleting your code; feedback form no longer blocks valid emails; CWD pill on Agent tiles uses the Lucide folder icon and shows up in Focus mode too.

0.4.0 — Silent auto-update, Layout Templates, OpenCode

The release where Nyx starts shipping itself.

  • Silent in-app auto-update. A small pill appears in the header when a new version is out. Click → release notes → Update now → Restart & install. No Gatekeeper dialogs, no password prompts, no manual steps. Works without an Apple Developer ID via a custom install helper.
  • One-line installer — new users install Nyx with a single command. Downloads the DMG, verifies SHA-256, mounts, installs to /Applications, launches. ~10 seconds, zero macOS warnings.
$curl -fsSL https://api.getnyx.dev/install.sh | bash
  • Layout Templates — save a canvas arrangement (tiles, positions, agent commands) as a named template. ⌘⇧S to save, ⌘⇧T to pick and drop into any workspace. Templates show as SVG thumbnails with their own sidebar panel.
  • OpenCode agent joins Claude Code, Codex, Gemini, Aider, Droid, and Hermes as a first-class agent. Full PTY integration with hooks for accurate state tracking.
  • Canvas is noticeably faster during pan and zoom. Three fixes: no more whole-area repaints on zoom change, temporal GPU promotion for tiles during motion, dot-grid bleed-through fix.
  • Maximize button on AgentTile and TodoTile — opens the tile in Focus mode.
  • ASAR integrity protection. The npx asar unpack / pack tampering attack no longer works — Electron verifies the hash of app.asar on every launch.
  • Ad-hoc signing — the app is properly signed so macOS allows launch without the xattr -dr com.apple.quarantine workaround.
  • Landing redesign. getnyx.dev now leads with the one-line curl installer; .dmg download still available. New /download/dmg page with animated step-by-step illustrations of the manual install.
  • Fixes: agent tiles preserve PTY across workspace switches, terminal scrollback survives resize, browser tile keeps its webview session per-tile, agent picker shows exited agents and auto-restarts on send, OpenCode no longer gets stuck in Working state, Codex no longer prints the noisy unstable-features warning.

0.3.7 — ESC cancels in agent tiles

  • Escape now actually cancels the agent’s action inside a running agent tile. Before, the global Escape shortcut and Focus mode exit captured the event before xterm could send \x1b to the PTY.
  • Canvas, focus in agent terminal → Escape cancels the agent.
  • Canvas, focus on canvas → Escape clears selection (unchanged).
  • Focus mode, focus in terminal → Escape goes to the agent; use Shift+Esc to exit focus directly.

0.3.6 — Security hardening + polish

  • Server-enforced license. Closes the .asar tampering exploit that let users unpack 0.2.1 and show “Infinite days left”. Server is now the source of truth for license status and trial countdown — client pulls a signed JWT from /api/license-heartbeat every hour.
  • Version cutoff: builds older than 0.3.0 are blocked by the server with a “Download latest” modal.
  • 72h offline tolerance — JWT stays valid up to 72 hours without connectivity.
  • Focus mode exit no longer empties tiles. Exiting Focus left tiles visually empty on canvas until re-entering; DOM reparent cleanup is now safe.
  • AI commit messages — ✨ button in the commit box generates a message via Claude CLI, with local Qwen as fallback.
  • Show hidden files toggle in Explorer — exposes .gitignore’d files like AGENTS.md, docs/. Persists per workspace.
  • Cmd+=/-/0 now zooms tile font size (Terminal/Agent) instead of the whole canvas.
  • Settings → About pulls the version dynamically from package.json (was hardcoded since the first build).

0.3.5 — Hook cleanup

  • Claude Code / Codex / Droid hook errors on startup fixed. After an uninstall+reinstall, the CLIs could throw Cannot find module '/tmp/nyx-debug-home/hook-bridge.cjs' on every prompt. Nyx now auto-cleans stale hook blocks from ~/.claude/settings.json, ~/.codex/hooks.json, and ~/.factory/settings.json on startup.
  • Hook templates are re-applied freshly after cleanup — existing users just need to launch Nyx once to recover a working setup.

0.3.4 — Trial integrity + /buy polish

  • rm -rf ~/.nyx cheat closed. The trial is now anchored to a stable device fingerprint and backed by the license server. Wiping local config no longer resets the 14-day countdown.
  • Promo codes validated live on /buy — wrong codes show a clear inline error instead of silently generating a full-price invoice.
  • Email autofill readable on dark backgrounds (Chrome/Safari no longer paints a bright blue field with invisible text).
  • /download refreshes client-side so a just-published build appears immediately.

0.3.3 — Bug fixes

  • Buy button now opens /buy with a proper email-to-crypto-invoice flow instead of the landing home.
  • AI model selection persists — signing into Claude via onboarding keeps Settings → AI on “Cloud”.
  • Deactivate this device actually works (was sending the wrong payload).
  • Title bar regression — the Nyx logo no longer slides over macOS traffic-light buttons.

0.3.2 — First public build

Nyx goes public.

  • Spawn Claude Code, Codex, Gemini, and any CLI agent as a live PTY tile.
  • Run many agents in parallel on one infinite canvas.
  • Focus Mode — split view without losing canvas context.
  • Smart agent labels that track what the agent is actually doing.
  • Agent Inbox — pulsing highlights + notifications when agents finish.
  • Shell integration with OSC 133 / 633 prompt markers.
  • 14-day free trial — then $29 lifetime license (3 devices).
  • macOS 12+, Apple Silicon.
← Back to Nyx Join the waitlist ↗
NyxNyxinfinite canvas for agents · 2026
DownloadBuyPrivacyTermsContactChangelogDiscordTwitter
© 2026 · getnyx.dev
NYX