Releases: emaitchess/searoom
Release list
Searoom 0.8.1
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
-
The
sample,watchandstatusdocuments carry an additive optional
sample.topProcessesblock: the five heaviest readable processes by CPU
rate and the five by resident memory, refreshed at the requested interval
like every other rate. The CLI primes per-PID baselines across the
requested interval, so the first primed sample already carries real
per-process CPU rates. Persisted samples encode without the key,history
documents are untouched, and the frozen 41-field--dump-sampleshape
stays exactly that.
SHA-256:Searoom.dmg 2f92f02dcaa634c8fe559fae05b28d8a14db24042380da5dcd72c07ffdf37618
Searoom.zip a4c405c921a5fceb961bbb838cb103e7736aee4f5c80b703d8a29d8d9e643498
Full Changelog: v0.8.0...v0.8.1
Searoom 0.8.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
- A Top Processes card on the dashboard names the five heaviest readable
processes by CPU rate and the five by resident memory at all times,
refreshing at the sampling interval like the other live readings, so the
first place to look is visible without leaving the dashboard. It sits
behind the six metric cards in the shipped order, and a settings archive
that never reordered anything is migrated onto that arrangement while a
deliberate reordering is left alone. Clicking a row selects it and
Command-C copies the process name; Escape releases the selection. A column
with no measurable consumers says so — MEASURING while the first reading
warms up, NONE when nothing readable drew on the resource, UNAVAILABLE
when the scan failed — instead of leaving blank space. Enumeration is a
publicsysctl kern.procread, wider thanproc_listallpids, so the scan
covers the whole process table; sandboxed helpers and other-user daemons
that refuse inspection are omitted rather than shown as zero, because
macOS keeps their CPU and memory figures private without privileges. No
helper, no subprocess, no new permission. Rankings live only in the
dashboard and are never persisted to history, because process names do
not belong in stored archives. The card joins the movable dashboard
sections and can be dragged or reordered in Settings like the others. - CPU/package temperature now reports on M5 Pro Macs. The SMC temperature
probe gains theTp04,Tp08andTp0Ckeys, which carry the M5 Pro's
package sensors asfltpayloads that track load between roughly 52 and
72 Celsius on identified hardware. The earlier M-series keys stay first in
the probe order, so each generation still finds its own sensor, and the
reading keeps itsCPU PACKAGEsource label.
Changed
- Every reading shown with a decimal point now shows exactly two decimal
places, in every unit and on every surface: the accountability strip's
gigabyte RAM reading, selectable gigabyte pairs, and the fractional rate
branches. Percentages, temperatures, fan rpm, and compact readings below
the gigabyte and megabyte scales keep their integer treatment, where a
decimal would be noise.
Fixed
-
The build is warning-free again. Its only deprecation warning came from an
inertcopiesOnScrollassignment that has had no effect on any macOS this
app supports; dropping it changes no behavior, and the opaque document
views keep the copy behavior the comment beside it described.
SHA-256:Searoom.dmg b27761ad7c356d0e8320beed6bf3ab96d66535a13b8551a5d5cf22e5003238a2
Searoom.zip 91375e7929be31db95497bdbb95a213163ac7bcc9f3c7a2468dcdbbd1990b0cf
Full Changelog: v0.7.0...v0.8.0
Searoom 0.7.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
- Every
searoomoption answers to a one-letter shorthand as well as its long
name:-iis--interval,-pis--pretty,-jis--json,-cis
--count,-nis--limit,-sand-uare--sinceand--until, and
-lis--jsonl. Both spellings work everywhere, and validation, duplicate
detection, and every error message speak in the long form however the option
was typed.searoom -handsearoom -vwork on their own, andsearoom COMMAND -hprints that command's reference and wins over validating the
rest of the line. Thehelp --jsoncatalog lists each shorthand beside its
long name, so automation can pick either form from the same document.
Fixed
-
Settings failures are no longer silent. A failed command toggle, a blocked
agent-skill install, and a rejected global shortcut are announced to
VoiceOver, and the two status lines mirror their full text onto tooltips, so
a message longer than its column is readable on hover instead of being cut. -
Check for Updates now says what it is doing: the button is disabled and
retitledChecking…while the request runs, so the network's silence no
longer reads as breakage and a second click cannot stack a second dialog. -
The release link shown by the update check is only offered when the update
manifest points at a securehttpspage, so a tampered manifest cannot hand
the browser afile://or custom-scheme address to open. -
The shortcut recorder states its rule instead of only beeping: help text on
the control and a line beneath it say that ordinary keys need Command,
Option, or Control. -
The shortcut error uses the design's critical color token rather than the
system red, the footer sits at the design's ten-point micro-label floor, and
the history note is set in the design's thirteen-point body size.
SHA-256:Searoom.dmg 65512853648fb38293d46f89a52dcdb96251d8e8a229c909ede2c2e1d9652ead
Searoom.zip 78837a7f1c74d0e7bab8de218684dc9043fb3f2e40ee17075f0b9c5b04e98189
Full Changelog: v0.6.0...v0.7.0
Searoom 0.6.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
-
The
searoomcommand is linked on first launch, so it is there the first
time someone opens a terminal rather than waiting to be found in Settings. It
creates one symlink at~/.local/bin/searoomand, when that directory is not
already reachable, one clearly marked block in~/.zprofilethat puts it on
PATH. No prompt and no privileges. It does nothing when the command already
works, when something else occupies the path, when the app is running from a
disk image or App Translocation, or when the command has been turned off.The profile edit is new behaviour for an installer that previously promised
never to touch a shell file, and it is there because nothing else reaches a
stock PATH without privileges: macOS ships
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin, and both/usr/local/binand
/etc/paths.dare root-owned. The block is written only when no login file
already mentions~/.local/bin—.zshrc,.zshenv,.bashrcand
.profileare read even though Searoom never writes to them, because PATH is
set in.zshrcfar more often than in.zprofile— and turning the command
off removes the block again, leaving every surrounding line untouched. -
Settings replaces the Install and Remove buttons with one
Enable the searoom commandtoggle. Its state is read from the filesystem rather than from a
stored flag, so it always shows what a terminal would find. A command
provided by Homebrew is recognised and reported: the cask's link is not
Searoom's to remove, so the toggle shows it as on and names where it came
from instead of offering an off switch that would not work. Turning the
command off is remembered, so the next launch does not put it back. -
Settings are grouped by what they change, under
MENU BAR,DASHBOARD,
SAMPLING,SEAROOM CLI,GENERALandMAINTENANCE, rather than arriving
in the order the controls happened to be built. Launch at login, trackpad
feedback, Check for Updates and Reset Trend History move out of the strip
below the grid and into the sections they belong to, and the three toggles
are now switches on the trailing edge so they line up instead of drifting
with the width of their labels. -
An
Agent skillscontrol installs the bundled Agent Skill into the folders
coding agents read: Claude Code, Codex, Cursor and OpenCode, individually or
all at once. Each agent is a checkable item, so the same menu removes what it
installed, and an item shows a dash when the file on disk is not this
version. OneSKILL.mdper agent is written and nothing else is touched. The
row only appears while the command is enabled, because a skill that tells a
model to runsearoomis useless without it.
Fixed
-
Scrolling is smooth in both the dashboard and Settings. Three things were
wrong. The shared scroll view swallowed every wheel event whose vertical
delta rounded to zero, which included the phase changes that drive momentum,
so a flick stalled and stopped early; it also forced the clip view back to
x = 0 from insidescrollWheelandlayout, fighting the scroll already in
progress. Both are gone: the horizontal lock belongs in the clip view's
constrainBoundsRect, which constrains a scroll before it happens rather
than undoing it afterwards. And both document views now declare themselves
opaque, so the scroller copies what is already drawn and repaints only the
strip a scroll exposes, instead of redrawing the whole visible page every
frame. -
The metric and card lists in Settings no longer scroll on their own. They are
sized to hold every row they can ever have, because a scroll view inside the
scrolling settings page swallowed the wheel while the pointer was over it,
which read as the page sticking and then lurching. -
Reopening Settings while it was closing could leave the app demoted back to
an accessory in the middle of showing the window, and the window would not
appear at all. -
Settings is now the popover's size, 430 by 720, and scrolls. It had grown to
928 points tall, which no longer fits a laptop screen, and a fixed window
also means no control can resize it by appearing or disappearing. The page's
ownSEAROOM / SETTINGSbanner is gone, since the title bar already names
the window, and the reorder controls are arrow glyphs, which is what fits
beside a label column at that width; each keeps its accessibility label and
gains a tooltip. -
The app appears in the Command-Tab switcher and the Dock while Settings is
open, and goes back to being a menu bar app when it closes. -
Clearbeside the shortcut recorder is hidden when no shortcut is set,
rather than shown permanently disabled. -
Command-W closes the Settings window and leaves the app running in the menu
bar. The shortcut is handled by the window itself, because an accessory app
installs no menu bar andNSApp.mainMenukey equivalents are never matched:
the Quit item's Command-Q has never fired either. -
The Searoom CLI status line no longer appears and disappears. It reports
states only some machines reach, a Homebrew-provided command or a conflicting
file, and letting it come and go resized the window under the switch that had
just been clicked. It now holds one line whether or not it has something to
say. -
The menu-bar preview is gone from Settings. The stacked and inline layouts
have different natural sizes, so switching between them resized the window
and the whole page appeared to jump. The menu bar itself now updates the
moment the selection changes, which is a truer preview than a mockup of it. -
Changing a menu-bar metric or the layout refreshes the status item
immediately rather than at the next sample, which at a ten-second interval
was long enough to read as the setting not having worked. -
searoom history --jsonlreturned the single envelope document instead of
one sample per line. The parser accepted and validated the flag and then
dropped it:ParsedCommandcarried only the shared--jsonand--pretty,
and the runner passed--jsonthrough in its place, whichhistorydoes not
accept, so the value was always false.--jsonlnow travels on thehistory
command itself, where a flag belonging to one command belongs.The streaming lines are the same
sampledocumentwatchemits, so one
reader handles both and every line validates against the published schema; a
bare sample did not, because the schema's top level requires the envelope.
Each line is labelledsource.kind: persisted,producer: searoom-app,
rather than claiming to be live telemetry the CLI just collected. -
searoom watchwas killed by SIGINT and SIGTERM instead of finishing the
line in flight and returning 128 + signal.CLIRunner.Environmentdefaulted
its signal monitor toNoSignals(), the test double, so the real
DispatchSignalMonitorwas never constructed outside the test suite and the
two signals kept their default disposition. Every signal test injects its own
monitor, which is why 133 passing tests said nothing about it. The default is
now the dispatch monitor, one test asserts the production default directly,
andScripts/check-watch-signal.pyruns in CI and in the release audit: it
reads the raw wait status, because a shell reports 130 both for a process
killed by SIGINT and for one that exits 130, and so cannot tell the
regression from correct behaviour.
SHA-256:Searoom.dmg 732ba70a6e1b73bee32c12e33dac07532f3bb6d877e66b7f8d5a1373198d4ecd
Searoom.zip f188f89e4514cc1a251b7f15fad54234de97fb323106dfc7a7bedc78c0579003
Full Changelog: v0.5.1...v0.6.0
Searoom 0.5.1
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Fixed
-
searoom versionand thesearoomVersionfield in every telemetry document
reported0.0.0 (build 0)whenever the command was reached through a symlink
outside the app bundle, which is how both supported installations expose it:
Homebrew'sbinlink and the~/.local/bin/searoomthatinstall-cli
creates.Bundle.mainis derived from the launch path without resolving
symlinks, so it pointed at the link's own directory, which has no
Info.plist. Bundled resources were unaffected, because SwiftPM's accessor
also searches the executable's directory, which is why only the version was
wrong and only on the common path. The version now falls back to the.app
enclosing the resolved executable, and CI asserts the version reported
through a symlink againstInfo.plist.
SHA-256:Searoom.dmg eb887185b236f5066482b6455265b1bbd689124bc1e1c61ade51a17c2069dee2
Searoom.zip 1fa932350cb7639c01a1af75d2c9e6a4727e0fd844987b707d86aaf636ef5269
Full Changelog: v0.5.0...v0.5.1
Searoom 0.5.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
- A first-class
searoomcommand line interface, built into the app: the same
signed executable gains a lowercasesearoommode that prints help with no
arguments and exposessample,watch,status,history,capabilities,
metrics,schema,agent-guide,version,self-test,install-cli,
anduninstall-cliwithout launching any UI. Every telemetry and
documentation command is read-only and offline; live sampling never writes
app history. Homebrew installs link the command automatically; DMG installs
can add it rootlessly withsearoom install-clior the new Settings control. - Versioned telemetry output (schema v1) with UTC RFC 3339 timestamps,
stable base units, lowercase pressure levels, and explicitnullfor
unavailable readings, plus bundled JSON Schema, metric definitions, and an
offline Agent Skill so automation can discover the whole contract without
the network. - Per-source availability metadata (
available,warmingUp,unavailable,
legacyUnknown) that distinguishes a valid idle zero, a missing rate
baseline, and a failed read. Old archives decode aslegacyUnknownand
remain readable. searoom sample,watch,status, andcapabilitiesprime their rate
baselines before emitting, including one forced second disk read, so the
first emitted sample carries meaningful disk I/O instead of a permanent zero.
Fixed
-
A failed disk-IO registry read no longer installs a zero counter baseline,
which previously fabricated a false throughput spike on the next successful
read. The same protection now covers the sampling process's own CPU baseline.
SHA-256:Searoom.dmg 2a7c3f1c528627ac2015dce16c519d1a5f83162119d5ab8c2c9f49c01637a776
Searoom.zip 2400cac30788cf098d9bb113143f5e2f31d99e06f5f71c24fe151ac77089232f
Full Changelog: v0.4.0...v0.5.0
Searoom 0.4.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
- Trackpad haptic feedback when the sample rate changes, at each trend-window
slider stop, while scrubbing a trend chart as the cursor crosses into the
next retained sample, and each time a dragged dashboard card would land in a
new slot. The slider and card-drag taps fire on the change rather than per
event, so a slow gesture gives one tap per detent crossed rather than fifty.
Chart scrubbing is floored at 25 taps a second: the snapped sample changes
about once per pixel column, so an unthrottled sweep would fire at the
mouse-moved rate and read as a buzz rather than a series of detents. - A Trackpad feedback checkbox in Settings turns all of it off. On by default,
and settings written before the toggle existed keep the feedback they already
had. Every haptic in the app routes through one gate, so a new detent cannot
ship ignoring the preference.NSHapticFeedbackManageris part of AppKit, so
this adds no dependency and no measurable size, and it is a no-op on hardware
without a Force Touch trackpad.
Changed
- The trend window now runs from 15 minutes to 24 hours. It offers 15 and 30
minutes then every hour to 24, and Settings presents it as a slider that
snaps to those stops rather than a four-item menu. The four windows that
existed before (15 minutes, 30 minutes, 1 hour, 3 hours) are all still
offered, so a stored preference carries over unchanged. - Windows longer than three hours keep their full span and retain every nth
sample rather than every one. A 24 hour window therefore costs no more
memory, disk, or scan time than the three hour window already did. Nothing
changes on screen, because the dashboard already downsamples every series to
its pixel width before drawing, and live readings are never thinned. Storing
every sample for a 24 hour window would have meant about 33 MB rewritten to
disk every minute to draw fewer than 400 points. - Sample rate offers every whole second from 1 to 10, on a slider matching the
trend window rather than a four-item pop-up. All four rates offered before
are still stops, so a stored setting carries over. The value is committed
when the drag ends, not on each tick: changing it restarts the sampling
timer, so writing per tick would tear the timer down and rebuild it up to
nine times for one gesture. - The value beside each slider is pinned to the width of the widest string it
can show. The trend-window strings range from 40.8pt for "1 hour" to 68.0pt
for "15 minutes", so without this the label resized as the value changed and
dragged the slider sideways under the thumb. - Removed the blank line reserved under the global shortcut row. The error
label was always present and empty, and an empty label still has intrinsic
height, so it held roughly 16pt whether or not there was an error. It is now
hidden when there is no message, which drops it from the layout entirely.
Fixed
-
The card order list's buttons are titled
Move Card UpandMove Card Down.
Two buttons readMove Upand two readMove Downin the same window, one
pair per list, so the two lists were distinguishable only by which table
happened to be selected. -
The sample rate control carries an accessibility label. VoiceOver announced
the selected value with no indication of what it set, because the SAMPLE RATE
text beside it is a separate label with no programmatic association. -
The Settings footer is constrained to sit at least 16pt below the disclosure
note. The note is the only variable-height element in a fixed 720pt window
that cannot scroll, and nothing held it off the footer; they did not overlap,
but the failure would have been silent.
SHA-256:Searoom.dmg 5416692902ec891e75a9a741f1045b642b5ad4a15cd69f6abb369b57eed6a0c5
Searoom.zip 8927c252e91a60cadc80ebb556afd90f3e0f410195ee5e89fa69d1db5bb5af75
What's Changed
- docs: describe the menu bar as a selection, not as presets by @heytherehamza in #1
New Contributors
- @heytherehamza made their first contribution in #1
Full Changelog: v0.3.0...v0.4.0
Searoom 0.3.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no background updater and downloads nothing by itself. Its only network request is the update check in Settings, made when you ask for it, which reads the current version number from searoom.app and nothing else.
Added
- A
Network Upload/Downloadmetric showing both directions in one menu-bar
slot, each on its own line with a compact arrow when the layout is stacked. - Dashboard cards can be rearranged. Drag a card to move it, or use the card
order list in Settings, which is the keyboard and VoiceOver equivalent. The
order is remembered. The Searoom accountability strip and the footer stay
where they are.
Changed
- The menu bar stacks each metric's label above its value by default, which is
about 61% of the previous width for the same five metrics and makes each
label unambiguously belong to the reading beneath it.Inlinein Settings
restores the single larger line. Readings still cannot move the item as they
change. - The menu bar is no longer built from presets. Choose up to five metrics in
any order, in Settings or from the status item's Menu Bar submenu. Choosing
none shows the Searoom mark alone, which is what Minimal used to be. - Existing settings migrate to the equivalent metric list, so the menu bar
keeps showing what it showed before. The LLM preset is the one imperfect
case: it drewRAM used/total, which no single metric expresses, so it
becomes RAM used, temperature, and GPU memory, and the total is lost. - Releases are now gated on continuous integration.
Scripts/release.sh --publishrefuses to tag or publish from a commit whose CI run did not
conclude successfully, and a published release is re-checked against the
artifacts attached to it: notarization, stapling, and the SHA-256 values in
the release notes.
Fixed
- Stacked menu-bar lines are positioned by baseline rather than by line box,
so they no longer sit a point low in a 22pt menu bar.
SHA-256:
Searoom.dmg 22fcc6090716766789183ccc0ba9f535b4f28732904b12776a1366bd62f42661
Searoom.zip 6aa107c6d29f7ab3dfff6ce7f87491c8da7ef7e49ba3461f1cd158dbb2b4ad33
Full Changelog: v0.2.0...v0.3.0
Searoom 0.2.0
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no updater and no network client, so new versions are announced here only. Watch the repository's releases to hear about them.
SHA-256:
Searoom.dmg afc3a9aa84d5c1635405a6b02dc1f01811246ce6919569be01e545f6db6eeddb
Searoom.zip 4d1fb646fe2e3fbd67fb572fa741860bb5d6938e622fe8dc18ce4b6a525cf009
Full Changelog: v0.1.1...v0.2.0
Searoom 0.1.1
Requires macOS 14 or later on Apple silicon. Both downloads are signed with a Developer ID certificate and notarized by Apple, so they open with a normal double-click rather than a Gatekeeper prompt.
Searoom.dmg is the one to take: drag Searoom to Applications. Launch at login needs the app in a stable location, and an app left in Downloads can be run from a randomised read-only path instead. Searoom.zip is there for scripted installs.
Searoom has no updater and no network client, so new versions are announced here only. Watch the repository's releases to hear about them.
SHA-256:
Searoom.dmg 0d3b3bf7b271ac94097e3e0cea848938a40d6edc688e21a154914649f8141cf0
Searoom.zip 1938a260bf09c7b22278bf7c0205d75150675b4d5906d035156d5f9b948f9042
Full Changelog: v0.1.0...v0.1.1