Shared OfflineBanner (DRY/KISS, plugin like Toast). Extracted the transport state notice (online / syncing / offline) from an inline banner in features/todo/components/layout.templ into a central component internal/components/offline_banner.templ (SCOPE:core), in the same package as Toast. Now both todo and whiteboard use the same mechanism via @components.OfflineBanner() — a single source of truth for offline state. The bridge is the Service Worker: web/resources/static/sw.js posts sync-start / sync-end / sync-error to clients during Background Sync replay; the component listens and swaps CSS classes. Falls back to navigator.onLine when the SW is not registered (OFFLINE_SYNC_ENABLED=false in dev).
Expanded CONTENT_WRITING.md. Writing style guide rewritten with 10 angles (Functionality, Strategy, Design Philosophy, Skills, Comparison, War Stories, Personas, Formats, Anti-marketing, Numbers) covering all layers (goqite, dagnats, loro, pb realtime, sse hub, jetstream), the opt-out by env var vs delete-directory, the gogogo_auth+pb_auth split, and 10 bug stories from the changelog. Added posts/ to .gitignore so generated drafts are not pushed to the repo.
Changed
Whiteboard page shells mount @components.OfflineBanner() (features/whiteboard/components.templ: BoardListWithRealtime and Board), closing the gap where only todo had offline feedback.
Remove prebuilt gogogo-desktop binary from the repo (44.6 MB) and add gogogo-desktop + stelow.json to .gitignore. The desktop binary is built from source (make desktop / wails3), not committed. Ported from commit e4b97f4 which the previous remote master carried.
Rebuild app.min.css (purge calendar widget CSS that was erroneously committed in v0.16.0).