Releases: AgentSystemLabs/nebula
Release list
v0.21.0
Nebula v0.21.0 is out. The quick prompt now starts a session without stealing your cursor, and a new setting puts the old behavior back.
🚀 Launch faster
pkeeps your place. A quick prompt launch no longer drops you inside the new session's terminal. It selects the new row — so the pane previews it and it is marked seen as usual — and leaves your cursor on whatever panel you fired from, unlocked. Fire off three prompts in a row without paddling back to the list between them.Quick prompt focusbrings the old behavior back. Settings › Agents, directly underQuick prompt agent, off by default: turn it on and a quick prompt launch attaches, enters the terminal pane and locks it, exactly as it did in v0.20.0. Every other launch — the new-session picker, agent presets, PR sessions and cloud tasks — is untouched and still focuses the way it always has.
curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.20.0
Nebula v0.20.0 is out. A quick prompt on p that starts an agent straight from what you typed, and two keys to retarget that one launch at any harness or saved preset.
🚀 Launch faster
- A quick prompt on
p. Presspin any panel for a wrapped, multi-row task box —Shift+EnterorCtrl+Jinserts a line,Esccancels,Enterlaunches. It starts a new agent in the selected worktree with what you typed as its first prompt and attaches it: no picker, no name step, and the session titles itself from the prompt. Which CLI it runs is Settings › Agents ›Quick prompt agent(defaultclaude), launched with that harness's own default model and effort. - Retarget one launch, not the setting. Inside the box,
Tabopens the harness list the new-session picker uses (→drills into that harness's model and effort) andShift+Tabopens your saved agent presets — adopting the preset's harness, model, effort and its prefix/postfix wrapping around your task. Either picker hands the box back with your text intact, onEsctoo. The override applies to that launch only: the title bar shows the live spec, and the nextpstarts from the default again. - Task box hints that fit. Between 36 and 41 columns the task editor's key hint was two columns wider than its border, and ratatui clipped the tail without a word. Every width now picks a line that fits, held in place by a test that measures each tier against the border.
curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.19.0
Nebula v0.19.0 is out. q now asks before it quits, the file finder gets out of the editor's way, and the focused panel is always tinted.
🛟 Quit on purpose
qasks first. The quit key —q, orCtrl+C— now opens a confirm dialog instead of closing the TUI outright: "Leave the TUI? Sessions keep running in the daemon."yorEnterquits,Escornbacks out. A letter aimed at an agent that lands on a focused panel no longer takes nebula down with it.- The escape hatch still works. In raw mode that dialog is the only thing between you and the exit, so
Ctrl+Cpressed on it commits immediately — the terminal's own quit chord twice always gets you out.qinside a locked pane still forwards to the PTY,qstill closes an overlay, andnebula sshstill hands off without a prompt.
🫥 Fewer things in your way
- The finder closes behind the editor. Opening a file from the file finder (
f) or find-in-files (Shift+F) now dismisses that overlay as the editor opens, so quitting the editor drops you back on the panels instead of on a finder you have toEsca second time. Settings › General ›close_finder_on_open, on by default; turn it off to keep the results underneath. The tree browser (b), whose editor is embedded in its own preview pane, and ⌥click are unchanged — and a failed editor spawn leaves the finder open rather than stranding you on bare panels. - The focus tint is always on. The focused panel — and the terminal pane when it holds focus — is painted with the theme's
focus_tintunconditionally, and the "Focused panel tint" row is gone from the settings overlay. Afocus_tintkey left over in yourconfig.jsonis ignored, not an error.
curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.18.0
Nebula v0.18.0 is out. Cursor gets a real model and effort picker that keeps itself current, every model and effort list filters as you type, the / finder puts what needs you on top, the root checkout keeps the first worktree row, the selection rail and workspace-tab underline take the session's status color, and make prune keeps target/ from eating the disk.
🚀 Launch faster
- Cursor models and efforts.
cursor-agent --modeltakes one flat id per family and effort (claude-opus-5-thinking-high-fast), so nebula keeps the family as the model and the suffix as the effort and joins them at spawn. Pick them on Settings › Agents (cursor_model/cursor_effort), in the preset editor, or by drilling→into the Cursor row of the new-session menu. The effort list follows the family —-fastvariants included — and re-fits itself when the family changes, so the CLI never sees an id it refuses. - A catalogue that keeps itself current. The lists are a built-in seed merged with
cursor-agent --list-models, cached incursor_models.jsonbesideconfig.jsonand refreshed on a background thread once the cache is a day old. Families with no bare id launch theirhigh(elsemedium) variant when the effort is left at default.
🔎 Find it faster
- Type to filter the picker. In any model or effort submenu of the new-session menu, typing narrows the rows —
opuskeeps the Opus families and the title readsCursor model ⌕ opus—↑/↓move,Backspacewidens,Escclears the filter before it backs out, and a letter that would leave no rows is refused with a flash. Claude and Codex lists filter the same way. - Type to filter the preset editor. On the Harness / Model / Effort rows, typing jumps the row to the best match and
←/→cycle only the matches; the filter shows beside the value as⌕ opus (3), andTab/↑/↓leave the row and drop it. /opens on what needs you. Before you type, the finder lists sessions waiting on you first, then running ones, then unread finishes, then everything else — worktrees, projects, workspaces — by last interaction, so/Enteris the fastest way back to the row that wants you or the worktree you just left. Typing still ranks the best match first, with that order as the tiebreak.
🧭 Lists that look after themselves
- The root checkout keeps the first row. In the Worktrees column the
⌂ rootrow is the one fixed seat; the other worktrees still sit most-recent-first under it, and the cursor follows its row across a re-sort. - The selection rail wears the status color. The rail beside the selected session, worktree or project row in the focused panel takes the color of that row's status dot — yellow mid-turn, violet done and unread, green read, red waiting — instead of the theme accent; parent rows use their rollup. Rows without a dot (PR rows, terminals, overlay lists) keep the accent, and an unfocused panel's dim rail is unchanged.
- So does the open workspace tab. The underline under the open tab in the workspaces bar is painted with the workspace's rollup color, so a red tab means a session in it wants you.
🧹 A lighter checkout
make prune. Every release bump and everycargo build/test/checkvariant leaves another hash of each workspace crate undertarget/, and on macOS each one keeps its object files — ten days of that reached 41 GB.make prune(KEEP=3by default) keeps the newest three builds of every crate and drops the rest, under cargo's own build lock so it never deletes under a running build;make cyclenow runs it betweenkillanddev.scripts/prune-target.py --dry-runreports without deleting.
⚠️ Heads up
The Cursor --model join happens in the daemon, so run nebula kill before relaunching — an older daemon still spawns cursor-agent without a model. No protocol bump this time.
curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.17.0
Nebula v0.17.0 is out. Ask a session for a second session and it starts one, the Sessions panel's pull-request row reads in the pane, the focused panel's tint is gray again, and pinning is gone — every list is one flat, most-recent-first list.
🚀 Launch faster
- Ask the agent for another session. Tell a Claude session "start a new nebula session that fixes the login redirect" and it runs
nebula spawn "<task>": the daemon starts a second agent beside it — same worktree, same harness, model and effort unless--kind claude|codex|cursornames another — opening on that task as its first prompt, so it is working before you look. The new row appears in the sessions list on its own and titles itself; the session you asked from is untouched — no restart, no focus change. - The command is yours too.
nebula spawn <task…> [--kind …]works from a shell inside any nebula agent session. Claude learns it from the same appended system prompt as the worktree rule, with aBash(nebula spawn:*)permission so it never prompts.
🫥 Shape the screen
- The Sessions panel's PR row reads in the pane. Rest on the worktree's open pull request under OPEN PRS and the pane shows its description, stats and conversation — exactly as it already did for the project-wide OPEN PRS rows under the worktrees. Same debounced
gh pr viewfetch, same cache; the terminal underneath stays live. - Diff and scroll from that row.
gshows the pull request's diff,PgUp/PgDnand the wheel scroll the preview, and the right-click menu gained View diff. Saved links behave as before. - The focused panel is gray, not black. Every theme's
focus_tintsat a few steps above pure black, so the focused panel — and the rounded corners of a selected pill row — painted flat black on most terminals. Each preset now has a real gray floor, with a test that keeps it there (#6).
🧭 Lists that look after themselves
- Pinning is gone. Sessions and worktrees already sort most-recent-first with a
23m agostamp saying why, sop/ pin / unpin, the PINNED groups and the pinned exemption from the idle reaper are removed. Rows you pinned before simply take their place by recency. - No more RECENT header. The RECENT / UNPINNED split and the
recent_windowsetting are gone with it: agent sessions are one header-less list, followed by TERMINALS, OPEN PRS and ARCHIVED as before.
⚠️ Heads up
Protocol version is now 34 — run nebula kill on an older daemon before the new TUI attaches. A pin entry in your hotkeys and a recent_window in config.json are ignored.
curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.16.0
What's new
Agent presets — e in the Sessions column. If you keep starting the same kind of session with the same framing, save it once: name, harness, model, effort, and an optional prefix and postfix. e lists the presets, a adds one, e / d edit or delete. Enter on a preset asks for the task in the wrapped editor and launches the CLI with prefix + task + postfix as its very first prompt, so the agent is already working when the pane opens. The row it creates is an ordinary session — it names itself on that first turn, resumes, and shows status like any other. Presets live in agent_presets.json beside config.json.
A done sound. A ding when a turn finishes. Pick it on the settings overlay's Sessions tab (done_sound): a macOS system sound such as Glass (the default), bell for the terminal bell, or off. Over nebula ssh and off macOS it is always the bell.
Lists that order themselves. Projects and worktrees now sit most-recent-first, the way sessions already did, with a dim 23m ago after the name saying why the row is where it is: a worktree carries the newest stamp of its sessions, a project the newest of its worktrees; pinned rows keep their own group on top. Manual reordering (Shift+J / Shift+K) is gone — nothing is dragged into place by hand any more.
Hide the Projects or Worktrees panel — Shift+P / Shift+B. Each column can be hidden on its own (also on the Appearance tab, hide_projects / hide_worktrees); its width goes to the terminal pane, its drag width is remembered, and focus, the panel walk and / palette picks skip whatever is hidden. The footer leads with the restore hint while a panel is down. Thanks to @lnmunhoz (#20).
Switch off the CLIs you never use. The Agents tab gained an enabled toggle per harness (claude_enabled / codex_enabled / cursor_enabled, at least one stays on); a disabled CLI drops out of the new-session menu, the PR launch and the context menu. The new-session menu no longer lists a Terminal row — t and the context menu's New terminal are the way to a plain shell.
k,k up into the workspaces bar, j,j back down. On a panel's first row a double tap of k (or ↑) steps up into the workspaces bar, the way h,h at the leftmost column does; j,j in the bar drops back onto the panel you came from, cursor untouched. The first press stays put and says what a second one does.
Fixes
- Background subagents no longer turn a session green early: Claude Code 2.1 runs the Agent tool in the background, and the idle notification that follows was read as "turn over". The session now stays RUNNING while subagents are tracked, with a 30-minute quiet grace so a killed worker cannot wedge the row.
- Open pull requests refresh every 15 seconds and whenever the Worktrees or Sessions panel or the terminal window takes focus, instead of once a minute — a PR closed in the browser leaves the list almost as soon as you come back.
- The protocol version is now 32; a running daemon from an older release needs
nebula killbefore the new TUI attaches.
Full install: curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.15.0
What's new
Start a Claude session from an open pull request — n on an OPEN PRS row. The Worktrees panel's OPEN PRS group now does more than open the PR in the browser: press n (or pick New Claude session from m / right-click) and nebula launches a local Claude session in the project's root checkout with the PR's URL and a "work only on this pull request" rule injected as its system prompt. The URL is stored with the session, so restarting the daemon or resuming the session reapplies the same scope. The model and effort submenus and the name prompt work exactly as they do for any other new session; a pre-warmed Claude that booted without the constraint is never adopted for one, so the rule is in place from the first prompt.
The Sessions panel's group is now OPEN PRS, and manual links are retired. Shift+L / "Add link" are gone from the hotkeys tab, the help overlay, the footer and the context menus. Links you saved in earlier versions are still listed under OPEN PRS and still open, edit and delete — nothing stored is discarded.
nebula tunnel reuses a browser already serving on the remote. If the box already has a nebula browser on the port (typically a --public one you left running), the tunnel notices — it probes the remote's loopback with curl -I and matches ttyd's server: header, which a --credential server's 401 carries too — says so, and holds the ssh session open so the forward reaches the existing server, instead of failing on "port N is not free". Ctrl+C or hanging up still ends the session. The probe is plain shell, so remotes on an older nebula work too.
Fixes
- The footer on a detected pull-request row no longer advertises
r/d, which never applied to it; the help overlay'snhint notes that it starts a Claude session on a PR row. - The daemon rechecks a PR URL on every spawn (http(s), a
/pull/path, at most 4 KiB) rather than trusting the client.
Under the hood
CreatePrAgentrequest; PROTOCOL VERSION 30 (an old daemon offers the usual kill-and-restart).- Migration 22 adds a nullable
agents.pr_url— existing rows are untouched.
Full install: curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.14.0
What's new
Double-tap h/l (or ←/→) to jump past the ends of the panel row. A single press at the end still stays put, so leaning on the key can't spill over — but tapping it twice does what Tab / Shift+Tab would: l,l at Sessions crosses into the terminal pane and takes its input, h,h at the first column steps up into the Workspaces bar (while it's shown). The footer tells you what the second press will do; any other key in between, or a slow second press, resets the gesture.
Click outside any modal to dismiss it. A left-click outside the box of the help overlay, a confirmation, a prompt or the diff viewer does exactly what Esc does — cancel, abandon, close — and the click is swallowed rather than landing on the panel underneath. The pickers, settings, memory view and context menu already worked this way; now every modal does.
Settings remembers where you were — for a minute. Reopen the settings overlay within a minute of closing it and it lands back on the tab and row you left. Later than that, the memory is stale and it opens fresh on the tab strip, like a first open.
A new workspace opens with focus on Projects. Whether you create it from the workspace switcher, the Workspaces bar, or the bar's m menu, the new (empty) workspace opens with the cursor on the Projects panel — n there adds its first project.
Deleting the open workspace lands on its right-hand neighbor. Instead of always jumping to the first tab, deleting the open workspace from the bar or the switcher lands on the tab that sat to its right; from the last tab, the one to its left.
make cycle. One re-runnable target for the whole dev cutover: make install, then nebula kill, then make dev. Install runs first, so a build that fails stops before anything is killed. Run it from a terminal outside nebula — the kill step takes every session down.
Fixes
- A workspace switch no longer cold-boots a fleet of agent CLIs (#17).
- A worktree row keeps its branch name while a rebase is paused, instead of relabeling itself
detached @ …(#17).
Full install: curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.13.0
What's new
Cloud rows follow their session. When claude --cloud prints a session URL and exits, nebula reads the session id off that output and re-enters the session for you — no browser, no command to copy. The row becomes a mirror: nebula runs claude --cloud <id> (falling back to claude --teleport <id> on accounts without live attach) and re-teleports every 45 seconds, so turns the cloud agent takes keep landing in the pane. The badge reads cloud ↻ while it is following.
A teleport is a snapshot rather than a live link, which is why the mirror re-pulls — and why the first key you type into the pane ends it. From then on the session is yours: an ordinary local Claude that happened to start from a cloud transcript. NEBULA_CLOUD_MIRROR_SECS changes the cadence, and 0 turns the follow off entirely, leaving Attach cloud session in the row's m menu as a manual refresh.
Steer a cloud session without leaving the TUI. Send to cloud session (also on m) opens the same wrapped editor and runs claude -p <message> --cloud <id>, then pulls the transcript. The reply arrives on a later refresh — the CLI never returns one itself.
Fixes
- Copying text over
nebula sshno longer fails.nebula sshruns the whole TUI on the remote machine, so the copy path was asking a headless VM for a clipboard it does not have — hence "copy failed (clipboard unavailable)". Nebula now delegates the copy to the terminal you are actually sitting at, using OSC 52. Nothing to install on the remote, no X forwarding. Terminals that implement OSC 52 (Ghostty, iTerm2 with clipboard access enabled, kitty, WezTerm) get the text; ones that silently drop it (macOS Terminal.app) do not, which is why the confirmation now names the route it took. - The open workspace tab's accent underline sits flush against the tab instead of a half-cell below it, closing the strip of background that read as a gap.
Full install: curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh
v0.12.0
What's new
A finished turn is violet until you read it. Green used to mean two different things — "this went
well" and "go look at this" — and a terminal teaches you to skip green. Finished now has its own
color: ● violet while nobody has read the turn, dropping to the familiar ● green once the cursor has
been on the session. Parents roll it up, so the violet walks up the tree and turns green as you read
your way down it. On the rose theme, where violet is already spoken for, done goes turquoise.
Counts say n done, at every tier. The unwatched-finish badges on project and worktree rows, the
badge in a session's harness slot, and the command palette's rows all switched from new to done
and wear the done color. The Workspaces bar tabs joined them: they used to show how many agents were
running — which the dot already said — and now count the sessions that finished unread, so a
workspace mid-run still tells you what's waiting to be read in it.
The Workspaces bar reads as its own tier. A row of air above and below the tabs, the open tab a
raised block whose fill takes the bar's full height instead of a single highlighted row, and the rule
beneath it turned into that tab's accent underline rather than a gap punched through it.
Fixes
- In a narrow worktree column the
⌂ rootbadge now yields to a branch name it would have
ellipsized:main 1 doneinstead ofma… ⌂ root 1 done. The badge is the least load-bearing thing
on the row; the branch is the row's identity. - Project and worktree rows bill the pill marker they actually draw when sizing their text, so the
trailing badge no longer falls off the end of a twenty-cell column.
Full install: curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh