chore(deps): update repo-local nix packages - #213
Conversation
|
🔍 PR Analysis
|
| rustPlatform.buildRustPackage rec { | ||
| pname = "leaf"; | ||
| version = "1.26.1"; | ||
| version = "1.27.0"; |
There was a problem hiding this comment.
🔴 Markdown previewer package will fail to build after its version bump
The new version number of the markdown previewer is used to pick which upstream release to download while the recorded download fingerprint (hash at packages/leaf/default.nix:15) and dependency fingerprint still describe the old release, so the download check fails.
Impact: Building or installing this tool errors out with a hash mismatch, breaking any rebuild that includes it.
Version-derived rev with stale source and cargo hashes
packages/leaf/default.nix uses rev = version; (line 14), so bumping version to 1.27.0 changes the fetched tag, but hash = "sha256-faZ3yiAdPbN1Pxf7Gss62eYUJzaJ3ZF5BZyCVqHOC4s=" (line 15) and cargoHash (line 18) were left at the 1.26.1 values. Contrast with packages/amoxide/default.nix, where the bump updated both hash and cargoHash.
Prompt for agents
packages/leaf/default.nix bumps version from 1.26.1 to 1.27.0, and the derivation fetches the source with rev = version. However src.hash and cargoHash still contain the 1.26.1 values, so the build will fail with a fixed-output hash mismatch. Recompute the fetchFromGitHub hash for tag 1.27.0 and the cargoHash for the new lockfile, or revert the version bump.
Was this helpful? React with 👍 or 👎 to provide feedback.
| let | ||
| pname = "nf-core"; | ||
| version = "4.0.2"; | ||
| version = "4.1.0"; |
There was a problem hiding this comment.
🔴 nf-core tooling package will fail to build after its version bump
The new version number of the nf-core tooling selects a different upstream release while the recorded download fingerprint (hash at packages/nf-core.nix:163) still describes the previous release, so the download verification fails.
Impact: Any rebuild including nf-core aborts with a hash mismatch error.
rev = version with stale src hash
packages/nf-core.nix:160-164 fetches nf-core/tools with rev = version; and hash = "sha256-UclYmIf7LUmfn0jdjtozD7/vNcA/FY3w4nCTsNaTN+A=", which corresponds to 4.0.2. The diff only bumped version = "4.1.0" at line 10 without touching the hash. Additionally, upstream dependency changes between 4.0.2 and 4.1.0 may require updates to the vendored pypi pins in the same file.
Prompt for agents
packages/nf-core.nix bumps version to 4.1.0 but the fetchFromGitHub for nf-core/tools uses rev = version with the old 4.0.2 sha256. The build will fail on hash mismatch. Update src.hash for tag 4.1.0 (and re-verify the vendored pypi dependency pins in the same file still satisfy 4.1.0's requirements), or revert the bump.
Was this helpful? React with 👍 or 👎 to provide feedback.
| stdenv.mkDerivation { | ||
| pname = "jmux"; | ||
| version = "0.21.1"; | ||
| version = "0.27.2"; |
There was a problem hiding this comment.
🟡 jmux package advertises a new version but still builds the old code
The declared version of the jmux tool was raised to 0.27.2 while the download still points at the old v0.21.1 tag (rev = "v0.21.1" at packages/jmux/default.nix:18), so users get old software labelled as new.
Impact: jmux --version, store paths and any version checks report 0.27.2 while the actual behavior is that of 0.21.1, making upgrades appear applied when they are not.
Hardcoded rev not derived from version
Unlike packages/leaf/default.nix and packages/nf-core.nix, jmux hardcodes rev = "v0.21.1" (packages/jmux/default.nix:18) rather than v${version}, so bumping version only changes metadata; the build succeeds silently with the old source. A real 0.27.2 upgrade would additionally require rebasing the eight patches in packages/jmux/patches/, which are written against 0.21.1.
Prompt for agents
packages/jmux/default.nix now declares version = "0.27.2" while src still pins rev = "v0.21.1" with the 0.21.1 hash. The derivation builds 0.21.1 but reports 0.27.2. Either perform the real upgrade (update rev/hash and rebase the patch stack in packages/jmux/patches/, which targets 0.21.1 sources) or revert the version string to match the pinned rev.
Was this helpful? React with 👍 or 👎 to provide feedback.
| rustPlatform.buildRustPackage (finalAttrs: { | ||
| pname = "kittylitter"; | ||
| version = "0-unstable-2026-05-30"; | ||
| version = "v0.3.5"; |
There was a problem hiding this comment.
🟡 Several packages now claim release versions that do not match the commit they build
Four packages had their version labels replaced with upstream release tags (e.g. version = "v0.3.5" at packages/kittylitter/default.nix:21) while still downloading the same unchanged pinned commit, so the reported version no longer describes what is actually built.
Impact: Installed tools report versions that do not correspond to their contents, and the leading "v" makes version comparison and store path naming inconsistent with every other package here.
Affected files and prior convention
packages/kittylitter/default.nix:21:0-unstable-2026-05-30→v0.3.5,rev = "abee3ace..."unchanged (line 26).packages/kittylitter/AGENTS.mdstill states default.nix buildsv0.3.0.packages/rift/default.nix:10:0.0.10-unstable-2026-06-03→v0.0.10,rev = "18ca9d19..."unchanged.packages/tmux-palette/default.nix:12:0-unstable-2026-06-24→v0.3.0,rev = "7caa11e8..."unchanged.packages/herdr-tab-smart-rename/default.nix:11:0.1.1-omp→v0.1.1,rev = "2db0c157..."unchanged; the-ompsuffix signalled the local OMP-provider patch stack that is still applied (lines 20-23).
The previous X-unstable-DATE form is the nixpkgs convention for unpinned-commit builds, and version strings are conventionally written without a leading v.
Prompt for agents
Four packages (packages/kittylitter/default.nix, packages/rift/default.nix, packages/tmux-palette/default.nix, packages/herdr-tab-smart-rename/default.nix) had their version strings replaced with upstream release tags including a leading 'v', while their src rev remains the same pinned commit as before. Either bump rev+hash to the tagged release and drop the 'v' prefix, or restore version strings that describe the pinned commit (e.g. the previous 0-unstable-YYYY-MM-DD / X.Y.Z-unstable-DATE form, and the -omp suffix for the locally patched herdr plugin). Also update packages/kittylitter/AGENTS.md which documents the built version.
Was this helpful? React with 👍 or 👎 to provide feedback.
8778e9c to
c50f0ae
Compare
🔍 PR Analysis
|
c50f0ae to
617015c
Compare
🔍 PR Analysis
|
617015c to
05350d5
Compare
🔍 PR Analysis
|
05350d5 to
ae439c0
Compare
🔍 PR Analysis
|
ae439c0 to
ef01587
Compare
🔍 PR Analysis
|
ef01587 to
68f8a0c
Compare
🔍 PR Analysis
|
68f8a0c to
0e68a59
Compare
🔍 PR Analysis
|
0e68a59 to
b73bbf3
Compare
🔍 PR Analysis
|
b73bbf3 to
358ee04
Compare
🔍 PR Analysis
|
358ee04 to
789ff18
Compare
🔍 PR Analysis
|
789ff18 to
c4c96ca
Compare
🔍 PR Analysis
|
c4c96ca to
4b643f5
Compare
🔍 PR Analysis
|
This PR contains the following updates:
0.21.0→0.23.10.3.6→0.5.21.1.7→1.7.00.0.10-unstable-2026-06-03→v0.0.100-unstable-2026-06-24→v0.3.00.1.1-omp→v0.2.00.21.1→0.29.00.4.2→0.4.64.0.2→4.1.00.39.0→0.40.01.26.1→1.28.01.28.10.10.2→0.10.6Release Notes
Ataraxy-Labs/sem (Ataraxy-Labs/sem)
v0.23.1Compare Source
v0.23.0Compare Source
v0.22.1Compare Source
v0.21.1Compare Source
Ataraxy-Labs/weave (Ataraxy-Labs/weave)
v0.5.2Compare Source
Full Changelog: Ataraxy-Labs/weave@v0.5.1...v0.5.2
v0.5.1Compare Source
What's Changed
Full Changelog: Ataraxy-Labs/weave@v0.5.0...v0.5.1
v0.5.0Compare Source
What's Changed
weave applyto materialize entity edits onto files by @rs545837 in #123New Contributors
Full Changelog: Ataraxy-Labs/weave@v0.3.6...v0.5.0
agentclientprotocol/codex-acp (agentclientprotocol/codex-acp)
v1.7.0Compare Source
Features
Bug Fixes
v1.6.2Compare Source
Bug Fixes
v1.6.1Compare Source
Bug Fixes
v1.6.0Compare Source
Features
v1.5.1Compare Source
Bug Fixes
v1.5.0Compare Source
Features
v1.4.0Compare Source
Features
v1.3.0Compare Source
Features
Bug Fixes
v1.2.0Compare Source
Features
Bug Fixes
v1.1.14Compare Source
What's Changed
Full Changelog: agentclientprotocol/codex-acp@v1.1.13...v1.1.14
v1.1.13Compare Source
Full Changelog: agentclientprotocol/codex-acp@v1.1.12...v1.1.13
v1.1.12Compare Source
Full Changelog: agentclientprotocol/codex-acp@v1.1.11...v1.1.12
v1.1.11Compare Source
What's Changed
Full Changelog: agentclientprotocol/codex-acp@v1.1.10...v1.1.11
v1.1.10Compare Source
What's Changed
Full Changelog: agentclientprotocol/codex-acp@v1.1.9...v1.1.10
v1.1.9Compare Source
What's Changed
Full Changelog: agentclientprotocol/codex-acp@v1.1.8...v1.1.9
v1.1.8Compare Source
What's Changed
New Contributors
Full Changelog: agentclientprotocol/codex-acp@v1.1.7...v1.1.8
anomalyco/rift (anomalyco/rift)
v0.0.10Compare Source
What's Changed
Full Changelog: anomalyco/rift@v0.0.9...v0.0.10
eduwass/tmux-palette (eduwass/tmux-palette)
v0.3.0Compare Source
{ "name": "terminal" }intheme.json.transparent(the terminal default) and named ANSI colors (blue,bright-black, etc.) alongside hex, in any built-in,theme.json, or custom theme.selectedFg(active-row highlight) andtitleFg(header title color).v0.2.1Compare Source
nsfor "New Session") now ranks the aliased item first instead of getting outranked by items that just happen to contain the query inside their category (e.g. "Detach" matching via "Sessions").v0.2.0Compare Source
v0.1.1Compare Source
iurysza/herdr-tab-smart-rename (iurysza/herdr-tab-smart-rename)
v0.2.0Compare Source
Features
Bug Fixes
jarredkenny/jmux (jarredkenny/jmux)
v0.29.0: — the first thirty minutesCompare Source
Three of the things in this release are the same idea: jmux should work out
what you meant instead of asking you to assemble it. Your repos and teams are
Projects now, the Command Center works out its own membership, and a new
user gets a flow instead of a checklist.
A first run that goes somewhere
The old checklist had eight rows, a progress figure that disagreed with them,
four unexplained glyphs, and four steps that closed themselves and dropped you
into the settings screen with no explanation and no way back. One of them
printed
jmux-control skill: installed to …straight onto the rendered frame.It's a flow now — one modal that owns its own steps. It opens when there is no
config.json, and from Setup in the palette (Ctrl-a p) forever after. Itstarts by asking what you came for:
That answer decides which pages exist, which is what removes "you can't do
this yet" from the flow entirely: a page that needs the tracker comes after the
tracker page.
escalways zooms out — page, then map, then closed — and nostep has to be completed to move past it, so "no tracker account today" stays
recoverable. Nothing advertises an action it can't perform: the workflow page
drops its "use these" hint when there are no statuses to use, rather than
offering a button that quietly does nothing.
Existing users see no new screen. Having a
config.jsonis what suppressesit.
Projects
issueWorkflow.teamRepoMapandreposare gone. A Project is one repo, atmost one team, and its own settings:
{ "projects": [ { "id": "01J…", "title": "api", "dir": "~/Code/api", "teamId": "…", "settings": { "defaultBaseBranch": "main", "agentCommand": "claude" } } ] }Settings resolve in three tiers — built-in, then
projectDefaults, then theProject's own — sparse by key presence. Pinning a value that happens to equal
the global is still a deliberate override, so changing the global later doesn't
silently move the Project with it.
Starting work on an issue routes to a Project with five outcomes rather than
two:
resolved,unclaimed,ambiguous,conflict,orphaned.Disagreement is a distinct answer from absence — a stored route
contradicting a linked MR is a different problem from having no information at
all, and collapsing them produces a confident wrong answer. Each says what it
knows:
TRA-123 → api (linked MR), orTRA-123 has conflicting routes — issue route → api; linked MR → web.An ambiguous issue is answerable, so jmux asks instead of falling through to
the manual picker having learned nothing — and then offers to remember the
answer: Just TRA-123, or Always for "Billing". The second is withheld
when the issues jmux has actually seen say that Linear project has gone to more
than one Project, because "always" would be a lie. Routes live in
config.jsonand are visible and deletable, since a rule written by a keystroke you may not
remember making has to be inspectable.
An existing session always wins outright, before any of that. A session whose
stamp names a Project you've since deleted is reported as
orphaned— neversilently re-routed, because moving work that already has a worktree is the one
thing this exists to prevent.
Sessions carry their Project durably (
@jmux-project, and in the durable-sessionsnapshot), because two Projects may share a directory and
ctlhas no IPC intothe running TUI.
ctl statusandctl workflow boardboth report it, thesidebar groups and bands by it, and
Ctrl-a noffers your Projects ahead ofscanned directories.
ctl issue startgoes through the same resolver rather than its own copy —which is what closes a live regression the migration would otherwise have
opened: with
teamRepoMapdeleted, the CLI's own lookup answered nothing forevery issue and refused work the sidebar would have started.
--repostillwins where you pass it.
Upgrading: the migration runs once at startup. It computes the whole new
document first, writes
config.json.backup-<timestamp>beside your configbefore touching it, and removes the legacy keys only once the new file is
durably on disk. It's idempotent —
projectsexisting is what suppresses it, soa Project you delete stays deleted.
Downgrading is not supported, deliberately. An older jmux carries
projectsthrough intact, so nothing is destroyed and upgrading again restores everything
— but it won't understand them, so issue routing and per-repo overrides sit
inert until you do.
The Command Center derives its own membership
You don't pin panes to populate the grid any more. It shows whichever sessions
the active view's filter/group/sort would put in your sidebar, computed by the
same primitive the sidebar uses — so it fills and empties on its own as agents
start and finish, and a sidebar disclosure gesture can't change what it mirrors.
One tile per session. tmux ties the current window and zoom to the session,
not the client, so two tiles genuinely cannot show two panes of one session
full-bleed at once — by any arrangement of pins. A session running several
agents shows one at a time, elected by live urgency;
Ctrl-a xcycles which,and the focused tile's border says
⌃a x agent 2/3so the others are avisible fact rather than something you have to already know.
Tabs are replaced by views: named presets of the grid's own axes, as a strip
of chips along the top. Switching views adopts that view's axes outright; a
·on the active chip means your live narrowing has drifted from what's saved, and
Save current axes as view… is how you keep it.
Ctrl-a CCtrl-a PCtrl-a ↵Ctrl-a xCtrl-a zCtrl-a DCtrl-a G/s/fCtrl-a 1…9,[/]Two per-session exceptions layer on top, and neither is ever silent. Pin to
Command Center keeps a session on the grid when the view wouldn't have it, and
prefers that pane as its face.
Ctrl-a Phides a session until you bring itback — the palette's Show hidden sessions (N)… lists every one. Hiding
always beats a pin left on one of that session's panes: hide's subject is the
whole session, a pin's is one pane in it, so pinning can't quietly undo an
explicit "keep this off my grid". Sessions dropped by
commandCenter.maxTilesshow as
+N not shown, and an empty grid names the view it's on and the keysthat widen it.
Your existing
commandCenterTabsandautoPinAgentPaneskeys are left in placerather than deleted, and every legacy
@jmux-pinnedvalue — tab ids included —reads as a plain "keep this on the grid".
Settings you can edit without opening the JSON
◂ ▸changes the selected row's value. Booleans toggle, numbers steptheir ladder, lists cycle and commit live.
Enteris now only for values youhave to type or search for, and a row with no ordered ladder declines rather
than pretending — the footer names only the keys that row actually answers.
/searches every category at once, andj/kmove like everywhere else.rows that said
↵ editwhile doing nothing are now honestly read-only.Test naming command runs it and shows you what came back. That row is what
makes the setting honest: an automatic naming failure is silent by design, so
a command that returns a preamble or nothing has no other way to announce
itself.
live and writes once.
Ctrl-a I→ Projects… for per-Project settings, each with its healthstated.
A tracker change applies without a restart
This is the bug the release came from.
adapterswas built once at import timeand the config watcher never rebuilt it — so choosing Linear did nothing until
you restarted, and the workflow screen, starved of statuses, hid the one
affordance that would have built your workflow for you. A setting that looks
configured, is not in force, and has nothing on screen willing to say so.
Swapping adapters is now an app-wide transaction carrying an epoch: every async
consumer re-checks it after each
await, before any write, so a late401or429from the adapter you just retired can no longer mark the current one asbroken.
Credentials are verified rather than checked for existence — GitHub and
GitLab get identity probes, and transient blips are retried instead of read as
a bad token. A rejected token no longer destroys the working one.
Config that survives a bad write
config.jsonis written atomically, and a failed write is reported ratherthan swallowed.
diagnostic naming the file.
used to invite first-run setup to write over it.
replace doesn't blind it.
config isn't flushed over a file you're mid-edit on.
Which tmux config jmux sources
Layer 3 protects only what jmux can't run without; everything else it ships is
presentation you're invited to override — which is how an elaborate tmux config
lands its own chrome on top of jmux's UI.
userTmuxConfigis the way out:Unset auto-detects — and the detection changed. jmux now resolves the two
locations tmux itself documents, in order:
~/.tmux.conf, then$XDG_CONFIG_HOME/tmux/tmux.conf. jmux had only ever checked the first, so ifyou keep yours at the second it has been silently ignored and now won't be.
Also on the settings screen under tmux. It's read only when the tmux server
starts, so the row says
restart to applyuntil you exit every session andrun
tmux kill-server.Also fixed
start itself.
the toolbar was swallowing every click while hover kept working, which is
what hid it.
Escapeout of the Projects or workflow screen goes back where you came from.ctl statusreported no agent kind for sessions that plainly had one, andtook an inherited session-scoped state at face value: a shell is not an agent
just because tmux says it has state.
dirty marker; the strip could window away the chip for the view you were in;
repairing an out-of-bounds view name deleted the view instead.
v0.28.0: — sessions that say what they areCompare Source
Your sessions can name themselves, and a session can carry a whole feature's
worth of tickets.
Sessions named by a model
A session row used to show a slug —
tra-123, or whatever you typed atCtrl-a n. PointsessionTitle.commandat any CLI that reads a prompt onstdin and jmux asks it to name the session from what it knows about the work:
{ "sessionTitle": { "command": ["claude", "-p", "--model", "haiku", "--effort", "low", "--settings", "{\"alwaysThinkingEnabled\":false}", "--setting-sources", ""], "timeoutMs": 60000, "maxChars": 32 } }It is an argv array, not a shell string —
["codex", "exec"],["ollama", "run", "qwen2.5"]or a script you wrote all work. Unset is off,and it is off by default. There is no provider registry and no second
credentials story: the model choice is a flag you already control.
jmux names a session from the strongest of three inputs it has — your linked
issues, your first prompt to the agent, or your branch and the commits it has
that its base branch doesn't. What that prompt contains leaves your machine
if the command does. Point it at a hosted model and your issue text goes to
that provider under their terms; point it at a local one and it stays put. jmux
itself makes no network call for this.
Three things worth knowing:
jmux takes the first one that answers and then leaves the name alone — a name
that changes while you are reading it is worse than one that is merely not the
best available.
palette (
Ctrl-a p). It is the way to re-title after linking more issues,after a naming call failed, or when a git-tier title has frozen on the
branch's first commit. It overrides a hand-typed rename too.
To name from your first prompt, re-run
jmux --install-agent-hooks— thecapture is new and an older install doesn't do it. Nothing is captured unless
you have configured
sessionTitle.A titled session carries its branch on the row below the title. With naming
off, the sidebar is exactly as it was: row 1 is still the session name, and
there is no branch row to repeat it.
One session, many issues
Product files a feature as five tickets; five tickets is one branch, one
worktree and one merge request. A session now carries any number of issues.
Spaceticks issues in the panel,nstarts the ticked set as onesession.
non a group header still starts the whole group.TRA-123 +4, naming the least advanced unfinished ticket —so a session leaves a stage band only when its last ticket does.
Ctrl-a e, or a click on the badge, expands the session in place to listwhich tickets. They are sub-rows:
Ctrl-Shift-Up/Downstill walks sessions,not tickets.
{and
}to walk it,pto send that ticket's prompt to the session'sagent.
Ctrl-a Zundoesthe whole batch rather than the last write.
jmux ctl issue linkappends rather than replacing, andunlinktakes anoptional id. An issue linked from the CLI is now a full citizen — it gets the
badge, the stage band, the linked dot and its MR transition, none of which it
had before.
Row 2 says where the work sits
Stage bands only exist when you group by stage, so on the other three axes the
sidebar named a ticket without ever saying where it was. Each session now leads
with the workflow stage its driving issue sits in, on every grouping axis.
The same field reports drift — an issue behind where your configured
transitions say it should be, which is what a restart, a failed write or a
session adopted after its MR merged all leave behind silently.
Ctrl-a mmovesthis session's issues where the workflow says they belong;
Ctrl-a Ztakes itback.
Ctrl-a \gives the panes the whole terminalHides and shows the sidebar. Not persisted — this is "get out of the way for a
minute", not a preference, and a sidebar that stayed hidden across a restart
would have hidden the surface that explains how to get it back.
It keeps working on the full-screen surfaces (settings, the workflow screen, the
ghost preview), where every chord used to die. So does
Ctrl-a g: askingfor the diff panel from one of those surfaces now leaves the surface and opens
the panel, instead of doing nothing.
Also fixed
and the divider drag all went with it. An absent sidebar now subtracts the
sidebar and nothing else.
the filter bar was open.
instead of the names shown everywhere else.
created or renamed one. The session list is now retried, bounded.
entirely while the agent waited forever for a directory that was never coming.
attention with nothing to say about why.
gitseveral times a second,forever, to keep re-learning there was nothing to name it from.
v0.27.2: — agents can start issues againCompare Source
Agents can start issues again.
jmux ctl issue startused to run the worktree tool to completion before itcreated anything. On a repo where
wtm createruns install hooks, that meant aminute or more of total silence — no session, no pane, nothing in
ctl status— which is indistinguishable from a hang. Agents reported it as one, killed it,
and left an orphan worktree behind that the next attempt mistook for finished
work.
It now provisions the way pressing
nin the issues panel always has: thesession is created first with the agent waiting in it, and the worktree tool
runs in a setup pane beside it. The command returns in about a second no
matter how long setup takes, and the work shows up in your sidebar,
ctl statusandworkflow boardwhile it is still being built.If you script against
issue startcwdis now where the worktree will be. Untilprovisioning.readyistrue, that directory may not exist yet — don't
cdinto it orgit -Cit.Three ways to handle that:
seeded, so "kick this off" needs nothing more.
jmux ctl issue start TRA-123 --wait [seconds](default 300) blocksuntil setup finishes. Always bounded — a timeout returns a live session, not
an error.
jmux ctl status. If setup fails, the session raises its attentionflag with the reason
worktree setup failed, and the setup pane stays openon the tool's own error.
Also fixed
issue startnow fires thesession-startstatus transition, so work anagent starts leaves your backlog column like work you start yourself does.
-p— print mode, headless, exits — where a humangets an interactive session seeded with the issue. Now both get the same
thing.
pane nobody is looking at.
v0.27.1: — A real browser, in a paneCompare Source
A real browser, in a pane
You are building a web app. The agent is in one pane, the dev server in another, and the thing they are both about is behind you in a different application — on a different desktop, or under the terminal you are typing into. Every check of "did that actually work" is a context switch out of the workspace and back.
Ctrl-a bsplits the current pane and puts Chromium in it. Not a text-mode renderer and not a screenshot: a live page you can click, scroll, fill in and open DevTools on, beside the agent that is building it.The browser is terminal-browser by Zenbu Labs, MIT-licensed, and it is the project that solved the hard part — getting Chromium to render into a terminal at all. jmux does not bundle it or reimplement it. You install it, jmux spawns it, and everything you look at in a browser pane was drawn by it.
curl -fsSl https://terminal-browser.sh/install | bashOpen what you are already serving
Ctrl-a p→ Open dev server in a browser pane asks what the current session is actually listening on and opens it.It reads listening sockets, not your scrollback. A server that printed its URL four hundred lines ago is still found, and a URL sitting in a log line is never mistaken for one. Ports are attributed to a session by walking the process tree down from each pane's shell, so you get your session's servers rather than every port on the machine.
The same list, as JSON:
Your agents can drive it
actionpasses everything after--straight through to terminal-browser's agent-browser CLI, so the vocabulary is that tool's rather than jmux's — and jmux gains whatever they add without having to model it. An agent may open a browser pane, but only beside itself: the split targets the agent's own pane, so it can show you something in its workspace and cannot rearrange a session it is not in.Every pane is its own browser
Two browser panes are two browsers, with their own tabs, history and pages. This is on by default and it is load-bearing — terminal-browser derives its image id from its process id, so a shared process makes every pane transmit under the same id and the terminal draws whichever frame arrived last in all of them. Set
browser.isolatetofalseto trade back for a working cross-paneterminal-browserCLI.Requirements, and one honest limit
The
⊙toolbar button appears only when both are true.Ctrl-a balways answers, and says which one is missing.Pages may lay out narrower than the pane is wide.
browser.displayScaleis passed to terminal-browser asTERMINAL_BROWSER_DISPLAY_SCALE, and it turns out to be a multiplier on the display's scale factor rather than the absolute device pixel ratio jmux assumed — so the default of1gives a device pixel ratio equal to your display's scale, and the page is laid out for a fraction of the pane's width. Measured on one machine:1→ dpr 3.37,0.297→ dpr 1.0 and a viewport matching the pane exactly. If pages look zoomed, lowerbrowser.displayScaleuntil they don't. A proper fix belongs upstream.jmux ctl workflow— the pipeline, for agentsjmux ctlcould list sessions and read agent state, but knew nothing about the workflow the sidebar grew around them. An agent could not ask what stages exist, which sessions sit in which, what nobody has picked up, or what to work on next.There is no IPC to a running TUI, so this is re-derived from config, tmux and your tracker — and it agrees with what you see by reusing the same modules the sidebar renders from, never by reimplementing their rules.
A session an agent started is now a session the sidebar knows about
The two sides disagreed about what a session even is. The CLI derived
<id>-<title-slug>with worktrees in a-worktreessibling and recorded links in a tmux option; the TUI usedsessionNameTemplate, put worktrees at<repo>/<session>, and read onlystate.json. So a sessionctl issue startcreated was invisible to the sidebar, which would happily offer to start the same work again.There is now one implementation of issue → session, shared by both.
ctl issue startprovisions what the TUI would, with the same tool, and the TUI reads both link stores. If you have been usingctl issue start, this is the release where it stops duplicating your work.The diff panel picks the right theme
hunk's own--theme autoqueries the terminal's background at startup, and inside the diff panel nothing answers — hunk runs in a pty jmux reads into a headless terminal, and that feed is one-way. It therefore always took the "terminal didn't answer" fallback and chose a dark theme, which is the wrong half of the choice on exactly the terminals the flag exists for.jmux already ran that probe against the real terminal, so it now resolves the light/dark theme itself and passes the answer. Set
diffPanel.themeto pin a specific hunk theme, or tofalseto pass nothing and leave hunk's own config in charge.Pane border titles are off again
0.27.0 turned pane border titles on the moment a window held more than one pane — a
window-layout-changedhook flippingpane-border-statustotop. Splitting a pane therefore changed the shape of the window: a line off every pane's height, plus a rule across the top.The theory was that a border row earns its place by telling panes apart. It doesn't — the line between two panes already does that, and jmux names the window in its toolbar and the session in its sidebar, so a per-pane title was a third label for a screen that already had two.
Titles are off everywhere now. The format is kept, because it is the right one if you want them:
core.conflosesunbind Pand a hook-unset along with it. Both existed only to stop that automation being knocked into a half-state, andcore.confis sourced last — so they were silently destroying those bindings for anyone who had bound them deliberately.tmux only reads its config when a server starts, so this lands when your tmux server next restarts, not on upgrade.
Install
0.27.0 reached GitHub but never reached npm or Homebrew, so this is the first 0.27 release on those channels — everything above is new if you are upgrading from 0.26.0.
jmux-0.27.1-darwin-arm64.tar.gzjmux-0.27.1-darwin-x64.tar.gzjmux-0.27.1-linux-x64.tar.gzjmux-0.27.1-linux-x64-baseline.tar.gzjmux-0.27.1-linux-arm64.tar.gzEvery tarball carries a checksum in
SHA256SUMS.Full documentation: Browser panes.
v0.27.0: — A real browser, in a paneCompare Source
A real browser, in a pane
You are building a web app. The agent is in one pane, the dev server in another, and the thing they are both about is behind you in a different application — on a different desktop, or under the terminal you are typing in
Configuration
📅 Schedule: (in timezone America/Chicago)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR has been generated by Mend Renovate CLI.