Changelog

Fresh off the board.

This release introduces GitHub-style namespaced board URLs (/:workspace/:slug), completed-note archiving with strikethrough and opacity fade, and a migration of file uploads from local disk to Cloudflare R2. Several deployment infrastructure fixes land alongside these features, including cache-busting for static assets, a corrected Kamal secrets setup, and a production host-binding fix.

Breaking changes

  • Board URLs have moved to /:workspace/:slug — update any saved linksThe canonical path for every board has changed from /:slug to /:workspace/:slug. Existing boards are migrated automatically on boot via applyNamespaceMigration(), but any hardcoded or bookmarked URLs using the old single-segment format will no longer resolve. 4a16248 75b0773

New

  • Boards now live at /:workspace/:slug — namespaced like GitHub reposEvery user gets a personal workspace (slug = username) created at signup. Board slugs are now unique per workspace, so /alice/notes and /bob/notes can coexist. Shared boards appear under the owner's namespace in a "Shared with you" section on the home page. The schema is shaped for future team workspaces via a workspaces.kind column already in place. 4a16248 75b0773
  • Completed notes fade out and auto-archive after 48 hoursMarking a note complete now strikes it through and fades it to 55% opacity over 48 hours, after which it is automatically archived on the next board fetch. A new archive button on completed notes lets you file them immediately. Note.Completed and Note.Archived SSE events keep all connected clients in sync. Pre-migration notes with a null completed_at are treated as immediately eligible for the sweep. c42353b 6cfc764

Improved

  • File uploads migrated from local disk to Cloudflare R2Attachments and avatars are now stored in Cloudflare R2 instead of the VPS filesystem, closing a data-loss risk where replacing the server would have wiped every uploaded file. The local volume mount has been removed after the cutover was verified in production. bd86b96 ecef060

Fixed

  • Static assets are now cache-busted on every deployLayout appends ?v=<KAMAL_VERSION> to script and stylesheet URLs in production (falling back to boot time outside Kamal), so Cloudflare's CDN automatically serves fresh JS and CSS after each deploy without a manual cache purge. 716bf8c