Releases: askysh/benchbar
Release list
BenchBar 0.5.5
The project skin: BenchBar gets a manual, a front door and a way to
reach you. The documentation moves to its own site,
benchbar.akashmishra.com, built from docs/ with search and a page per
command; the README becomes a short front door; the repository gets the
files a project people contribute to needs; and the app gets an About
pane with an update check, a Help menu and Report a Bug.
App
- About pane: the app's version and build, the command line tool's
version and path (frombenchbar --version), links to the docs, the
release notes and the source, the license line and the trademark note. - Check for Updates in the About pane and the app menu: one request
to GitHub's latest release, only when you click, with "up to date" or
"0.6.0 available" and a button to the release page. Nothing is
downloaded. - Help menu: BenchBar Documentation (⌘?), Keyboard Shortcuts, Release
Notes and Report a Bug. The status item's right click menu has About
and Documentation. - Report a Bug: a sheet explains what the zip holds (no secrets, no
personal paths, no names), runsbenchbar report --json, shows the zip
in Finder and opens a new issue with the macOS and BenchBar versions
filled in. - With no bench yet, the popover points at the Install guide, and its
hint saysbenchbar adopt <path>for a bench you already have. - About BenchBar in the menus opens the About pane instead of the bare
standard panel.
Command line
benchbar docs [TOPIC]opens the documentation site or a topic's page
(install, quick-start, app, sites, apps, doctor, teams, agents, mcp,
cli, json, runners, troubleshooting, config ...);--printprints the
URL;benchbar docs --helplists the topics.benchbar --helpends with the docs URL.benchbar doctorprints asee:line with the check's section of the
doctor guide under every[FAIL](after itsfix:line). The
[OK],[WARN],[FAIL]andfix:lines and--jsonare unchanged.benchbar --versionadds the installed BenchBar app's version on a
second line; the first line is unchanged.benchbar report --jsonprints{"schema_version":1,"cli_version":..,"zip":PATH,"redactions":N}
for the app and scripts (docs/json-schema.md).
Repo
-
CONTRIBUTING.md: the tests, bash 3.2 and shellcheck, idempotency,
what a pull request needs (small, CHANGELOG, DECISIONS, tested on) and
the AI policy. README's Contributing section now points to it. -
CODE_OF_CONDUCT.md(Contributor Covenant 3.0) andSECURITY.md
(private vulnerability reports, what counts, latest release supported). -
Issue forms for bugs (macOS, version, install method, profile, the
benchbar reportzip, doctor output) and features, blank issues off
with a link to Discussions Q&A, a pull request template with an AI
disclosure line,CODEOWNERS, Dependabot for Actions and Swift, and a
commented outFUNDING.yml. -
docs/images/social-preview.pnganddocs/images/og-image.png, drawn
byscripts/social-preview.swiftfrom the icon, the light popover and
the runner frames. -
ROADMAP: Vouch under 1.0, once drive-by pull requests appear.
-
The Code of Conduct and the security policy give
mail@akashmishra.com for people who cannot use GitHub.
Docs
-
A docs site at https://benchbar.akashmishra.com: Astro Starlight
insite/, built with Bun from the markdown indocs/, with search,
dark mode that follows the system, an edit link and the last updated
date on every page. Start (Introduction, Install, Quick start, The menu
bar app), Guides (Benches and sites, Apps, Doctor and repair, Teams,
Coding agents and MCP), a CLI reference with one page per command group
(flags, exit codes, an example each), Configuration, and the existing
JSON schema, Runners, Troubleshooting, Decisions, Releasing and Testing
pages.ROADMAP.mdandCONTRIBUTING.mdstay at the repo root and
appear as/roadmap/and/contributing/. -
Every paragraph of the old README now lives in
docs/, rewritten into
those pages. -
docs/guides/doctor-and-repair.mdhas a### <check_id>heading for
every doctor check, with what it checks and its fix, so
/guides/doctor-and-repair/#<check_id>links land on the right check. -
Every markdown file in
docs/hastitleanddescription
frontmatter; the duplicate#headings are gone. -
.github/workflows/docs.ymlbuilds the site and checks its links on
every pull request, and deploys it to GitHub Pages on a push tomain
that changed the docs.tests/test-docs.shchecks that every doctor
check id has its heading, that every flag in the CLI reference exists in
benchbar --help, and that every page has its frontmatter. -
CI skips the CLI and app jobs when a change touches only
docs/or
site/. -
The command reference documents
benchbar docs,--versionand
report --json; troubleshooting says how to turn the scheduler on.
Readme
- README rewritten as the front door: logo and popover in light and dark,
why, install, quick start, eight features and links into the new
documentation site, about 800 words instead of 3,200. Everything it no
longer says lives in the docs.
This build is not signed with an Apple Developer ID (ad hoc signature). macOS shows "Apple could not verify" on first open of the DMG: use System Settings > Privacy & Security > Open Anyway, or install with the one liner, which downloads with curl and opens without that prompt:
curl -fsSL https://raw.githubusercontent.com/askysh/benchbar/main/install.sh | bashChecksums are in SHA256SUMS.
BenchBar 0.5.0
BenchBar grows from a start and stop button into the place you run your
benches from: a window with every bench's sites, apps and health, Repair
from the app, a log window, apps from any GitHub repository (private
ones too), team profiles and a lockfile for the whole team, benchbar pull for a production copy, and benchbar mcp for coding agents. A new
app icon, and the window uses the macOS 27 tab style and Liquid Glass
buttons (older macOS versions get the classic look).
Added: the app
-
The BenchBar window replaces the sparse Settings window: General,
Menu Bar, Team Profiles and About, then a page per bench with Overview
(actions, ports, the scheduler), Sites (add a site with its
Administrator password, make one the default, the hosts fix), Apps (add
from the registry or any GitHub URL, public or private, install on a
site, update after a changelog preview) and Health (doctor, and Repair
with the plan first and a live step list). The popover links into it
(⌘M) and offers Repair when doctor found something repairable. -
A new app icon: the menu bar runner, a park bench on the run, drawn
for Icon Composer (macos/BenchBar/Resources/AppIcon.icon,
scripts/app-icon.py). -
A log window per bench (⌘L): follows
logs/bench.logwith smart
scroll, search with a match count and next and previous (⌘G, ⇧⌘G), a
filter per honcho process, errors and tracebacks in red, the previous
log, clear, select and copy, and Open in Terminal. It survives the
runner's log rotation and keeps at most 5000 lines.
Added: the command line
-
benchbar mcp: a Model Context Protocol server on stdio (stdlib only
Python) withbenchbar_list,benchbar_status,benchbar_doctor,
benchbar_logs_tail,benchbar_site_list,benchbar_up,
benchbar_downandbenchbar_restart, each backed by the CLI's JSON. -
benchbar logs --jsonwith-nNand--process NAME. -
benchbar repair --jsonstreams a plan, a step event per action and a
done event with the exit code;--dry-run --jsonprints only the plan. -
App commands.
benchbar app list [--json] [--no-sites]shows every
app with its branch, commit, local changes, shallow clone, version,
theapps.tsvbranch and the sites that have it (read with
bench list-apps, cached per bench).app add NAME|URLgets an app
fromconfig/apps.tsvor any git URL (GitHub over HTTPS, SSH, or an
SSH host alias from~/.ssh/config), with--branch,--name, and
--site Sor--all-sites: it checks access first with a git that
never prompts, so a missing key or token fails in a second with a fix
line, clones withbench get-app --skip-assets(never--overwrite
or--resolve-deps), clones therequired_appsofhooks.pyafter
a second plan, installs on the sites, builds once and restarts a
running bench. A half finished clone moves to the backups.app install NAME --site Sinstalls an app the bench has.app update NAMEfetches, shows the changelog, backs up every site that has the
app, fast forwards, runs requirements, migrate and build; it refuses
a dirty tree, a detached HEAD or a diverged branch, and on a failure
prints (never runs) the way back.app update --dry-run --jsonis the
plan for the app. -
Doctor checks
apps_txt(anapps.txtline without its folder
fails, a git app missing fromapps.txtwarns) and
app_branch_policy(an app off itsapps.tsvbranch warns). Both
read only local files and git;repairhas no action for them. -
Team profiles: an organisation's bench recipe in a TOML file outside
BenchBar, in~/.config/benchbar/profiles/NAME.tomlor a folder on
BENCHBAR_PROFILE_PATH(a clone of the team's config repo). It names
a built inbasefor Python, Node and MariaDB, an optional
frappe_branch, abundleor[[apps]]with repo, branch and an
optional commit, and optionalsiteandscheduler.benchbar install --profile NAMEuses it, and the bench keeps following it.
benchbar profile list [--json],profile show NAMEandprofile create NAME --from-bench PATH [--dir DIR](reads a bench, never
writes a credential or a commit). A team profile may not shadow a
built in one. -
The team lockfile
benchbar.toml: every app's repo, branch and
commit inapps.txtorder, and each site with its apps, in the same
strict TOML subset.benchbar lock writewrites it from the bench
(refuses local changes or a detached HEAD unless--allow-dirty,
--no-commitsfor branches only, shows the diff, backs up the old
file),lock check [--json]reports drift (13 kinds, from a missing
app to a site without an app) with no network or database, andlock applyclones missing apps, switches clean apps to the locked branch
and fast forwards to pinned commits, then runs requirements and
build. It never touches a site, never resets local work (ahead,
diverged and dirty apps are skipped), and prints the site steps to run
by hand.--lock PATH(remembered per bench) orBENCHBAR_LOCK
points at a file kept in the team's app. Doctor gainslock_parse
andlock_drift;list --jsongainsbenches[].lock_file. -
Access checks before cloning (phase 01 and
app add) run git with
GIT_TERMINAL_PROMPT=0and SSH in batch mode, so a private repo fails
at once instead of waiting on a prompt.
Added: pull
benchbar pull HOST:SITE --as NAMEcopies a production site over SSH
into a new local site. It uses the latest backup that already exists on
the server, so a plain pull writes nothing there;--new-backupruns
bench backupfirst, after the production site name is typed (or
given with--confirm-site), because that also deletes older backups
on the server. The download resumes (rsync --partial,scpwhen the
server has no rsync) into<bench>/.benchbar/pulls/, mode 0700.- The copy keeps its stored passwords: the production
encryption_keyis
written into the new site config through stdin and never shown or
logged, and a probe counts the encrypted rows that decrypt. Encrypted
backups are decrypted locally withgpg --passphrase-fd 0. - Before the restore, pull compares the production apps with the bench
and stops with thebench get-appcommands when one is missing
(--skip-app APPrestores without it and says what that leaves
behind), and stops when production frappe is newer than the bench. - After the restore:
mute_emails,pause_schedulerand
disable-scheduler(unless--keep-scheduler),host_name, the
removal of skipped apps,bench migratewhen the apps differ,
clear-cache, an optional Administrator password (ADMIN_PASSWORDor
a prompt, on stdin), the hosts line, and a verify pass. --replacerestores over an existing local site after a
bench backup --with-filesof it;--from-dir DIRrestores a backup
set downloaded by hand (Frappe Cloud);--dry-runconnects read only
and prints the plan;--jsonstreamsplan,gate,progress,
stepanddoneevents (docs/json-schema.md).
Changed
- The window's settings panes are laid out like System Settings: a
header per pane, Startup, Notifications, Command line tool and
Keyboard shortcuts on General, a runner preview on Menu Bar. The
sidebar's benches have a context menu (start, stop, restart, open,
show, copy path). app add URLfor an app inconfig/apps.tsvfollows its branch there
when the repository has it, instead of the repository's default
branch, so doctor does not warn about an app it just added. Raven's
registry entry points atgithub.com/frappe/raven.bench new-sitegets the MariaDB root and Administrator passwords on
stdin, never in its arguments.- CI runs the CLI tests in three parallel macOS shards (about 4 minutes
per pull request, from about 13); the Linux job is gone.
Fixed
app updaterefuses to run when a site's app list cannot be read, so
it never skips a site's backup or migrate.pullinto a running bench pauses the bench's scheduler until the
copy has its ownpause_schedulerandmute_emails.- A git repository or branch from a team profile or lockfile can no
longer be read as a git option (--everywhere, values starting with
-refused). - The window no longer jumps wider when you open General, and a
change's result shows only on the page it belongs to.
This build is not signed with an Apple Developer ID (ad hoc signature). macOS shows "Apple could not verify" on first open of the DMG: use System Settings > Privacy & Security > Open Anyway, or install with the one liner, which downloads with curl and opens without that prompt:
curl -fsSL https://raw.githubusercontent.com/askysh/benchbar/main/install.sh | bashChecksums are in SHA256SUMS.
The app in this release was built on a Mac with Xcode 27 (the macOS 27 tab style needs its SDK; the CI runners have Xcode 26.6) and is ad hoc signed like earlier releases. SHA256SUMS covers both files.
BenchBar 0.4.0
Frappe v16 is a first class profile, and more than one bench runs on the
same Mac: each with its own ports, sites, settings and scheduler choice,
side by side in the menu bar. Verified on a real Mac with a v15 and a v16
bench running at once (docs/DECISIONS.md, "the v16 bench on a real Mac").
Added
- Frappe v16, supported. The
v16-ltsprofile (Python 3.14, Node 24)
installs and runs end to end.pkgconfandmariadb-connector-care
system dependencies of every profile and onPKG_CONFIG_PATH(v16
pinsmysqlclient, which builds against them); a CI job runs the v16
profile under mocks. - One MariaDB for every bench. A bench uses the MariaDB server
already running on 3306 when the profile accepts its version (v16
accepts 10.6 to 11.8), so a v16 bench next to a v15 bench shares
mariadb@10.11instead of installingmariadb@11.8. - Several benches side by side. Every bench keeps its own profile,
site, autostart, scheduler, honcho and ports in
.benchbar/benches/<name>-<hash>.env; settings from before 0.4 still
count for the default bench and move there on the nextservice,
adoptorinstall. A bench without a stored profile gets it from its
frappe version. A second bench no longer becomes the default by being
set up;--make-defaultdoes that. - Port blocks. A new bench that clashes with an established one moves
to the next free block (web8000 + n, socketio9000 + n, Redis
11000 + nand13000 + n), written withbench set-config -gand
bench setup redisas part of the plan;--port-offset Npicks one.
The default bench never moves on its own. - Sites.
benchbar site list,site add NAME(with the Keychain
MariaDB password, the hosts line, and apps fromapps/),
site default NAMEandsite hosts. - The scheduler, opt in per bench:
benchbar service --with-schedule
and--without-schedule;repairkeeps the choice. - Doctor checks from the community threads, each with its fix:
full_disk_access,toolchain_node,toolchain_yarn,
toolchain_pkgconfig(the tools as the bench's launchd PATH sees them,
so nvm's node shows up as missing),mariadb_version(the profile's
range),honcho_setuptools(with a repair that touches only honcho's
venv),fork_safety,orphans(stale processes on the bench's ports)
andscheduler. - BenchBar.app with several benches: a bench list with state, uptime
and Start, Stop and Restart per row; the runner shows the worst state
across all benches, with an "n of m up" count; the selected bench lists
its sites with Open buttons, the default marked, and thesite hosts
fix when a hosts line is missing; a scheduler switch per bench in
Settings. - JSON (still
schema_version: 1):sites[]inlistandstatus,
schedulerinstatus,redis_socketioinports. benchitself is installed withuv tool install frappe-benchwhen uv
is on PATH; pipx stays the fallback and existing pipx installs are left
alone. Doctor names the owner.
Changed
- Benches never touch each other's processes.
down,statusand
the runner match honcho and socketio by their working folder: both run
with the same relative command line in every bench, and before 0.4
starting or stopping one bench also stopped the other's. The runner
template is v3; runbenchbar repairon every bench once. - The shell block's PATH lines follow the default bench's profile, so a
v16 bench never changes the Python and Node of your shell; phase 00
writes the block only when there is none. - The doctor check
wkhtmltopdfis nowpdf_engine: wkhtmltopdf on
every profile (still v16's default engine) and, on v16, the Chromium
used by Print Formats set tochrome, withbench setup-chromeas
the fix. bench initruns with--no-backups: a dev bench needs no backup
cron, and the crontab write is what fails without Full Disk Access.- Site setup runs the bench's own Redis while it creates the site and
installs apps (frappe v16 needs it; a new bench has none running yet),
and stops only what it started. - v16 sites are created with
--mariadb-user-host-login-scope=%; v16
calls--no-mariadb-socketdeprecated. - The port clash check also reports a bench that is only configured with
the same ports, with the--port-offsetthat fixes it. - ROADMAP.md: 0.5 is one bigger release (repair from the app, a log
viewer,benchbar mcp, app installs from any GitHub repo, team
profiles, a team lockfile and pulling a production site); the public
launch moves to 0.6.
Fixed
doctor --jsonwith a failing check printed a[FAIL] Last command failedline after the JSON, so the app could not read the report.- The Python formula check read
brew leaves, which hides a formula
other formulae depend on (python@3.14 under pipx and uv); it now reads
"installed on request". - A run that ended on verify warnings no longer adds a misleading
[FAIL] Last command failedline naming a command that succeeded.
This build is not signed with an Apple Developer ID (ad hoc signature). macOS shows "Apple could not verify" on first open of the DMG: use System Settings > Privacy & Security > Open Anyway, or install with the one liner, which downloads with curl and opens without that prompt:
curl -fsSL https://raw.githubusercontent.com/askysh/benchbar/main/install.sh | bashChecksums are in SHA256SUMS.
BenchBar 0.3.1
Fixed
benchbar doctorno longer reads the MariaDB root password from the
Keychain: the livecharacter_set_serverquery added in 0.3.0 is gone.
Doctor is read only and the app runs it on a timer, so it must never
touch the Keychain. The!includedircheck stays; a missingmy.cnf
counts as a missing includedir.- Phase 01 exits 2, the documented "root password unknown" code, when a
fresh site needs the MariaDB root password and no source has it, and
benchbar installreports that as a pending manual step. - wkhtmltopdf detection prefers the official package binary in
/usr/local/binwhen it is the patched build, and warns (fix:
brew uninstall wkhtmltopdf) when an unpatched Homebrew build earlier
on PATH would shadow it.
This build is not signed with an Apple Developer ID (ad hoc signature). macOS shows "Apple could not verify" on first open of the DMG: use System Settings > Privacy & Security > Open Anyway, or install with the one liner, which downloads with curl and opens without that prompt:
curl -fsSL https://raw.githubusercontent.com/askysh/benchbar/main/install.sh | bashChecksums are in SHA256SUMS.
BenchBar 0.3.0
The project is now BenchBar: the benchbar command line tool, plus a
native menu bar app. Built for Frappe and ERPNext on macOS; not
affiliated with Frappe Technologies.
Added
- One line installer,
install.sh: checks macOS, the Command Line
Tools and Homebrew (offering their installers), clones the CLI into
~/.local/share/benchbarwith links in~/.local/binand a PATH block
in~/.zshrc, installs the BenchBar app from the latest GitHub release
(zip checked against the release'sSHA256SUMS, unpacked withditto,
so no Gatekeeper prompt), then offersbenchbar adoptfor a bench it
finds orbenchbar install. Flags--yes,--dry-run,--no-app,
--app-only,--version vX.Y.Z,--uninstall. Re-runs say
unchanged. - The manual install steps are gone. Phase 00 sets the MariaDB root
password itself (generated, orMARIADB_ROOT_PASSWORD), applies the
secure installation steps in SQL, and keeps the password in the macOS
Keychain (benchbar-mariadb); every later step reads it from there and
passes it throughMYSQL_PWD. The utf8mb4 drop-in is a doctor check and
repair action. The patched Qt wkhtmltopdf is downloaded from the pinned
official package (config/wkhtmltopdf.tsv, sha256 checked) and
installed withinstaller; on Apple Silicon Rosetta 2 is offered first
because the package is an Intel binary, and skipping it only costs
PDFs. The/etc/hostsline sits inside# >>> benchbar >>>markers,
with a backup first. Onesudoprompt covers a whole run. benchbar adopt PATH: registers an existing bench (Procfile.lean,
runner, launchd agent, helpers, hosts line) after showing the plan and
asking. Never runsmigrate,buildorupdate.benchbar report [--print]: a redacted diagnostics zip on the Desktop
with doctor and status JSON, versions, the agent,Procfile.lean,
state.json, log tails and the key names of the site configs. Secrets
are masked by key name, paths and names are replaced by placeholders,
andREDACTIONS.txtlists what was replaced.benchbar mariadb-password: prints the Keychain password after a
confirmation.- Doctor checks
MariaDB utf8mb4andwkhtmltopdf, with repair actions. - CI (
.github/workflows/ci.yml) on pull requests and pushes to main:
shellcheck and the CLI tests on macOS (/bin/bash3.2) and Linux, an
unsigned app build and the Swift tests, andscripts/release-local.sh
whose zip, dmg andSHA256SUMSare uploaded as a workflow artifact. - Releases (
.github/workflows/release.yml): av*tag drafts a GitHub
release with the CHANGELOG section as notes. Without Developer ID
secrets the app is ad hoc signed (scripts/release-local.sh); with
them it is signed, notarized and stapled, with the Sparkle appcast and
the Homebrew cask (docs/releasing.md). docs/testing.md, a three step guide for testers, and
docs/DECISIONS.md.- BenchBar.app (
macos/, macOS 14+, Apple Silicon), built from the
command line withscripts/macos-build.shand installed with
scripts/macos-install-local.sh:- an animated menu bar runner per state (sleeping, walking, running,
stumbling, alert, question), one Core Animation keyframe animation,
tinted for light, dark and the transparent menu bar; - running speed from the CPU use of the bench's process tree (libproc,
every 2 seconds, smoothed), behind aSpeedSourceprotocol; - Reduce Motion support, and pausing on sleep, screen sleep, lock and
user switching; - a popover with state, uptime, Start, Stop, Restart, open site, logs
(Terminal) and folder, a read only doctor, a bench picker, repair
hints and keyboard shortcuts; - a Settings window: runner picker with live preview, speed toggle,
launch at login (SMAppService), notifications, CLI path; - notifications on crash, crash guard pause and recovery;
- two original built in runners (a bench and a coffee cup) and custom
runners: a folder withmanifest.jsonand PNG frames, imported from
a folder or zip with strict validation (docs/runners.md,
examples/runners/blob).
- an animated menu bar runner per state (sleeping, walking, running,
- Versioned JSON API (
schema_version: 1):benchbar list --json,
status --json,doctor --json, and<bench>/logs/.benchbar/state.json
written atomically by the runner on every transition
(docs/json-schema.md). stop_reason: "broken"for a bench that cannot start untilrepair.- Release plumbing, documented and not yet live (no Apple Developer
account): Developer ID signing, notarization, DMG, Sparkle 2 behind a
build flag, a Homebrew cask template and a guarded GitHub Actions
workflow (docs/releasing.md).
Changed
00-mac-system-deps.shexits 2 only when MariaDB already has a root
password that neither the environment nor the Keychain knows; it takes
--yes.01-install-bench-and-site.shreads the root password from
the Keychain and no longer passes it on themariadbcommand line.- The test suite runs on Linux as well as macOS (GNU stat and sed, a
unamemock), so a Linux machine gives quick feedback. - The CLI is
benchbar;frappe-macstays as a link to it. - Agents are
com.benchbar.<bench>and carry
AssociatedBundleIdentifiersso Login Items shows them under BenchBar.
benchbar repairmigratescom.frappe-mac.<bench>agents (only for
this bench), restarting the bench if it was running. Old plists move to
~/Library/LaunchAgents-disabled/<timestamp>/. up,downandrestarton a bench that still has its old agent now
say so and point atbenchbar repair, instead of "not installed".- The runner runs honcho as a child, forwards SIGTERM and records the
final state; a SIGTERM without a stop flag is a clean stop. Its
osascript crash notification stays as a fallback and is skipped while
BenchBar runs. status --json:stateis now the contract value (stopped, starting,
running, crashed, paused); launchd's word moved toagent_state.- The repository is now github.com/askysh/benchbar (the old URLs
redirect). README, AGENTS.md, the docs, the cask and the Sparkle feed use
it. - Names from before 0.3.0 move over once, on the next run or
repair:
the checkout's.frappe-local/becomes.benchbar/,
frappe-mac-run.shin the bench becomesbenchbar-run.sh(the old file
goes to the backups once no agent uses it), the# >>> frappe-mac >>>
block in the shell rc is replaced in place by# >>> benchbar >>>, and
new files carry abenchbar-template:header. Files are not rewritten
for the header word alone, so MariaDB is not restarted.
Fixed
- Reading a missing stop flag no longer prints "No such file or
directory". - Reloading the agent of a running bench (a repair after a template or
setting change,autostart on|off) could leave it stopped and unloaded:
launchctl bootoutreturns while the job is still shutting down, the
immediatebootstrapfailed, and theload -wfallback exits 0 without
loading anything. The CLI now waits until launchd has let go of the job
(up to 30 seconds), confirms the load withlaunchctl print, and fails
the step clearly instead of reporting success.
This build is not signed with an Apple Developer ID (ad hoc signature). macOS shows "Apple could not verify" on first open of the DMG: use System Settings > Privacy & Security > Open Anyway, or install with the one liner, which downloads with curl and opens without that prompt:
curl -fsSL https://raw.githubusercontent.com/askysh/benchbar/main/install.sh | bashChecksums are in SHA256SUMS.