Repository navigation
Onyx 0.16
Onyx 0.16
The first release shaped mostly by other people using it. Several things
here exist because a user asked a question whose real answer was "you
can't, actually" — and a few because the answer was "you can, but nothing
told you so".
Getting around
- New sessions claim a ⌘-number automatically. Switching sessions by
keyboard needed a favorite first, so the fast path was gated behind a
concept you hadn't met yet — the question that surfaced this was "is
there a shortcut to toggle between sessions". The first nine sessions in
a window now arrive ready to jump to. It only ever adds: nothing is
reordered, and a session you unfavorite stays that way. - Picking a session in the list closes the list. It used to stay open
on the theory you might flip between several — but you pick one, and then
the list is sitting over the terminal you just asked for. ⌘J reopens it. - Rename and kill sessions from the session list, right-click. A rename
carries the session's note and its ⌘-number across, since a session's
identity is its name and both are keyed to it. Names are restricted to
letters, digits,-and_— narrower than tmux allows, because tmux
reads.and:as separators and a session named with them can't be
targeted afterwards. - ⌘⌥← and ⌘⌥→ move the keyboard between the terminal and the open side
panel. Directional rather than a toggle: you shouldn't have to know where
focus is to predict where it lands. The file browser says which way round
it currently is, and which key sends the keyboard back — on screen, where
someone stuck in the panel is actually looking. - A guided tour on first launch, and under Help → Onyx Walkthrough
after that. Organised by the job rather than by the key, because the
shortcut list answers "what does ⌘J do" and not "what can this do for
me". - The Help menu opens that help, instead of macOS reporting that help
isn't available for Onyx.
Drag a file onto the terminal
Terminal.app inserts a dropped file's path, and that gesture has become how
people point Claude Code at a file. Onyx does it too — and over SSH, where
the path would otherwise be meaningless, it copies the file to
~/.onyx/dropped first and inserts where it landed. Sessions inside a
container take a second hop, so the path names a file the shell in the
container can actually open.
The upload rides the host's existing connection as a multiplexed channel,
like everything else here: a drop never opens another connection.
Watching more than one machine
- Two fleet layouts.
Fcycles what the charts are about: this host,
the busiest few hosts one row each, or the whole fleet collapsed to one
CPU and one GPU chart where each column is the max across machines — if
anyone is busy, we're busy. Every row shares a time axis, so a spike on
one machine lines up with a spike on another. - Memory can't be merged that way (an absolute number over wildly different
totals), so the merged view puts per-host memory charts underneath as
small multiples. SandFare separate axes now.Sis detailed vs. simple;Fis
which machines. They compose, and fleet mode applies to the detailed
layout too.- AMD GPUs are visible to the fleet views. They were reported by the
active-host poller but not the fleet sweep, so an AMD box pinned at 100%
showed nothing at all — and with no other GPU host, the merged chart
disappeared entirely rather than reading zero. Tzooms the fleet window — ten minutes at one sample per column, or
an hour averaged. It can't change how often the fleet is sampled (that
sweep is shared with the screensaver), so it changes how much time is on
screen, and says which.- Fleet views carry the side panel and the bottom strip, and their
containers strip is merged across the fleet — the busiest containers
anywhere, each labelled with its host.
Simple mode
- The left column (
D) now lists session notes above today's
reminders — both halves of what's on your plate, in the view you leave
up on a second screen. Sessions show a colour only: at that distance the
colour is the status. - Reminders in that column are grouped by list, in your configured
order, and filtered strictly to today and earlier. - With the column up, the activity pills in the corner are hidden rather
than saying the same thing twice.
Pull requests
- Watch a whole GitHub owner or GitLab group. One line —
almostrealism,
fivn— instead of a hand-maintained list that's always missing the repo
someone created yesterday. GitLab groups cover their subgroups. - Filter drafts: all, hide drafts, or only drafts. A PR counts as a
draft if the forge says so or if its title starts withDraft:,WIP:
or[draft]— which is GitLab's actual mechanism, and a convention plenty
of GitHub teams use on PRs the API considers ready.
Page watches
Some things you're waiting for aren't announced, they're edited: a
configurator gains an option, a status page loses the word "degraded", a
vendor deletes their own "coming later" notice. A watch is a URL, a string,
and whether you care about it appearing or disappearing. Buried at the
bottom of Settings, polled no more often than every five minutes.
The first check only establishes a baseline and never fires, firing needs a
transition rather than a state, and a failed check records the error
without disturbing the baseline — a watch quietly 403ing for a week is
worse than no watch, because you think you're covered. The last check time
is shown under the monitor headline, and goes amber when it's stale.
Fixes
- The file browser was eating every space typed into the terminal. With
the panel open and a file selected, space toggled a preview and never
reached the shell. Bare keys are now claimed by whichever component
actually holds the keyboard — the same authority that decides where your
typing goes, so the two can't disagree.⌘Ypreviews from anywhere, and
space in the file browser's own search box types a space. - Focus stopped drifting to the side panel. Closing the monitor or the
session list re-asserted panel focus merely because a panel was open. A
panel isn't modal; it claims the keyboard when it opens and not
afterwards. - The keyboard can no longer go nowhere. Handing it away without
anything taking over left it with the window, where keystrokes are simply
discarded — clicking between the terminal and the panel a couple of times
could land you there, with no sign except that nothing worked. Whenever
nobody holds the keyboard it now goes back to the terminal. - Clicking the terminal takes the keyboard, rather than hoping the
terminal wins a race with a focused text field. That was the "clicked the
terminal, still typing into the search box" case. An empty search box also
closes when you click away; one with a query in it stays, because those
results cost a round trip. - The focus outline (Settings → DEBUG) now follows the keyboard between
events instead of only correcting itself on the next keystroke. - The session idle clock was measuring the wrong thing. It could only
see sessions still in the terminal pool, and the pool drops anything you
haven't looked at for five minutes — so "time since last output" quietly
became "time since we stopped watching", and a busy session read as
quiet. It now reads tmux's own activity timestamp for every session on
the host, pooled or not. - A 30-second hang when search results were large. The results tree was
rendered recursively inside a lazy stack, which can only be lazy about
its direct children — so the whole tree was measured and placed on every
layout pass. It's flattened now. - Slack and other sites no longer refuse to load in a browser tab.
WKWebView's user agent is Safari's without theVersion/… Safari/…
tokens, so anything sniffing for Safari saw an unknown browser. - The dock bounces when an agent is blocked on a permission decision —
it times out after 120 seconds, so an unnoticed request isn't delayed, it's
abandoned. It stops when you answer or when it expires. - Double-click the top of the window to zoom again. Hiding the title bar
meant content sat where the title bar would be and swallowed the click.
Honours your "double-click a window's title bar to" setting. - 12/24-hour clock and show-all-containers moved to Settings from the
overlay's key list. Both keys still work. Show-all-containers is now
persisted and has one source of truth, so it can't disagree with itself
across windows, and the header says "all" when the idle filter is off.
Packaging
release.shpublishes a version to GitHub Releases: tag, notes and the
DMG, refusing to ship a disk image Gatekeeper would reject, and checking
the resulting download URL actually resolves before calling it done.- Script-installed builds stamp their real version. Crash and hang
reports used to say0.1.0regardless of what was installed, which made
a user's report impossible to tie to a build.