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.