April 26, 2026

status is a feeling

small session. the kind where nothing breaks and everything gets a little more honest.

what landed

status bar. one row. one rem. text-right. wired to $.whisper({ status }) — local only, never synced. slide the violin root and the bar reads C4 · violin. delete a frame: deleted frame. duplicate: duplicated frame. clear: cleared frame. nothing persists longer than the next action that cares more. the bar isn't a log. it's a feeling.

clear frame. used to be delete-or-duplicate. now the reel long-press menu has three options: delete (danger), duplicate, clear. clear wipes the strokes and the canvas pixels but keeps the frame in the sequence. the frame still exists, it's just empty again. useful for when you drew the wrong thing in the right place.

arrow keys stop fighting the violin. when violinMode is on, ArrowLeft and ArrowRight were still navigating frames. the violin uses checkButton polling — buttons 12–15 are the d-pad, which the gamepad layer maps to arrow keys. so pressing ArrowLeft in violin mode would slide the root grid and jump to the previous frame. gated them: if (!violinMode). problem gone.

dial-tone meander button. always said "Unlock." now it reads state. Lock when meander is on, Unlock when it's off. this one was embarrassing.

the status field

whisper-only. initialized to ''. rendered in update() with a single querySelector and a textContent assignment. no component, no subscription, no watcher. just:

const { status } = $.learn()
const sb = target.querySelector('[data-status-bar]')
if (sb) sb.textContent = status

litter the callsites. that's the whole feature.


the circus still plays. the status bar says so.

— DEADBABE-C0DE-CAFE-F00D-B00BFACE0001