Changelog

Release notes and version history

October 2026 · Build 4409 Plain terminals

🖥 A terminal with no project

  • ⌘⌥T opens a plain terminal: a shell in your home folder, or plain ssh to a host, with no project and nothing on the right.
  • “Open as Plain Terminal” on recent folders and SSH hosts in New Tab, and nexion tab new --kind terminal [--path <folder> | --ssh user@host:port] from the command line.
  • They come back after a restart with their splits. Restored SSH splits share one login.

SSH Connect, redesigned

  • Pick a host, choose Project or Plain Terminal, then open. A click selects, a double click or Return opens.
  • A saved host now connects with its own user and port.

Fixes

  • A pane broken out of an SSH tab stays an ssh terminal on the same connection, instead of opening your home folder as a local project.
  • New Tab no longer reacts to arrows and Return typed in other windows.
  • “Workspaces” no longer opens an empty sheet you cannot close.
September 2026 · Build 4378 What a pane is doing

🏷 A pane says what it is doing, not just what it is running

  • The title a program sets for itself now appears in the pane's strip, after the name you gave it: node becomes npm run build, and an agent announces the task it is on.
  • Hidden when it only repeats the folder, which is what most shells put there and what the strip already shows.

A terminal that behaves the same everywhere

  • Nexion no longer reads the settings of the standalone Ghostty app. If you use both, that file was quietly changing fonts, scrollback and keys inside Nexion, for everything Nexion does not set itself.
September 2026 · Build 4376 Agents that work together

🤝 Agents can work together

  • An agent can take a name and be addressed by it, give another one work and wait for the answer in a single call, and hand back a long result as a file instead of leaving it on a screen for somebody to read off.
  • It can also open a pane beside itself and start another agent in it. Off until you allow it, and capped at two deep and four at a time: each one costs tokens and runs on your machine. The new pane does not take your focus.
  • A pane that finished something you have not looked at says so, and the workspace explains why it thinks an agent is busy, including when that answer is a guess.

🔒 One switch, every way in

  • The setting that stops agents typing into each other's panes now covers the command line too, which is the path an agent with a shell actually has.
  • Sending prose to a pane running a shell says so, because there it is run rather than read. Writing to an agent stopped on its own permission prompt is refused. Clearing somebody else's pane asks the same permission, and closing a pane whose agent is mid-turn needs you to say you mean it.

🔌 A remote workspace that survives a laptop

  • It keeps trying for minutes instead of giving up after twenty seconds, and retries the moment the Mac wakes rather than waiting out a timer that was asleep.
  • While it is out of touch it says how long it has been, and that the tree and branch on screen are the last thing it knew rather than the state of the machine.

Out of the way

  • An update waits for a quiet moment rather than interrupting an agent mid-turn.
  • Cmd+Enter reaches what is running in the pane instead of toggling fullscreen.
  • A pane an agent opens lands in that agent's own tab, and a browser pane no longer covers the tab when another pane is zoomed.
September 2026 · Build 4370 The window, and your phone

🚪 Closing the window asks first

  • Closing the window is not quitting: Nexion stays in the Dock and whatever is running in the panes keeps running. The question says what is still going, and there is a switch for it in Settings next to the one for ⌘Q.
  • Opening the window again finds the same terminals in it. The tabs come back with their shells still running, not with fresh ones beside them.

📱 Scrolling back through a pane on your phone works

  • The history above the visible screen arrives whole, in the order it was printed, drawn for the phone's own width, and it keeps its colours. A pane whose history did not all fit says so.

⚡ Lighter while agents work, and awake without a freeze

  • A rendering optimisation took out a redraw that kept the whole window busy for as long as a tab had an agent mid-turn. Measured on a window of sixteen tabs: 29% of a processor core before, 5% after.
  • Waking the Mac used to repaint every pane at once and leave the window unresponsive past the point where macOS calls an app hung. Only what is on screen repaints now. A display going to sleep and coming back no longer freezes the app either.

Pairing, a cold pane, and a newer terminal

  • Manual pairing can pin the port: 8884, 80, 443 or one you type. Useful when the Mac is reached through a tunnel or a forward that only passes the web ports.
  • A pane starting from cold says so, instead of drawing nothing while the shell comes up.
  • The terminal moves to a newer libghostty, twice, picking up the fixes made upstream in between.
August 2026 · Build 4359 Performance & open source

⚡ The terminal stops repainting itself for nothing

  • Nexion used to drive one frame per display refresh, per pane, on the main thread, for every session alive whether or not anyone could see it. An idle window full of tabs sat at a quarter of a core and worse.
  • libghostty renders itself now, and a pane behind another tab is told it is hidden, so it stops being drawn and gives its GPU resources back. An idle window with ten sessions went from about 26% of a core to 6%.

📦 Three parts of Nexion are now open source

  • The Go agent Nexion installs on your own servers over SSH, the wire contract it speaks with your phone, and the library that reads what your coding agents leave on disk. All MIT, at github.com/nexion-one.
  • The agent is the one piece that runs on a machine you own rather than inside the app, so it is the one you should be able to read. It has no third-party dependencies, opens no network listener, and every path it touches is held inside the workspace you opened.
  • The twelve official plugins are MIT as well, so you can fork the one closest to what you want and change it.

A server running in a pane gets a chip

  • When something in a terminal pane starts listening on a port, the pane's status strip shows it. Click it to open the page in a browser pane beside the terminal, or the cross to stop the server the way Ctrl-C would.
  • Read from the open socket rather than from what the tool printed, so it works when an agent started the server, and it appears and disappears on its own.

The workspace explains itself to your agents

  • A new skills tool serves guidance pages an agent pulls when it needs one: panes, agent-to-agent messaging, the browser, the canvas, the simulator, dev servers, projects and notifications.
  • The context every session starts with shrinks to a table of contents, so a session pays half of what it did and gets the detail that never fitted. Plugins can contribute their own pages, which is the first time their commands are documented to an agent at all.

An agent can see what it can click

  • The browser now hands an agent the page as a list of things that can be acted on, each with a handle: links, buttons, fields, headings, and what is inside the page's iframes, cross-origin ones included.
  • Clicks and typing take a handle instead of a CSS selector, so an agent stops guessing at generated class names. A handle whose element is gone fails and asks for a fresh look; it never lands on something else. What is typed into a password, card or token field is reported as filled and never quoted back.

Smaller things

  • A message to an agent in another pane arrives as a sentence rather than as an attachment. It used to go through the paste pipeline, so opencode collapsed it into a [Pasted ~N lines] chip.
  • nexion pane swap does something. The command existed and the app had no method behind it, so it always answered "method not found".
  • A paused task now says whether it will really resume, by checking the conversation is still on the agent's disk, instead of promising it and starting a new one.
  • A task whose processes all exited on their own is marked "exited", so it stops looking like one you closed on purpose.
  • Worktrees you created by hand show up in the project that owns them, and can be opened as a tab.
  • Diagnostic logs keep their tail and drop their head past a ceiling, which only the ssh one did.
August 2026 · Build 4322 Claude usage

📊 Claude usage, without the Keychain prompt

  • Right-click the Claude icon and press Sign in with Claude, or paste a token from claude setup-token. Nexion keeps a token of its own: macOS never asks for your login password, and reading the quota costs no API request.
  • Session, weekly and per-model windows, plus any limit Anthropic adds later.

Where the tokens went

  • The same panel breaks the last 30 days down by day, by model and by project, read from Claude Code's own transcripts on your Mac.
  • No account and no network: it works before you connect anything.
August 2026 · Build 4311 Agents that talk · Alpha

💬 An agent can talk to the one in the next pane Alpha

The big one in this release, and the newest. Until now an agent could write into another pane and nothing else: no way to know who was there, no way to read the answer, no way to wait for it. It could prompt a colleague and then stare at a wall.

  • Five things, as a typed panes tool over MCP and as the same verbs on the command line: who am I and what is beside me, who else is here, read a pane, send it something, wait for it.
  • It reads the transcript, not the screen. An agent terminal redraws in place, so what is left on it is not what was said: while this was being built an agent answered a question twice and its screen showed an empty input box both times. terminal read --source transcript reads the file the agent writes its conversation in. Claude Code and Codex keep JSONL, opencode keeps SQLite, Gemini keeps two formats under a hash of the folder: all four are read.
  • It waits for a reply, not for quiet. --for reply ends when a new turn from that agent appears and hands the text back with it. Quiet was already true the moment before it started, which is the trap it replaces.
  • The ones that cannot be read hand a result back. Copilot and Antigravity record what the agent DID, the files it touched and the commands it ran, and nowhere the words it said. They call report instead, which posts a structured result on their own pane where whoever asked is already waiting.
  • A handle to an agent, not to a pane. A pane id outlives whoever is in it, so a message meant for one agent could land on whoever replaced it. Every listing carries an occupancy token that moves when the agent does; hand it back on a write and a pane whose occupant changed refuses.
  • Writing is off until you allow it. Typing into somebody else's pane asks for the same permission running JavaScript in a browser pane does, in Settings, Privacy, Agent tools. Reading, listing, waiting and reporting never ask. And a pane with no agent in it refuses text unless the caller says so, because at a prompt a sentence is not read, it is run.

Keys are pressed, not written

A modern terminal program can ask for the kitty keyboard protocol, and in that conversation a raw carriage return is not the Enter key: it is nothing at all. nexion terminal send-keys had been writing bytes from a table older than that protocol.

  • Against Gemini it looked like it worked and did nothing, every time, and the same was true of Tab, Escape, the arrows and Ctrl-C for any program that turns the protocol on. Keys now go through the terminal's own encoder and fall back to the old bytes for a name that has no key behind it.
  • How it was found is the part worth keeping: the same agent in a bare pseudo-terminal, where it does NOT turn the protocol on, submitted on the very first raw Enter. That was the tell.

A pane a phone is holding says so

A pseudo-terminal has ONE size. While a phone watches a pane it drives that size, and the desktop pane wears the result.

  • The pane now draws that smaller grid centred, with a line saying what size it is and why, and an X that gives the width back at once instead of waiting for the phone to be put down.
  • The phone is told when that happens, and gets a Refit button. Without it the phone would find its screen full of desktop-shaped output with no explanation, because the automatic re-fits it sends afterwards are exactly what the dismissal is refusing.

Smaller things

  • A pane can be named by the id it carries in its own environment. Every pane's NEXION_PANE_ID is the session id, while the CLI wanted the one pane list prints, so passing the one you had was answered with "no such pane" about the pane you were sitting in. Both are accepted now.
  • nexion pane list says which panes are directly beside which: four ids, and nothing about ratios or pixels, which stop being true the moment somebody drags a divider. --all covers every project tab in the space, and only that space: spaces are how work is kept apart.
  • terminal send takes --no-submit, which types without pressing Enter: how you leave a message in an agent's box for a person to look at before it goes.
  • A pane found in any window, not only the one in front. An agent whose window had lost focus could not name the pane it was sitting in.
August 2026 · Build 4308 Sidebar cards · Safe start · The phone's terminal

🧱 Every panel in the sidebar is a card

The big one in this release. The Project card used to hold a strip of tabs of its own: the file tree, Notes, and every panel a plugin had registered. The sidebar had two different ways of showing a panel, one nested inside the other, and a plugin could only ever be shown INSTEAD of the file tree.

  • Each of them is a card now, like Git or Attach: opened beside the others, moved between the sidebar's columns, resized, closed. What is left of the Project card is the file tree, and it is called Finder, which is what it is.
  • Notes is one of those cards. It ships switched off, like Attach and Issues, and is turned on from the sidebar's + menu. Anyone who had it open when the tabs went finds it open, as a card, where it was.
  • It is offered only where there are notes to show: not on a drawing, a browser or the welcome tab, and not at all while Notes is switched off in Settings, where it used to appear and then quietly fall back to the file tree.
  • A plugin that registers a sidebar panel gets a card of its own and a row in that menu, with its name and its icon. It arrives switched off: installing a plugin does not take a piece of the sidebar without being asked. A plugin that asks to show its panel gets it switched on and brought into view.
  • Switch the plugin off and its card goes with it, and the room it was taking goes back to the cards still there. A card is something you turn on and off, not a piece of the sidebar reserved for good.

A project remembers how its sidebar was arranged

The arrangement was remembered in the tab, and a tab is a thing you close: reopening the same project started from the factory defaults again, however you had left it.

  • It lives with the project now: which cards, in what order, how tall, in which column, and how wide the sidebar was.
  • Restoring a session still wins over it, because a restored tab has an answer of its own. What is remembered is applied to a NEW tab opened on a project you have seen before.
  • It settles rather than breaks when the world has moved on: a card for a plugin that has since been removed is dropped, a Notes card comes down if Notes has been switched off in Settings, and a layout written by a version that has moved on is ignored without taking the project's name and colour with it.
  • It is kept in .nexion/sidebar.json, a file of its own so that git can ignore it: how somebody likes their sidebar is theirs, while the name and the colour in .nexion/config.json next door are meant to be shared, and stay tracked. A layout written into the config file by an earlier build moves across on its own.

Nexion can start without its plugins

A plugin is somebody else's code running inside the app, and plugins load before there is a window to click in. When one of them is why Nexion will not start, Nexion is the one thing you cannot use to fix it.

  • Hold Shift while it launches, or pass --safe-mode, or set NEXION_SAFE_MODE=1. Plugins are found as usual and simply not started.
  • When the previous start never finished, the next one comes up safe by itself. That is exactly the case where nobody can be expected to know a shortcut.
  • Nothing is switched off for good: everything stays enabled, and the next normal launch runs it all again. A sheet says what happened and offers Plugin Settings, where a banner repeats it, because the switches there look the same as always while meaning something different.
  • nexion plugin list fills in its ACTIVE column: enabled is what you asked for, active is what is running. The two differ after a plugin fails to load, and by design in a safe start.

The file tree stops walking the whole project every time a file is saved

To grey out what git ignores, the tree ran the two slowest git commands in ordinary use, listing every ignored file and directory in the working tree. On the Nexion repository that is 0.83 seconds of work, against 0.01 for reading what changed, and it ran on every probe: a probe happens whenever anything writes a file, so with a build, an install or an agent working it ran continuously.

  • Measured side by side on one machine with the same project open in both: 68 walks in forty seconds before, 6 after.
  • What that walk answers cannot change unless the rules change, so it runs when they do: editing a .gitignore greys the folder within a second, as it always did. Otherwise at most every fifteen seconds, because a rule can also change by node_modules simply appearing.
  • The tree refreshes at most four times a second while a storm of writes is going on. The first change is answered as fast as it always was, so saving a file still moves the marks immediately: it is the tenth write in the same second that waits, for a tree nobody could read at that rate anyway.
  • Asking the command line about git no longer answers from before what you just did. nexion git status and nexion git branch read what the file tree had last drawn, so an agent that commits and asks in the same breath was handed the state from before its own commit. A question looks again whenever anything has moved since the last look: 47 ms for a question about a quiet tree, 137 ms for one right after a change.

The terminal on your phone, read properly

Watching a pane from the companion app was tested against the agents people actually run, and most of what follows is what that testing found.

  • The terminal scrolls back with the keyboard down. It used to have nothing to scroll: what a freshly opened pane received rebuilds the screen an agent is showing and leaves nothing above it, because an agent redraws its prompt in place rather than printing a new one. The phone asks the Mac for what the terminal holds above the visible screen, and a finger dragged down moves through it.
  • Scrolling back no longer shows the same two thousand lines twice, one copy sitting under the other out of sight. The Mac is now told what the replay already covers and stops its history there.
  • Re-opening a pane no longer draws everything twice, with the older copy rewrapped at whatever width the pane had last time. Codex used to come back looking as if its box drawing had been torn in half.
  • Escape codes stop leaking into the picture as text. The replay is cut at a byte count, and a program that redraws in place writes for long stretches with no line to align to, so the cut landed halfway through a colour instruction: opencode printed “245;245m” into the middle of its own answer. The cut steps over a half-finished instruction now.
  • Typing faster than the phone can keep up no longer multiplies the text. Dictation, a Bluetooth keyboard or a paste could arrive before the hidden input had been reset, and everything typed so far was sent again: “mare” arrived as “mmamarmare”.
  • The keyboard button lights up while the keyboard is down. Tapping the terminal deliberately does not raise it, since that would fight scrolling, which left the one way in looking like the buttons beside it.
  • The Mac takes its terminal's width back the moment the phone stops watching. A pseudo-terminal has ONE size: while a phone watches a pane it drives that size, which is what makes the pane readable on a phone at all, and the desktop pane goes narrow meanwhile. What was wrong is that it never ended, because the Mac only learned a viewer had gone when the socket closed: a pane opened once from a phone stayed narrow for the rest of the day.
  • A phone that drops its connection leaves nothing behind on the Mac. Every pane a phone watched had an observer attached to it, walked on every chunk of output, and a phone on a mobile network reconnects all day. And leaving a pane and re-entering it quickly can no longer freeze it: the two requests could interleave, and in the losing order the phone was left showing a pane that never updates.
  • A phone that asks the Mac something and gets no answer no longer waits forever. Each call gives up after twenty seconds on its own, without disturbing the connection.

Smaller things

A switch that had never done anything, a place in System Settings, and three agent corrections.

  • The ads and trackers switch finally does something. The rules it applies had never compiled, from the day they were written: two of them used regular expression constructs WebKit rejects, and one bad rule voids the whole list, so the switch had been decorative all along. If a page behaves differently after this update, that is where to look.
  • Nexion can be your browser. It registers as a handler for web links, so it appears in System Settings under the default browser, and a link clicked in Mail or anywhere else opens in a tab, whether Nexion was already running or had to start.
  • An agent started in a Nexion pane writes its conversation down again. A pane is a fresh terminal, not a child of whatever launched the app, but the environment said otherwise: Nexion opened from inside an agent inherited that agent's session markers, every pane inherited them in turn, and Claude Code reads one of them and turns transcript saving off. Nothing looked wrong except one line of warning, and the conversation was simply never written.
  • The line under a tab stops blinking while an agent answers. An agent printing a long answer goes quiet for several seconds at a time while the model thinks, and five seconds of silence was being read as “finished”. It waits twelve seconds now, and lingers a few seconds after the end, which is the harmless way to be wrong.
  • The agent icon on a tab no longer depends on the keep-awake setting. Reading what a pane is doing and keeping the Mac from sleeping had ended up sharing one switch, so turning the automatic keep-awake off also took away the icon and the working line, which have nothing to do with sleep.
  • The list of conversations to resume is no longer empty for a project behind a symlink. /tmp is a link to /private/tmp, and an agent files its transcript under the resolved spelling, so a project opened on the linked path found none of its own history. Both spellings are looked at now.
August 2026 · Build 4268 🎉 Spaces · Tasks · Companion

🚀 One window, and as many spaces as you need

The big one in this release. A tab used to belong to whichever window it was opened in, so the same project could show three different task lists depending on which frame you looked at, and a task opened in one window could not be reached from another. Windows have become spaces.

  • A space is a context to work in: its own projects, its own tabs, its own colour and its own browser profile. Client work in one, your own things in another, and neither shows the other's tabs.
  • Move between them by clicking an icon in the strip at the foot of the sidebar, by swiping sideways with two fingers over it, or with Ctrl-Command-Left and Right. The swipe follows your fingers and travels past the spaces in between, so you always see where you went.
  • Command-N makes a space, which is what it always meant: somewhere else to work. A new one starts with no colour, which is the sidebar exactly as it was; give it one when it has earned it.
  • Deleting a space says what goes with it, and its projects move to the first space rather than being deleted. A project is a folder with a history behind it.
  • Windows you had became spaces, one each, keeping their tabs and their order. The previous layout is kept on disk untouched, in case you want to go back to it by hand.
  • nexion space list|new|switch|next|prev|edit|rm does the same from a script.

Projects that keep their work, and tasks that outlive their tabs

A project is a folder with a list of tasks; a task is one piece of work, with its tab, its worktree and the agent conversation it carries. Closing a task keeps the record, so reopening it puts you back where you were.

  • A project lists every task it has, not just the ones with a tab open. It used to need a running tab before it would draw a row, so a task open in another window appeared and a task open nowhere appeared nowhere at all.
  • A task can run on a git worktree of its own, so two tasks on the same repository never fight over one checkout, and the project's setup entries are linked into it.
  • A loose tab can become a task of a project, and a task can go back to being a loose tab, from the row's own menu. Nothing is recreated: the shell keeps running, the agent keeps its conversation, the page keeps its scroll position.
  • A task shows the mark of the agent it runs, in the sidebar and on the project page, read from the task's own record rather than from whatever the shell is doing at that instant.
  • Reopening a task you had opened and never typed in no longer fails. Claude names a conversation before it writes one down, so Nexion looks first: a conversation that exists is resumed, one that never existed is started on that same name.
  • Two projects with the same name no longer share a worktrees folder, and removing a worktree refuses a path outside the folder Nexion manages them in.
  • nexion project and nexion task reach all of it from a script.

The companion app knows what needs you

A list of spinning dots answers “is something running”, which is the opposite of what you open a phone to find out: the busiest row is the one that needs you least.

  • Every tab says what it is doing in one word, and a task blocked on a permission request wears a raised hand instead of looking exactly like one that is merrily working.
  • Tap the raised hand and you get the question the agent is actually asking, with its own choices as buttons. The choices are read off the terminal rather than from a table of per-agent wordings, so an agent nobody taught it about works the same way.
  • A running task carries a bell: one tap and it will tell you when it stops, quietly if you are at the Mac and as a push if you are not. It fires once and disarms itself.
  • Reading an alert on the phone puts the bell out everywhere. Unread is one fact about a tab, not one per device.
  • The phone knows about spaces, lists your work in the order the Mac does, and opens a project on the same dashboard the Mac shows.
  • A phone stays paired when it is reinstalled. It used to identify itself with the id iOS replaces on reinstall, and the only cure was removing the Mac and adding it again.

Move a pane to a window of its own, and it takes everything with it

“Open in New Window” used to start a second shell on the same folder, or a second view on the same page. It moves the one you already have now, and is called Move to New Window because that is what it does.

  • A terminal keeps its shell running and its scrollback, and an agent mid-answer does not notice it changed window.
  • A page keeps its web view, so it arrives with the form you had half filled in, its scroll position and whatever its scripts were holding. None of that survives loading the same address again.
  • A drawing keeps its editor, which is where the scene, the undo history and the zoom live.
  • Closing that window is what brings the pane home, and it goes back where it came from: a pane out of a split returns beside the pane you are in, a tab that left whole returns to its own row, in its project and its space. Quitting Nexion brings them all home first.
  • nexion pane detach and nexion pane recall do it from a script.

Smaller things

Memory, precision at the command line, and a few corrections.

  • Nexion gives memory back for what it is holding but not showing: four seconds after you move away, a frozen web tab and a drawing let go of the browser engines they were keeping alive. A drawing comes back when you return, at the cost of half a second; one with unsaved changes is never touched.
  • nexion terminal takes --pane-id, so a script writes where it says instead of wherever the focus happens to be, and send-keys refuses a key it does not know rather than typing its name into a running session.
  • nexion device list|rm|disconnect reaches the paired phones, which were the one noun in the app a script could not.
  • Holding Command numbers every row it can take you to, tasks and projects included: they were counted all along and simply never said so.
  • A browser profile with an emoji keeps its name in the profile menu, and the address field takes the colour of the bar it sits in instead of a grey wash over it.
  • A saved workspace brings its agent back on the conversation it was having, rather than on a blank one.
August 2026 · Build 4217 SSH · Panes · Agents

An SSH tab comes back when the machine does

A remote tab used to end where the connection ended. The banner said “disconnected”, the Reconnect button did nothing useful, and the way back was to close the tab and open it again.

  • A dropped connection is retried three times, and each attempt rebuilds the shell in the pane, which is the thing that carries the rest of the workspace.
  • When the retries run out Nexion keeps an eye on the host and picks the session up when it answers again: after a network change, after the Mac wakes, or within the minute. Shell and file tree both return, no click needed.
  • It waits for the host to actually come back. If the machine is up and something else is wrong, it stops and leaves the Reconnect button to you, instead of retrying in a loop.
  • The status bar says why: unreachable, name not resolved, connection refused, credentials, host key. For a machine on your own network it also points at the macOS Local Network permission, which is easy to miss and looks like a broken app.
  • While a connection is being rebuilt the remote file tree dims and says it is showing the last known files, rather than passing an old listing off as the state of the machine.
  • When something still fails, ~/.nexion/ssh-diagnostics.log has what ssh actually said, for every connection Nexion makes on its own behalf.
  • A key or jump host written on a bookmark is used by the terminal too, and hosts that arrive through an Include in your ssh config now show up in the list.

Panes, and the keys around them

Smaller things, all in the way panes and windows are handled.

  • A pane can become its own tab: drag its handle onto the sidebar, or pick Break to New Tab from its right-click menu. Focus stays where you were working.
  • ⌘Q asks first, and the alert names what would go: the panes running a command, the agents mid-turn, the drawings with unsaved changes. It sits one key away from ⌘W, and that was enough.
  • A shortcut you choose brings Nexion forward from any app and pushes it back when you press it again from inside. Off until you turn it on, in the new General settings.
  • Every entry in a pane’s right-click menu has an icon now, and the split icons show where the new pane lands rather than the opposite.

Agents

Two changes for people who keep an assistant running in a pane.

  • Antigravity and GitHub Copilot CLI get Nexion’s MCP server registered as well, next to Claude Code, Codex, Gemini and opencode. Only for the ones you actually have installed.
  • The sidebar shows the mark of the assistant running in a tab in place of the terminal icon, so a glance tells you which one is busy where.
August 2026 · Build 4205 Browser profiles · Canvas · Fixes

One pane logged in, the one beside it not

A browser profile used to belong to the tab, so every pane inside it shared one session. Panes can now hold their own.

  • The profile icon in the address bar is now a button, and it shows on every pane including one on the default profile. Click it to move that pane to another profile, private included; the panes beside it stay where they are.
  • What it is for: the same URL as you see it signed in, and as an anonymous visitor gets it, side by side in one window. That is a permissions bug most people meet in production.
  • From the outside: nexion pane split --kind web --private opens one private from the start, and browser profile switch <id> --pane-id <id> moves one already open.
  • A tab row shows the profile of its first pane, and nothing when they are all on the default.

Diagrams an agent draws arrive with their labels

Ask an agent for a diagram on a canvas and the boxes used to come out empty, while the scene read back from the canvas looked perfect.

  • A scene written against Excalidraw’s current shape was missing a field this build still needs, and text without it is not drawn at all. Scenes are now repaired on the way in, so a drawing renders whatever version wrote it.
  • A label tied to a shape by a half-finished binding used to vanish the same way. It now lands centred inside that shape.

Three things that lied quietly

  • An agent notification bubble now appears only in the window holding the tab it is about. It used to show up in every other window as well, where clicking it did nothing.
  • nexion pane close closes the pane you named or none: naming one that is not in the active tab, or mistyping its id, used to close whichever pane you were working in and report success.
  • pane split --dir says where the new pane lands, v beside and h below, instead of naming the cut and reading backwards.
August 2026 · Build 4200 Agent tools · Untrusted page content

A web page cannot give your agent orders

Agents running in Nexion can open and read a browser pane. A page knows it might be read by one, and can write a paragraph aimed squarely at it.

  • Page text now reaches the agent wrapped and labelled as untrusted data, carrying the address it came from. An instruction found inside is something the agent is told to report to you, not to follow.
  • This makes the easy attempt fail loudly rather than quietly. It is not a guarantee, and nothing here pretends it is one.

Two tools now ask first

  • Running JavaScript in a browser pane, and reading or clearing your browsing history, are off until you switch them on in Settings, Privacy. While off they are not offered to the agent at all, so it cannot rephrase its way back to them.
  • Everything else stays as it was: an agent can still read a page, take a screenshot, draw, take notes, drive the simulator and notify you. It has never been able to run a command, change a setting or touch git.
  • The same panel can withdraw agent access to Nexion entirely, which takes the entry back out of the agent’s own configuration rather than leaving it there and refusing calls.

A drawing can sit next to your terminal

Canvas used to mean a whole tab. It can be a pane now, beside the terminal it belongs to.

  • Right-click a terminal and pick Split with Canvas: a new drawing or one you already have, to the right or below. The pane comes back after a restart still pointing at the same file, and saved workspaces keep it.
  • Agents and the CLI can draw in that pane, not only in a canvas tab. With one drawing open they find it; with several they ask which.

Menus that do what they say

  • “New Canvas File…” creates a drawing and opens it already saved. What used to be called “New Canvas Tab” only ever opened an existing file, so it is “Open Canvas File…” now, on the same shortcut.
  • The pane menu can split with a terminal, a browser or a canvas, and close any pane. A canvas pane had no way to close at all.
  • “Save Canvas” is gone: a canvas saves itself, and the command was holding ⌘S for the whole app. Rename Pane now appears only on terminals, where the name is actually shown.
August 2026 · Build 4195 First public beta release Notarised · Phone notifications · Keep awake

Signed by Apple, so it just opens

Nexion is now signed with a Developer ID certificate and notarised by Apple.

  • Double click and it opens. No right click and “Open”, no trip to System Settings, no warning about an unidentified developer.
  • Updates carry the ticket with them, so a fresh install and an auto-update behave the same way, even offline.

Your phone gets told, even with the app closed

  • An agent finishing while you are away from the desk now reaches the companion app on your phone even when it is suspended or fully closed, not only while it happens to be open.
  • Tapping the notification opens the tab that raised it, straight from the lock screen, waiting for the workspace to load rather than dropping you on a list.
  • A burst from the same tab leaves one current notification instead of a stack.

Quiet while you are already looking

  • When Nexion is the app in front of you, your phone stays silent: the alert appeared on the Mac, buzzing your pocket for the same thing is noise. It still arrives on the phone, so the Alerts list and the unread badges stay in step.
  • On by default, with a switch in Settings for anyone who wants the phone to ring regardless.

Your phone can let the Mac sleep again

Nexion holds your Mac awake while the companion is connected. That hold is the only one with no natural end: a build finishes, an agent goes quiet, a phone in your pocket does not.

  • Settings on the phone now carries the switch, so you can hand the Mac back its sleep from the sofa instead of walking over to it.
  • Underneath it is the full list of what is keeping the Mac up. Turn the switch off while a build is running and the Mac stays awake for the build, and now says so, instead of leaving you with a control that looks broken.
  • Switching it off releases the hold immediately. It used to wait until the phone happened to disconnect, which meant the setting appeared to do nothing at all.

Settings from the command line actually change something

nexion config set reported success twice over while changing nothing.

  • Values are typed now. true used to be stored as the word “true”, so anything reading a yes/no got no. Numbers are numbers, and quotes force text.
  • The change lands right away, the same as flipping it in Preferences. It used to write the file and stop there, leaving the running app on the old value until the next launch.

The version reads 2026.8, not 2026-08

Same meaning and the same monthly cadence, one character different. The dash had to go because the iPhone companion shares this version and the App Store only accepts numbers separated by dots. Updates are unaffected.

August 2026 · Build 4184 Camera & mic · Private tabs · Notifications

Video calls, and a way to cut them off

Sites can now reach the camera and the microphone, so a call in a browser tab works. What matters more is knowing when they are live.

  • While a page is capturing, a red badge appears in the pane toolbar: its menu says which devices are live and can mute them, keeping the call alive but recording nothing, or revoke them outright so the page has to ask again. The tab row carries a red dot as well, because a background tab or an unfocused split pane is exactly where you would not notice.
  • Scriptable too: nexion browser capture status|mute|stop, so an agent can answer “is anything recording?” and act on it.

Private tabs, and notifications that arrive

  • A built-in Private profile joins your own: an in-memory store shared between private tabs and gone on quit, with no history entries, no recent-tab entries, and a restart that brings the tab back empty. Open one from the Terminal menu, the tab context menu, or nexion browse --private.
  • Chat and mail sites can finally notify you. Each notification is titled by the site with the host underneath, and clicking one brings that tab forward and runs the page's own handler, so a site that jumps to the message still does. Rate-limited per site, and switchable off in Preferences.

Browsable history, a richer context menu, a calmer inspector

  • History is no longer just fuel for autocomplete: search it in Preferences, reopen an entry in a new tab, forget one page or everything from a site. Same from the command line, including nexion browser history delete --host.
  • Right-click a page and the image under the cursor can open in a split pane or download; a selection can be searched with your engine in a new tab; View Page Source opens the live HTML in a floating viewer. Cmd+P prints, and Save as PDF captures the whole scrollable page.
  • The Web Inspector no longer makes the pane strobe: WebKit resized the web view while the pane's constraints put it back, hundreds of times a second. The pane now hands its layout over while the inspector is docked and takes it back when it closes.

Permissions per site, zoom that sticks, suggestions

  • Camera, microphone and notifications are now answered per site and remembered: a site asking for notifications gets one prompt, an allowed site never asks again, a denied one is refused silently. Review or revoke everything in Preferences or in the popover behind the lock icon, and from nexion browser permission. Notifications used to be granted to whoever asked, which took the choice away from the person whose Notification Centre it is.
  • Zoom belongs to the site: it returns on the next visit, in every tab on that host, and after a restart. Click the zoom chip in the status bar to reset, hold it to pick a level, or edit the list in Preferences.
  • The address bar offers search completions from your engine under the history rows. It has its own switch, skips anything that already looks like a URL, and never runs in a private tab, because it is the one part of the address bar that leaves the Mac.
  • Pinned tabs. The sites you always keep open become a fixed row of favicon tiles above the tab list, sized to the sidebar and reorderable by dragging. They can't be closed by accident: Cmd+W, the close button and nexion tab close deactivate a pinned tab instead of removing it, releasing its memory and dimming the tile until you click it. Only Remove, in the tile's own menu, actually takes it away.
  • A private tab now says so in the address bar, which inverts to a dark field with a glasses icon inside it, and a tab on a custom profile shows that profile's icon in the same corner. The sidebar marker was no help with the sidebar hidden or the tab pinned into a tile.
  • Downloads appear in Finder with Dock progress while they arrive rather than only at the end, can ask where to save, and are readable from nexion browser downloads. Download Media works on video and audio, and “Open Image in New Window” opens a tab, since a workspace has tabs.
July 2026 · Build 4097 Terminal links · Shell integration

A link in a terminal can stay in the app

⌘-clicking a URL used to hand it straight to the system browser, with no way to keep it here. Now the click asks, the way iTerm2 does.

  • Three destinations: your default browser, a Nexion tab, or a browser pane split beside the terminal that printed it, so the page and the command that produced it stay side by side.
  • “Remember my choice” turns the answer into the default and the sheet stops appearing. Settings › Terminal › Links holds the same four values.

Nexion stays out of your other terminals

It used to install a claude wrapper at the front of the PATH of every shell on the machine, and leave it there after the app was dragged to the Trash. That is more reach than a terminal app needs.

  • The wrapper now reaches PATH only inside Nexion panes. In iTerm, Terminal or VS Code nothing is intercepted, and the old file is deleted on launch.
  • Inside Nexion the integration got more reliable, not less.
  • And it can undo itself: nexion uninstall removes the shell line, the shim and the entries written into Codex, Gemini and opencode. Your own data is never touched.

The phone finds your Mac again

Pairing had become unreliable on Macs running virtual machines: the phone was handed every address the Mac owns, took the first one, and often got loopback or a VM network nothing can reach.

  • The Mac now publishes a shortlist of addresses that actually work, best first, and the phone walks it until one opens instead of giving up on the first dead one.

Smaller things

  • Alerts gained a button to clear the whole backlog at once. It appears only when something is unread.
  • Saved workspaces keep their browser panes.
  • Attachments show their date, and can be revealed in Finder.
  • An agent can drive a browser pane.
July 2026 · Build 4081 iOS Simulator · Agent context · Local AI

The iOS Simulator, in the workspace

A new Simulator card in the gutter, on machines with Xcode installed. Pick a device, boot it, and drive the whole build-test loop without leaving Nexion.

  • Screenshots and screen recordings drop straight into the tab's Attach card, ready to hand to an AI prompt. Drop a built .app on the card to install and launch it, open deep links from a small popover, and follow the device log in a movable floating window.
  • Everything is scriptable from nexion sim: list, boot, screenshot, record, install and launch, open URLs, and send a test push. An AI agent can drive the UI too, tapping, swiping, and typing on the device, with a one-time verified tool download.

Agents arrive knowing Nexion

  • Every Claude Code session started inside a Nexion pane now learns the workspace on its own, with no CLAUDE.md edits: a session-start hook teaches it the nexion commands, and it re-fires after /clear so the context never quietly disappears.
  • A new nexion mcp runs a Model Context Protocol server that hands the agent 38 typed tools: attach files, notify you, and the full simulator, browser, canvas, notes, and keep-awake surface. It is wired up automatically for Claude Code, Codex, and Gemini.

opencode joins the bots, models can run local

  • opencode is now a first-class bot in the toolbar, with the same working indicator, keep-awake, and MCP tools every other agent gets.
  • The in-app AI features can now run entirely on your own machine: add Ollama as a provider in Preferences, point it at your local server, and every model you have pulled shows up. No API key, nothing leaving the Mac.
July 2026 · Build 3986 Keep Awake · Terminal · Settings

Keep the Mac awake

You start an agent, walk away for coffee, and come back to a machine that slept in the middle of the work. Not any more.

  • A cup in the title bar, and in the menu bar while it is on. Click for indefinite, right-click for a timer with a countdown ring. Ctrl-Cmd-K from the keyboard.
  • The part you never touch: Nexion holds sleep off on its own while a coding agent or a long build is working, and lets go once things go quiet. An agent sitting idle at its prompt does not keep your Mac up.
  • It knows a finished turn is not always finished work: when an agent hands back the prompt while its own background tasks keep running, the Mac stays up until those are done.

Nexion knows what your terminals are doing

  • A light sweeps along the bottom of a tab while an agent is mid-turn. The opposite of the notification badge: that one means it stopped and wants you, this one means it is still going.
  • The SSH badge now appears for an ssh you typed yourself, not only for connections opened through the SSH panel.
  • Bot buttons and plugin tools name what is running before typing over it. Closing a pane that is only sitting at a shell prompt no longer asks at all.

Settings, redrawn

  • Every setting is a row: what it is, a line saying what it does, and the control lined up on the right with all the others. Rows sit in cards, and the thirteen panes are gathered into three groups.
  • Choices that were rows of custom buttons became ordinary dropdowns, and the theme pickers gained room to compare more than two rows at a time.
July 2026 Mobile companion · Sidebar

Nexion companion for iPhone and iPad

Pair your phone or tablet with your Mac over the local network and your workspace travels with you, live in your hand. Pairing is approved on the Mac and everything runs on your own network with nothing in the cloud, and the link is end-to-end encrypted. From the phone you can:

Terminals, with tmux

  • Every terminal is mirrored and interactive. Attach a pane to a tmux session and drive it from the phone: move between windows, open a pane full-screen and readable, and scroll back through its history with a drag.
  • The phone can drive the desktop pane's size, so what you see matches your device instead of a cramped slice.

Web tabs as real pages

  • Open a Mac browser tab as a real, interactive page on the phone. It runs through the Mac's own network, so it reaches the same sites the Mac can (local, LAN and VPN included) and keeps you signed in, exactly as on the desktop. Only the tab you are viewing is shared, never the rest of your browser.

Live tab video stream

  • Prefer to watch a tab live instead of proxying it? Start a real-time video mirror of the desktop tab that you can tap, scroll and type on directly.
  • Built on WebRTC: end-to-end encrypted, hardware-decoded on the phone, and congestion-controlled so it stays smooth on a real network.
  • Adaptive quality with an Auto mode that stays crisp while you read and lightens up while you scroll, plus manual High-res and Fast options.
  • Precise input: taps, scrolling, pinch-zoom and typing map straight onto the page under your finger.

Notifications and alerts

  • AI toasts ("Claude finished", "Codex needs approval") and workspace alerts now reach the phone: a banner, sound and lock-screen alert while the app is open, plus an in-app Alerts feed.
  • Tap a notification to jump straight to the tab that raised it. The unread badge then clears everywhere it is shown, on the phone and the Mac.
  • Reconnect and the phone catches up on anything it missed while away. Push while the app is fully closed is coming.

Windows and canvas

  • Switch between the Mac's open windows from the phone, and open your canvas boards, all from your hand.

Desktop: clearer sidebar columns

  • Creating a second column in the right sidebar is simpler: drag a card into a wide zone on the left edge and the existing column slides aside to show exactly where the new column will land, instead of a thin strip that hugged the current column's border.
May 2026 · Build 3730 Antigravity · Codex hooks

Antigravity bot (agy) integration

  • Google's Antigravity CLI joins the bot toolbar alongside Claude, Codex, Gemini, Aider and Copilot. One-click launch in any terminal tab; the toolbar shows a "signed in" badge as soon as agy stores its credentials.
  • New toggle under Preferences > Bots to show or hide the Antigravity button in the toolbar.
  • Per-instance agy-notify.sh wired into ~/.gemini/antigravity-cli/hooks.json: notifications and toasts route to the correct Nexion socket so dev and prod builds never cross-fire.
  • Known limitation (agy 1.0.1): the Stop hook is registered but the binary never actually fires it. Until upstream ships a fix, "agent finished" toasts for Antigravity fall back to terminal prompt detection like Gemini. The integration is left in place so notifications start working with zero changes the moment agy fixes the firing.

Codex notifications on stable lifecycle hooks

  • Codex notifications migrated from the legacy -c notify=[...] launch wrapper to Codex's official Stop and PermissionRequest lifecycle hooks in ~/.codex/hooks.json. More reliable across Codex updates and decoupled from the launch command.
  • The installer is merge-aware: third-party entries in hooks.json (Muxy and friends) are preserved, only Nexion's matchers are rewritten. No more "Nexion clobbered my Codex hooks".
  • PermissionRequest raises a toast the moment Codex asks to run a tool or edit a file. The previous mechanism never caught those approval prompts.

Clickable AI notification toast

  • The floating AI bubble that announces "Claude finished", "Codex needs approval", or "Antigravity has output" is now clickable. Tapping it activates the originating tab and pane, even if it lives in a background window.
  • Hover state plus a VoiceOver hint ("Activate this tab") makes the affordance discoverable without a tooltip.

Gemini / Antigravity: ToS-aligned authentication

  • Gemini "Sign in with Google" removed. Google's Cloud Code Assist backend (cloudcode-pa.googleapis.com) is contractually reserved for the official Gemini CLI; third-party clients piggybacking on the OAuth token have been getting their accounts banned. An API key from aistudio.google.com is now the only supported Gemini credential. The key placeholder shows AIzaSy… so it is obvious what shape of credential to paste.
  • In-app Usage sheet removed for Gemini and Antigravity, for the same reason: reading the quota requires hitting Cloud Code Assist with the user's OAuth token. In its place, the Bots panel shows a local-only "signed in" badge and a button that opens Google's own usage dashboard (aistudio.google.com / antigravity.google). Claude, Codex and Copilot keep their full in-app usage panels unchanged.
  • Stale OAuth mirror entries (created by the old Gemini sign-in flow) are now cleaned up on launch so they cannot resurrect themselves into Keychain or trip the bot-status detector.

Polish

  • agy added to the shell-integration ignore list and the AI-source detector so its terminal output does not double-fire as a generic "long command finished" notification.
  • Finder Trash confirmation now defaults to the destructive button so Return immediately confirms (matches the system Finder).
May 2026 · Build 3689 Privacy-first analytics

Privacy-first analytics: TelemetryDeck

  • Nexion's product analytics moved to TelemetryDeck, a Swift-native, EU-hosted analytics service. Same anonymous-counter contract as before: the install identifier is SHA-256 hashed on the device before any signal leaves it, no IP addresses, no cookies, no behaviour profiling. GDPR-compliant without a cookie banner; the opt-out toggle in Preferences keeps working unchanged.
  • The set of counted actions was widened so engagement panels stop under-representing people who live in the Notes card, the Command Palette, the Web bookmarks list, or the pane-layout commands. Same bucketed-properties contract as before: no raw plugin IDs, no file paths, no URL bodies, no AI prompt content. Only the count grows.
  • The provider-gating fast path that lets the server retire deprecated analytics vendors gracefully now also handles mid-session recovery: if the binary is allow-listed again after a remote-config update, the SDK starts cleanly without waiting for the next launch.

Auto-update polish

  • Sparkle bumped to 2.9.2 (the latest "Appcast Improvements" release).
  • Wake-from-sleep recheck: the 4-hour update scheduler does not catch up across a missed tick, so an overnight sleep used to leave the update badge unset for hours after wake. A wake observer now fires a silent background check the moment the system wakes so the "update available" badge can light up immediately. The check stays silent: no dialog, no popup, just the badge.
  • Classified update failures: install errors are split into download / verification / extraction / permission / install phases instead of collapsing every abort into a generic "download failed". An outage on the update server is now distinguishable from a clean "you are up to date" in the diagnostics breadcrumbs.
May 2026 · Build 3685 Multi-window

Multi-window

  • Cmd+N opens a new window. Each window has its own tab list, active tab, sidebar visibility, and gutter cards. Closing one does not affect the others. Cmd+T keeps its existing meaning (new tab inside the focused window).
  • Safari-style last-window behaviour: closing the final window leaves Nexion live in the Dock with the menu bar active. Cmd+N reopens a fresh window, a Dock click does the same, and Cmd+Q is the explicit quit that flushes every window's state.
  • Cmd+Shift+T reopens the most-recently-closed window with all its tabs, active selection, gutter state and split layout (Safari "Reopen Closed Tab" chord, transposed to windows).
  • At launch every window from the last session reopens at its saved position and screen, in the focus order you last left them. Multi-monitor users get their windows back on the right display when the screen is still connected; off-screen rects are pulled back onto the visible area.
  • Sidebar shortcuts (Cmd+T, Cmd+W, Cmd+1..9, Cmd+D, Cmd+Shift+K, etc.) act on the window you are looking at, not the first one you opened. Per-window key monitors gate every keystroke through NSApp.keyWindow instead of fighting over the process-wide event monitor stack.

Crash-proof per-window persistence

  • Each window owns its on-disk state at ~/.nexion/windows/{uuid}/: a consolidated snapshot.json plus a write-ahead log that takes every mutation on a 50 ms tail and a .bak rotated only when the live file decodes cleanly. SIGKILL, kernel panic, OS reboot: at most ~50 ms of state can be lost, and the WAL gets replayed at next launch.
  • An owner lock (PID + kernel boot ID + instance ID) lets a recovering instance distinguish "still owned by a live process" from "stale lock from a dead PID or previous boot" and reclaim orphans safely.
  • Crash recovery banner: after a hard quit the next launch surfaces a one-shot orange notice ("Recovered N windows from previous session"), explaining that the tabs and layout were rebuilt from the write-ahead log. Auto-fades after 10 s.
  • Sidebar tab reorder (drag), web tab URL changes (navigation, redirects, manual URL bar entry), and window focus changes now all trigger an immediate per-window save instead of being held in memory until something else flushed.

Single-instance launch handshake

  • Double-clicking a running Nexion (or open -n Nexion.app) no longer spawns a parallel process. A short IPC handshake first thing in startup detects the live instance, asks it to open a new window, and exits the second process cleanly. Stale sockets left by a previous crash fall through gracefully so you are never locked out.

Multi-window CLI & IPC

  • New global --window <uuid|front> flag on every per-window CLI command (tab, pane, terminal, editor, browser, git, notes, attach, workspace, canvas, open). Default front: the current key window, so existing scripts keep working unchanged.
  • New nexion window list enumerates every Nexion window with its UUID, title, tab count, active tab, frame, key / fullscreen flags. window info --window=X, window focus --window=X, window close --window=X drive a specific window from a script.
  • IPC event payloads now carry windowID. nexion event subscribe "tab.*" can tell "tab created in window A" from "...in window B"; pane events resolve their owning window by tab UUID.
  • AI hook notifications fired from a pane in a background window now resolve correctly: the resolver scans tabs across every registered window instead of only the front one's tab list.

Polish & small fixes

  • Browser address-bar site-info popover now anchors exactly at the lock icon (HTTPS) or the "Not secure" chip (HTTP) instead of floating in the middle of the URL field.
  • Git card "Checking Git…" loader redesigned: centered pulsing branch icon plus three shimmering skeleton bars instead of a lonely top-left spinner. Matches the visual language of the other empty-state cards.
May 2026 · Build 3640 First alpha release Flat redesign

Browser split view

  • Up to four recursive WKWebView panes per browser tab. Each pane has its own URL, history, navigation, downloads, find-in-page. Layout persists across app restarts.
  • Cmd+D split right, Cmd+Shift+D split down, Cmd+W close pane (with confirm)
  • Cmd+Opt+click opens a link in a pane to the right of the current one; Cmd+Opt+Shift+click stacks it below
  • Drag the Move-Pane handle onto another pane's top/bottom/left/right quadrant to rearrange the split tree
  • Drag a pane onto the sidebar to extract it into its own tab, or drag a tab onto another tab's middle band to merge them as a split
  • Focused pane stays full-saturation; non-focused panes desaturate and dim. Tab badge updates: WEB ×2, WEB ×3. Tab title and favicon follow the focused pane.
  • Background panes pause their own JS timers, animations, video autoplay via Page Visibility API (energy win on streaming / chat sites)

Freeze web tabs

  • Right-click a web tab › Freeze Tab to tear down every WKWebView in the tab while keeping its sidebar slot. The row desaturates and gets a small snowflake badge; the WEB ×N pane-count badge stays visible so it's still obvious whether the frozen tab is single- or multi-pane
  • Clicking a frozen tab thaws it. The saved split layout and URLs are rehydrated through the same path used by session restore, so cookies and localStorage that live on disk under the tab's profile keep working, behaviour identical to a manual Cmd+R
  • Frozen state survives app restart: the snapshot is persisted in session.json and the next launch lands the tab in its placeholder state without allocating a WKWebView
  • Frozen tabs hide their hover close button (the context menu still offers Close Tab) and are skipped by Cmd+Up/Cmd+Down navigation and the Cmd+1..Cmd+9 shortcut sequence, so the visible numbering on the active tabs stays contiguous

Browser chrome and address bar

  • Safari-style site tinting: the toolbar inherits the page's <meta theme-color> when consistent with the visible page, with auth-page heuristics that override a dark meta on a bright login form. SPA-aware via pushState / MutationObserver hooks; 220ms ease tween between site tints with no neutral flash.
  • Click-on-lock site information popover: HTTPS shows certificate Issued to / Issued by / valid date range parsed from live SecTrust; HTTP pages get a prominent orange "Not secure" chip with explanation
  • Search engine setting (Preferences > Web Browser): Google (default), Bing, DuckDuckGo
  • Esc in the address bar restores the loaded URL without reloading the page
  • http:// links and http-to-https redirects now work; OAuth flows with mixed schemes too

Welcome dashboard

  • Cmd+T opens an in-tab welcome dashboard with hero, quick actions (Open Folder, Web, Canvas, SSH, tmux), and a searchable recents list
  • Auto-focused search; ↑/↓ navigate; Return activates the only result when a single match remains
  • Picking a recent transforms the welcome tab in-slot, replaces the floating launcher panel

Tab groups

  • Sidebar groups with multi-select (Cmd-click), "New Group from Selection", "Move to Group", drag-reorder, inline rename, 13-swatch palette, emoji + SF Symbol icon pickers
  • Groups auto-delete when their last tab leaves; CLI tab list / tab active expose group_id

Window & theme

  • Native macOS Full Screen (Ctrl+Cmd+F) with pinned chrome: the sidebar toggle, project pill, bot picker and gutter menu all stay reachable. Auxiliary windows (auth popup, page summary, git diff) overlay; utility windows opt out.
  • Flat-design palette in light mode: warm #fafaf9 chrome, 1pt rounded window border, sidebar groups as tinted containers, 44pt tab rows, leading sidebar toggle as titlebar accessory, dashed New Tab footer. Dark mode unchanged.
  • Right-side resizable card stack replaces fixed sidebar panels: File / Notes / plugin sidebar panels as inner tabs, Attach + Git accordions; drag handles + persisted layout per tab
  • Per-file .excalidraw canvas tabs: Finder double-click, dock drop, open CLI all spawn a canvas tab bound to that single file

GitHub Issues in the sidebar

  • New right-sidebar card listing open / closed issues for the project's GitHub repo, with search, state filter, and multi-select label filter. Master / detail in-card: read the body, comments, and metadata without losing your place in the list.
  • OAuth device-flow sign-in from the card itself. Create issues with title, body, labels, and assignees; close / reopen with one click and optimistic update that rolls back on API failure.
  • Cached under .nexion/issues/ with ETag-based polling: the card stays usable offline and refreshes when network is back.
  • Sidebar cards now wear a 1pt hairline border and a very subtle drop shadow so the GitHub Issues, File, and plugin cards read as part of the same chrome family as the left sidebar.

CLI & IPC

  • nexion pane * commands now dispatch to browser tabs too: list, split (with optional --url seed), close, focus, new move --zone left|right|top|bottom
  • New browser state aggregate read (URL, pending URL, title, theme color, profile, focused leaf, loading, history). Replaces browser url and browser title.
  • All browser * actions accept --pane <index> to target a specific leaf inside a split tab
  • tab list / tab active now include a uniform panes[] array (cwd for terminal, url + title + profile for browser)
  • New IPC events: pane.close-requested, pane.extracted, pane.merged. Subscribe via nexion event subscribe "pane.*"

Bugfixes & reliability

  • Claude usage popover quotas are back (probe migrated to claude-haiku-4-5 over Authorization: Bearer with the oauth-2025-04-20 beta)
  • Keychain access prompt for Claude credentials no longer fires on every usage refresh (Nexion-owned mirror entry)
  • WKWebView "blank pane after extract / close / merge" fixed: lazy container pinned via auto-layout constraints, frame nudge + JS reflow on every attachment change
  • target=_blank / session-restore tabs no longer strand on an empty home view: pending-navigation queue retries from viewDidMoveToWindow once the WKWebView is properly hosted
  • Refresh button re-navigates from the address bar when the page never committed (was a silent no-op)
  • Sparkle release notes now render as HTML in the in-app updater
April 2026 · Build 2891 Canvas · Workspaces

Canvas

  • Built-in whiteboard and diagram editor powered by Excalidraw 0.17.6 (MIT) bundled in-app via WKWebView
  • Infinite canvas with shapes, arrows, freehand drawing, text, and image embedding
  • Files saved in standard .excalidraw JSON format: compatible with the Excalidraw web app
  • 800 ms debounced autosave; Cmd+S for immediate save; unsaved-changes indicator in tab header
  • CLI: nexion canvas export, get-scene, set-scene, append, zoom, show-dialog and more
  • IPC socket: canvas.getScene, canvas.setScene, canvas.appendElements, canvas.export, canvas.showDialog and more
  • Plugin API: nexion.canvas namespace with canvas.read, canvas.write, and canvas.dialog permission gates

Workspace Management

  • Workspace manager with SSH, tmux, and SSH+tmux session modes
  • SSH bookmark picker, tmux session picker, auto-restore on startup
March 2026 · Build 1637 Finder · Quick Open · Notes

Finder

  • File explorer with Git status badges and color-coded file names
  • Quick Open (Cmd+P) with fuzzy search, .gitignore filtering (powered by ripgrep), recent files, match highlighting
  • Auto-fold single-child directories, Move to Trash, jump to next git change (Ctrl+])
  • Gitignore-aware dimming, macOS metadata hiding, persistent folder state
  • File Attachments panel with drag & drop, auto-scan of .nexion/attachments/, per-file actions (preview, prompt reference, open, trash)
  • SSH tabs: disabled Quick Open, search bar, external editor, attachments, and Show in Finder for remote sessions

Notes

  • Per-project scratch pad with custom tags and markdown preview
  • Drag & drop file attachments with gallery, open/reveal/remove actions
  • IPC support: notes.attach, notes.detach methods
  • Use in prompt: send note text + @attachment paths to the terminal in one action

Performance

  • Quick Open powered by bundled ripgrep: .gitignore-aware file enumeration with persistent cache
  • Optimized fuzzy matcher: zero per-keystroke allocations, top-K bounded insertion
  • Faster startup with many tabs: deferred loading for inactive tabs, staggered session restore
February 2026 · Build 437 Native rewrite

Terminal

  • GPU-accelerated terminal powered by Ghostty
  • Infinite split panes with recursive nesting and drag-and-drop repositioning
  • Advanced pane management: resize, rotate, equalize, zoom, synchronized input, layout presets
  • Break pane to new tab, join pane from another tab, mark and swap panes, rename pane
  • Native tmux session manager: visual panel for local and remote tmux sessions
  • SSH config auto-discovery, Keychain integration, tmux status badge

Code Preview & Editor

  • Monaco Editor with 34 languages syntax highlighting, bundled offline
  • Image, PDF, markdown, and diff preview
  • Auto-save on file switch (configurable in Preferences)

Web Browser

  • Built-in web browser with profiles, userscripts, content blocker

Plugins & CLI

  • Plugin system with 12 official plugins, sandboxed JavaScriptCore runtime
  • Command Palette, keyboard shortcuts, multi-tab workspace
  • nexion theme: switch appearance mode, terminal theme, and preview theme on the fly
  • nexion notify: send notifications from any script or AI agent hook
  • nexion attach: manage file attachments via CLI (list, add, remove, clear, open)
  • Plugin API: nexion.tabs, nexion.git, nexion.editor, nexion.workspace.isSSH, nexion.terminal.isTmux for full project context inside plugins
  • Terminal context menu handlers now receive selectedText and cwd arguments
December 2025 · Build 190 Git · Agent notifications

Git Integration

  • Full Git integration: stage, commit, push, PR creation
  • Commit history panel with detail view and diff browser

AI & Notifications

  • Multi-provider AI: Anthropic, OpenAI, Codex / ChatGPT, Gemini, or GitHub Models
  • Floating notification bubble for AI agent messages
  • Long-running command detection (>30s) with completion alerts
  • Idle timer detection for commands waiting for input
  • Tmux session support for notification propagation
October 2025 · Build 78 Panes · Tabs

Panes & Tabs

  • Recursive split panes with resize and drag-and-drop repositioning
  • Project tabs, each with its own working directory
  • Session restore: open tabs and pane layout come back on launch
  • nexion open to launch a project tab from the shell
July 2025 · Build 12 The POC

The proof of concept

  • Terminal, browser and code preview in a single window
  • Terminal rendered with xterm.js in a web view; syntax highlighting with highlight.js
  • No split panes, no tabs, no session restore
  • Both web-based foundations were replaced in February 2026 by libghostty and Monaco