Changelog
Every change a host or a player would notice, newest first.
August 26, 2026
ChipClock is now PokerLeagueOS, at pokerleagueos.com. The name says what the product grew into: not just a tournament clock, but the whole league. Seasons, schedules, standings, seating, payouts and the player companion are all the same product you were already using, under a name that covers it. Old chipclock.com links redirect, so nothing you have shared stops working. Your league, your players, your results and your saved setups are untouched.
New look throughout: a darker, higher-contrast theme built for a room with the lights down, with every number set in a fixed-width face so the clock, chip counts and standings line up and stay readable across the table.
The marketing site was rebuilt from scratch around what a league actually does across a season, with an honest pricing page: paid plans are not open for sign-up yet, so it now says so instead of offering a trial you cannot start.
August 26, 2026
ChipClock now keeps its own diagnostics instead of sending them to an outside service. When a page is slow or something breaks, the record of it lives in our database with the rest of your league's data, and it is deleted automatically as newer records arrive. Nothing is shared with an analytics or error-reporting company, and nothing tracks you across other sites. The privacy policy has a new Diagnostics section describing exactly what is kept.
August 26, 2026
Player initials in the companion are unchanged, but the unused photo fields behind them are gone. The app carried a player-photo column that nothing could ever set, so the coloured initial was always what you saw. Removing it trims every roster and standings response. If photos are wanted later they will be built as a real feature rather than a half-wired one.
You can now correct a player's season points for a tournament. Open the results for that night, tap the pencil next to their name, enter the points and a short reason. The reason is shown to the player on their season history, so write it for them. Adjustments are org-admin only, appear in the tournament timeline, and clearing one puts the scored points back. Until now the app could display an adjustment but nothing could make one.
Re-saving results for a tournament that already had them no longer fails. Reopening saved results and saving again was rejected unless you retyped every payout amount, because the payouts came back as text and the save expected numbers.
Tournaments that pay fixed dollar amounts now show those amounts on the player companion. If your structure is "$300, $200, $100" rather than percentages, the Payouts list and the Deal tab were reading every place as $0 whenever the prize pool worked out to zero, which happens when check-ins were not recorded. Both now show what you actually promised, and a fixed place no longer displays a meaningless 0%.
The deal calculator no longer offers up money that has already been won. With five paid places and four players left, 5th belongs to whoever just busted; the chip-chop column was still dividing it while the ICM column ignored it, so the two columns disagreed by that amount. Both now work from the places genuinely still in play.
August 25, 2026
Editing a tournament that is not yours, or one that no longer exists, now says so instead of reporting success. The save reported "saved" and quietly changed nothing, which is the worst of both answers. Nothing was ever readable or writable across leagues; the request was correctly ignored, it just was not reported.
August 25, 2026
Two of the player companion's tabs were sharing one request budget. Your tournament view and your career view each allow 60 refreshes a minute, but they were counting against the same total, so flipping between them on a busy night could stop one of them loading for up to a minute. They now have their own budgets.
August 25, 2026
Starting a tournament from a template no longer loses your sound preset or your table names. A tournament saved as a template carried both, and the Library kept them, but the new-tournament screen had nowhere to put them: the sound preset silently reverted to the standard set and custom table names came back blank, every time. Both now come through with the rest of the setup. Templates you already saved keep the values they were holding.
The template badge on the new-tournament screen is more reliable. It reads green while your setup still matches the template and orange once you change something, and opening a template from the Library could briefly settle on orange without you touching anything.
A player searching for their seat on the TV clock no longer gets the page zoomed in on an iPhone, with no way to zoom back out.
August 25, 2026
New passwords must now be at least 10 characters, up from 8. Existing passwords still work; the new length applies when you sign up or set a new one.
You now get an email whenever your account's password or email address changes. If a change was not you, that message is the warning, and it arrives whether or not you were at the keyboard.
An account could finish signing up and end up with no profile record behind it, which left the app unable to resolve the person's name anywhere it appeared. Creating that record no longer depends on the browser making it back from the confirmation email, so it cannot be missed. The one account already in that state has been repaired.
Signed-in pages verify your session without a round trip to the login service on every request, which takes a step out of the wait before a page starts rendering.
August 25, 2026
Retry-safe requests are now safe when they arrive together, not just one after another. An Idempotency-Key reserved its slot only after the work had finished, so two copies of the same request landing at the same instant both ran: two identical blind schedules saved, two sessions created, or a player charged for two rebuys off one tap. The key is now claimed before the work starts, and a duplicate that arrives while the first is still running is turned away instead of repeating it. This affects API and integration callers; the app's own screens were not sending duplicate keys.
The database now rejects a malformed write to any of its structured fields outright. That class of fault used to store a scrambled copy that read back correctly through the app while search and filtering silently found nothing in it. It is the fault behind minigame names going missing from the live feed earlier this month.
August 25, 2026
Season points now use one field size everywhere. A tournament's point chart was matched against the number of players who had paid, while the default scale counted the results you entered, so points could shift the moment you saved. More seriously, a tournament where you never recorded check-ins counted as a field of zero, which matches no tier in your point chart at all, so the chart was skipped without a word and everyone scored off the built-in scale instead. Already-saved standings are untouched.
Editing a saved template no longer wipes its payouts. The editor only knew how to show fixed dollar amounts, so opening a template that paid by percentage (50/30/20, say) read every place as $0 and saving wrote the zeros back. Any tournament built from it afterwards paid nothing. Percentages, fixed amounts and saved payout schedules are now each shown as what they are, and a template whose payouts the editor has no control for is left exactly as it was.
A template backed by a saved payout schedule keeps that link when you edit it, and you can now change or remove the link from the template editor instead of having to rebuild the template.
Editing a template no longer resets each minigame's scoring type. A game you had set to Judged went back to whatever its name implied, quietly changing how its leaderboard ranked. The template editor now shows the scoring type per game, like the setup wizard does.
A template whose blind structure comes from the Library now shows that schedule's current levels while you edit it, rather than an older copy that saving would have made permanent.
August 25, 2026
Private tournaments. A new switch in Tools › Share (and on the setup wizard) turns off the TV clock and the player companion for a game, so a link that leaks does not expose your roster, chip counts or feed. Present mode and the host screens are unaffected, and flipping it either way is recorded on the tournament timeline.
Templates now hold the whole tournament, not part of it. Bounties, minigames, the rebuy and add-on cutoff levels, the house cut, career recording, the host-tools setting and your usual turnout all save with a template and come back when you use it. Previously the template had nowhere to put them, so every one of those reverted to a default on the next game you built from it.
Hitting the template limit on the free plan now says so. It was answering with a blank error page, so the only signal that you had run out was the template not appearing.
Corrected the API reference at /openapi.json and /llms.txt. It listed PUT where the endpoint takes PATCH, described a few endpoints that do not exist, and advertised retry-safe Idempotency-Key support on nineteen endpoints that ignore the header. A test now compares the reference against the real routes on every build.
Rehosting a tournament now copies the whole setup. The bounty amount and type, the minigame list, the add-on cutoff level and the “count toward career history” setting were all being reset to their defaults on the copy, so a rehosted bounty night came back as a plain freezeout with no minigames.
Bounty knockouts now show the amount won in the tournament timeline. Standard bounties were rendering as a plain elimination with no money attached, while progressive ones showed theirs, which made it look like standard bounties were not being tracked at all.
Recording a minigame result now needs the same permission as approving one. A co-host without check-in rights could add results to the minigame leaderboard even though the approve button was correctly closed to them.
Sharing a ChipClock link now shows a preview card. Links to the home page had no card at all, and the pricing, features, FAQ, about, agents and changelog pages were serving a login page to Slack, iMessage and every other link preview instead of their card.
Minigame results in the player companion's Feed now show which minigame was won. Every one of them read “a minigame” instead of “High Hand” or “Low Hand”, because the name was being stored in a form the feed could not read back. Past results were repaired too, so old feeds read correctly now.
Signup and password-reset emails no longer stop going out after the second one in an hour. If you invited a group and some of them never got their confirmation mail, that was the cause.
Creating a point chart through the API now accepts an Idempotency-Key, matching the other Library resources, so a retried request cannot leave you with two copies.
Moving a player into a seat someone else is sitting in now works. It had been failing with an error since early June, so the two players never swapped. If you tried this mid-tournament and nothing happened, that was why.
Seating a player who has no seat yet into an occupied seat no longer removes the player already sitting there. It now tells you who is in the seat and leaves them alone, so nobody quietly vanishes from the seating chart.
Season standings now add up prize money correctly. Total winnings were being joined together instead of summed, so the earnings column showed a dash for most players and could break the season page for anyone with exactly one cash.
Setup template limits now count per league rather than per person, so a league on the free plan gets the three templates the plan describes instead of three each.
August 17, 2026
League rules PDF. Upload your house rules once from Library > Rules and every player can pull them up on their phone during the game, straight from the companion page. Replacing the file updates it everywhere immediately, and you can remove it at any time.
The player companion's Me tab now shows your real finishing position once a tournament is complete, instead of leaving you at your last live standing.
August 14, 2026
Live league standings on the player companion. When a tournament belongs to a season, players see where the season standings sit right now, including the game in progress. Anyone already eliminated is scored at their real finishing position, and everyone still alive is scored at the worst they can now finish, so the table updates on every bust instead of waiting for the final result.
Season standings on the companion Season tab, so players can check the league table without leaving the clock.
July 23, 2026
Three ways to seat a room. Choose whether players are seated as they pay in, all at once when you are ready to start, or entirely by hand. The setting saves into your setup templates, so a league night and a casual game can each open the way you actually run them.
Seat anyone at any time. The Tables view now lists everyone waiting to be seated, lets you pick an exact seat, add a table on the spot, and open a new table with one button. You are no longer locked into the seating that happened at check-in.
Career achievements and head-to-head on the player companion. Players see the milestones they have actually earned (no empty locked grid), plus who they have knocked out the most and who has knocked them out the most.
Start time, finish time, and total run time on the Results report, for example 7:12 PM to 11:48 PM over 4h 36m. It measures from when the clock really started, not when you first opened the setup.
July 22, 2026
Export to CSV. Download your roster, season standings, and tournament results as spreadsheet files for records, dues, or a league email.
Printable sheets. Print or save-as-PDF a clean seat draw, payout sheet, or results sheet to post on the wall or hand to the room.
Fixed a crash when opening the Export view on a tournament with a saved payout structure.
June 28, 2026
Tournament setup is now two pages instead of three, with fewer jumps between related settings. Changing pages also scrolls you back to the top, and a missing tournament name is flagged right where the Next button is rather than silently failing.
Season sub-tab in the player companion's History, plus tap-to-expand detail on any past tournament, so a player can see how a specific night went without leaving the page.
Adding a large roster in one go is noticeably faster.
June 27, 2026
Minigame leaderboards. Pick how each side game is scored (most wins, best hand, and so on), set a Bad Beat game up from a preset, and the tallies build themselves as you record results. Winners can be reordered by hand, and the leader gets a medal on every screen that shows the game.
CSV import across the Library. Paste or upload a spreadsheet to build a blind schedule, payout table, point chart, or chip set instead of typing every row. Each importer ships a template file, flags bad lines by line number, and loads the result into the normal editor so you review before saving.
Best N of M season scoring, editable on the season page. Count a player's best 8 of 12 nights and the leaderboard applies it everywhere.
Rename a tournament after it is created, from either the tournament page or the list.
The leaderboard now opens on the active season by default and falls back to all-time when no season is running, with a direct link to manage seasons.
The loaded setup template is highlighted correctly on the first setup page, including when you arrive from a Library link, and no longer shows as modified just because a number is formatted differently (30 and 30.00 now match).
June 26, 2026
Point Charts. Save your league's points-by-finishing-position table in the Library, per player count, and results award points from it automatically. Tournaments without a chart keep using the built-in scale.
Table advice while you run. The host screen, Present mode, and the TV clock now flag an unbalanced table and suggest the right move: balance seats, break a table, or go to the final table.
The TV clock no longer repeats the pause announcement every few seconds while the tournament is paused.
Timeline entries for level changes no longer label automatic advances as manual and vice versa.
June 22, 2026
Spoken announcer — the clock can now call the room out loud: "Shuffle up and deal" at the start, the new blinds at each level, when play pauses and resumes, the start of a break, "take your seats, cards are back in the air" when a break ends, and a heads-up to color up chips. Turn it on alongside the sound alerts. It uses a recorded announcer voice and now works on iPad and iPhone, where the browser's built-in speech was previously silent.
Announcements no longer double up — with the host screen and the TV clock open in the same browser, each level change is announced once instead of two voices talking over each other.
Recording a minigame result is now safe to tap twice — a double-tap or a flaky connection can no longer log the same minigame win as two separate results.
June 10, 2026
"You've been moved" alert on the player companion — when table balancing reseats you, a one-time banner shows your new table and seat (e.g. "Now at Table 2 · Seat 5"), then fades on its own. No more wondering where to go after a break.
Moving a player into a seat held by another active player no longer drops the player who was sitting there — in some cases the displaced live player's seat assignment could silently disappear instead of swapping. They now swap seats correctly.
Payouts can no longer exceed the prize pool when a structure mixes fixed dollar amounts with percentages — e.g. $60 to 1st plus 50% to 2nd on a $100 pool. The percentage share is now capped at whatever the pool has left after the fixed amounts, so the payouts always reconcile to the pool.
The clock now auto-advances correctly even after you step back to an earlier level — previously, using Prev Level (or jumping to a lower level) could silently disable auto-advance, leaving the timer sitting at 0:00 until you advanced by hand.
The "outside the season window" warning no longer misfires for evening tournaments — it was reading the game's date in UTC, which rolled a 7pm game to the next calendar day and falsely flagged games played on the season's last night.
Creating or cloning a tournament is now all-or-nothing — a hiccup mid-create can no longer leave a half-made session with no clock that shows in your list but can't be run.
Accepting, declining, or revoking player-submitted requests (knockouts, rebuys, minigames) now requires the matching host/co-host permission — a player-role member or a co-host without that permission can no longer resolve them.
Pages and API calls you don't have access to now return a clean "not authorized" / "sign in" response instead of a generic server error.
June 9, 2026
Seasons — group a run of tournaments into a league season and track a points standings across all of them. Create a season with an optional start/end date, then assign tournaments to it when you create or clone them (or link existing ones). The Seasons page shows the full standings — games played, points, best finish, and average — and you can delete a season when it's done.
Pick a season at tournament creation — the new-tournament wizard has a season selector, so each night's game lands in the right league standings from the start. Cloning (rehosting) carries the season forward too.
Season standings filter on the leaderboard — narrow the org leaderboard to a single season instead of all-time, so league nights and one-off games don't blur together.
Season tab on the player companion — when a tournament is part of a season, players see the live season standings (and their place in it) right alongside the clock and feed.
Hand-for-Hand mode — near the bubble, tap Hand-for-Hand to freeze the level timer so the blinds can't go up while tables finish their hands in lockstep. It shows as a clear badge on the host screen, the TV clock, Present mode, and every player's companion, and resumes the countdown cleanly when you turn it off.
Soft "outside the season window" flag — if you link a tournament that was played before or after the season's date range, the Seasons page marks it so you can catch a mis-linked game, without ever hard-blocking the link.
May 22, 2026
Payout schedule auto-pilot — saved schedules from Settings now apply themselves on /sessions/new when Expected Players matches a row (no more clicking Apply), and the session keeps re-evaluating live as players actually pay in. If 8 was expected but 12 show up, the session's payout structure automatically shifts to the 12-player row. Matching is exact-first, then falls back to the highest row ≤ paid count.
Custom payouts are dollar amounts, not percentages — on the new-tournament wizard and setup template editor, Custom mode now takes $ inputs and shows a dollar total instead of a 100% sum constraint. Top 3 / Top 5 presets keep their percentage semantics (they're proportional by design).
Door Mode "Outstanding" label no longer truncates to "OUTSTANDI" on phone viewports — renamed to "Owed" so it fits the 5-column stat rail at 390px.
Players page PIN icon buttons bumped from 22×22 to 36×36 to clear the 32px touch-target floor (10 instances per roster — now reliably tappable on phones).
Schedule-driven payouts ($ amounts) now display correctly on the Present screen — was rendering "0%" because the consumer only read percentage and ignored amount.
May 22, 2026
Manual prize pool — set a fixed prize pool when creating a tournament instead of having ChipClock auto-calculate from buy-ins. Useful for sponsored events, freerolls with fixed payouts, or when the pool is set by the venue. Now editable after creation too (not just at setup).
Saved payout schedules — admins configure named payout schedules in Settings (e.g. "6 players → $300 pool: 1st $180 / 2nd $90 / 3rd $30"). When creating a new tournament with a matching expected player count, the schedule appears as a one-click dropdown to apply prize pool + payouts together.
Winner banner on the Clock pane — when one player remains, the running clock view shows a celebratory banner with the winner's name and a one-tap End Tournament CTA. No more hunting for the action when the heads-up bust happens.
Expected Tables field on new tournament setup — sits next to Expected Players in Step 1. With seat-on-pay enabled, players now spread evenly across the planned tables from the start instead of filling table 1 first.
Rename tables inline from the Run screen — tap any table name on the Tables view to rename it. Empty value reverts to "Table N". Changes broadcast to player companions and the TV clock.
Eliminate (bust) + Undo elimination in the player ⋯ menu — Android swipe gestures aren't always reliable (touch-action conflicts with diagonal scroll detection), so the busting flow now also lives in the menu on every device.
Player menu rebuilt as a portal-rendered popover — was previously trapped inside SwipeRow's overflow:hidden container and getting clipped to a 0-height strip on phones. Survives any overflow / transform ancestor now.
Bigger tap targets on per-table seat buttons (now 40px minimum with active-state feedback) — reliably tappable on phones for opening the move-player sheet.
Playing / out counter above the phone players list — shows live count of active vs busted players so eliminations register visibly, not just via a toast.
Tournament status changes (end, cancel, pause, resume) now broadcast in real time to other tabs and devices — TV clock, present mode, and co-host phones no longer wait for the 5-second polling tick to catch up.
Payouts now allocate using largest-remainder math so the sum always equals the prize pool. Three positions at 33.33% from $100 used to total $99.99 — now totals $100 exactly with one position picking up the extra cent.
Floor view's table display no longer double-seats players when a roster row has multiple elimination records — replaced the LEFT JOIN with an EXISTS subquery for stable dedup.
Saved payout schedules in Settings + the new-tournament wizard now actually load. JSONB columns come back as strings from the database pooler; the page was trying to access them as parsed objects and silently getting undefined.
Amount-based payout schedules now display the right dollar amounts in the player companion clock, the player Deal calculator, and the host Tools Deal view. Was showing $0 across all positions because the consumers only read percentage.
Tournament results entry page now correctly uses the manual prize pool when set — was silently falling back to the auto-calculated pool, producing wrong pre-filled payouts.
Seat-on-pay no longer 500s under concurrent door-table check-ins. Two paid check-ins reading the same snapshot could pick the same seat; the second INSERT now retries with a fresh snapshot up to five times.
Moving a player into a seat held by an eliminated player no longer fails with "Failed to assign tables". The transactional 3-way swap cleans up stale assignments or rotates the live occupant via a temp seat to dodge the unique index.
Signing out of a tournament page now lands you on the homepage instead of a 404. The POST→GET redirect now uses 303 status so the browser follows it with a GET.
Players no longer appear at two seats on the table oval — the array-index fallback was masking sparse seat data and rendering each player twice.
Ending a tournament redirects to the results page instead of a 404 — the old library route never existed.
Check-in UPSERT now creates the check-in record when first marking a player as paid — was previously a no-op UPDATE that silently dropped the payment status.
Undo elimination button now actually calls undoEliminate instead of re-checking the player in (which lost their elimination position).
May 1, 2026
Co-hosts on live tournaments — Tools drawer has a new Co-hosts section. Add an existing org member with one tap, or generate a 30-minute QR code that hands the running tournament off to anyone (signs them in or up, scopes them to this game only). Pro tier supports up to 5 co-hosts per session, league tier is unlimited. Built for the real case: host gets eliminated, hands the iPad to a friend, walks out the door.
Send co-host invite to a checked-in player's phone — pick from the list of checked-in players in the Co-hosts section and tap Send. The invite arrives as an emerald banner on their /live/[id] companion (no QR, no copying URLs). One tap on their phone signs them in or signs them up, and they land on the host view.
Hand-off audit trail — manager_added / manager_removed events show up in the live timeline and end-of-tournament recap, so it's clear who took over and when.
Prev / Next level buttons on the host clock are now gated by a confirm dialog showing the target level — no more accidental skips when you brush the screen mid-walk. Prev disables at level 1, Next disables on the last level.
Revoke an accepted minigame is now confirmed — destructive action no longer fires on a single tap.
New-tournament setup form: expected-players input got its own labeled row with a wider field, blind structure inputs (SB / BB / Ante / Min) bumped to a readable size on mobile, payout-percentage inputs likewise. Double-digit values fit cleanly on Samsung Android portrait.
Login page now honors a `?next=` parameter (relative paths only) so the co-host hand-off round-trip lands you back on the right page after sign-in.
Tools drawer trigger button on the host desktop layout no longer floats on top of the Cash strip's Add-ons cell — it's part of the row now.
Per-session minigame photo cap (50 / session) was silently never enforced — the cap query was checking the wrong JSONB key. Now correctly counts uploads against the limit.
TV clock and host phone Clock tab don't crowd the timer against header chrome on narrow Samsung-Android-portrait viewports anymore.
April 18, 2026
Redesigned host UI — the admin is rebuilt from scratch around a Linear-inspired aesthetic: dense but calm, monochrome with a single emerald accent, status pills, slide-overs instead of modals. Feels like a serious live-ops tool instead of a collection of tabs.
New Today landing page — first thing you see is a big Jump-in card when a tournament is running (with pulse + elapsed time), a stat rail of live/player/completed counts, and your five most recent tournaments. No session? Quick-start and From-template buttons are one click away.
New Run screen — one URL per live session (/org/{slug}/run/{id}) with three panes: Clock, Floor (players + tables visual + request queue), and a Tools drawer. Desktop gets the full 3-pane layout; phone gets a bottom tab bar optimized for walking around with the session in your pocket.
Door Mode — tap Door Mode from Run or Tools for a fullscreen check-in view. Big tap targets, live cash strip (collected / expected / outstanding), and a walk-up add sheet with name + optional PIN + payment method (Cash / Card / Venmo / Pay later).
Present Mode (iPad-dock) — a new auth'd presentation mode at /run/{id}/present. Broadcast-scale clock with stat rail and payouts, and a tap-to-wake host controls overlay (pause/resume/next/prev). Wake-locked so it stays on during play.
Rebuilt TV clock at /clock/{id} — Apple-Sports-style broadcast layout with a 12-column grid, huge tabular-nums clock, next-break countdown, top-3 payouts pill row, and a QR footer for the player companion.
Cash Strip above the Floor — shows Collected / Expected / Outstanding / Rebuys / Add-ons at a glance, so you know where the cash reconciliation sits without doing math at 11pm.
Swipe to eliminate (on phone) — swipe left on a player row to bust them, with a 5-second undo toast. Swipe right to quick-check-in.
Deal calculator in the Tools drawer — chip counts, ICM (up to 9 players), chip-chop, and scheduled payouts side-by-side. Save as ICM, as chip-chop, or custom amounts — no more navigating away from Run during final-3 dealmaking.
Dealer draw + Seat draw back in Floor — Dealer draw picks one random active player per table and marks them on the oval; Seat draw (renamed from Random Draw) reseats everyone with an 8-second Undo toast. Both accessible from Floor view on any device.
Table visual back on Floor — ovals with seat circles, dealer chips highlighted, click any seat to open a move-player sheet with open seats per table.
Color-up suggestions in the Tools drawer — shows which chip denominations can be colored off at the current level, with the wording 'Color off all X chips.'
Minigame results view in the Tools drawer — host sees every accepted minigame report with submitted photos, timestamp, and a revoke button. Badge count on the button tells you when something new landed.
Inline rebuy + add-on row actions — the player row's ⋯ menu now has Add rebuy / Add add-on / Undo last rebuy or add-on, gated on the session's cutoff level so you can't accidentally record one past the deadline.
Request queue accept/decline — pending knockout, rebuy, and minigame reports from the player companion now have explicit accept/decline buttons in Floor. No more wandering into a separate tab.
Audio toggle + test chime moved to the Run header — visible on every device, with localStorage persistence so it remembers your preference across sessions.
Persistent 'jump-back-in' badge in the topbar while a session is live — you can browse Players / Templates / Settings and always return to the live tournament in one click.
New session-aware status pills (Running / Paused / Break / Completed / Cancelled) with the same color language on Today, Run, TV, Present, and the live badge.
Deal calculator penny-rounding — saving whole-dollar custom amounts over odd prize pools no longer produces off-by-a-cent differences on reload ($230 stays $230).
Auto-advance no longer double-fires when the host has Run and Present open on two devices at the same time — an Idempotency-Key on the level-advance request collapses concurrent POSTs into one server-side mutation.
Post-mutation UI refresh now always pulls fresh state — previously an internal debounce could silently no-op the refetch, making check-in / elimination / rebuy visibly lag until the next 5-second poll tick.
Undoing a Seat Draw is atomic in the user's eyes — partial network failures keep the snapshot around and offer a Retry action toast so you can try again instead of being stuck in a half-restored state.
April 17, 2026
Live tournament history — the host page and player companion now both have a History tab showing level changes, eliminations, rebuys, pauses, deals, and minigames in real time. Knocked-out players watching from home get to follow the whole game.
Proactive plan-status banner — your free-tier roster usage is shown on the new-session setup and check-in tab, so you know your ceiling before you hit it during check-in.
Offline indicator on the host page — if the host device loses network, a yellow banner appears so you know the clock and eliminations on screen may be stale.
Paused clock now shows a yellow border and badge — easy to notice in a noisy room when the timer is frozen.
End Tournament confirm now spells out that recorded eliminations are locked once you confirm, and the duplicate footer button is hidden when only one player remains.
UNPAID badge on the check-in list and a warning on results entry when unpaid players are about to be excluded from the prize pool — prevents underpayments at the end of the night.
Warning + confirmation when saving tournament results that already exist, so a stray tap doesn't silently replace them.
Blind structure editor redesigned for mobile — larger buttons, no more forced horizontal scroll on 360px phones, break rows properly labeled for screen readers.
Large prize pools no longer overflow the stat cards on narrow screens (they format with thousands separators and tabular digits now).
Empty check-in state now shows a "No players yet" card with guidance, replacing the bare search box.
Confirm dialogs now default focus to Cancel, trap Tab/Escape correctly, and announce themselves to screen readers.
Minigame photo uploads verified by magic bytes (defense against disguised file types); per-session cap of 50 photos to bound storage abuse.
Payout structures that sum to more than 100%, contain duplicate positions, or have negative positions are rejected at save time — no more overpayment surprises at the end of the night.
Recording an elimination for a player who isn't checked in now returns a clear error instead of creating a phantom record that shows up in the leaderboard.
Duplicate finish positions in results entry are rejected — every position must be unique.
Forgot your PIN and had the host reset it? You can use the new PIN immediately — previously a locked-out player could stay locked out for 15 minutes even after a reset.
Two venues running tournaments behind the same Wi-Fi no longer share a rate-limit quota — each tournament session gets its own bucket.
Malformed requests return a clear 'invalid input' error instead of a generic 500 server error across every mutating endpoint.
April 17, 2026
Agent quickstart — POST /api/quickstart creates a trial organization, a demo tournament, and an admin API key in a single request. The returned Bearer token can immediately run the clock, add players, and record eliminations. Trial orgs auto-delete after 7 days.
Daily cleanup cron — expired trial orgs and their ghost owners are swept at 03:00 UTC.
Agent-oriented documentation — /llms.txt rewritten to lead with the quickstart curl; new /llms-full.txt with full agent workflows, error-code table, idempotency rules, and rate-limit summary.
Marketing pages — /agents, /features, /faq (with FAQPage schema), /about, /for/leagues, /for/home-games, /vs/the-tournament-director, /vs/blindvalet, and a public /changelog.
SEO foundation — /robots.txt (allow-lists GPTBot, ClaudeBot, PerplexityBot, and more), /sitemap.xml, generated OpenGraph + Twitter cards, and Organization/WebSite/SoftwareApplication JSON-LD on every marketing page.
OpenAPI spec expanded with the /api/quickstart operation, per-tag guidance written like agent instructions, and an info.description that leads with the one-curl quickstart flow.
Landing page rewritten around the league thesis with a dual CTA (Start free + Try via agent) and a dedicated agent-ready callout card.
Privacy and Terms last-updated dates refreshed to April 17, 2026.
April 17, 2026
Minigame photos — players can attach a photo (high hand, best bluff, etc.) when reporting a win. Images compress on-device to 100 KB before upload, display as thumbnails for the host, on the live Minigames tab, and in the end-of-tournament recap.
Live Minigames tab on the player companion — everyone can see who's winning each minigame in real time, with photo thumbnails and relative timestamps.
TV clock now shows active minigames in the footer so spectators know what's being tracked.
Minigame Wins card on the completed-session page — chronicles every accepted minigame by game name with winner photos.
Career Minigame Wins card on player profiles — tallies wins per minigame across all tournaments, plus the 10 most recent with photos.
Tournament Timeline — every completed session now shows a chronological recap (level changes, eliminations, rebuys, pauses, minigame wins, etc.), grouped by level with elapsed deltas from start.
Expected-player count on setup — pair it with the planned table count and seat-on-pay fills the lower seats first (no more "seat 9 while seats 1-8 are empty").
Paste-to-add bulk minigames — paste a comma or newline-separated list in the setup wizard; duplicates are case-insensitively dedoped.
Revoke button on accepted minigames — host can retract an accepted result (e.g., inappropriate photo) and the timeline records it.
Manual "Next Level" button now behind a confirm dialog showing the upcoming blinds — stops accidental mid-level jumps on mobile.
Clock level changes are server-debounced (2-second cooldown) to prevent two devices racing to advance simultaneously.
Auto-advance guard rewritten — stale client state can no longer re-fire "next level" after the server already advanced.
ICM calculator for >9 players now distributes tail prize positions by chip stack instead of splitting equally — bigger stacks get proportionally bigger tail shares, matching real ICM intuition.
Running a tournament clone (rehost) now logs as a new session start in the timeline.
Adding the player companion to your iPhone home screen now opens the correct game — previously it bounced to the marketing homepage.
Dismissing a minigame you've already revoked returns a clear 409 instead of silently succeeding.
April 9, 2026
Add to Home Screen (PWA) — ChipClock now installs as a standalone app on iPhone and Android with its own icon and full-screen mode
Mobile UX overhaul — larger touch targets on host dashboard (action buttons, elimination buttons, table controls), bigger self-service buttons on companion page
Host bottom bar redesigned — End Tournament separated from safe actions to prevent mis-taps
Clock page refinements — wider volume slider, larger seat finder, session name truncation
Companion page — larger PIN submit button, more readable stats labels, tappable Switch button
Blinds editor scrolls horizontally on narrow screens instead of cramming columns
Security headers added — Content-Security-Policy, X-Frame-Options, referrer policy
CORS restrictions on public API endpoints
Rate limiting added to Stripe checkout, billing portal, and clock mutations
PIN set-pin endpoint now requires nickname match to prevent PIN-spraying
Clock page shows error for any failed API response, not just 404
E2E test selectors updated for pricing, privacy, landing, and clock pages
April 1, 2026
Player PIN identity — players scan the QR code and sign in with a personal 4-digit PIN for a personalized companion experience
Auto-seat display — identified players see their table and seat automatically, no searching needed
Host can pre-set PINs when adding players and share game links with PINs via clipboard
Bulk "Copy All Links" — one button copies all player invite links with PINs
Minigame lifecycle — host can end/restart individual minigames during the tournament
Rebuy and minigame self-service pre-populated with player identity (fewer taps)
Minigame reporting: primary "Report Hand" button for your own wins, secondary option to report for others
Dealer seat highlighted yellow with "D" badge in table map
QR code enlarged for TV scanning, overlay now mentions PIN sign-in
PIN status indicators on host check-in list and roster page
iOS safe-area-inset support for notched iPhones
Android back button closes modals instead of navigating away
Room code system removed — replaced entirely by personal PINs
March 31, 2026
Setup template editing — full edit page for tournament templates with blind structure, payouts, and all settings
Planned table count — choose how many tables before the tournament starts so seat-on-pay distributes players evenly
Minigame results card — accepted minigame reports now visible in the Tournament tab
Template list shows summary info — level count, break count, blind range, and estimated duration
Loading a template now also loads blinds and payout structure
Player companion clock enlarged for mobile readability
"Setups" renamed to "Templates" in navigation for clarity
Fixed crash on Templates page caused by double-encoded tournament data
Improved error messages — errors now show what went wrong instead of a generic message
March 31, 2026
Seat on Pay — automatically assigns a random seat when players pay, so everyone knows where they're sitting before the tournament starts
Bubble & ITM indicators — host mode shows a banner when approaching the money and when players are in the money
Pause messages — add a custom message when pausing (e.g. "Dinner break — 20 min") that displays on the TV clock
Next break on TV clock — footer shows how many levels until the next break
Payout structure visible in host mode — see payout amounts during the tournament
Average stack stat card added to host mode stats bar
Blind schedule always visible with auto-scroll to current level (no more clicking to expand)
Rebuy/add-on status badges — see at a glance if rebuys are open, closing soon, or closed
Player request notifications visible from any tab, not just Tournament
Elimination search filter — quickly find a player to eliminate when 8+ remain
Clock +/- buttons now show "-1m" / "+1m" labels for clarity
Copy Clock URL and Player Link buttons replace the static URL display
Duration column added to blind schedule on host mode and player companion
Strict equality checks across the codebase for more reliable comparisons
March 29, 2026
Player companion page (/live/) — mobile-first live view with clock, blind schedule, find-my-seat, and self-service reports
Self-service knockout reports, rebuy requests, and minigame reports
QR code on TV clock links directly to the player companion page
Production viewport audit — tested on desktop, Android, and iPhone viewports
iOS Safari auto-zoom on inputs fixed (text-base on all public page inputs)
March 28, 2026
Boolean coercion root cause fix — isTruthy() handles string booleans from Supabase pooler
Audio alerts now play reliably (AudioContext.resume() properly awaited)
Color-up suggestions persist across level changes
Penny rounding in prize pool calculations
22-test tournament simulation passing end-to-end
March 26, 2026
Chip color-up alerts — suggests when to remove small denominations based on blind level
Dealer draw — random dealer selection per table with visual indicators
Add-on support with configurable cutoff level
Bounty tracking (standard and progressive)
Table oval SVG with seat positions and dealer marker