Changelog

Updated

Every release, every fix, every new generator. Read what shipped last week or scroll back to see how Chitmunk came together. Versions follow major.minor.patch; dates are when the release went out the door.

v0.20.0 — Chitmunk Cloud, Live Collab & /home Overhaul (2026-04-11)

New: Chitmunk Cloud (R2 + D1 + Durable Objects)

  • Cloud save to Cloudflare R2 with content-addressed image storage. Editor state translates between local idb://img_xxx keys and cloud blob://{sha256} references via data/manifest.js. Upload path computes sha256, calls /api/blob/check for de-dup, and PUTs only the missing blobs before saving the manifest.
  • Atomic quota enforcement at 500 MB free / 50 GB Pro via a single UPDATE users SET used_bytes = used_bytes + ? WHERE ... AND (used_bytes + ?) <= quota_bytes query — no race conditions, no double-spend.
  • Soft-delete trash with daily cron sweep that walks expired projects, deletes R2 manifests + orphan image blobs (cross-project refcount-aware), and refunds used_bytes.
  • My Games rebuilt as a unified library: cloud projects pinned at the top with a storage bar, pending invites banner, and inline Share / Trash actions; local + Drive projects below.
  • New Game flow lists Chitmunk Cloud as the recommended storage option when the cloud bootstrap is ready.
  • Real Clerk email addresses are pulled from the Clerk Backend API (/v1/users/{sub}) instead of the previous @users.chitmunk.local placeholders — JWTs don't carry email by default.

New: Sharing & invites (Phase 1B)

  • Email invites: invite anyone by email. If they're already a Clerk user, the share is granted immediately. If not, a pending_invites row is created with an invite token and promoted to a real share the moment they sign up and sync.
  • Per-project share view (/home cloud-share) with role dropdowns, revoke, current shares table, and pending invite list.
  • New worker/lib/shares-repo.js and 002_shares_invites.sql migration.

New: Link sharing (Phase 1C)

  • Short links at /s/v/:id (view), /s/e/:id (edit), and /s/c/:id (collab) with optional expiry and use-count limits.
  • Card snapshot endpoint for readonly public views renders cards server-side from the manifest.
  • New worker/lib/links-repo.js and 003_project_links.sql migration.

New: Live collaboration (Phase 2)

  • CanvasParty Durable Object at /parties/canvas/:id handles WebSocket peer presence, op broadcast, and CSV lock arbitration. Built on native Cloudflare DOs with state.acceptWebSocket hibernation.
  • Op protocol with 4 types: el-update (whitelisted props only), el-add, el-remove, face-reorder. Schema validated against ALLOWED_EL_PROPS on both client and server.
  • Coarse-grained CSV lock — one writer at a time, with explicit acquire/release messages.
  • Kick on revoke via close code 4003 — when a share is revoked, the Worker actively closes that peer's socket so they can't keep editing.
  • Remote cursor + selection overlay rendered by canvas/collab-overlay.js (pure functions, unit-tested) with stable seat colors that survive peer churn.
  • Top-right presence pill (canvas/collab-presence-ui.js) shows count, avatar stack, and a "Who's here" popover. Auto-dismissing join/leave toasts via ui/animate.js presets.
  • New worker/lib/canvas-party.js, worker/lib/collab-ops.js, data/collab-socket.js, canvas/collab-integration.js, and 004_project_presence.sql migration.

New: Presence-gated collab (no wasted DO time)

  • The WebSocket does not auto-open when a cloud project loads. canvas/editor-cloud-init.js first calls /api/projects/:id/collab-eligible. Solo projects (≤ 1 non-owner share) skip everything — no Durable Object cost, no socket churn.
  • Eligible projects start a 15 s heartbeat poll. The server reports peer count from project_presence. When peer count ≥ 2, the client promotes from polling to a real WebSocket and mounts the presence pill.
  • After 60 s of no pointer/key/visibility activity, the client closes the socket and drops back to polling. The next user interaction re-evaluates and re-opens if peers are still around.
  • This is the difference between "shared with 3 people, only you are looking" (lightweight heartbeats) and "shared with 3 people and two of you are looking right now" (open socket).

New: Component Viewer

  • Top-level Components link in the /home sidebar — browses all TheGameCrafter component types across 27 categories (cards, dice, boards, mats, boxes, booklets, tokens, dials, and more).
  • Two-pane layout: sticky category sidebar + component grid in the main area.
  • Clicking a component opens a side drawer with a live rotating 3D preview, specs (dimensions, bleed, safe, face count, corner radius, TGC identity), and a Templates tab when matching templates exist.
  • "Start from…" action cards offer three creation paths per component with clear microcopy: Blank (design everything by hand), Generator (auto-fill each face with a parametric element), From template (pick a curated starter design).
  • Global search across component names and template names, with Escape-to-clear and keyboard navigation.
  • Contextual CTAs: action buttons say "Add to game" when a game is active, "Create new game" otherwise.

Renamed: Analytics → Balance Lab

  • The analytics suite is now Balance Lab — more native to board game designers than "Analytics".
  • Sidebar label, page headers, and document titles updated throughout /home.
  • Route keys unchanged (analytics-*), so bookmarks and sessionStorage continue to work.

Renamed: Costs → Cost Curve

  • The Balance Lab "Costs" sub-page is now Cost Curve — disambiguates it from print pricing and matches standard game-design vocabulary.
  • Standalone /analytics page label updated to match.

Renamed: Cost Estimator → Print Pricing

  • The TGC manufacturing-cost tool is now Print Pricing — removes the word "Cost" collision with the Balance Lab.
  • File renamed home/views/cost-estimator.jshome/views/print-pricing.js.
  • Old cost-estimator route kept as a legacy alias so existing sessionStorage.chitmunk_lastRoute values still resolve.

Sidebar restructure

  • Removed the old "Toolkit" collapsible section.
  • Added a new Design collapsible section containing Generators, Shapes, Maps, and Templates (same sub-pages, just relocated — route keys unchanged).
  • Components sits as a top-level item alongside Dashboard and My Games.

Template system refactor

  • Exposed the rich TEMPLATES registry from panels/template-library.js (with per-template sizeGroup, category, previewColor, fonts, bindingMap, genre) as the single source of truth for /home template browsing.
  • New getTemplatesForComponent(componentId) helper maps component IDs to their relevant templates via SIZE_GROUPS.
  • home/views/templates.js no longer does fragile string matching on template function names — consumes the registry directly.

Improved: 3D Preview

  • panels/preview-3d.js now renders a warm kraft-cardboard texture on empty faces (instead of ghostly pale gray), so components in the Component Viewer drawer look like physical prototypes even with no design loaded.

Improved: New Game flow

  • Component type dropdown now lists all 200+ TGC component types grouped by category, instead of the previous 13 hardcoded card types.
  • Pre-seeded cards from the Component Viewer are honored when you create the game.
  • Storage picker exposes Chitmunk Cloud as the first (Recommended) option when the cloud bootstrap is ready.

Fixed: Landing page restoration (Architecture 2)

  • A half-finished landing rewrite had left index.html referencing classes that no committed CSS file declared, so chitmunk.com was rendering with broken layout.
  • Restored index.html (1628 lines) from a dangling git blob and reconstructed site/landing.css (1976 lines) by extracting the inline <style> block from mockup.html and merging it with the guide-specific sections from the pre-rewrite landing.css.
  • site/landing-shell.js (the shared nav + footer + guide sidebar injector) is now tracked in git instead of living as an untracked working-tree file.

Fixed: /home theme FOUC

  • /home previously rendered with the wrong theme on first paint and snapped to the correct theme after the JS modules loaded.
  • New home/theme-bootstrap.js runs synchronously before the stylesheets and sets data-theme on <html> so CSS evaluates with the right theme on the very first frame.
  • Default theme is dark (matches the deployed appearance); users who explicitly switch to light still get their preference.

Worker infrastructure changes worth knowing about

  • CORS Allow-Methods expanded to GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS — the original GET, POST, OPTIONS silently broke cloud save with "TypeError: Failed to fetch" on the first real PUT. Do not narrow it.
  • Atomic quota refunds via users-repo.refundBytes so deleted projects free space immediately.
  • Native CF Durable Objects with state.acceptWebSocket hibernation; the original plan called for partyserver but native DOs ended up cleaner.

Not in this release

  • Phase 3 (Resend email) — invite notification emails are explicitly deferred. Invite infrastructure works without it (tokens are returned in the API response for manual copy).

v0.14.0 — Cloud Save, Sync & Progressive Auth (2026-03-28)

New: Progressive OAuth Consent

  • Google Drive, Google Sheets, and OneDrive permissions requested only when the user first uses each feature.
  • In-app consent dialog explains permissions before redirecting to Google/Microsoft.
  • Cumulative scope merging ensures previously granted permissions are never lost.
  • Account panel shows only connected services with Disconnect buttons.

New: Google Sheets & Excel Import vs Sync Mode

  • Data source menu now shows a mode selection dialog: Import (one-time fetch) or Sync (live updates).
  • Import: paste a URL, requires Sheets-only access.
  • Sync: browse Drive via picker, requires Drive + Sheets access, polls every 30 s (active) / 5 min (background).
  • Adaptive polling with exponential backoff and offline/online recovery.
  • Mode persisted per card type, restored on page reload and card tab switch.
  • Excel (OneDrive) gets the same Import vs Sync mode selection.

New: Save Project Modal Redesign

  • Save Project now offers three destinations: Google Drive, OneDrive, and Local.
  • Each handles auth/consent as needed.

New: Download Project File

  • New menu item bundles the full project (design, images, CSV data) as a ZIP to disk.
  • Round-trip: download and re-upload restores the identical project.

New: Upload Project File

  • Upload button in Game Shelf header.
  • After selecting a ZIP, choose: Just open, Open & save to Google Drive, or Open & save to OneDrive.

New: Reconnect Button

  • Data source bar shows a "Reconnect" button when sync is in error or offline state.
  • Handles scope re-granting and reconnection in one click.

Improved: Worker JWT Verification

  • Replaced deprecated Clerk /v1/sessions/verify with local JWT verification via JWKS.
  • Networkless after key cache (1-hour TTL).

Improved: Bound Column Indicator

  • Replaced green dot with amber tinted checkmark in rounded square.
  • Avoids confusion with sync status indicators.

Fixed: Shelf Retry Loop

  • Drive and Shared project fetches no longer retry infinitely on 401 errors.
  • Matches existing OneDrive failure guard pattern.

Fixed: Session Restore

  • sheetsLink, excelLink, and csvFileName now restored from autosave on page load.

v0.13.0 — QR Modes, Toolbar UX, Guided Tour (2026-03-24)

New: QR Code Encoding Modes

  • 9 encoding modes: URL, text, WiFi, vCard, email, SMS, phone, location, calendar event.
  • Mode-specific property panel fields with CSV binding support.

New: Toolbar UX Overhaul

  • Labeled clusters (Face, Tools, Add Elements, Panels) with visual grouping.
  • View toggles with distinct bordered active state.
  • Export button uses brand amber, trial badge styling subdued.

New: Data Mode Redesign

  • Opens as resizable side panel alongside canvas (not fullscreen overlay).
  • Horizontal scrollbar for wide datasets, real canvas stays interactive.

New: Guided Tour Onboarding

  • 8-step interactive tour with spotlight overlay.
  • Interactive steps (drag chip, click card) for discovery moments.
  • Keyboard navigation, skip with toast, re-accessible from brand menu.

New: Floating Toolbar

  • Context-sensitive floating toolbar for selected elements.

New: Brand Identity

  • Chitmunk logo SVG across all pages, replacing emoji placeholders.

Improved: Unit Tests

  • 248 new tests added (124 to 485 passing, 0 failing).

Improved: Properties Panel

  • Section reorder, label clarity, structural cleanup across all element types.

Improved: Animations

  • anime.js foundation wired into UI interactions (zoom, tabs, panels, canvas transitions).

v0.12.0 — Specialized Designers, 3D Preview, Print & Play (2026-03-21)

New: Specialized Designers

  • Dice Designer: multi-face grid with universal style controls, batch icon picker, 3D dice preview.
  • Document Designer: multi-page rulebook/sell sheet editor with dynamic pages, shared headers/footers.
  • Booklet Designer: spread view with add/remove pages, 3D preview.
  • Dial Designer: two-disc workspace with drag-to-rotate simulator.

New: 3D Product Preview

  • WebGL mockups for all 27 component categories using Three.js.
  • Cards, dice, boxes, mats, boards, tiles, standees, booklets, dials, screens, and more.

New: Print & Play Export

  • Configurable modal with live preview.
  • Page size, orientation, margins, cards-per-page, duplex/fold-and-cut modes.
  • Crop marks, TOC, row range filtering, multi-component PDF.

New: Game Package View

  • Project summary showing all components with previews.

New: Batch Image Import

  • Fuzzy filename-to-row matching with interactive mapping UI.
  • Upload files, folders, or ZIPs.

Improved: OAuth Migration

  • Google Drive and OneDrive auth migrated from GIS/MSAL to Clerk-managed OAuth via Worker proxy.

Improved: Landing Page

  • Feature carousel with real screenshots, generator showcase.

Improved: Security

  • CSP connect-src tightened, trial date validation, MIME checks, memory cleanup.

v0.11.0 — Advanced Design Tools (2026-03-19)

New: Visual Palette Modal

  • Shape and Generator buttons now open a visual grid palette with rendered previews instead of text dropdowns.
  • Two tabs: Shapes (22 items) and Generators (26 items) in one unified modal.
  • Free items displayed first, Pro items below with lock badges.
  • Large preview thumbnails so you can see exactly what you're adding.

New: 22 Shape Types

  • Free (8): Rectangle, Ellipse, Polygon, Line, Star, Arrow, Diamond, Cross.
  • Pro (14): Shield, Banner, Hexagon, Gear/Cog, Spiral, Progress Clock, Burst/Starburst, Compass Rose, Corner Filigree, Decorative Divider, Speech Bubble, Scroll/Parchment, Ribbon/Sash, Curved Arrow.
  • All Pro shapes include configurable properties in the properties panel (tooth count for gears, segment count for progress clocks, filigree styles, bubble tail position, ribbon style, etc.).

New: 26 Generator Types

  • Free: Score Track, Dice Face, Progress Bar.
  • Grids: Hex Grid, Square Grid.
  • Tracks: Race Track (interactive path editor: click to place control points, drag to reshape, 6 presets including Speedway and Spa-inspired layouts).
  • Widgets: Spinner Wheel (radial text alignment option), Dice Face (all standard die types D4-D20, custom fonts).
  • Card Parts: Resource Cost Pips, Stat Display (badges, bar, and radar chart modes).
  • Layout: Card Layout Frame, Player Mat, Tournament Bracket.
  • Reference: Ruler, Probability Table, Pie Chart (donut mode supported).
  • Maps & Diagrams: Map Compass + Scale Bar, Relationship Map, Point-to-Point Map, Tech Tree, Thermometer, Box Insert.
  • Game Mechanics: Action Rondel, Resource Converter, Phase/Turn Reference, Timeline, Token Sheet Layout.

New: Generator Configuration

  • Every generator opens a configuration modal with full settings on creation.
  • Double-click any generator on canvas to reconfigure it.
  • Live preview canvas in the modal updates as you change settings.
  • Quick-edit properties in the right panel for fast color/value tweaks.
  • "Edit Settings…" button for full configuration access.
  • Config summary shown in properties panel (e.g., "6 × 6 pointy", "d6 showing 3").
  • Input validation prevents invalid configurations.
  • "Convert to Shapes" right-click action to flatten generators into editable shape groups.

New: Interactive Path/Node Editors

  • Race Track: Canvas-based control point editor with Catmull-Rom spline smoothing. Click to add points, drag to reshape, right-click to delete. 6 track presets (Oval, Circuit, Figure 8, Monaco, Spa, Speedway). Multi-lane support with proper offset curves.
  • Point-to-Point Map: Click to place cities, drag to move, double-click to rename, right-click to delete. Route management with per-route color and length. 4 presets (Star, Loop, Grid, Random).
  • Tech Tree: Click to add nodes, drag to position, double-click for full node editor popup (name, color, tier, locked/unlocked state). Curved/elbow/straight edge styles. 4 presets (Binary, Wide, Deep, Diamond).

New: Card Style Panel

  • Appears in properties panel when no element is selected.
  • Card Frame: 5 presets (Classic, Ornate, Art Deco, Fantasy, Sci-Fi) with configurable colors and width.
  • Card Back Pattern: 5 tiling patterns (Geometric, Radial, Celtic, Art Deco, Hexagonal) with 180° symmetry enforcement.
  • Rarity Badge: Common/Uncommon/Rare/Mythic with configurable position and colors.
  • Renders in all export paths (PNG, PDF, TTS, print-at-home).

New: Enhanced Stroke Styles

  • New dash presets: Dotted, Dash-Dot, Dash-Dot-Dot, Long Dash (Pro).
  • Stroke line cap: Butt, Round, Square (Pro).
  • Stroke line join: Miter, Round, Bevel (Pro).

Improved: Auto-Update Notifications

  • Service worker now detects new deployments and shows an unobtrusive banner: "A new version of Chitmunk is available! [Refresh]".
  • No more Ctrl+Shift+R needed: user data (saves, images, fonts) is never affected.
  • Checks for updates every 5 minutes.

Improved: Toolbar Responsiveness

  • View toggles (Bleed/Safe/Snap/TGC) and scale selector collapse on screens under 1400px.
  • Fit button collapses under 1200px.
  • Ensures element creation buttons remain accessible on smaller displays.
  • Assets and Data buttons restyled to match toolbar consistency.

Improved: Slider Value Displays

  • All range sliders now update their displayed value live as you drag (tooth count, inner radius, turns, filled segments, etc.).

Technical

  • New files: panels/generator-modal.js, panels/palette-modal.js.
  • renderGenerator() exported from canvas/renderer.js for use by palette previews and modal previews.
  • Generator element type added to state model, renderer, interaction handler, context menu, and all export paths.
  • Design spec: docs/superpowers/specs/2026-03-19-advanced-design-tools-design.md.