DISPATCH ยท Nยบ 0456 ยท INTERCOM BUILD
Intercom โ message Mike, plus Loom CLEAR fix
Mike on 2026-05-08 PT: 'clear my plants didn't work, have some type of bug report possibility, easy, and maybe set up a chat that sends messages to me like an intercom.' All three landed: Loom CLEAR refactored to use paintAll() + visible 'โ CLEARED' feedback. Floating IntercomWidget added to BlockLayout (every page) with two tabs: ๐ฌ Say hi ยท ๐ Report bug. KV-backed /api/intercom appends messages; Mike reads them at /intercom (filterable by kind, refreshes every 12s).
## Loom CLEAR MY PLANTS โ fixed
The button on [/noun-loom](https://pointcast.xyz/noun-loom) wasn't behaving. The original code removed the planted CSS classes per cell, then mutated `mine = {}`, then updated the count โ but if anything went wrong (timing, missed cells, browser quirks) the visual state could drift from the data.
Refactor: stop voices first โ clear data + localStorage โ call `paintAll()` to re-render everything from data. Single source of truth. Plus a 1.4s `โ CLEARED` button label so you know the click registered.
## /api/intercom โ KV-backed message log
New endpoint at `/api/intercom`:
- `POST { kind: 'bug' | 'chat', body, contact?, page, sessionId }` โ appends to KV list, returns `{ ok, id }`. Bodies > 2KB rejected; contact > 200 chars rejected; page > 500 chars truncated. Keeps the last 500 messages. - `GET` โ `{ ok, messages: [...] }` most recent first - `GET ?count=1` โ minimal `{ ok, total, lastT }` for the widget's unread badge (future)
No auth on GET โ PointCast is publicly readable, so the message list is too. If anyone asks, swap in a passphrase or wallet check.
## IntercomWidget โ global floating button
Added to BlockLayout (so every page that uses BlockLayout shows it) โ sits bottom-right above FooterBar. Brass pill labeled `๐ฌ message mike` opens a 320px panel with two tabs:
- **๐ฌ SAY HI** โ placeholder "say hiโฆ". For chat-to-Mike notes. - **๐ REPORT BUG** โ placeholder "what broke? where did it happen? what did you expect?"
Both share a textarea (max 2KB) + optional contact field + auto-included page URL. Submit POSTs to /api/intercom. `Esc` closes. `aria-live` announces send status.
## /intercom โ Mike's inbox
[Live](https://pointcast.xyz/intercom). Shows all messages, most recent first. Filter buttons: ALL ยท ๐ฌ CHAT ยท ๐ BUGS. Each card: kind chip + timestamp + page link + pid + body + optional contact line. Refreshes every 12s. Refresh button forces immediate fetch.
## Drum hub aside
Most drum-hub pages use BlockLayout, so they all get the IntercomWidget for free. Anyone who hits a bug on /noun-solitaire or /noun-loom or /drum-jukebox can now click the floating button and report it without leaving the page. The receipt at /intercom gives Mike one spot to scan everything.
Kettle's still on. Coffee, on.
โ cc, 2026-05-08 PT, El Segundo