Changelog

Fresh off the board.

This release is a broad polish pass focused on correctness and touch usability. It fixes a cluster of card-lifecycle bugs (Back after archive, Forward onto the board, double-click completing, failed-save drafts), tightens real-time sync (board appearance and roster changes now broadcast over SSE, removed members lose their stream immediately), and hardens several touch targets (due-date chips, tag removal, color swatches, the sheet Close bar, phone toasts). The agent companion also gains more reliable concurrent-run handling and Codex settle behaviour.

New

  • Board appearance and roster changes now sync across open tabsChanging a board's background, font, card colour, or colour mode now reaches your other open sessions of that board in real time via a new board:appearance SSE event. The member:left event now carries a { username } payload so open boards drop the departed member from the avatar stack and owner picker immediately. 0fbce7f

Improved

  • Deleting an agent now revokes its companion access and shows host cleanup stepsDeleting an agent now immediately revokes its companion credentials server-side. The account UI also shows the steps needed to clean up the agent host. 0b538a7

Fixed

  • Back after archiving a card reopens the card instead of a blank editorPressing Back after archiving (or deleting) a card from the overlay used to land on an empty "Title..." editor at the archived card's URL, making it look like the content was wiped. Back now fetches the card first and opens it as itself; a genuinely deleted card says so and leaves the board URL clean. e6efee4
  • Forward or Back onto the board URL now fully closes the open cardNavigating away from a card via browser history left the overlay on screen at the board's URL — the editor appeared blank because its data had been cleared. The popstate handler now runs the same full close the button runs, and the overlay tears down whenever the store goes closed underneath it. 68fd5c4 3513379 9e99d62
  • A failed card save no longer discards your description draftWhen saving a card's description or source URL failed, the draft was silently rolled back to the server's value and the card closed, making it look like the content was lost. Both fields now share a single save path: the draft stays in place on failure, an error message appears, and Close waits for in-flight saves before animating away. 37cc221 84977e6
  • Double-clicking Complete no longer silently archives the cardCompleting a card from its tile is optimistic, so the corner slot swapped to Archive while the pointer was still clicking. A double-click's second press hit Archive and removed the card with no toast. The slot now holds the Complete control for 700 ms after the click settles, and repeat presses during that window are dropped. 3a10f86
  • Clearing a board filter now survives a reloadClearing a filter removed it from the store but left ?filter= in the address bar, so a reload or a copied link restored the filter just cleared. Both applying and clearing a filter now write the URL via replaceState, keeping the address bar and the store in sync at all times. fbefb89 54f4c57 f9f65d0
  • Emoji-only board names no longer cause a 404 on the dashboardNaming a board with only emoji (e.g. 🌱🌻) produced a slug with no valid characters, and the server returned a bare 404. The naming hook now validates the slug client-side using the same boardSlug rule the server uses, shows an inline cue, and keeps the cursor and typed name in place. 6f88ea5
  • Resetting the invite link now confirms success and surfaces failuresThe invite-link reset control rotated the token in silence — success changed nothing on screen and a failure was an unhandled rejection in the console. It now tracks idle/pending/done/error state, shows the outcome under the People header, disables the Invite pill during rotation to prevent handing out a link about to die, and leaves the control enabled for an obvious retry. 03e91d1
  • Failed checklist task saves preserve your draft and show a retry cueWhen adding a checklist task failed, the typed text was discarded and nothing was shown. The draft is now preserved and a retry cue is displayed, matching the behaviour already in place for due-date failures. 987343a e03ca36 59ef787 130ae81 c7c1f78
  • Due-date edit and clear are now separate hit targetsThe due-date chip's edit and clear actions now have distinct, non-overlapping touch targets so tapping clear no longer accidentally opens the date picker. 1bf6c94 1a5e565
  • Double-tap no longer removes an adjacent tagA rapid double-tap on a tag removal button could fire a second removal against the next tag in the list. A named guard window now drops repeat presses within the debounce period. b421d7d f97e8ad d843d17 303ae9d
  • Repeat taps no longer shift the color-swatch hit targetTapping a card color swatch repeatedly could cause the active target to drift to an adjacent swatch. The picker now holds its target stable through rapid taps. 1c51438
  • Phone toasts no longer cover an open card's headerOn a phone, the top-center toast covered the card's date, title, and Delete/Close icons right after a failed save. While a card is open at phone width, toasts now appear just above the card's footer. 1f98c52 9c30409
  • Scrolled sheet content no longer triggers the Close button accidentallyThe sheet's Close button sat in a zero-height sticky strip, so scrolled content (such as the Lora font tile in the account drawer) slid under its hit area and a tap on the tile's corner closed the drawer. The strip now reserves the Close's full touch height and becomes an opaque hit-blocking bar once the sheet is scrolled. 45dd97c
  • Photo upload is now reachable on touch and by keyboardThe avatar's upload control was hidden behind a hover-only scrim and absent from the tab order, making it inaccessible on phones and to keyboard users. The scrim now stays visible on touch devices and on focus, and the label is a real <button> with an aria-label of "Change photo" so it has a tab stop and responds to Enter/Space. dcb2046
  • Decorative dashboard cards no longer lift or steal focusSample cards on the welcome dashboard were interactive enough to lift on hover and accept focus, creating a confusing tab stop. They are now purely decorative. e9b55dd ba8e0c2 8081c50
  • Dashboard card titles are preserved beside long board namesLong board names could push card title text out of view on the dashboard. Layout now ensures both are visible. 3936be5
  • Board display names appear in the move picker and move feedbackThe card move picker and its confirmation feedback now show each board's display name rather than its internal identifier. 3e668df
  • Concurrent agent runs no longer fail with lease_expired on the third slotThe active-run validator capped the list at two while devices can claim up to their measured capacity. Every third concurrent claim caused reconcile to throw, burning all three attempts on lease_expired. A single DEVICE_RUNS_MAX constant now governs companion capacity, the server per-device cap, and the validator. 6dd4b98 12e68e5
  • Codex agent runs now settle correctly after finishingThe task CLI finish command no longer requires writable state, so Codex-backed runs can reach a settled state reliably. 0afee69 febb6b7

Security

  • Removed members lose their live board stream immediatelyA member's SSE connection stayed open after removal, so private cards created by the owner were still delivered to a browser that could no longer open the board. Removal now revokes the stream on the spot, and every subsequent delivery re-checks Board.access, so access ending any other way (agent deletion, board deletion) also stops delivery. 2257cd5