Repository navigation
Releases: leodudedev/cerberus-term
Release list
0.21.0
Added
- Drag a tab to reorder the strip. Press a tab and move it sideways; a
marker shows where it will land, and the new order survives a restart. A
plain click still selects, double-click still renames, and the close button
still closes — the drag only starts once the pointer has actually moved.
With more tabs than fit, holding the tab near either edge scrolls the strip.
Escape, or switching away from the window, drops the drag and leaves the
order as it was. Unnamed tabs keep numbering by position, so dragging
"Terminale 3" to the front makes it "Terminale 1" — the same thing closing
a tab already does. Name a tab if you want its label to stay put.
Changed
- The README now leads multi-agent use with named sessions. Running several
interactive agents side by side, each renamed with/rename, needs nothing
from Cerberus and every permission prompt still reaches your phone with the
agent's name on it — so that's the path the docs show first. The headless
worker setup with live follower panes is unchanged and still documented,
now scoped to what it's for: batch runs of agents that never prompt.
Full changelog: v0.20.0...v0.21.0
0.20.0
Added
- Telegram notifications carry the session's name. Rename a Claude Code
session with/renameand every notification it sends shows that name after
the project —🦈 Claude · my-app · orchestrator— so when several
sessions run in the same folder you can tell which one is asking without
opening the chat. Renaming again takes effect on the next notification. Only
names you set yourself count: the title Claude generates on its own is left
out, and a session you never renamed looks exactly as before. Claude Code
only for now — Codex and Copilot CLI have no equivalent of/rename.
Full changelog: v0.19.0...v0.20.0
0.19.0
Added
-
Codex CLI sessions now reach your phone. The third agent Cerberus knows
about, alongside Claude Code and Copilot CLI. When a Codex session asks to run
something, the request arrives in Telegram with the command, its risk icon,
and Codex's own explanation of why it wants permission — the sentence it would
have put on screen, in whatever language it wrote it.Approving from the phone works differently here, and better. For the other two
agents Cerberus types the answer into the pane, which means reading the dialog
off the screen and trusting that the option numbers haven't moved since. Codex
lets the answer be given to it directly, so Approve and Deny are handed back as
a decision rather than as keystrokes: nothing is typed into the session, and a
pane that has scrolled or repainted in the meantime cannot be answered wrong.The phone has about 25 seconds before Codex falls back to asking at the
keyboard, so a permission never waits on a phone left in another room — and if
no notification went out at all, because the project is muted or you haven't
set up a bot, Codex asks on screen immediately rather than pausing first.
Answering on the PC retires the buttons in the chat, the same as elsewhere.Two things worth knowing. Codex reviews a hook before it will run it: the
first time, it asks you to trust this one from its own/hooksscreen, and
until you do, nothing arrives — Settings says awaiting trust while that is
outstanding. And Codex is not offered on Windows yet, for the same reason
Copilot CLI isn't: nobody has run it there to find out whether the hook field
behaves the way it does on macOS and Linux.
Fixed
- A second copy of Cerberus run from a checkout no longer borrows the installed
app's settings. It shared the same stored bot token and chat id, so a copy
started for development pushed to the real bot whatever it was told to use
instead, and a port set through an environment file was read too late to have
any effect. Both now hold;.env.dev.exampledescribes the arrangement.
Full changelog: v0.18.0...v0.19.0
0.18.0
Fixed
- A dropped Telegram connection no longer takes remote control down for
good. Two things could end the bot's connection for the rest of the session:
a token that stopped being valid, and a second Cerberus polling with the same
token — a laptop and a desktop sharing one bot, or a development copy running
beside the installed app. Neither said anything. Every notification simply
stopped arriving, and since a quiet phone is also what "nothing needs you"
looks like, there was no way to tell the two apart. The connection now comes
back on its own, waiting a little longer between attempts for as long as the
problem lasts, and the ✈ button in the tab bar turns red with the reason in
its tooltip when it can't. - Waking the Mac no longer leaves the phone silent for minutes. A connection
that went to sleep mid-request can come back to a socket that never answers
again; Cerberus now reopens it on wake instead of waiting for it to time out.
A moment of silence right after the lid opens is still normal — the network
itself has to come back first.
Changed
- A new bot token or chat ID in Settings takes effect immediately. It used to
need a restart of the app, which was easy to miss: the settings said one thing
and the bot kept using the old credentials until the next launch.
Full changelog: v0.17.0...v0.18.0
0.17.0
Added
- An open document reloads itself when the file changes. Reading a spec
while an agent rewrites it used to show you the version you opened; the viewer
now notices the new file and re-renders it where you were reading, scroll
position kept. It follows a save that replaces the file wholesale — a temp
file plus a rename — which is how editors and agents usually write, and waits
for the writing to stop before re-rendering. A document in a background tab
isn't watched at all; it catches up when you come back to it.
Changed
- Documents load their remote images by default. The badge row of a README
now fills in on its own instead of waiting for the globe button, which was one
click too many for something every git host renders without asking. The button
and the Settings checkbox still turn it off, per machine, and everything else
about the fetch is unchanged: no cookies, https only, 2 MB and 6 seconds per
image.
Full changelog: v0.16.0...v0.17.0
0.16.0
Added
-
Documents can load the images they point at, once you ask. A README whose
badge row lives on a remote host used to render as a line of broken-image
glyphs, because the viewer refuses to let a document reach the network on its
own. Remote images now stand in as a small chip carrying their alt text, and a
globe button in the viewer bar fetches them on demand and swaps them in.It is off by default and stays off until you turn it on, per the checkbox in
Settings: opening a markdown file should not tell a third-party host that this
machine just opened it. When you do turn it on, the fetch happens outside the
browser session — no cookies go out — over https only, capped at 2 MB and 6
seconds per image, and limited to the image formats the viewer already shows
from disk.
Fixed
- The document list opened behind an already-open document, so reaching for
another file from inside one gave you a dropdown you could not see.
Full changelog: v0.15.0...v0.16.0
0.15.0
Added
-
A markdown reader in every pane. The new document button in a pane header lists
the markdown of the project that pane is in — the repo root plus configurable
folders (docs/,doc/,documenti/,.claude/by default), newest first
withCLAUDE.md,AGENTS.mdandREADME.mdpinned — and opens the one you
pick as a rendered document over the pane: headings, tables, highlighted code
and mermaid diagrams in the app's own palette, with find-in-document
(Cmd+F), links between documents followed in place, an expand button to take
over the whole window, and close or Esc back to the CLI. The document is an overlay, not a pane,
so the pty underneath is never resized and the session in it never redraws.The scan is rooted at the project (nearest
.git, else the pane's cwd) and
cannot leave it: symlinks out are skipped, and a read outside the root is
refused in main whatever the renderer asks for. The folder list is global in
Settings and overridable per project withdocs.globsin.cerberus.json.
Changed
- The pane header's buttons are drawn icons now, in groups. They were
Unicode glyphs from half a dozen blocks, each landing at its own weight and
optical size at 12px — the settings gear was a dot, the document one an
anonymous block. They're one stroked set on a single grid, a little larger,
ordered document · favourites · splits · window and separated by hairlines,
with the close button last. - The focused pane is framed on all four sides. The highlight was an inset
outline, which the terminal canvas painted straight over, leaving the accent
only above and below the pane. - Scrollbars follow the theme. The platform scrollbar was a bright slab
against the dark panels; every scrolling surface — the document list, the
document itself, the settings, the terminals — now gets a thin one in the
app's own tones.
Fixed
-
The installer no longer replaces Cerberus while it's running. Its guard
usedpgrep, which by default excludes its own ancestors — so run from a
Cerberus pane, the one place an update is most likely to be typed, it never
saw the app it was looking for and went ahead anyway. It now reads the process
list directly, and a pane is recognised before that:CERBERUS_PANE_IDsays
outright that the shell belongs to the app being replaced, so the script says
that rather than a vaguer "it's open".The README serves the script from
main, so this is live for everyone without
waiting for a release.
Full changelog: v0.14.0...v0.15.0
0.14.0
Added
-
A one-line installer for macOS and Linux,
install.sh, published in the
repo and now the first thing the README offers:
curl -fsSL .../install.sh | sh. The Gatekeeper quarantine that makes an
unsigned build open as "damaged" is attached by the browser, not by the
format —curlnever sets it — so an install that never goes through a
browser opens on the first double click with noxattr -cr. It puts
Cerberus.appin/Applicationson macOS and the AppImage plus a desktop
entry under~/.local/shareon Linux, re-runs as an update, refuses to swap a
bundle out from under a running app, and verifies every download against the
release checksums. -
SHA256SUMS-<os>.txton every release, uploaded by the build workflow
after the installers land. The installer verifies against them, and a manual
download can now be checked by hand. -
A
zipartifact for macOS alongside the.dmg, which is what the
installer extracts — a disk image has to be mounted, an archive doesn't.Two things the script deliberately doesn't cover. Windows has no
equivalent: SmartScreen isn't attached by the download the way the macOS
quarantine is, so nothing short of a signing certificate removes that prompt —
keep using the.exe. And Intel Macs still aren't built, so the script
says so and stops rather than installing an Apple Silicon build that can't
run. Both are unchanged from before, not new limits.
Changed
- CI actions bumped off the Node 20 runtime —
actions/checkout@v7,
pnpm/action-setup@v6,actions/setup-node@v7,actions/upload-artifact@v7.
Every run since 0.13.0 warned that these were being forced onto Node 24; that
substitution is a grace period, not a contract, and the release build is what
breaks when it ends. Behaviour is unchanged: the caching changes in
setup-nodev5/v6 only affect the automatic path, and this repo names
cache: pnpmexplicitly. - The README's install section leads with the script and demotes the direct
downloads, and the quarantine note now says why it happens and that macOS 15
moved "Open Anyway" into System Settings. The old right-click → Open it used
to imply stopped working there.
Full changelog: v0.13.0...v0.14.0
0.13.0
Added
-
A keyboard shortcut cheat sheet, opened by the
?button in the tab bar,
byCmd+/(Ctrl+Shift+/elsewhere), or from Help → Keyboard Shortcuts. The
leader key also answersCtrl+B ?. Every binding the app has was reachable
only from the README until now, which is the wrong place to look them up from
inside the app. The list is built per platform, so nobody reads aCmdrow on
Windows. -
Cerberus now asks before leaving processes behind. Closing a pane kills
its shell, and with it whatever was running in the foreground — that part has
always worked. What survives is everything detached from the terminal: a
nohuped build, adisowned job, a dev server whose launching shell already
exited. Those used to keep running with nothing left on screen to say so.On quit the panes are inventoried before their ptys are killed, and anything
from that inventory still alive a moment later is listed by name with the
choice to terminate it or leave it running. A tick box records the answer;
Settings → Leftover processes on quit changes it back to asking. A process
that deliberately left its terminal —setsid, a double-forked daemon — is
not listed, on purpose: it is not the terminal's to kill.The Windows path (PowerShell inventory,
taskkill /T /F) is implemented and
unit-tested but, like the rest of the Windows support, has not been exercised
on real hardware.
Fixed
- The close button of a renamed tab now parks at the right edge of the chip
instead of sitting against the label.
Full changelog: v0.12.0...v0.13.0
0.12.0
Added
-
Right-click a pane for the operations you'd otherwise go up to the header
strip for: clear the pane's buffer, star or unstar its directory, jump to
another favourite, close the pane. The header is 26 pixels tall and sits at
the top of a pane you're usually working at the bottom of; this puts the same
four things under the pointer. The star entry knows whether the directory is
already a favourite and offers the opposite. Follower panes, which tail a log
and have no shell tocd, get the clear and close entries only.Clearing wipes the pane's scrollback, the way iTerm's Clear Buffer does. The
shell running inside is not touched and does not notice.There is no Paste entry, though an early cut had one backed by a list of
recent copies. Keeping such a list honest means polling the system clipboard,
which captures whatever you copy anywhere on the machine — a password manager
included — for the sake of a shortcutCmd+Valready covers.
Full changelog: v0.11.0...v0.12.0