Desktop Dotbar

repo: ~/Projects/desktop-dotbar · 50 commits · 2 in last 24h, 32 in last 7d · ▁ ▁█ ▅▁

Search the build

50 commits indexed

  1. 7956e2f 2026-09-26 auto-data-snapshot: 2026-09-26T11:13:09 (1 data files) — .claude/worktrees/dotbar-keepalive
  2. d2b3a95 2026-09-26 dotbar: hide dead sessions from ALL panels (colour groups + parked), fix claude.exe liveness, never hide parked tickets (TK-12236, TK-12174)
  3. a5d20f8 2026-09-25 bar: add dw / non-dw ticket chips under the five state chips
  4. 7010761 2026-09-25 dotbar: start-bar comment now says Jev paid is ARMED (Steve 2026-09-23, TK-12078)
  5. 426230a 2026-09-25 dotbar: document claimed-vs-unclaimed bg-spare liveness + negative test (TK-12236 contrarian follow-up)
  6. 9c338a8 2026-09-25 dotbar: carry pid on live parked tab rows so folder/realm cwd lookup works post-merge (TK-12236)
  7. 355916c 2026-09-25 dotbar: parked panel shows only live rows (pid/claude probe, open tickets), unknown shown not hidden, chip==rows (TK-12236)
  8. bbbb012 2026-09-25 auto-data-snapshot: 2026-09-25T09:51:23 (2 data files) — .claude/worktrees/dotbar-always-show-states .claude/worktrees/dotbar-dw-folders
  9. 9053da3 2026-09-25 dotbar: DW / Non-DW folder chips scope the bar to one folder (TK-12234)
  10. fde99cb 2026-09-25 dotbar: always show every state — all 5 ticket states + all colour groups, offline shown not hidden
  11. b577919 2026-09-25 auto-data-snapshot: 2026-09-25T09:20:47 (3 data files) — .barcfg.bak-20260925 .barcfg.pre-e2e .barcfg.pre-restart
  12. c915cfa 2026-09-25 dotbar: boot guard uses process.versions.electron (require.main!==module under Electron left the bar windowless) (TK-12225)
  13. 4f3c60e 2026-09-25 dotbar: floatingPosFor falls back to orphaned display pos on macOS display-ID churn (TK-12225)
  14. 60473d3 2026-09-23 auto-data-snapshot: 2026-09-23T13:13:50 (1 data files) — start-bar.command
  15. a32c6bf 2026-09-23 dotbar/jev: isolate tests from real cost ledger + reconcile paidCallsToday to the enforced count
  16. 1ab5eb8 2026-09-23 dotbar/jev: price-independent daily call-COUNT cap as the real paid backstop
  17. de2776c 2026-09-23 auto-data-snapshot: 2026-09-23T12:42:16 (1 data files) — start-bar.command
  18. d56df0f 2026-09-23 dotbar: mark orphaned sessions (live claude, no iTerm2 tab) so open-terminal only shows for focusable tabs
  19. cf77e2f 2026-09-23 Jev classifies dotbar dot colors ($0 builtin default; paid TypeSafe flip gated off)
  20. 26f22db 2026-09-23 dotbar: ticket states as vertical chips with right-edge labels
  21. 385c3af 2026-09-23 dotbar: free-position persistence — bar stays where dragged, across restarts (TK-12072)
  22. 08b744a 2026-09-23 auto-data-snapshot: 2026-09-23T11:06:44 (1 data files) — start-bar.command
  23. 25e5616 2026-09-23 Harden ram-sniper toggle + ticket-fetch resilience (TK-12071 test findings)
  24. 36f503b 2026-09-23 dotbar: fix ticket-segment clicks — Electron can't window.open() an external URL; POST to /api/open-board which shells to macOS open (same pattern as reveal)
  25. fa6b41e 2026-09-23 dotbar: each ticket state (blocked/open/idle/doing/parked) is individually clickable → loads that filtered Fleet board section
  26. 0347444 2026-09-23 dotbar: ticket summary centered in the middle band, 5 live states (blocked/open/idle/doing/parked), fix auth + 8MB buffer for the 4.5MB board payload
  27. 4ad7b46 2026-09-23 dotbar: merge ticket-board summary (BLOCKED/DOING/OPEN counts) + retire TicketBar (launchd bootout, code preserved)
  28. b05080a 2026-09-23 dotbar: RAM chip shows real memory pressure, not cache-inflated used% (96%->44%) + green/amber/red bands
  29. fa809cb 2026-09-23 dotbar: visible dotted resize grip + one-click Compact/Full toggle button
  30. 60eea92 2026-09-22 Fix RAM missing on the bar: move RAM/CPU readout into the always-visible left chip cluster
  31. 34abb18 2026-09-22 Add RAM Sniper to the nav bar: live RAM%/CPU% chip, ON/OFF daemon toggle, top-hogs dropdown
  32. b102cca 2026-09-20 desktop-dotbar: collapsed PARKED chip/panel from the durable registry
  33. d88f4e1 2026-09-17 dotbar: horizontal contract/expand for the top bar (right-end length grip)
  34. 2415402 2026-09-17 chore: v1.1.0 — nav bar edge auto-hide + orientation toggle (session close)
  35. 62b3811 2026-09-17 dotbar (TK-11885): edge auto-hide + top/left/right orientation toggle
  36. 5bfe0b0 2026-09-17 keep desktop bar supervised by launchd
  37. 8db4601 2026-09-17 wire arrange bar to master router
  38. 534bea8 2026-09-16 dotbar: surface Arrange outcome on the button instead of swallowing errors
  39. 2f67aa2 2026-09-16 dotbar: render a strip on EVERY display (Arrange button reachable on both monitors)
  40. 158144e 2026-09-16 auto-data-snapshot: 2026-09-16T10:40:23 (1 data files) — electron-main.js.bak-single-20260916T174147Z
  41. 71dbcd1 2026-09-16 dotbar: add top-strip Arrange button — one-click re-tile every screen via the dot-screen router
  42. 0d25ad6 2026-09-16 dotbar: drop bare-Tab global resize hotkeys; keep drag grip (DTD-D 2026-09-16)
  43. f72f77b 2026-09-16 dotbar: keep-last-good so a slow/empty scan never flaps the live count to 0
  44. ef1d433 2026-09-16 dotbar: fix '0 live' (scan timeout) + resizable bar (drag/Tab/Shift+Tab)
  45. aa5dd2c 2026-09-15 TK-11794: pulse the 4 needs-Steve dots on the bar; green/pink stay solid
  46. ead5ad7 2026-09-15 debounce dropdown auto-close (2 ticks); login autostart via LaunchAgent
  47. ca97694 2026-09-15 Gate dbg() debug.log writes behind DOTBAR_DEBUG=1 to prevent unbounded log growth
  48. 98783dc 2026-09-15 stop tracking transient .port
  49. 994870a 2026-09-15 Electron always-on-top strip: color-dot counts, ticket dropdowns, jump-to-terminal, cached feed
  50. 1f2db8a 2026-09-15 desktop-dotbar: always-on-top color-dot nav strip with ticket dropdowns + jump-to-terminal

Authors

Agents used

  • none detected

Skills used

  • /claude36
  • /code32
  • /jev5
  • /open4
  • /idle4
  • /doing4
  • /parked4
  • /worktrees3
  • /ram-sniper2
  • /ram2
  • /pink2
  • /dotbar-keepalive1
  • /codex1
  • /realm1
  • /dotbar-always-show-states1
  • /dotbar-dw-folders1
  • /title1
  • /tickets1
  • /cost-ledger1
  • /call1
  • /capped1
  • /errors1
  • /day1
  • /gone-display1
  • /unparseable1
  • /open-board1
  • /amber1
  • /red1
  • /toggle1
  • /stop1

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

d2b3a95 · 2026-09-26 · dotbar: hide dead sessions from ALL panels (colour groups + parked), fix claude.exe liveness, never hide parked tickets (TK-12236, TK-12174)
- isClaudeComm accepted only /claude(\s|$)/, so the native installer's .../bin/claude.exe
  made a LIVE parked tab read as 'recycled' and vanish; now claude/claude.exe/node/codex
- filterSessions: same ps probe drops dead-tty rows from the colour groups; ps failure = fail-open
- parked TICKETS are never hidden (always-show rule); closed -> liveness 'closed', off-board -> unknown
- negative tests: fake dead tty hidden, live kept, unknown kept; mutation-verified red

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GEE4jWy9RBmz5QnR2xcvno
a5d20f8 · 2026-09-25 · bar: add dw / non-dw ticket chips under the five state chips
Same active population cut by business instead of state (dw + non-dw == the five
state counts, asserted). Segmentation copies the Fleet board's classifier verbatim;
a test re-reads board.html and fails on drift. Offline board -> both read '-', never 0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AeMJYTDYXnN6A6A1mW7Yud
7010761 · 2026-09-25 · dotbar: start-bar comment now says Jev paid is ARMED (Steve 2026-09-23, TK-12078)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RyJoXLrB22bwqavSf2ex1S
426230a · 2026-09-25 · dotbar: document claimed-vs-unclaimed bg-spare liveness + negative test (TK-12236 contrarian follow-up)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RyJoXLrB22bwqavSf2ex1S
9053da3 · 2026-09-25 · dotbar: DW / Non-DW folder chips scope the bar to one folder (TK-12234)
Server tags each live + parked session with realm (dw|other) from the ticket's
project/title, then the doing label, then the claude cwd (realm.js, incremental
index of the tk event log). UI adds 📁 DW / 📁 Non-DW chips; picking one filters
every colour chip, dropdown, parked item and the live total. Persisted in
localStorage. Tests incl. a negative case (never a false DW).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BhKndRAeekFseXqd9WFzYA
fde99cb · 2026-09-25 · dotbar: always show every state — all 5 ticket states + all colour groups, offline shown not hidden
Steve 2026-09-25: "nav bar should be including all from orig nav bar... blocked, parked,
doing, idle etc., remember!!" The original Swift TicketBar kept its state tiles up
permanently; the Electron port hid zero-count states AND hid the whole ticket row when
the board was unreachable. After this morning's reboot pm2 came back empty, ticket-board
(:9794) never restarted, and every ticket chip silently vanished.

- ticket-states.js: blocked/open/idle/doing/parked always rendered; three states per chip
  (measured / measured-zero dimmed / NOT-measured "–" + offline), never a fake 0.
- server: tickets snapshot carries ok:false on a failed fetch; /api/tickets returns states.
- colour groups: every real colour always shown (zero dimmed, no pulse); only 'no dot' hides.
- tests: healthy + 2 negative fault-injection cases (board never fetched / went down).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bo75Y1rV4if7AbvCEQohXT
c915cfa · 2026-09-25 · dotbar: boot guard uses process.versions.electron (require.main!==module under Electron left the bar windowless) (TK-12225)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161EawVb2Kb9BdpD5NGbtN3
4f3c60e · 2026-09-25 · dotbar: floatingPosFor falls back to orphaned display pos on macOS display-ID churn (TK-12225)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161EawVb2Kb9BdpD5NGbtN3
a32c6bf · 2026-09-23 · dotbar/jev: isolate tests from real cost ledger + reconcile paidCallsToday to the enforced count
Verification caught two defects in the count-cap change:
- Tests exercising the paid-log path called the real defaultLogSpend -> cost-tracker
  log.js -> the REAL ~/.claude/cost-ledger.jsonl, writing phantom typesafe_jev rows
  on every `npm test` (no money spent — mock transport — but polluting prod data and
  pre-consuming the live caps). Fix: every paid-firing test now injects a mock logSpend
  via the opts DI seam. Proven: full suite writes 0 rows to the real ledger (line count
  unchanged across a run). The 7 rows already written were backed up and removed (rest
  byte-identical).
- /api/jev showed paidCallsToday:0 while the ledger held 7 rows — the displayed stat
  (a per-refresh snapshot, only set when armed) diverged from the value the cap enforces
  (countPaidCallsToday). Fix: getStats() now derives paidCallsToday LIVE from the same
  ledger (shared defaultReadLedger), so displayed == enforced regardless of paidEnabled;
  a fail-closed read surfaces as null. Added an observability regression test.

13/13 pass. Bar re-verified: paidEnabled:false, paidCalls:0, paidCallsToday:0, $0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1ab5eb8 · 2026-09-23 · dotbar/jev: price-independent daily call-COUNT cap as the real paid backstop
The dollar cap sums the ledger at a PLACEHOLDER $0.001/call rate, so with the
real TypeSafe price unknown it may never trip under cache-gated volume —
effectively uncapped in real dollars. Add maxPaidCallsPerDay (default 800, env
DOTBAR_JEV_MAX_CALLS) that bounds worst-case spend to (calls x unknown price)
regardless of the rate. countPaidCallsToday() counts today's app+api ledger
rows, fail-closes to Infinity on any read error, composes with the dollar cap
(paid fires only if under BOTH), reserves in-loop so a burst within one refresh
can't exceed the cap, and surfaces paidCallsToday/maxPaidCallsPerDay/
countCapBlocked on /api/jev. start-bar.command stages the arm flags OFF
(DOTBAR_JEV_PAID=0, auto-snapshotted in de2776c). Negative tests prove the
guard goes red on injected at-cap + burst faults and countPaidCallsToday
fail-closes; 12/12 pass. No paid call fired; bar stays on the $0 builtin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d56df0f · 2026-09-23 · dotbar: mark orphaned sessions (live claude, no iTerm2 tab) so open-terminal only shows for focusable tabs
Cross-references iTerm2's attached-session ttys (split-pane-safe index walk) against
allcolordots' process-based live list. Rows whose claude survives under iTermServer with
no tab now render 'orphaned - no tab' instead of a dead-end 'open terminal' button.
Fixes 'open terminal never works' (79% of rows were orphans).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cf77e2f · 2026-09-23 · Jev classifies dotbar dot colors ($0 builtin default; paid TypeSafe flip gated off)
Re-decide each active terminal's displayed dot color through a Jev-style typed
choice at the dotbar's own getDots() seam. allcolordots.sh is untouched (no fleet
regression); Jev unavailable/capped/errors falls back to the heuristic color.
$0 builtin classifier by default; paid path unreachable unless DOTBAR_JEV_PAID=1
and provably under a $5/day cap (fail-closed). Per-terminal state-hash cache gates
reclassification to real transitions only. /api/jev exposes the counters.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
26f22db · 2026-09-23 · dotbar: ticket states as vertical chips with right-edge labels
Render blocked/open/idle/doing/parked as individual vertical .chip elements
(colour dot + count left, state word pushed to the right edge via margin-left:
auto) matching the colour-dot chips above, replacing the cramped horizontal
🔴/⚪/⚫ segment footer. Only non-zero states show; each still opens the Fleet
board filtered to its section. Moved into the top cluster (before the spacers)
so they read as a continuation of the list, not a bottom footer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
385c3af · 2026-09-23 · dotbar: free-position persistence — bar stays where dragged, across restarts (TK-12072)
Steve: "once moved, keep the nav bar where relocated" → free-position mode.

electron-main.js:
- .barcfg gains floating(bool) + pos(displayId→{x,y,w,h}); readCfg defaults both
  cleanly so an old .barcfg still loads docked (backward-compatible).
- per-window 'moved' listener flips floating on and saves getBounds() once the bar
  leaves its docked spot by >4px; a programmatic-move guard (progUntil, 250ms window
  around every internal setBounds via setWinBounds) plus a docked-divergence check
  stop our own setBounds from being mis-captured as a user drag.
- boundsFor returns the saved pos (clamped to the visible work area) while floating
  and never re-snaps; createBarFor opens at the saved pos; off-screen/gone-display
  positions clamp back on-screen so the bar is always grabbable.
- pollAutohide no-ops while floating (no edge to slide to).
- setOrientation/cycleOrientation exit floating and re-dock to the edge (escape hatch).
- grip setters (setBarH/W/Len) patch the saved pos w/h so a floating bar resizes and
  remembers its size; flushCfg on before-quit so a drag-then-quit isn't lost.

start-bar.command: drop a stray DOTBAR_DEBUG=1 an auto-snapshot committed mid-test.

Verified by cycling the live launchd app: floating restores at exact (800,400,520,48);
docked cfg still edge-snaps ignoring pos; off-screen (5000,5000) clamps to (2040,957).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
25e5616 · 2026-09-23 · Harden ram-sniper toggle + ticket-fetch resilience (TK-12071 test findings)
Fix #2: resolve the ram-sniper daemon by exact PID (a shell interpreter
executing the script) and kill by PID, replacing the broad `pkill -f
bin/ram-sniper.sh` that SIGTERM'd any process merely mentioning the path
(editors, pgrep shells). See pgrep-f-matches-own-watcher-shell.

Fix #1: keep-last-good in getTickets/refreshTickets, mirroring getDots.
A dead ticket board makes curl return '' which JSON.parse('[]')'d cleanly
to [] and zeroed every count; now an empty/unparseable body returns null
and the last-good snapshot is kept instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
36f503b · 2026-09-23 · dotbar: fix ticket-segment clicks — Electron can't window.open() an external URL; POST to /api/open-board which shells to macOS open (same pattern as reveal)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
fa6b41e · 2026-09-23 · dotbar: each ticket state (blocked/open/idle/doing/parked) is individually clickable → loads that filtered Fleet board section
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
0347444 · 2026-09-23 · dotbar: ticket summary centered in the middle band, 5 live states (blocked/open/idle/doing/parked), fix auth + 8MB buffer for the 4.5MB board payload
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
4ad7b46 · 2026-09-23 · dotbar: merge ticket-board summary (BLOCKED/DOING/OPEN counts) + retire TicketBar (launchd bootout, code preserved)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
b05080a · 2026-09-23 · dotbar: RAM chip shows real memory pressure, not cache-inflated used% (96%->44%) + green/amber/red bands
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
fa809cb · 2026-09-23 · dotbar: visible dotted resize grip + one-click Compact/Full toggle button
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
60eea92 · 2026-09-22 · Fix RAM missing on the bar: move RAM/CPU readout into the always-visible left chip cluster
The bar is a right-docked vertical strip; the RAM chip was in #meta (bottom of
the column) with RAM/CPU as a split .cnt/.nm pair, so RAM clipped while CPU showed.
Now it sits with the dot chips (top of the strip) as one atomic .cnt span
(🧠 RAM% ⚙ CPU%), plus the 🔫 ON/OFF toggle. Verified rendering on both displays.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AztR94xH5K8nBe9ssBoagG
34abb18 · 2026-09-22 · Add RAM Sniper to the nav bar: live RAM%/CPU% chip, ON/OFF daemon toggle, top-hogs dropdown
- server.js: /api/ram (top -l1 + sysctl + ps, zero-dep, cached 2s) and
  POST /api/ram/toggle (start/stop ~/bin/ram-sniper.sh, pgrep-f path-qualified)
- index.html: 🧠 RAM% ⚙ CPU% chip in #meta, 🔫 ON/OFF toggle, click-to-open
  top-memory dropdown reusing the existing panel pattern

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AztR94xH5K8nBe9ssBoagG
b102cca · 2026-09-20 · desktop-dotbar: collapsed PARKED chip/panel from the durable registry
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QZehHfR2cgtmFvznNavrn5
d88f4e1 · 2026-09-17 · dotbar: horizontal contract/expand for the top bar (right-end length grip)
Top bar was locked to full screen width. Add a left-anchored barLen config +
setBarLen IPC (main+preload) and a top-only right-end #gripx (ew-resize) that
drags the bar's horizontal span; snaps back to full at the screen edge, clamped
per display, persisted in .barcfg. Side docks unchanged (main #grip owns width).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mx9jXp5vC4sft858UfivPN
2415402 · 2026-09-17 · chore: v1.1.0 — nav bar edge auto-hide + orientation toggle (session close)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XJaU3fPAuhfFTynAAJmev
62b3811 · 2026-09-17 · dotbar (TK-11885): edge auto-hide + top/left/right orientation toggle
Both nav-bar behaviors Steve asked for, in the in-scope Electron app:
(a) EDGE AUTO-HIDE — 📌 Pinned / 👁 Auto-hide toggle. When on, each strip
    slides off its docked edge leaving a 3px peek and slides back in when the
    cursor hits that edge. Cursor-polled (screen.getCursorScreenPoint every
    110ms) because the panel is non-focusable, so DOM hover can't see an
    off-screen bar; hysteresis via a 320ms hide-grace so it doesn't flap; an
    open dropdown or an active grip-drag pins it open.
(b) ORIENTATION top<->left<->right — one-click dock cycle, so a SIDE bar can
    be reverted back to a TOP bar. Side docks render the strip as a vertical
    column (chips stacked, controls at the bottom), grip becomes an ew-resize
    width handle; prefs persist to .barcfg.

Default state (top + pinned) is byte-identical to prior behavior — the
auto-hide poll early-returns when off, so no regression at rest. All 18
orientation x open x hidden bounds combos verified on both displays.
Reversible, local Electron/CSS/JS only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XJaU3fPAuhfFTynAAJmev
534bea8 · 2026-09-16 · dotbar: surface Arrange outcome on the button instead of swallowing errors
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MtzMyVz6sH79QSHLZzQMEZ
2f67aa2 · 2026-09-16 · dotbar: render a strip on EVERY display (Arrange button reachable on both monitors)
One BrowserWindow per screen, pinned to each display's top edge; dropdown-open tracked
per-window, grip-resize applied to all; rebuilds on monitor plug/unplug. (Steve 2026-09-16)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Szengr4hMUDtYdw3jSCfA
71dbcd1 · 2026-09-16 · dotbar: add top-strip Arrange button — one-click re-tile every screen via the dot-screen router
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Szengr4hMUDtYdw3jSCfA
0d25ad6 · 2026-09-16 · dotbar: drop bare-Tab global resize hotkeys; keep drag grip (DTD-D 2026-09-16)
A bare Tab/Shift+Tab registered via Electron globalShortcut is consumed OS-wide
while armed, so Tab silently died in the focused app whenever the mouse hovered
the top-of-screen strip; mouseleave could also be missed, leaving Tab hijacked.
An informed DTD panel (Claude+Codex+Qwen unanimous) chose D: remove the keyboard
path entirely since the drag grip already covers resize, eliminating the whole
bug class (no global shortcut, no arm/disarm state).

Also:
- perf: setBarH no longer writes .barh to disk or re-asserts always-on-top on
  every pointermove during a grip drag; disk write is debounced to drag-settle.
- grip hit target: anchor the grip fully inside the closed-bar window so it isn't
  a ~4px sliver (it's the sole resize affordance now).
- gitignore the runtime .barh file (its sibling .port was already ignored).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FFLLQmm7wJFvyHQkBb5Y21
f72f77b · 2026-09-16 · dotbar: keep-last-good so a slow/empty scan never flaps the live count to 0
The allcolordots scan can take 60-90s on a loaded box with many sessions; a timed-out
or empty scan returns 0 rows and was overwriting the good snapshot with total:0 (the bar
flipped back to '0 live'). Now refresh() only replaces the snapshot on a real result (>0)
or the first run, and the execFile cap is 120s. The bar holds the last good count between
slow refreshes instead of zeroing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AuZ7T3ffxRGXj5rrwgbquD
ef1d433 · 2026-09-16 · dotbar: fix '0 live' (scan timeout) + resizable bar (drag/Tab/Shift+Tab)
- 0 live: allcolordots --json takes ~9s but server execFile cap was 8s -> every
  refresh timed out -> empty -> '0 live'. Bumped to 25s. Now shows 48 live.
- Resizable strip: drag the bottom grip (screen-Y absolute setBarH), or Tab=expand /
  Shift+Tab=contract while the pointer is over the bar (hover-scoped globalShortcut so
  Tab isn't hijacked fleet-wide). Height clamped 22-140px, persisted to .barh.
- Launcher: start-bar.command used `command -v node` which is empty under launchd
  kickstart (no homebrew in PATH) -> server never started on a launchd restart. Added
  absolute-path fallback so launchctl kickstart works.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AuZ7T3ffxRGXj5rrwgbquD
aa5dd2c · 2026-09-15 · TK-11794: pulse the 4 needs-Steve dots on the bar; green/pink stay solid
The REAL visible pulse (Steve 2026-09-15 dot-flash directive): a CSS @keyframes
dotpulse animation on the always-on-top bar — one already-running process animates
the waiting rows, no per-tab background loop. WAIT set {lightblue,orange,purple,
yellow} (exact match to server.js /api/dots color keys) gets .pulse on both the
bar chip .dot and the panel-row .rdot; green/pink are excluded so they render
solid. Respects prefers-reduced-motion (animation:none). Verified live on :9787
(HTTP 200, a lightblue session present and pulsing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HKMY3eXqwFUCfqDShfUVnH
ca97694 · 2026-09-15 · Gate dbg() debug.log writes behind DOTBAR_DEBUG=1 to prevent unbounded log growth
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pnon7dut9MfPekhhm9YY4Q

File tree

28 files tracked. Click any to browse the source at HEAD.

Other build journals

← Designtradereps  ·  all 4 projects  ·  Desktop Sorter →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 3ms