Changelog
All notable changes to Chess Manager will be documented in this file. The format is based on Keep a Changelog.
[0.22.2] - 2026-07-09
Tournament-integrity, discovery, security, and accessibility fixes from a full codebase review.
Fixed
- Knockout tournaments always crown the bracket winner. If both finalists missed the scheduling deadline, the final used to be recorded as a draw — which handed the title to whoever had the stronger tiebreakers rather than to the higher seed, and could crown the lower-seeded player. Automatic forfeits and organizer dispute resolutions now record a decisive result on knockout boards, so the bracket winner is always correct.
- Tournaments open for registration now appear in discovery. Published tournaments accepting sign-ups were missing from Trending, recommendations, and the "open signup" count, while unpublished drafts leaked in as dead links. Discovery now surfaces the tournaments you can actually join.
- The "has open spots" filter count is accurate — tournaments that have hit their participant cap are no longer counted as having space.
- Reported Lichess games that were aborted or still in progress are no longer pre-filled as a draw when reporting a result.
- Swiss and round-robin pairings now ignore matches an organizer has voided, so voided opponents can be paired again and colors stay balanced.
- "Matches flagged for review" notifications link to the correct page, and matches flagged during a platform-API outage now consistently appear in the Review tab.
- Round-advancement notifications are no longer silently dropped if a momentary database hiccup happens while a round advances.
- Admin email broadcasts send reliably — with the default email configuration a broadcast could be marked "delivered" without actually sending; it now sends correctly.
- Editing your profile after your session has expired no longer traps you on the page with a Save button that does nothing — you're taken to sign in again.
- Production builds now report their real version and no longer display a "DEV" badge on the live site.
Security
- Email sign-in can no longer be locked out by an attacker. Requesting a sign-in code no longer lets someone who knows your email flood your inbox or block your own code requests, and a fresh request now supersedes any older codes so only the latest one works.
- Standings CSV exports are safe to open — a player's name can no longer smuggle a spreadsheet formula into an exported file.
- Export and calendar-feed links no longer leak their access token to other sites through the browser's referrer header.
Accessibility
- Screen readers are no longer interrupted by routine success and info notifications; only errors announce assertively.
- Dropdown menus announce the focused item to assistive technology as you arrow through them.
This release also includes internal hardening with no user-visible behavior change: a build/deploy fix so releases self-verify, new automated regression guards (typed API responses, fail-safe background tasks, and silently-skipped-test detection), a database index to speed up scheduling cleanup, dead-code removal, and documentation corrections.
[0.22.1] - 2026-07-07
A draw-results accuracy fix for organizer-resolved disputes.
Fixed
- Draws recorded by an organizer resolving a disputed match now count correctly in standings, dashboards, and data exports. The dispute-resolution flow used to store the draw as the display glyph ("½-½") instead of the canonical form ("1/2-1/2"), so those draws silently vanished from win/loss/draw tallies. The server now normalizes the result on save, and a migration repairs any previously affected results.
This release also includes a large internal test-coverage expansion (verify-results pipeline, endpoint authorization band, Swiss lifecycle browser test) and a code-deduplication sweep, with no intended behavior changes.
[0.22.0] - 2026-07-04
In-app update notifications so you're never left on a stale version.
Added
- Update notifications — when a new version of Chess Manager is deployed while you have the app open, a prompt now appears with a one-click Reload so you're never left on an out-of-date version.
[0.21.1] - 2026-07-03
Account-linking security and reliability hardening.
Security
- Signing in with Lichess no longer signs you into a pre-existing account just because it shares the same email. Because an email can't be confirmed as verified on Lichess's side, an account that already uses that address is now left untouched — you're asked to sign in with your existing method and then connect Lichess from your profile. This closes an account-takeover path.
- Proving your email (by signing in with Google or an email code) now removes an unverified Lichess connection that had been attached to an unverified account under your address, so a Lichess link set up by someone else can't ride along on your account. If this affects you, just reconnect Lichess from your profile.
Fixed
- If your session expires while connecting Lichess from your profile, you're now asked to sign in again and retry — instead of being dropped into a brand-new, empty duplicate account.
[0.21.0] - 2026-07-03
Club invitations, in-chat match scheduling, and a more trustworthy result-reporting flow, plus accessibility and reliability fixes.
Added
- Club invitations — invite players to a club and accept or decline invites from your side. Invites now require the recipient's consent instead of adding them silently, and member email addresses are no longer exposed.
- Clubs in the main navigation — Clubs is now a top-level destination, with an onboarding checklist for new members and a Browse escape-hatch for finding clubs and tournaments.
- Propose match times in chat — suggest a time for your game directly from the match chat, with timezone-aware timestamps so both players see the correct local time.
- Clearer result reporting — result edits are now gated once a result is in flight, a "pending verification" chip shows when a reported result is awaiting confirmation, and toasts give clearer feedback through the pipeline.
Fixed
- Deadlines are now daylight-saving-time-safe: local-to-UTC conversion and end-of-day deadlines handle DST transitions correctly.
- Server validation errors now surface as specific, readable messages instead of a generic "network error".
- The user menu and profile popover are now fully keyboard- and screen-reader-operable.
- More resilient real-time connections: WebSocket keepalive pings and automatic session revalidation reduce silent disconnects.
- Onboarding progress is preserved across a page reload, a broken feed call-to-action (404) is fixed, and the page now declares its language for accessibility.
- Club discovery de-duplicates its list and no longer recommends private clubs.
This release also includes a broad round of internal security, correctness, and reliability hardening from a full code review.
[0.20.4] - 2026-07-01
A standings-accuracy fix for round-robin tournaments.
Fixed
- Round-robin and double round-robin standings no longer award a player's bye point ahead of time. Because the full schedule is generated when the tournament starts, a bye scheduled for a later round used to show up in the standings (as an extra point, win, and game played) from round one — inflating that player's rank mid-tournament. A bye now counts only once its round is the current round. Swiss and knockout standings were unaffected, and final standings were always correct.
[0.20.3] - 2026-06-30
Account linking plus a broad round of reliability, security, and performance fixes.
Added
- Connect a Google sign-in to your existing account from your profile, so Google and email login both reach the same account.
Fixed
- Signing in with Google no longer creates a duplicate, empty account when the Google email differs from your original sign-up email (including a difference only in letter-casing). Saving your profile now shows a clear "username already linked to another account" message instead of failing silently on every retry.
- Viewing a player's profile (e.g. from a tournament or club) no longer shows a false "Player not found" after sign-in, caused by server-rendered authed data returning empty.
- Auto-discover in the report-result view no longer hangs on "Searching for games": a stalled request now times out and falls back to manual entry, and a previously infinite refresh loop was fixed (CHESS-164, CHESS-158).
- Knockout final resolution, Swiss round clamping, color-relaxed Swiss pairing, and sweeping disputed matches on player withdrawal (CHESS-157).
- Atomic and observable auto-forfeit, more reliable weekly digest and reminder delivery, and a self-report guard on match confirmation (CHESS-159).
- Atomic tournament and club creation together with their creator membership (CHESS-159).
- Real-time fixes: chat message de-duplication, notification-bell re-subscription, and toast dismissal (CHESS-158).
- Frontend stability: repaired frozen-signal effects, memory leaks, and admin-list races (CHESS-158).
[0.20.2] - 2026-06-25
Stability and security improvements across tournaments, notifications, and account privacy — no new features.
[0.20.1] - 2026-06-20
Added
- Forward-compatible client deserialization + v0.20.0 help/test cleanup
- Prefix test-deployment email subjects with [TEST]
Fixed
- Hide Join Tournament CTA on a full capped tournament (CHESS-140)
[0.20.0] - 2026-06-19
This is the Tournament Formats & Match-Flow release — two big milestones in one. Chess Manager now runs Swiss and single-elimination knockout tournaments alongside Round Robin, kills the manual link-exchange that drove half of all forfeits with automatic Lichess game creation, lets full tournaments run a waitlist with auto-promotion, gives players a way to dispute a wrong result, and adds calendar export so your matches land in any calendar app. It also closes a large round of correctness, feedback, and security polish.
Added
New tournament formats
- Swiss tournaments — organizers can now choose Swiss as the pairing system when creating or editing a tournament. Set the number of rounds (pre-filled with a sensible default of about log₂ of the field size), and the app pairs each round automatically from the live standings: no repeat opponents, balanced colors, and a clear bye callout (e.g. "Carol — bye, +1") for odd fields. Players and spectators see per-round pairings with each board's colors, the standings between rounds, and a "Round N of M" indicator. Before you start, a preview shows the resulting round count and estimated duration.
- Single-elimination knockout brackets — run a knockout tournament end to end. Seeding is frozen at the start (by rating, falling back to join order), and top seeds automatically get first-round byes when the field isn't a power of two. Winners advance round by round until a champion emerges, and forfeits and no-shows are always decisive — the higher seed advances, never a deadlock. Everyone sees a round-grouped bracket with proper labels (Final, Semifinal, Quarterfinal…) across the tournament page, the public spectator view, embedded widgets, and dashboards — not a flat point table.
- Participant caps — set an optional maximum participant count on any tournament (leave it blank for unlimited). Once full, further join attempts are cleanly rejected, and the cap holds even under a flood of simultaneous joins.
Match flow
- Automatic Lichess game creation — for a Lichess pairing, the app now creates a ready-to-play game automatically, restricted to exactly the two paired players and with each player's color already assigned, and surfaces the join link to both. Chess.com pairings (which have no game-creation API) fall back to the same one-click "Game link" entry flow. A background safety net reverts any dead or expired challenge back to manual exchange — and re-notifies both players — before a round deadline could forfeit anyone.
- Per-pair Lichess auto-create (opt-in) — players can grant a standing Lichess authorization from profile settings (separate from sign-in). When both players in a pairing have opted in, their game is created the moment pairings go live, with no manual step at all; pairings where one or both haven't opted in fall back to an open challenge, then to manual. Revoke the authorization anytime; if Lichess ever invalidates it, the affected match reverts to manual and prompts you to re-authorize — you're never forfeited because a token died. The authorization is encrypted at rest and purged when you delete your account.
- Nudge your opponent — for an unplayed match, send a single, rate-limited reminder (email and in-app, roughly once a day) to prod your opponent to play. "Exchange a link" reminders are automatically suppressed once a game has already been auto-created.
Disputes & waitlists
- Dispute a wrong result — the player who didn't report a result can now flag it as wrong, with a required reason and game link. The disputed match pauses only its own round — other rounds and other tournaments keep running. Admins get a side-by-side review screen showing both players' claimed results, the game link, and the match chat together, and can resolve it by accepting either result, overriding it, declaring a mutual forfeit (0–0), or dismissing it — with the outcome recorded as a system chat message.
- Tournament waitlists — when a capped tournament is full, players can join a waitlist instead of being turned away, and see their real position in the queue. When a slot opens up, the player at the front gets a time-limited offer (in-app and email) to claim it; decline or let it expire and the offer passes to the next in line. The cap is never exceeded, and no one is ever added to a tournament that has already started. Players can withdraw at any time, and organizers can view and manage the queue.
Calendar export
- Add matches to your calendar — download an "Add to Calendar" (.ics) file for a single match, a whole round, or your full tournament schedule, complete with a reminder alarm. Or subscribe to a personal, always-up-to-date calendar feed via a private link — rescheduling a match updates the existing calendar event in place instead of creating a duplicate. You can rotate the feed link from settings at any time, which immediately revokes the old one.
Admin
- Cross-tournament review dashboard — superadmins get
/admin/review, a single place to see open disputes and review items across every tournament at once, each labeled with its tournament name, rather than hunting through them one event at a time. - "Community & tips" broadcast audience — admin broadcasts can now target members who've opted into general community and tips email, alongside the existing product-update and marketing audiences.
Changed
- Honest feedback on every action — scheduling actions (propose / confirm / decline / withdraw a time, chat time-offers), notification-preference saves, and other mutations now show a loading state and surface real errors via toast or inline message, instead of silently failing or showing a false "saved." A declined time now carries its reason through to the opponent.
- Require a chess account to finish onboarding — new users must link at least one Chess.com or Lichess account before completing onboarding. If platform verification happens to be down, the gate fails open: entering a username is enough to finish, so a temporary outage never blocks sign-up.
- Easier navigation and clearer copy — Browse is now always reachable from the top navigation, and Feed appears when you're signed in. The public spectator view uses consistent "Participant" terminology, club pages show an explicit error with a retry when a section fails to load (instead of rendering empty), and clipboard "copy" affordances now report whether the copy actually succeeded. A past time can no longer be proposed for a match.
Fixed
- Manually advancing a Swiss round no longer prematurely marks the whole tournament as completed — it forfeits the current round and generates the next one, finishing only after the final round.
- Round counts now show correctly everywhere — the start-modal preview, the embed widget's "Round N of M", and round deadlines — instead of occasionally showing "0 rounds."
- You'll now receive at most one weekly digest per week and exactly one round-advancement notification per round, even when an advance is triggered from several places at once.
- A dispute raised mid-advance can no longer corrupt the next round's pairings.
- Background tasks now recover from transient failures instead of stalling — result verification backs off and retries, conflict flagging is written atomically, and broadcast email sending paces its retries instead of exhausting them in a couple of seconds.
- Upstream errors from Chess.com / Lichess now return a generic "try again" message to the client, with full detail kept to server logs; the platform-proxy and game-discovery endpoints are also rate-limited and gated to approved users.
[0.18.2] - 2026-06-07
Added
- Verify chess accounts during onboarding
Fixed
- Underline home recommendations empty-state link (CHESS link-in-text-block)
[0.18.1] - 2026-06-07
A patch release polishing the new Sign in with Lichess flow and the login page.
Fixed
- Sign in with Lichess now completes reliably — the token exchange uses request-body auth for the public PKCE client.
- The login page no longer freezes when an authentication error is shown.
- Only the sign-in button you click shows a spinner, not all of them.
- Removed a stray console error on the login page (invalid meta-tag CSP directive).
[0.18.0] - 2026-06-05
The Compliance, Admin Depth & Hardening milestone wraps up — a new Lichess sign-in option for players, plus a deeper admin toolkit (platform metrics, bulk actions, and broadcast emails).
Added
- Sign in with Lichess — players with a Lichess account can now sign in with one click, alongside Google, email OTP, and passkeys. First sign-in auto-fills your Lichess username so rating and game validation work right away. You can also link Lichess to an existing account from your profile.
- Platform metrics dashboard — Superadmins get
/admin/metrics: rolling DAU/MAU sparklines, signup velocity, waitlist depth, tournament and club counts, and operational counters (OTP volume, email by category, live WebSocket connections). - Bulk admin actions — Superadmins can multi-select rows and act in one go: approve / reject / deactivate users from the directory, feature / unfeature tournaments from
/admin/featured, and undo forfeits from a tournament's match list. Each row succeeds or fails independently, with a summary toast (e.g. "12 approved, 1 failed"). - Admin broadcast emails — Superadmins can compose and send an announcement to members opted into product-update or marketing emails from
/admin/broadcast: live recipient-count preview, markdown body with HTML preview, typed-count confirm step, resumable batched sending, and a history view with per-recipient delivery status. Every broadcast carries a "Manage email preferences" footer link.
Changed
- The audit-log viewer's filters now cover every v18 admin action and entity type (bulk actions, broadcasts, edit-on-behalf, hard-delete).
Fixed
- Hard-deleting a user (GDPR erasure) now also purges that user's personal-data export rows and ZIP files, so no exported copy survives the deletion.
[0.17.1] - 2026-05-23
Documentation refresh — the in-app User Guide now fully covers passkeys and reads more cleanly throughout.
Changed
- Passkey guide — the help page now walks you through registering, signing in with, managing, and troubleshooting passkeys, with a full list of supported platforms (Touch ID / Face ID / Windows Hello / Android fingerprint / FIDO2 keys).
- Clearer User Guide — friendlier intros for Account Approval, the Tournament Lifecycle, and Match Day; a more direct explanation of how round deadlines work; and tightened answers across the FAQ (including a new "How do I report a result?" entry).
[0.17.0] - 2026-05-22
The Compliance & Admin Depth milestone — passkey sign-in, personal data export, and deeper admin tooling.
Added
- Sign in with a passkey — register passkeys from your profile and sign in without a password, alongside Google and email OTP. Name, review, and revoke them from the new Security section in profile settings. Works on web, desktop, and mobile.
- Personal data export — request a ZIP of your profile, chat messages, and match history from profile settings. You'll get an email with a signed download link when it's ready.
- Admin audit log — Superadmins get a filterable audit log at
/admin/auditwith CSV export. Expand any row to see the before/after diff. - Admin edit on behalf of a user — Superadmins can edit a user's display name, chess platform usernames, and timezone from the user directory.
- Admin hard-delete — Superadmins can immediately erase an account for GDPR right-to-erasure requests, gated behind typing the user's email to confirm. Matches and standings are preserved (anonymized).
Changed
- Tapping Follow on a touch device now opens the confirmation modal before unfollowing.
- The "For You" see-all link on the homepage now actually keeps the For You sort.
Fixed
- Opted-out player profiles (searchable off) now signal
noindexto search engines. - Dashboard summary no longer fails to load when your match history includes opponents who have since deleted their account.
[0.16.1] - 2026-05-03
Security and reliability hardening. No new features; behavior is unchanged for normal use.
[0.16.0] - 2026-05-02
This is the Growth & Engagement release — Chess Manager opens up to spectators, makes the community visible, and helps you discover what's happening across the platform.
Added
Watch tournaments without signing in
- Spectator mode — anyone can now watch ongoing tournaments without an account. Live standings, match results, and round progress update in real time.
- Public player profiles — every player has a public page at
/player/{name}showing their tournament history, ratings, and bio. Privacy controls let you choose what's visible. - Embeddable tournament widgets — copy a snippet from any tournament to embed live standings on your club's website or blog. Works as a tiny iframe, loads instantly, no sign-in needed.
- Rich social previews — tournament and profile links shared on Discord, Twitter, WhatsApp, etc. now render as preview cards with the tournament name, status, and player count.
Connect with players and clubs
- Follow players and clubs — follow buttons on player profiles and club pages keep you informed about their activity.
- Activity feed — your homepage now shows what your followed players and clubs are doing: matches played, tournaments joined, achievements earned.
- Player bios — write a short bio (up to 200 characters) on your profile. Visible on your profile page and in the hover popover when others see your name.
- Achievements — earn badges as you play: tournament milestones (5 / 10 / 25 completed), first wins, referrals, and helping clubs grow.
Discover what's relevant to you
- "For You" tournament rail — homepage now suggests tournaments based on your activity (clubs you've joined, players you follow, time controls you prefer).
- Suggested players and clubs — homepage rails surface accounts worth following, with a privacy filter so private profiles aren't leaked.
- Trending tournaments — Browse page has a new Trending sort showing tournaments gaining momentum (new joiners + recent activity).
- Quick filter chips — 8 category chips on the Browse page for fast filtering (Active, Upcoming, Online, OTB, Rated, Casual, etc.) with live counts.
- Manage hidden recommendations — undo recommendations you've previously dismissed from a dedicated settings page.
Invite friends, earn rewards
- Referral system — every account gets a unique referral code. Share it via
/join?code=YOUR_CODE(or the matching invite link in club emails) and earn achievements when invitees complete tournaments. - Referral landing page —
/joinpage shows who invited you, with a clear sign-up CTA and rich social previews.
Changed
- Homepage — replaced the generic landing with personalized rails (For You, Suggested Players, Suggested Clubs, Activity Feed).
- Notification preferences — redesigned with cleaner toggle layout and full screen-reader support.
- Public visibility — tournaments and player profiles are now spectatable by default, in line with the spectator-mode launch. Private and club-only tournaments remain unaffected.
Fixed
- Activity feed occasionally dropped items posted at the 5-minute or midnight boundary.
- Bio character counter showed wrong limits for non-ASCII text (emoji, accented characters).
- Achievement totals didn't refresh immediately after a tournament completed.
- Email subject lines could appear garbled when they contained non-ASCII characters.
- Bio editor was saving on every keystroke; now debounced to feel snappier.
[0.15.1] - 2026-04-07
Fixed
- Superadmins can now see all tournaments in the list view, including finished and club-visibility tournaments they are not a member of
[0.15.0] - 2026-04-06
Changed
- Simplified tournament visibility from two toggles (tournament visibility + participant visibility) to a single two-level model: Public (everyone sees everything) or Club (only club members see the tournament and its participants)
- Removed participant visibility toggle from tournament detail page, create form, and edit form
Fixed
- Draft tournaments no longer visible to non-creator/non-admin users in tournament list
- Draft tournament details no longer accessible by UUID to unauthorized users
- Superadmins can now access private club tournaments (previously got access_denied)
- Notification toggle checkboxes now have proper aria-label attributes for screen reader accessibility (fixes flaky WCAG test)
[0.14.3] - 2026-04-06
Fixed
- Help page tiebreaker order corrected to match code: Buchholz → Sonneborn-Berger → Head-to-head → Wins (was incorrectly showing SB first, missing H2H)
- Help page tournament lifecycle diagram now shows Draft→Cancelled and Completed→Cancelled transitions
- Help page Cancelled status description updated to include all source states
Added
- Help page "How Round Deadlines Work" section explaining that games must be played AND reported before the deadline, with the three enforcement points (contact → forfeit → round)
- Help page "How Verification Works" section detailing username, time control, result, and timing checks with 48h retry window
- Help page scheduling presets now show full config (contact, forfeit, response deadlines and grace period)
- Help page bye note explaining 0.0 tiebreaker contribution for bye matches
[0.14.2] - 2026-04-06
Added
- Inline tournament visibility toggle (public/private) on tournament detail page with confirmation modal
- Private option disabled when no club is assigned (enforces private-requires-club constraint)
[0.14.1] - 2026-04-05
Fixed
- Match row player names overflowing into schedule/action buttons on mobile viewports, causing unclickable buttons
- Assignment modal tournament list extending beyond viewport on mobile, making items untappable
[0.14.0] - 2026-04-05
Added
- Club-to-tournament assignment system — club admins can request tournament slots, tournament owners approve/reject
- Assignment UI on both tournament detail and club detail pages
- Auto-reject pending assignment requests when a tournament is cancelled or ended
- Assignment notification emails for request, approval, and rejection events
- Tournament visibility toggle with confirmation modal on tournament detail page
- Per-option disabled state support for inline visibility toggle
Changed
- Standardized visibility labels and badge colors across all surfaces
- Removed visibility field from tournament edit form (now managed via dedicated toggle)
[0.13.1] - 2026-04-04
Added
- Club visibility toggle — owners and admins can switch clubs between private and public at any stage
- Tournament visibility toggle — owners and admins can switch between public and participants-only at any stage
- Profile popover on hover/click showing player summary (display name, chess accounts, rating) with privacy filtering
- "View full profile" link in popover navigating to dedicated player profile page
- OG meta tags on homepage, club pages, club join page, and tournament pages for rich social previews
- Full invite URL format (chessman.club/clubs/join?code=X) in UI copy buttons and email invitations
- Clickable join link in club invite approval emails
- Sign-in prompt for unauthenticated users visiting player profile pages
Fixed
- Deactivated users can now access club join pages instead of being redirected to waitlist
[0.13.0] - 2026-04-03
Changed
- Migrated production data, all user profiles, tournaments, matches, standings, and round deadlines preserved
- Test accounts excluded from migration
[0.12.1] - 2026-03-23
- Minor improvements
[0.12.0] - 2026-03-18
Added
- Onboarding checklist on the homepage guiding new users through profile setup, chess account linking, and first tournament
- Profile completeness banner nudging users to fill in missing details
- Dismissed hints persistence — onboarding hints stay dismissed across sessions
- "Create a Tournament" hero CTA card on the authenticated homepage
- Clubs discovery section on the homepage (browse clubs, create a club)
- Compact mobile layout for tournament cards
Improved
- Tournament header actions grouped by role with clear visual hierarchy — primary actions prominent, secondary actions in overflow menu
- Consistent terminology: "Player" renamed to "Participant" across all tournament UI
- "Report match" unified to "Report result" throughout the app
- Waitlist rejection page rewritten with empathetic tone ("We couldn't approve your account yet")
- Tournament action error messages now include the tournament name for clarity
- Browse filter bar no longer sticky on mobile (avoids viewport clutter)
[0.11.1] - 2026-03-15
Added
- Add club association selector to tournament edit form
- Add visibility indicators to tournament cards and header
Fixed
- Disable private visibility option for non-club tournaments in edit form
[0.11.0] - 2026-03-15
Added
- Add visibility indicators to tournament cards and header
Fixed
- Various small UI changes
[0.10.1] - 2026-03-13
Added
- Allow tournament admins to read match chat messages
Fixed
- Extend chat auth to check superadmin and club admin roles
- Chat messages now display with proper left/right alignment like a typical chat app
- Admin/superadmin chat view shows two-sided conversation instead of all messages on one side
[0.10.0] - 2026-03-12
Improved
- Forms now validate as you type and show errors inline — no more submitting bad data and waiting for a server round-trip
- Save button sticks to the bottom of the screen on long forms so you never have to scroll back up
- Filter bars scroll horizontally on small screens instead of wrapping awkwardly
- Modals go full-width on phones with proper overflow handling
- Buttons and interactive elements are easier to tap on touch devices
- Notifications "mark all read" now shows a loading spinner and displays a toast if something goes wrong
- All actions (saving, deleting, updating) now show success/error toast feedback
- Page layouts are more consistent across screens with better responsive headings
Fixed
- Club name validation now works correctly when creating or editing a club
[0.9.4] - 2026-03-08
Added
- Add Sign In button to navbar for unauthenticated users
Fixed
- Several bug fixes
[0.9.2] - 2026-02-26
Fixed
- Security hardening and multiple vulnerability fixes
[0.9.1] - 2026-02-24
Fixed
- Improve readability of muted state color backgrounds (CHESS-216)
- Fix creating private tournaments when user already has a club (CHESS-218)
- Profile bugs — wizard data loss, false verification, unsaved warning (CHESS-213, CHESS-214, CHESS-215)
[0.9.0] - 2026-02-22
- Early Access Beta release — thanks for being here early.