⌄
The app's settings window, a plain macOS preferences window:
Keep it small; new settings are new rows.
The filter field narrows the board everywhere. The jumplist and the menu bar dropdown share it, so the two stay in sync.
#tag matches a tag.! excludes either.The field applies live as you type (no Save button) and persists across restarts
(tagFilter below). Set it at launch too:
open Signalbox.app --args --filter demo restarts straight into a filtered view, and
--filter with no value clears it back to all.
The shortcut shows as a caption: ⌃⌥J by default, overridden with
defaults write com.dwmkerr.signalbox hotkey "cmd+shift+space". If another app holds the
combo, signalbox falls back and notifies.
macOS has a standard control for this: a recorder well, as in System Settings under Keyboard Shortcuts. Click the well, it focuses; press a combination, it captures it and shows a clear button. The KeyboardShortcuts Swift package provides the recorder control, persistence, and the global listener in one, replacing the Carbon code and the defaults-write override.
| Store | What | Why |
|---|---|---|
UserDefaults | menu bar icon (menuBarIcon), jumplist shortcut (hotkey), board tag filter (tagFilter), jumplist zoom (uiScale, 0.8-1.6, set with ⌘+/⌘−/⌘0), login-item one-shot (didRegisterLoginItem - the app registers itself as a login item once, on first launch from /Applications, and never re-adds it if you remove it in System Settings) | only the app needs these; the filter and zoom are local view preferences, not shared config |
~/.config/signalbox/settings.json | toggles the CLI hooks must also see, currently claudeClearEnds, claudeRenameTitle, codexClearEnds and codexRenameTitle; plus a hub section for how the hub binds: hub.bind (a keyword or a literal - the keywords loopback (127.0.0.1) and lan (the 0.0.0.0 wildcard) still resolve, and any literal like 0.0.0.0 or an explicit IP is honored verbatim; default loopback, this Mac only) and hub.token (the bearer token; default empty). The Hub "Allow other devices" checkbox writes the literal 0.0.0.0, and off writes 127.0.0.1. | the app writes the file and the hook path reads it on every fire, so a change applies immediately with no IPC; the hub reads hub.bind/hub.token at start so the app-spawned hub (which passes no flags) can serve other devices on the network |
Writes to the shared file merge key by key, so unknown keys survive. A missing or broken file falls back to defaults and keeps the hook path working.
The Allow other devices to connect checkbox controls who can reach the hub. Off (the
default), the hub answers only this Mac; on, it answers other devices on the network too. The
checkbox reflects hub.bind in the settings file, read live each time the window opens so
it stays right even when Connect Phone changed it. Toggling it rewrites that value and restarts the
hub (the same restart Connect Phone uses) so the new bind takes effect. The grey caption beneath shows
the address a phone dials, this Mac's LAN IP and the hub port, and notes the token is created
automatically.
The hub section is the persistent, file-backed equivalent of signalbox hub's
--bind flag and SIGNALBOX_TOKEN. It exists so the hub the app spawns - which
passes only --port - can come up reachable with a token, with no flags and no env.
hub.bind: a keyword or a literal, and the two coexist with no normalization pass
rewriting one into the other. The keywords loopback and lan resolve to
127.0.0.1 and the 0.0.0.0 wildcard; a literal (127.0.0.1,
0.0.0.0, or an explicit IP) is honored verbatim. The checkbox writes literals -
0.0.0.0 to allow other devices (loopback stays served for local hooks and this app while
every interface is served too), 127.0.0.1 to restrict to this Mac; an absent value means
loopback. Set it from the CLI too: signalbox config set hub.bind 0.0.0.0 (or
lan) then signalbox config get.hub.token: the bearer token non-loopback clients must send. When the hub starts on a
non-loopback bind with no token set, it generates one and saves it here, so a reachable hub is
on a stable auto-token across restarts. No control on this window edits the token; it is a CLI-only
value (signalbox config set hub.token --generate).Full resolution order, auth, and the auto-token are in the CLI spec and the data model.
Claude Code fires SessionEnd with reason clear when you type
/clear.
done instead, so the old session stays listed with
its last exchange until you hide it (⌃X), remove it (⌃⌫), or it expires.
The fresh post-clear session appears as a new row alongside it.For scripting, SIGNALBOX_CLEAR_ENDS=0|1 overrides the file.