Skip to content

Releases: mitchmalone/scuttlarr

scuttlarr v0.7.0

Choose a tag to compare

@mitchmalone mitchmalone released this 01 Oct 05:58

Breaking changes

  • launcharr is now scuttlarr. New name, new app (scuttlarr.app), new cask, new
    homes. Your config, themes, frecency, scripts, widgets, agent hooks and login item move
    on first launch with nothing to do (~/.config/launcharr → ~/.config/scuttlarr, and
    the rest). On Homebrew, install the new cask; the old one is deprecated and points here:

    brew uninstall --cask launcharr && brew install --cask mitchmalone/tap/scuttlarr

    Upgrading with only brew upgrade keeps launcharr 0.6.0 — and installing scuttlarr
    without uninstalling launcharr leaves two launchers fighting over one hotkey.

  • ~/.config/scuttlarr/widgets reference widgets that imported @launcharr/tui keep
    building (the alias stays), but new ones should import @scuttlarr/tui.

Highlights

One product, not two. The launcher and the scuttlarr desktop setup were separate
repos; now the launcher is a feature of scuttlarr. Install gets the bar and the launcher;
everything else is a rung you turn on — Desktop (AeroSpace tiling and borders,
rendered from your theme), Theme (one palette rendered into the app, the bar,
Ghostty, tmux, your editors and git), and Machine (the scuttlarr CLI: de-shined
macOS defaults, the shell, doctor, remove — shipped inside the app, every write
recorded in a manifest and reversible).

Themes that reach every terminal, live. theme ⏎ switches the palette everywhere at
once: open terminals retint in place (no permission asked), tmux re-sources, VS Code and
Claude Code follow, and Ghostty can reload its config if you opt in. A theme policy can
pick for you — by macOS Focus, by system light/dark, or on a schedule. Bring your own
themes alongside the built-ins.

Keep-awake you can leave for weeks. awake holds until it says it will: "until I
turn it off" no longer expires, holds survive relaunches, crashes and reboots, and
awake until oct 16 takes a date. With launch at login on, scuttlarr now relaunches itself if it crashes. Run
scuttlarr sudoers on once and every hold also switches macOS sleep off — lid closed on
battery stays up too, and a crash leaves no gap. Away mode is one checkbox for
remoting in over Screens from an iPad: it keeps an iPad-sized virtual screen (via
BetterDisplay) as the Mac's only display, so the iPad gets a native-size desktop instead
of a letterboxed one.

The menubar knows more. App updates from brew, the App Store, pnpm, npm and mise in
one cell, upgradable from the panel; every Claude and OpenAI account's usage shown as
pace, so the cell warns before you run out, not after; agent sessions follow you across
tmux and herdr; plugins are React cells and Bun services that declare their permissions
up front; and ! hands a command to Ghostty through herdr or tmux.

scuttlarr updates itself. Every 6 hours it checks for a release; updates ⏎ installs
it after verifying the checksum and the Developer ID signature (Settings → General turns
the check off, and off means no request).

Performance receipts

Measured on the release build's code, 2026-10-01 (M5 Max, two displays, bar on, agents
monitor on, plugins running):

Metric Budget This release
Hotkey → panel visible < 100 ms 2.3 ms
Cold start → hotkey registered < 1 s 351 ms
Idle memory (panel hidden) < 120 MB 169 MB

Hotkey → panel is the native side of the summon path, median of 11 summons (1.5–3.4 ms).

Idle memory is over budget, and has been since the bar and plugins landed (first
measured 2026-09-16 at 157–177 MB; JOURNAL). The shrink is its own task. Helpers add to
it: two Bun plugin services (26 + 31 MB) and the Bluetooth helper (8 MB); the optional
JankyBorders child (372 MB) is not ours but runs because of us when Desktop borders are on.

Install

brew install --cask mitchmalone/tap/scuttlarr

Or curl -fsSL https://scuttlarr.com/install | sh, or grab the dmg / zip below, or
build from source (README).

All changes

8a3a1d7 feat(awake): away mode — a checkbox that holds an iPad-sized screen for Screens
0d7355a feat(awake): switch macOS sleep off while a hold is armed; login item gets LANG
9f957eb docs: no emoji anywhere we author — invariant 14
5cf1e4a fix(widgets): vercel reads the CLI 61 credential store
1c235c6 fix(agents): force tmux to UTF-8 so groups survive a launchd launch
5922ddf feat(awake): holds last until they end — no 12 h cap, across reboots, dates, crash relaunch
0fbb06b fix(usage): pace review — early bursts, stale and unknown windows, glyph
4f60377 feat(usage): pace, not percent — the cell warns before you run out
44b0bbd feat(theme): live switch across every terminal — OSC into every owned pty, opt-in Ghostty reload
c14220c docs: drop the inspiration attribution — decisions stand on their own
bd788c2 feat: ranking corpus, naming roles, purity lint, mem.sh, self-update
66191ea feat(tui): kit controls inside a hover card, and the bar loads styles.css
d217897 fix(plugins): keep @launcharr/tui as a shared alias so pre-rename plugins still build
378ea29 docs: close-out for the session — plan and STATUS current as of 2026-09-14
e66365f chore(www): serve /install as a shell script; Vercel project is scuttlarr-web
cd1a91f docs(journal): a moved checkout needs cargo clean before Tauri builds again
c996298 feat: shell base, hot editors, user themes, switcher polish, wallpaper
cc88854 docs: the product is scuttlarr — README, PRD, AGENTS, THEMES, SETUP, API docs, site copy
b36a459 ci: run the zsh setup tests on the macOS job, not the Linux node job
4900772 docs(plan): 1.1 done — repo renamed to scuttlarr
301b470 docs(status): unification cursor — phases 0–4, what is proven, what is open
036a128 fix(appearance): the policy engine is opt-in; the pair seeds from the current theme
d48eb94 feat(appearance): theme policy — macOS Focus, light/dark by system or schedule, theme ⏎
1934553 feat(theme): packages/theme — Omarchy palettes, templates, and the theme rung
fb45e0d feat(setup): the machine rung — CLI in the bundle, Settings → Machine, installer
dc12c7d feat(setup): port the scuttlarr CLI into packages/setup
604128a feat: rename launcharr → scuttlarr in code, with a one-shot home migration
5eb6b77 docs: fold scuttlarr into this repo, renamed scuttlarr — decision, plan, phase 0
d9c7948 feat(plugins): declared permissions, asked first, blocked on denial — proven by the amaran light
e2e33d5 feat(terminal): hand off to Ghostty via herdr or tmux — bang mode, upgrades, agent jump
78a3ffc fix(updates): re-check 90 s, 5 min, 15 min after an upgrade hand-off
340d5a5 feat(updates): run the upgrade from the panel — ↵ one source, a all, in the terminal
c182c36 feat(updates): app updates in the menubar — brew, App Store, pnpm, npm, mise as a bundled plugin
afb0b47 feat(agents): hook adapter owned by launcharr — stable path, boot repair, settings install
a7809c2 fix(tui): bar cards anchor to their zone's edge — a plugin card no longer runs off screen
461cc24 feat(usage): count other machines — mirror plugin pulls journals, usage scans the mirrors dir
299f1b4 docs: plugins memory receipt — 161/132/114 MB, watch item against the 120 MB budget
ec74e7b feat(plugins): cells and panels in react on the kit, services in bun — usage and calendar go first
13b2af0 docs: plugins direction — cells and panels as React, service in Bun; Omarchy QML on macOS rejected
ddee14a feat(usage): every Claude account in the menubar — usage cell, per-account tiles
c7c9280 fix(agents): the process outranks the multiplexer — one empty pane read stops emptying the bar
371e1fb docs: scuttlarr boundary — contract items and non-goal amendment
bb0a0dc docs: v0.6.0 released — status cursor

launcharr v0.6.0

Choose a tag to compare

@mitchmalone mitchmalone released this 20 Aug 05:02

Breaking changes

  • none. One reference-widget note: github-actions.ts no longer reads a JSON feed
    (GITHUB_ACTIONS_FEED_URL) — it talks to the GitHub API with your GitHub CLI login.
    If you'd pointed it at a custom feed, keep your old copy; the widgets dir is yours.

Highlights

Widgets: drop a TypeScript file in ~/.config/launcharr/widgets/, own a cell in the
bar.
A widget answers manifest and tick with JSON — launcharr runs it on its own
cadence (Bun or Node found automatically; any executable in any language works), renders
the cell and its hover card in the theme, on every display, and never lets it near the
hot path. Live dir watch: drop it in, it's there; edit it, it re-ticks; touch ~/.config/launcharr/triggers/widget.<id> to tick on demand. Fail-visible: a broken tick
keeps the last good view, turns the cell red, and puts the reason in the card. Reference
set ships in the repo — uptime, GitHub Actions, Vercel deployments, TRMNL — and the
contract is documented in docs/WIDGETS.md.

Credentials that mostly just work. Widgets piggyback the CLIs you're already signed
in to — gh auth token, the Vercel CLI's login — so GitHub Actions lights up with zero
setup. When a credential is missing or goes stale the cell dims (nothing broke, nothing
red) and the card, and Settings, name the problem with the fix as a copyable command
(gh auth login, vercel whoami). Prefer your own token? Every credentialed widget
takes one in Settings → Menubar → Custom widgets, stored in the macOS Keychain —
never in config.json, never shown back. Settings stay quiet: a healthy widget is one
line; the fields appear only when it needs you.

Settings grows widget management. Menubar splits into Layout / Custom widgets:
place widget cells on the zone board like built-ins, and install from a URL or a file,
tick, remove, open the folder — with each widget's health ("ok · 2m ago", or why not)
inline. General splits into General / Color picker / Config sub-tabs, and the
settings window now actually comes to the front when summoned from the panel.

One colour language. Every strip colour is a theme token now — a new warn token
joins the palette, and the rule is simple: fine is fg. A done agent, a healthy
battery, an ok widget all read as plain foreground; accent means busy, warn/danger
mean it needs you — and all of it retints with your theme. Wifi arcs keep their
footprint at every strength (lost arcs ghost instead of vanishing), and the battery and
wifi glyphs are optically sized so nothing in the strip reads squat.

The quiet strip. Wifi, battery, and awake cells are glyph-only now — strength arcs,
a battery tier judged against your macOS charge limit (80 % on a limited pack reads as
full), a coffee cup that lights while a hold is armed — with the words (SSID, exact %,
elapsed/remaining) in the hover card where they belong. Awake holds survive a
relaunch
: an armed hold is persisted and re-armed at launch under the same rules, with
a toast to say so. Agent cells got smarter too: Claude's background daemon no longer
claims a cell, and running subagents ride the parent — a count on the cell, the list in
the hover.

TypeScript everywhere. Bundled scripts and reference widgets are .ts — no shebang,
no chmod, no build: launcharr finds your Bun (or Node) and runs them, even from a
Finder-launched app with its bare PATH. The Python bundle is retired (.py.retired,
edits preserved).

Performance receipts

Measured on the release build, 2026-08-20 (M-series, two displays, bar on, agents
monitor on, four widgets ticking):

Metric Budget This release
Hotkey → panel visible < 100 ms 2.0 ms
Cold start → hotkey registered < 1 s 186 ms
Idle memory (panel hidden) < 120 MB 118 MB

Idle memory carries two bars and the widget scheduler; widgets are child processes,
resident for milliseconds per tick, so the number moves with displays, not with how many
widgets you install.

Install

brew install mitchmalone/tap/launcharr

Or grab the dmg / zip below, or build from source (README). Signed and notarized.

All changes

35f4aa7 docs: decisions 2026-08-20, plan to done, status cursor for v0.6.0
c8197f9 fix(settings): widget fields appear only when the widget needs attention
6259778 feat(widgets): piggyback CLI credentials, fail-visible — requires + setup
560d65d fix(widgets): sign-in errors wrap under the row; no sign-in button without a client id
355a736 fix(widgets): one row per widget — sign in or paste a token; password inputs styled
acab255 feat(widgets): manifest settings, keychain store, env delivery, widget auth
38adaf2 feat(settings): general sub-tabs; settings window comes to the front
5433703 chore(settings): rename the Hackables row to Config
6fce208 fix(bar): optical sizing — battery and wifi glyphs get a 17 px box
67f5899 fix(bar): wifi glyph keeps its footprint — all four arcs, lost ones ghosted
047fa3e feat(bar): every strip colour is a theme token — new warn token, fine = fg
e375994 docs: session close 2026-08-19 — widgets plan done, STATUS cursor, ROADMAP module API ✅
e1cdb51 feat(plugins): TypeScript everywhere, run under Bun — runtime.rs resolves bun/node; widgets + bundled scripts rewritten in TS with Vitest'd view() halves; .py retired
2836f95 feat(settings): Menubar splits into Layout / Custom widgets sub-tabs
b82b345 feat(widgets): Settings → Menubar places custom widgets on the zone board; Custom widgets section — install from URL/file, tick, remove, open folder (widget_install/remove/tick)
c51d731 fix(bar): widget ok tone is the agent blue, error red muted a touch; plugged-in-at-limit battery reads as charging
3c82a54 fix(widgets): any change in the widgets dir re-ticks kept widgets too
2936c61 feat(bar): widgets — user executables own bar cells (manifest/tick JSON), four Sketchybar modules ported
d5fac26 docs: session close 2026-08-19 — STATUS cursor, two decisions, roadmap
9f2a5f8 feat(bar): battery cell is glyph-only, tier + colour from the adjusted charge
1c03d05 fix(awake): breadcrumb every persist/resume/release decision; tests never touch the real state dir
6cd62dd feat(bar): awake cell is glyph-only — the timer lives in the card
d1148a7 feat: awake holds survive relaunch; wifi glyph shows strength, SSID moves to the card
e322eac feat(agents): claude's background daemon gets no cell; subagents ride the parent's hover
0c2d274 docs: 0.5.0 released — STATUS cursor

launcharr v0.5.0

Choose a tag to compare

@mitchmalone mitchmalone released this 19 Aug 00:54

Breaking changes

  • none. One permission note: the launcharr loupe for colorpicker (opt-in, Settings →
    General → "Use the launcharr loupe") asks for Screen Recording once when you turn it on;
    off — the default — it's Apple's NSColorSampler and nothing prompts.

Highlights

Multi-display. The bar sits on every screen, and the launcher opens on the screen
your mouse is on. Both were meant to work before and both quietly collapsed to the primary
display (Tauri's monitor API is empty for an accessory app, and its cursor→monitor lookup
never matches on Retina) — launcharr now asks CoreGraphics directly. Bars follow displays
as they come and go, the notch layout follows the window if it lands on the built-in
panel, and hover cards open on the bar you're actually pointing at.

Agents, observed not reported. Agent cells disappear when the agent does: dead tmux
panes and dead processes are reaped, ⌫ in agents ⏎ dismisses one by hand, and
herdr joins tmux as a second multiplexer — every agent herdr detects gets a cell,
click to jump.

colorpicker with an optional 2–8× loupe (framebuffer capture, so every app shows —
including the ones that hide from screenshots), #RRGGBB straight to the pasteboard,
confirmed by a toast row. lorem is a built-in now (five volumes, lorem ⏎ picks).

? mode as turns: first question pinned in the header, transcript below, follow-up
prompt at the bottom, Claude-style thinking spinner.

Bar + desktop: wifi cell hovers a card (SSID, IP, router, DNS — click → Wi-Fi
settings), battery card breathes, AeroSpace gaps now means the visible gap (borders
and the showing bar are factored in), unfocused border reads as an edge. Settings →
Agents splits into three sub-tabs; About fleshed out.

Performance receipts

Measured on the release build, 2026-08-19 (M-series, two displays, bar on, agents
monitor on):

Metric Budget This release
Hotkey → panel visible < 100 ms 2.6 ms
Cold start → hotkey registered < 1 s 202 ms
Idle memory (panel hidden) < 120 MB 109 MB

Idle memory is the number to watch: every display costs a bar, and a bar is a WebKit
view. Two bars up here and still under 0.4.0's single-bar reading — the shared WebKit
pool amortises the second view. Bar off ≈ 0.3.1.

Install

brew install mitchmalone/tap/launcharr

Or grab the dmg / zip below, or build from source (README). Signed and notarized.

All changes

7b5cf2d feat(display): a bar on every screen, the launcher on the mouse's screen
06efb68 fix(herdr): agent.focus addresses the agent by `target`, not `pane_id`
96eebf1 fix(agents): land the jump on the right client and window, and read the cell only after it lands
1dd3544 feat(agents): herdr as a second multiplexer — the monitor stops being tmux-shaped
c32fbd7 fix(agents): a session with nothing to interrogate is judged on silence, not the 12h sweep
d673c78 feat(agents): liveness is observed, not reported — reap dead panes/processes, dismiss by hand
bf829d7 feat(desktop): unfocused border is a solid border→fg mid tone (reads as edge, gap reads 8)
7f2ddad feat(desktop): gaps means the visible gap — borders and the showing bar factored in (gapPlan), native menu-bar state read on apply, one BAR_STRIP_HEIGHT
754caf9 feat(bar): wifi hover card (IP/router/DNS, click → Wi-Fi settings); battery card spacing + read-only power mode
6e975c9 feat(loupe): default 8× at 264px
43b39c3 fix(loupe): breadcrumb every pick to ~/Library/Logs/launcharr.log; JOURNAL: TCC vs ad-hoc dev builds
876d2d7 fix(loupe): protected-window breadcrumb to ~/Library/Logs/launcharr.log
18abb90 feat(loupe): size setting (default 352pt); log windows that block screen capture
1cd5f93 fix(loupe): capture the display framebuffer (sharingType none hides the loupe) so every app shows; 264pt picker
f98cc15 feat(colorpicker): loupe is opt-in (Settings → General), zoom configurable 2–8× (default 4)
ab9d419 feat(colorpicker): launcharr loupe at 2× (Screen Recording opt-in, system sampler fallback); built-ins fuzzy-match
51249ef fix(lorem): keyword ⏎ opens the volume menu, then ⏎ copies (0.5 feedback)
9a63aa6 feat: Ready column 2026-08-17 — colorpicker, lorem built-in, toast, ? mode redesign, settings sub-tabs/about
6130af3 docs: 0.4.0 released — STATUS cursor, desktop plan → done
879c3a1 chore: release v0.4.0
1aaa352 docs(release): v0.4.0 notes; site cards for desktop layer + screenshots; roadmap renumbered 0.4/0.5
52840f4 fix(settings): 0.4 feedback — HTML DnD works, manage-AeroSpace flow, borders ride on tiling, wider
bd64a0d fix(screenshots): space between chord glyphs in key hints
98cfdb7 fix(screenshots): key hints — lucide move glyph instead of four crammed arrows
8acf2f1 feat(panels): screenshots — ss grid of latest captures, Enter copies the file
ae3c23e refactor(bar): remove TRMNL battery module (personal; returns as a plugin)
3060dd3 feat(settings): sub-tabs; Desktop splits into AeroSpace + JankyBorders / macOS adjustments
0cd58fa fix(settings): content scroller spans the window so the scrollbar hugs the right edge
11653db fix(settings): tabs clear of traffic lights; merge Search+Links → Quicklinks; reorder
fb04784 docs: session close — v0.4 desktop layer built and adopted, release pending polish
de2ff2a docs: open-source readiness review plan (active)
d0e7949 feat(bar): wifi SSID resolved once per join via system_profiler
c41bc2c fix(tui): revealSelected — one keep-in-view helper for every selectable component
4bc490f fix(tui): segment states — active = accent border, cursor = solid fill, both = fill + accent border
dff66f1 fix(tui): scope segmented rules above the .tui button reset
88bb343 fix(tui): segmented cursor uses the standard selected fill
e389ab8 fix(tui): segmented cursor uses an inset outline so it shows over the active fill
e6765d1 feat(aerospace panel): workspaces as a horizontal strip; actions list below
3daaaba feat: aerospace ⏎ panel — the tray menu as launcher rows
cfb752a fix: borders lives in felixkratz/formulae, not homebrew-core — fully qualify the install
9e9175c feat: v0.4 desktop layer — AeroSpace config owned by launcharr, opt-in JankyBorders, corner radius
25071d7 docs: session close — JOURNAL gotchas (card-line green, pmset parse), dates
0545e9d docs: awake replaces Amphetamine + Caffeinated in daily use
b448b3c feat: awake slices B-D — panel, grammar, trigger reducer, rails, bar cell
1612628 feat: awake slice A — in-process power assertions; caffeinate footgun removed
ca2f512 refactor: extract the bar into packages/tui so the website has no second copy (#2)
deb2dc4 docs: record the bar-port correction in STATUS, JOURNAL, and the plan
cc1a372 docs: invariant 10 — the site demos the real thing, never a replica
264ca02 fix(www): derive the demo bar and agent cells from the app, not the mockup
665567c feat(www): redesign as the keyboard control surface; add /docs
c6e6da1 feat: battery hover card — capacity/time/cycles/draw/health, read-only power mode
251ad30 docs: plans/done write-up for bar zones + arranger; prune shipped items from STATUS next-list
7297ea9 feat: zone board v2 — full-width boards, ✕-to-retire, retired-widgets tray
6e17e13 feat: bar layout becomes explicit zones with a drag zone board
23dec2a feat: notch layout profiles + drag arranger; fix bar-disable crash, agent borders, accent revert
1c5931d fix: lucide icons in launcher + panels, audio slider/scroll fixes, brighter bar cells
76b3d91 feat: omarchy panel wave — audio/clipboard/help panels, wifi scan, fuzzy keywords, 5-day ranking
4538999 docs: DECISIONS entry for the ask command + consumed-prefix mode keys
4949e0f docs: restore panel-framework bullet header lost in a STATUS edit
af7b486 feat: consumed-prefix mode keys + ask provider select (claude|codex)
9daf095 feat: ? agent mode — ported from spike-ask-ai, gated by settings
15fa511 refactor: limits credentials as consent capabilities with fallback
bdad484 feat: agents + menubar settings, consent-gated account limits
e9078eb feat: usage panel — local token monitor for claude + codex
1af1ace fix: bar hover events for accessory app — always-active tracking area
63ee0c4 feat: agent hover dropdown + tmux session grouping
adf4f96 feat: agent cells — WIP colors, done-unread state, hover readout
602d4dd feat: agent monitoring — launcharr absorbs sketchybar-agent-status
fc3426c docs: roadmap non-goals annotated with the v0.5 amendments
665a884 docs: status compressed to a handoff cursor; roadmap milestone states
62c5855 feat: dns panel + wifi panel layout — pinned active network, scoped scroll
c5263b1 fix: wifi panel — router via dhcp option, selection scrolls into view
e1d520c feat: panel framework + wifi panel — super+space does things
57c5999 feat: tui workbench — story-driven state testing replaces the gallery
4e9ec2a docs: plans — tui workbench and panel framework + wifi (P0/P1/W0 on roadmap)
d4ed8c6 feat: simple bar modules — wifi, trmnl battery, battery states, clock parity
f3e3f9a docs: status — bar verified working, next slices queued
f6e009b fix: active-workspace indicator — css specificity, not plumbing
ddc3431 fix: bar pixels froze — disable webkit occlusion detection + hold off app nap
f9dc99b fix: push bar snapshots via webview eval — emit never reached the panel webview
9982a6a docs: journal the webkit timer-throttling gotcha
d39a17c fix: bar updates are rust-pushed — webkit throttles timers in unfocused webviews
3795951 fix: bar focus indicator resilience + omarchy-flat redesign
d495899 fix: bar latency, menubar slide-over, and active-workspace clarity
092af4f fix: bar re-frames after display mode changes
c3463b4 docs: status — bar enabled, cutover pending sketchybar stop
18300de feat: bar daily-drivable — clickable workspaces, front app, themed
624dd8e feat: v0.5 slice 1 — @launcharr/tui component kit + bar window spike
5facc83 ...
Read more

launcharr v0.4.0

Choose a tag to compare

@mitchmalone mitchmalone released this 17 Aug 03:34

Breaking changes

  • none for the launcher. Two things to know if you upgrade from 0.3.x:
    • AeroSpace becomes a Homebrew dependency of the cask (depends_on cask: "nikitabobko/tap/aerospace"). If you already run AeroSpace with your own
      ~/.config/aerospace/aerospace.toml, launcharr does not touch it — Settings →
      Desktop asks whether to use launcharr's config (yours is backed up beside it) or keep
      yours. Tiling can be switched off entirely.
    • The bar is off by default; turn it on in Settings → Menubar.

Highlights

launcharr is a keyboard control surface now, not just a launcher. Everything below is
in daily use on the author's Mac.

The bar. An Omarchy-flat menubar replacement: workspaces (clickable, hotkey-tracked),
front app, clock, Wi-Fi SSID, battery with a hover card (capacity, time left, cycles,
draw, health), coding-agent cells. Zones (left / center / right) arranged by drag in
Settings, with a separate profile for notched displays. Themed by the same tokens as the
launcher; ~19 MB marginal.

Panels. Trigger words open keyboard-driven TUI panels inside the launcher window:
wifi ⏎ (connect, scan, power), dns ⏎, audio ⏎ (volume, devices, mute),
clipboard ⏎, awake ⏎ (keep-alive sessions with rails — retires Amphetamine),
agents ⏎, usage ⏎ (local token monitor for Claude + Codex), aerospace ⏎ (the tray
menu as rows), help ⏎, and ss ⏎ — a grid of your latest screenshots; Enter puts the
file on the clipboard, ⌘V into your agent.
Esc walks back; focus returns exactly
where it was.

Agents. Claude and Codex sessions as bar cells (boxed by tmux session, blocked
breathes red, click to jump to the pane), plus opt-in ? mode: press ? and ask your own
claude/codex CLI, streamed. Off by default; account-limit fetches are opt-in per
provider.

The desktop layer. Tiling via AeroSpace with a config launcharr writes for you
(modifier, gaps, workspaces — the file is yours the moment you stop letting launcharr
manage it: edit, use your own via symlink, or save a copy), opt-in JankyBorders in your
theme's accent, and the pre-Tahoe window corner radius back if you want it.

Settings. Sub-tabs, a Quicklinks page, wider window, and drag-and-drop that
actually works (wry's file-drop hook was swallowing every HTML5 drag event).

Performance receipts

Measured on the release build, 2026-08-17 (M-series, bar on, agents monitor on):

Metric Budget This release
Hotkey → panel visible < 100 ms 1.8 ms
Cold start → hotkey registered < 1 s 200 ms
Idle memory (panel hidden) < 120 MB 114 MB

Idle memory is the number to watch: the bar is a second WebKit view and it costs ~19 MB
over 0.3.1's 98 MB. Bar off ≈ 0.3.1.

Install

brew install mitchmalone/tap/launcharr

Or grab the dmg / zip below, or build from source (README). Signed and notarized.

All changes

52840f4 fix(settings): 0.4 feedback — HTML DnD works, manage-AeroSpace flow, borders ride on tiling, wider
bd64a0d fix(screenshots): space between chord glyphs in key hints
98cfdb7 fix(screenshots): key hints — lucide move glyph instead of four crammed arrows
8acf2f1 feat(panels): screenshots — ss grid of latest captures, Enter copies the file
ae3c23e refactor(bar): remove TRMNL battery module (personal; returns as a plugin)
3060dd3 feat(settings): sub-tabs; Desktop splits into AeroSpace + JankyBorders / macOS adjustments
0cd58fa fix(settings): content scroller spans the window so the scrollbar hugs the right edge
11653db fix(settings): tabs clear of traffic lights; merge Search+Links → Quicklinks; reorder
fb04784 docs: session close — v0.4 desktop layer built and adopted, release pending polish
de2ff2a docs: open-source readiness review plan (active)
d0e7949 feat(bar): wifi SSID resolved once per join via system_profiler
c41bc2c fix(tui): revealSelected — one keep-in-view helper for every selectable component
4bc490f fix(tui): segment states — active = accent border, cursor = solid fill, both = fill + accent border
dff66f1 fix(tui): scope segmented rules above the .tui button reset
88bb343 fix(tui): segmented cursor uses the standard selected fill
e389ab8 fix(tui): segmented cursor uses an inset outline so it shows over the active fill
e6765d1 feat(aerospace panel): workspaces as a horizontal strip; actions list below
3daaaba feat: aerospace ⏎ panel — the tray menu as launcher rows
cfb752a fix: borders lives in felixkratz/formulae, not homebrew-core — fully qualify the install
9e9175c feat: v0.4 desktop layer — AeroSpace config owned by launcharr, opt-in JankyBorders, corner radius
25071d7 docs: session close — JOURNAL gotchas (card-line green, pmset parse), dates
0545e9d docs: awake replaces Amphetamine + Caffeinated in daily use
b448b3c feat: awake slices B-D — panel, grammar, trigger reducer, rails, bar cell
1612628 feat: awake slice A — in-process power assertions; caffeinate footgun removed
ca2f512 refactor: extract the bar into packages/tui so the website has no second copy (#2)
deb2dc4 docs: record the bar-port correction in STATUS, JOURNAL, and the plan
cc1a372 docs: invariant 10 — the site demos the real thing, never a replica
264ca02 fix(www): derive the demo bar and agent cells from the app, not the mockup
665567c feat(www): redesign as the keyboard control surface; add /docs
c6e6da1 feat: battery hover card — capacity/time/cycles/draw/health, read-only power mode
251ad30 docs: plans/done write-up for bar zones + arranger; prune shipped items from STATUS next-list
7297ea9 feat: zone board v2 — full-width boards, ✕-to-retire, retired-widgets tray
6e17e13 feat: bar layout becomes explicit zones with a drag zone board
23dec2a feat: notch layout profiles + drag arranger; fix bar-disable crash, agent borders, accent revert
1c5931d fix: lucide icons in launcher + panels, audio slider/scroll fixes, brighter bar cells
76b3d91 feat: omarchy panel wave — audio/clipboard/help panels, wifi scan, fuzzy keywords, 5-day ranking
4538999 docs: DECISIONS entry for the ask command + consumed-prefix mode keys
4949e0f docs: restore panel-framework bullet header lost in a STATUS edit
af7b486 feat: consumed-prefix mode keys + ask provider select (claude|codex)
9daf095 feat: ? agent mode — ported from spike-ask-ai, gated by settings
15fa511 refactor: limits credentials as consent capabilities with fallback
bdad484 feat: agents + menubar settings, consent-gated account limits
e9078eb feat: usage panel — local token monitor for claude + codex
1af1ace fix: bar hover events for accessory app — always-active tracking area
63ee0c4 feat: agent hover dropdown + tmux session grouping
adf4f96 feat: agent cells — WIP colors, done-unread state, hover readout
602d4dd feat: agent monitoring — launcharr absorbs sketchybar-agent-status
fc3426c docs: roadmap non-goals annotated with the v0.5 amendments
665a884 docs: status compressed to a handoff cursor; roadmap milestone states
62c5855 feat: dns panel + wifi panel layout — pinned active network, scoped scroll
c5263b1 fix: wifi panel — router via dhcp option, selection scrolls into view
e1d520c feat: panel framework + wifi panel — super+space does things
57c5999 feat: tui workbench — story-driven state testing replaces the gallery
4e9ec2a docs: plans — tui workbench and panel framework + wifi (P0/P1/W0 on roadmap)
d4ed8c6 feat: simple bar modules — wifi, trmnl battery, battery states, clock parity
f3e3f9a docs: status — bar verified working, next slices queued
f6e009b fix: active-workspace indicator — css specificity, not plumbing
ddc3431 fix: bar pixels froze — disable webkit occlusion detection + hold off app nap
f9dc99b fix: push bar snapshots via webview eval — emit never reached the panel webview
9982a6a docs: journal the webkit timer-throttling gotcha
d39a17c fix: bar updates are rust-pushed — webkit throttles timers in unfocused webviews
3795951 fix: bar focus indicator resilience + omarchy-flat redesign
d495899 fix: bar latency, menubar slide-over, and active-workspace clarity
092af4f fix: bar re-frames after display mode changes
c3463b4 docs: status — bar enabled, cutover pending sketchybar stop
18300de feat: bar daily-drivable — clickable workspaces, front app, themed
624dd8e feat: v0.5 slice 1 — @launcharr/tui component kit + bar window spike
5facc83 docs: journal the brew untap-uninstalls-casks gotcha
96f5461 feat: consolidate into the shared homebrew-tap — homebrew-launcharr retired
388bc31 chore: tap secret is HOMEBREW_TAP_TOKEN — align with beeptui
b0e0025 chore: gitignore .vercel project link
902318b feat: jig reconciliation — one monorepo, one gate, CI fan-out
4d7f0ce style: pink sigil, search placeholder; exclude session worktrees from lint/test
c188f1a style: pink sigil in launcharr theme; summon placeholder becomes a search prompt

launcharr v0.3.1

Choose a tag to compare

@mitchmalone mitchmalone released this 10 Aug 04:22

Breaking changes

  • none

Highlights

Signed & notarized. Identical to v0.3.0 in features; this build is Developer ID signed
and notarized, so the dmg and zip open clean from a browser — no Gatekeeper detour.
(v0.3.0 shipped unsigned while Apple's first-submission review dragged; brew users were
never affected.)

Performance receipts

Metric Budget This release
Hotkey → panel visible < 100 ms 4.2 ms
Cold start → hotkey registered < 1 s 183 ms
Idle memory (panel hidden) < 120 MB 98 MB

Install

brew install mitchmalone/launcharr/launcharr

Or grab the dmg / zip below, or build from source (README).

All changes

signing-only release — see v0.3.0 for the feature changelog

launcharr v0.3.0

Choose a tag to compare

@mitchmalone mitchmalone released this 10 Aug 03:07

Breaking changes

  • none

Highlights

Settings grew up. The settings window is now a proper macOS surface: toolbar tabs,
hidden titlebar, autosave (there is no Save button — edits apply live, and hand-editing
config.json still works and updates the open window), and press-to-record hotkey pills
instead of typing accelerator strings.

Themes. Fourteen built-ins — launcharr, dracula, terminal (matrix green), amber CRT,
catppuccin, gruvbox, monokai, nord, one-dark, rosé pine, solarized, solarized light,
synthwave '84, tokyo night — applied live to the panel and settings. Your own theme is a
JSON edit: partial token overrides under "themes" in config.json.

Quicklinks go both ways. chill captain hook ⏎ hits the search template;
a bare chill ⏎ now opens the site itself.

Housekeeping. Config and scripts access moved from the tray into settings
(General ▸ Hackables); the tray menu slimmed to summon / settings / reindex / quit.

Performance receipts

Metric Budget This release
Hotkey → panel visible < 100 ms 4.2 ms
Cold start → hotkey registered < 1 s 183 ms
Idle memory (panel hidden) < 120 MB 98 MB

Install

brew install mitchmalone/launcharr/launcharr

Or grab the dmg / zip below, or build from source (README).

All changes

fa19958 chore: add license (mit)
a34c814 docs: journal the cargo stale-path gotcha after repo move
a94787a docs: draft v0.3.0 release notes
cfd17f0 feat: deterministic release pipeline — release.sh, notes-first, dmg, two-repo layout
4f0a829 docs: plan — restructure + deterministic release pipeline
e341da1 docs: release decisions — personal Developer ID now, Homebrew as installer/updater
976f5f3 revert: home stays ~/.config/launcharr (XDG) — migration heals either direction
ed4c668 feat: 11 more built-in themes incl. solarized-light (theme-aware color-scheme + checkmark)
1f5c16e feat: ~/.launcharr home + theme system (launcharr/dracula/terminal), settings hackables
9ee7164 feat: bare quicklink trigger opens the site root
4e84369 style: flat accentless checkboxes and radios in settings
c9724c8 feat: brand colors in settings — icon-blue ground, pink accent, icon on About
077c3f8 feat: settings native polish — autosave, toolbar tabs, hidden titlebar, hotkey recorder