Changelog
All notable changes to Chess Manager will be documented in this file. The format is based on Keep a Changelog.
[0.29.0] - 2026-08-14
One mailbox is now one account, deleting your account removes every way back into it, and a wrong sign-in code can no longer lock you out.
Fixed
- Five wrong sign-in codes no longer lock you out for ten minutes. The used-up code is now retired immediately, so asking for a new one really does send one.
- You can cancel a scheduled deletion from the page you land on. The Cancel button was only on your profile — the one page a deletion-scheduled account is sent away from.
- Signing in with Lichess or Google no longer creates a second, empty account when your address is stored with different capitalisation, leaving your clubs and history on the original.
- Connecting Lichess now tells you when that username is already taken, instead of appearing to succeed and changing nothing.
Changed
- A code that doesn't work always says "Invalid or expired code" — wrong, expired, already used, or out of attempts. The reply used to differ between those cases, which let anyone test whether an address had an account here.
- Removing your last way to sign in is refused. Add another passkey or connected account first.
Security & reliability
- Deleting your account now removes every way back into it. Passkeys and standing Lichess permissions used to survive erasure, and deleting a second account failed outright.
- A half-finished "connect this account" step can no longer be picked up by the next person on a shared computer. Those steps now expire and are tied to the account that started them.
- Removing a passkey or connected account signs out the sessions it created.
- A flood of sign-in code requests can no longer block email sign-in for everyone else.
[0.28.1] - 2026-08-13
A failed sign-in email no longer locks you out, and email outages no longer go unnoticed.
Fixed
- A sign-in code that fails to send no longer locks you out for ten minutes. When our mail provider refused the message — as it did when the mail host hit its daily quota — the code was still treated as sent and kept alive for its full ten minutes. Every "send me a code" after that came back looking fine, instantly, having sent nothing at all, so signing in appeared simply broken with no way out but waiting it out. A code whose email fails to go out is now discarded on the spot, so asking for another one really does send another one.
Security & reliability
- We're now alerted within minutes when outbound email stops working. Sign-in codes, notifications and invitations all travel by email, and until now a complete outage produced no signal at all — the last one came to light only because someone told us. Failing sends now raise an alert that quotes the provider's own reason, sent by a fallback route so the warning still arrives when the usual sender is the very thing that's down. A successful send clears it again.
[0.28.0] - 2026-08-12
Club invite links work with Lichess and Google sign-in, and connecting Lichess to an existing account no longer takes two trips.
Added
- If you sign in with Lichess and that email already belongs to an account, we now offer to connect that Lichess account in one click. We still won't merge the two automatically — a Lichess email can't be confirmed as verified on our side, so joining accounts on the strength of it isn't safe. But instead of turning you away, we hold on to the Lichess account you just proved you own, and once you've signed in your usual way we ask whether to connect it. Confirming takes one click and doesn't send you back to Lichess. Previously this was a dead end: you had to work out which credential your account used, sign in, find the setting in your profile, and authorize on Lichess all over again.
Fixed
- Club invite links now work when you sign in with Lichess or Google on an account you've used here before. Following an invite link and signing in that way quietly dropped the invitation: you arrived signed in but not in the club, with nothing to show for the link you'd clicked. If you were still waiting for your account to be approved, the invite was supposed to let you straight in, and instead you were left on the waitlist with no way forward. Invitations are now honoured however you sign in, and land you on the club you were invited to.
- Signing in with an email code is now what we suggest when your email already has an account. The old message told you to "sign in with your existing method", which is the one thing that's hard to remember at that moment. An email code works whichever way you originally signed up.
[0.27.2] - 2026-08-11
Admin tooling improvements.
[0.27.1] - 2026-08-10
Updates no longer risk leaving the site down.
Security & reliability
- The app now restarts reliably when a new version is deployed. Every startup re-checked the sign-in session table, and on a busy site that check could sit waiting behind ordinary sign-in traffic until it gave up — leaving the new version unable to start at all. Startup now skips the check once the table is in place, so an update can no longer be blocked by people using the site while it happens.
[0.27.0] - 2026-08-10
Tell us what you think — and a sign-in security fix.
Added
- A short feedback survey now appears in the app for active players. If you've finished at least one match, a dismissible banner invites you to a survey about what's working and what isn't. It only shows while a survey round is running, and dismissing it means you won't see it again.
Security & reliability
- Sign-in codes now strictly enforce the 5-attempt limit. Under database load, a failed attempt could fail to be counted, quietly handing out extra guesses against the same code. Every attempt is now counted or refused, so the limit always holds. In the rare case a database hiccup blocks your first try, requesting a new code gets you in.
[0.26.1] - 2026-07-31
Browse filters always show the list you actually asked for.
Fixed
- Browse filters no longer leave a stale tournament list on screen. Switching filters quickly — Open, then Active, then All — fired off several lookups at once, and whichever answer came back last won, even an out-of-date one. The list could end up showing tournaments that didn't match the filter you'd picked, and a "load more" overtaken by a filter change could mix old rows into the fresh list. The newest answer now always wins.
[0.26.0] - 2026-07-30
Invite a friend works again for everyone who signed up since v17.0, edit forms warn you before you lose changes, and match chat opens where the conversation actually is.
Fixed
- Invite a friend works again for every account created since v17.0. The invite screen returned "not found" for that entire group of accounts, because they never received a referral code. New signups now get their code as part of signing up, and the accounts already missed have been backfilled.
- You're now warned before leaving a tournament or club edit form with unsaved changes, with the choice to save, discard, or stay. Leaving previously lost the edits silently. An untouched form never interrupts you.
- Match chat opens on the newest message. Opening a chat with history left you at the very top of the conversation, and a message arriving while you read appended below the fold, out of sight, with nothing to indicate it.
Security & reliability
- Account sign-in and account-linking hardening, plus capacity and page-stability improvements across the site.
- A deactivated account can no longer sign back in and lift its own deactivation. Every sign-in method now refuses accounts deactivated by an admin, and cancelling an account deletion only works for a deletion you requested yourself. Accounts that asked to be deleted still sign in normally during the 30-day grace period, so you can still change your mind.
[0.25.2] - 2026-07-29
The Google sign-in button now looks the way Google's own does.
Changed
- "Continue with Google" now uses Google's official button design. The Google "G" was drawn as a single flat shape in the button's text colour — a white silhouette on an indigo button — rather than in its four brand colours, and the button used the app's accent colour instead of one of the three Google permits. Both are required by Google's sign-in branding guidelines. The button is now white on the light theme and near-black on the dark one, with the mark in full colour; the same corrected mark appears beside "Connect Google" in your profile.
[0.25.1] - 2026-07-29
The home page now arrives with tournaments already on it.
Fixed
- The home page shows tournaments the moment it loads. Recent and featured tournaments only appeared once the page had finished starting up, so the first thing a signed-out visitor got was a headline, two buttons and an empty section. Anything that reads the page without running it — a search engine, a shared-link preview — saw only that.
[0.25.0] - 2026-07-27
Report a result without being told your time control is wrong, find the game you played after the deadline, and clear cancelled tournaments out of your list.
Added
- Cancelled tournaments can now be deleted, so they stop piling up in your tournament list. Drafts and cancelled events can go; a live or finished tournament still has to be cancelled first, because deleting one takes its pairings and results — and both players' game history — with it.
Fixed
- The report screen no longer claims your time control is wrong when it matches. Pasting a game link into a 10+5 tournament could warn "Time control: 10+5 (tournament requires 10 +5)" — the same control, rejected because it had been typed with a space. The same check quietly flagged every correctly-played game in tournaments with no increment, written either as "10+0" or as just "10".
- Auto-discovery now finds games played after the deadline. The search only covered the 48 hours either side of a match's scheduled time, but matches are routinely played later than that — so the game wasn't found and the link had to be pasted by hand. Discovery now looks from 48 hours before the scheduled time up to two weeks after it.
- Actions no longer leave the page stuck after they've worked. Resolving an item in the Review tab, or starting a tournament, could complete on the server and then hang — the dialog staying open or the spinner never stopping — until the page was reloaded.
- Tournaments whose time control is written as just "10" now create real Lichess games. They were being created as correspondence games instead of a 10+0 clock.
Changed
- Time controls are stored in one consistent form. "10 +5" and "10+5" are the same control, and are now saved as the same value; existing tournaments are tidied up automatically. This also means they group and filter together in browse and in your recommendations.
[0.24.0] - 2026-07-25
Record the right winner every time and correct a result after it's been reported — plus a reliability, accessibility and privacy pass over the whole app, and a signup flow that no longer loses your work.
Added
- Correct a recorded result. Organizers and the player who reported a match result can now edit a completed result — the old "Match already completed" dead end is gone. The corrected result is re-verified automatically, and a knockout match whose winner has already advanced is steered to bracket correction so the bracket is never left inconsistent.
- Tournament tabs are now shareable and Back works. The tab you're on is reflected in the page address, so you can link someone straight to Standings or Matches, and the browser's Back button steps between tabs instead of leaving the tournament.
- Screen readers now announce live tournament updates. New pairings, standings changes and reported results are read out as they arrive, and the match chat is announced as a live conversation rather than staying silent.
- A clear "Live updates paused" indicator appears when the connection to the server has genuinely been failing for a while, so you know the page is showing stale data instead of quietly wondering.
Fixed
- Games where the two players had reversed colors now record the correct winner. When a Lichess or Chess.com game was played with colors swapped from the tournament pairing, the result could be attributed to the wrong player — for example "Rubing vs szshen 1-0" when szshen actually won. Results are now matched by username rather than board position, so the winner is always correct: the report screen shows the right result before you submit, and games that were recorded incorrectly earlier are re-checked and corrected automatically.
- The result button now reads "Report result" instead of just "Report", so it's clear it's for entering your game's result — not for reporting misconduct.
- Clearer guidance when a Lichess game can't be auto-created — if a player hasn't linked their Lichess account yet, the match now says so, instead of a generic "Couldn't auto-create".
- Clearer messages for Sign in with Lichess and account linking. The confusing "OAuth configuration error" is now a plain "Lichess sign-in is temporarily unavailable", and problems while linking your Lichess account now show up on your profile instead of failing silently.
- Ongoing or aborted games pasted as a game link are no longer pre-filled as a draw — the report screen steers them to manual entry, matching the existing behaviour for auto-discovered games.
- Signing in with Lichess no longer erases your Lichess username. Finishing the welcome flow after signing up through Lichess wiped the very account link that had just been established — leaving nothing connected, and in rare cases removing it from another account too. Your handle is now preserved.
- The welcome flow no longer loses what you typed. Reloading the page while filling in your profile discarded everything, despite the app appearing to save a draft. Your entries are now kept as you type.
- Your answers in the welcome flow are no longer forgotten. Choosing whether you're a player, an organizer, or both is now remembered, so the checklist and suggestions afterwards actually match what you picked — and stepping Back no longer silently resets that choice.
- On a shared computer, one person's half-finished signup can no longer leak into the next person's. A partly-completed welcome flow left the display name and chess/Lichess handles behind in the browser, where the next person to sign in could unknowingly save them onto their own account.
- The welcome flow now tells you what went wrong. If saving your profile failed — for example a display name or chess handle that's already taken — you got a generic "please try again" that could never succeed, with no way to leave the page. It now shows the actual reason so you can fix it.
- Announcement emails are no longer reported as sent when they weren't. A misconfigured mail provider caused broadcasts to be marked delivered while nothing was actually sent.
- Swiss tournaments with an awkward number of players no longer fail to pair a round. When the automatic bye choice made a round impossible, the round could not be generated at all; alternative byes are now tried.
- A tournament round no longer accepts a deadline that ends before it begins.
- Private tournaments left without a club can no longer be joined by people who shouldn't have access.
- Menus now close with Escape, form labels on the login and browse screens are properly associated with their fields, and light-theme accent and success colours were darkened to meet WCAG AA contrast.
- Editing a tournament or club no longer traps you on the page. In-app navigation was being silently cancelled with no prompt explaining why.
- A brief connection hiccup is no longer reported as "access denied". A momentary drop while watching a tournament could look like you'd lost permission to view it; it now reconnects quietly.
Changed
- Pages load faster, and long match lists load in pages instead of all at once.
- Personal data exports are limited to 10 requests an hour per account, so one person repeatedly requesting an export can't slow the site down for everyone.
Security
- Email addresses are no longer written to server logs. When a message failed to send, the recipient's address was recorded in the logs; only a short irreversible fingerprint is kept now.
[0.23.0] - 2026-07-23
Run tournaments you're not playing in — organize without competing, step out of your own event, or hand it to someone else.
Added
- Organize without competing — a new Organize only option when you create a tournament runs it without entering you as a player, so you never appear in the pairings or standings while keeping full organizer control. Because you're not competing, you'll need at least 3 other players to register before you can start.
- Leave your own tournament as a player — if you created a tournament and joined it to compete, you can now click Leave as player to drop out of the standings while staying the organizer with full control.
- Hand a tournament to another organizer — the organizer (or a superadmin) can transfer a tournament to another participant from the actions menu. The successor becomes the organizer immediately and is emailed the news; if you were also competing you stay on as a co-organizer, and if you were organizing only you step out entirely. Transfers are allowed while a tournament is in Draft, Open, or Active, and because every tournament always has exactly one organizer, a handoff always names a successor.
Fixed
- The time control field no longer rejects valid entries like "15+2" with a false "Increment cannot be empty after +". Completing a valid time control right after an incomplete one (such as "15+") could leave the earlier error on screen and block the form; the field now always validates the value you've actually entered.
[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.