Skip to content
Coro

Release notes

Every calendar week is a release. Newest first.

2026-W41

Oct 5 - Oct 11

What's new

Features

  • Sign in with a code sent by email, in the same window, as an alternative to Google

Changes

  • Pages no longer move sideways when you go between a short page and a long one
  • The privacy policy has a new “Who can see it” section: only Kevin can see what Coro keeps about you (your email, when you signed up and last signed in, how you sign in, when your progress last synced and its size, and how many pages you rated), on a private admin page, and never what is inside your progress
  • The privacy policy describes sign-in by email code

Under the hood

Features

  • An admin panel at /admin for admins only, linked from the profile menu, with a Users section: GET /api/admin/users lists everyone with a synced record or a signed-in rating, most recently active first, joined with auth's POST /api/admin/users (getAdminUsers over the AUTH binding); it never returns a user id or a synced record's contents
  • An unlisted offline media prototype that plays songs and videos from R2 out of an on-device copy

Changes

  • html has scrollbar-gutter: stable from sm up, so pages with and without a scrollbar have the same content width
  • The admin panel moved to admin.kamadorueda.com: /admin and the profile menu's Admin item are gone, and Kevin's admin app reads the same /api/admin endpoints over a service binding
  • Unit tests run on vmThreads, the two slowest end to end files are split so they run side by side, and each preview server picks its own port

2026-W39

Sep 21 - Sep 27

What's new

Features

  • New Song stories: what 31 salsa classics are about, in plain English, from Anacaona and Pedro Navaja to Vivir Mi Vida and El Swing, with the slang explained and what to listen for on the dance floor
  • Mark a song story as read, and your read songs sync to your other devices when you're signed in
  • New Notable songs, in Knowledge: 19 recordings that shaped salsa, from El Manisero and Manteca to Quítate Tú and Tú Con Él, with why each matters and what to listen for, and a “Mark as listened” that syncs to your other devices

Changes

  • Videos wait behind their thumbnail until you press play, so pages open faster
  • Darker, easier-to-read colors for text, buttons and links
  • Removed animations and transitions for a snappier, more responsive UI
  • Rhythm skill tree now shows demo thumbnails and video posters
  • Exercise prose reordered: grid sits above the text explanation
  • Practice page: Start button moved into the tap target and page titled by instrument
  • Settings moved reset button and other controls to a dedicated settings panel
  • Footer updated with real design tokens and improved layout
  • Move Share/Feedback into a global top bar accessible from every page

Fixes

  • Accessibility fixes: keyboard support for the tap trainer (Enter), quizzes and account deletion, screen-reader announcements for results and notifications, a skip link, and visible focus everywhere
  • Notifications (toasts) had no background color
  • Fixed data sync issues that prevented user updates from reaching the server
  • Fixed data not displaying in UI even after successful sync to server
  • Fixed guest and auth users losing data on logout
  • Fixed top bar layout to be fixed-size and prevent jumping when session loads

Under the hood

Features

  • Data normalization layer to strip defaults before sync, reducing payload size
  • Feature flags now sync to IDB for persistence across sessions
  • Comprehensive end-to-end test suite covering full user flow including guest and auth paths
  • Shared sync schema (zod) between client and Worker for validation
  • Dynamic routes for all 11 rhythm exercises with a single typed registry
  • DELETE /api/sync endpoint for proper progress reset on sync
  • Breadcrumb navigation added to show user location across the site

Changes

  • Refactored storage to use IndexedDB as single source of truth, removed localStorage writes
  • Added support for guest users with persistent local-first sync
  • Enhanced sync manager to wait for pending writes before syncing
  • Normalized data before sending to server for minimal bandwidth usage
  • Clear IDB data on logout to ensure clean session state
  • Consolidated 11 rhythm exercise modules into a single dynamic router
  • Reverted TypeScript to 6.x due to typescript-eslint compatibility issues
  • Major refactor: split app code into client/, server/, and shared/ directories by where code runs
  • Simplified sync manager, rhythm schedulers, and record merging logic
  • Moved to unified pnpm workspace with single root-level lockfile
  • Skill card styling made consistent across all views
  • Improved honeypot field for feedback spam protection
  • Axe accessibility checks (e2e/a11y.test.ts) and token contrast tests guard WCAG 2.2 AA
  • vite preview now serves each prerendered page like production instead of the home page's HTML

Fixes

  • Fixed React.createElement children prop syntax in tests
  • Fixed TypeScript errors in sync hooks
  • Fixed e2e test failures related to auth redirects and stale locators
  • Fixed error handling in saveSyncData to properly propagate IDB failures
  • Fixed useFeatureFlags test to match IDB loading behavior
  • Fixed test assertions for IDB-based initialization
  • Fixed progress reset for signed-in users being undone on next sync
  • Fixed first sign-in overwriting stored data instead of merging it
  • Fixed e2e test to properly target home page heading

2026-W38

Sep 14 - Sep 20

What's new

Features

  • New Demos section: full social-dance routines alongside Patterns and Rhythm
  • Links now preview properly with real SEO metadata, a sitemap, and a share button
  • New release notes page - a weekly changelog broken into what's new and what changed under the hood
  • New feedback page for sending bug reports and ideas straight to the maintainer

Changes

  • Move videos now bleed to the card edge on mobile
  • The "How's it feeling?" status picker is more prominent
  • Move and technique cards dropped the catalog index number
  • The footer at the bottom of every page now links to the release notes

Fixes

  • Fixed a site-wide bug that broke all client-side interactivity right after load

Under the hood

Features

  • Added a Worker-backed API alongside the static site, the first step toward real server endpoints
  • Added Cloudflare's native Email Service binding so the feedback box can send email without a third-party provider
  • Implemented local-first data sync infrastructure with Cloudflare KV as the backend, activated for both production and preview environments

Changes

  • Migrated the build to React Router Framework Mode with build-time prerendering, after an initial attempt was reverted and redone correctly
  • Code-split routes with React.lazy + Suspense
  • Load the YouTube iframe API lazily instead of globally
  • Deploy hooks now refuse to run unless HEAD is main and pushed to origin
  • Stop hook scripts now use quiet/silent flags to cut output noise, and dev deploys happen automatically after every push to main
  • Removed the placeholder /api/hello route now that /api/feedback is the real endpoint
  • Refactored auth system to use React Context instead of custom hooks for better composability and testing
  • Achieved comprehensive test coverage across all components and utilities with smoke, integration, and unit tests
  • Extracted pure scheduler and audio context logic into testable modules for better isolation

Fixes

  • Removed the PWA service worker's navigateFallback to stop a flash-of-home-page on navigation and reload
  • Improved sign-out flow to properly clear session state and refresh the page
  • Fixed auth tests to use environment bindings correctly and avoid test pollution
  • Resolved TypeScript and ESLint errors throughout test files for better type safety

2026-W37

Sep 7 - Sep 13

What's new

Changes

  • Practice now cycles through your active moves directly instead of spaced-repetition scheduling
  • Learn and Practice buttons are now colored differently so they're easier to tell apart
  • Home page redesigned with a warmer look
  • Move cards redesigned: curriculum index, stacked name/translation, status footer
  • Move descriptions and technique guidance rewritten in clearer English, with glosses for Spanish-only names

Fixes

  • Fixed Practice getting stuck oscillating between the first two moves

Under the hood

Features

  • Added a feature-flag system (off by default, saved to localStorage) for staging new features

Changes

  • Moved Cloudflare credentials from .env to a SOPS-encrypted, repo-local secrets file
  • Prototyped a smarter PWA update prompt, then reverted it after it didn't work out
  • Rewrote move descriptions in ASD-STE100 style for consistency
  • Updated app dependencies to their latest versions

Fixes

  • Fixed the nix devShell so the Stop hook works in sandboxed sessions

2026-W36

Aug 31 - Sep 6

What's new

Features

  • Added an early/late bias meter so you can see your timing tendency
  • New footwork diagram shows weight transfer for the basic step, On1/On2

Changes

  • Rhythm exercises split into a separate explanation page and practice page
  • Rebalanced and normalized the synthesized percussion audio across all voices
  • Practice's hint grid now highlights every beat unit, not just the hits

Under the hood

Features

  • Each rhythm exercise's practice page got its own route
  • Added a PWA update prompt instead of silently auto-reloading on a new version

Changes

  • First week of development
  • Bass tumbao moved to its own, more gently limited output bus
  • Footwork diagram rebuilt twice, settling on a stateless weight-transfer lookup