Release notes
You are running .
2026.09.22.2
- No more lock-screen session card — the Live Activity is gone. Notifications work exactly as before.
- The privacy page is exact about your data download — it lists what the file contains, and what it doesn’t.
2026.09.22.1
- Faces where you pick people — check-in, team building, squads and recording a game all showed a bare name. They show a photo now, or coloured initials when there isn’t one.
- Check-in is a grid you tap — sixteen people in a few seconds instead of sixteen rows of buttons. One tap marks somebody in, a second marks them out, a third clears. The running count is in the title.
- Add someone’s photo at the door — straight from the check-in grid, which is the one moment a photo is easy to get.
- Scores without the keyboard — the number pad is part of the screen, so it no longer covers the teams you are checking while you type.
2026.09.21.1
- Squads are dealt as full sides, and you can change the split — sixteen people used to become four squads of four on a night that plays five a side. Sixteen is now three squads of five, and the picker shows every split with its size and bench before you deal. The iPhone had no picker at all; it does now.
- Subs — swap anyone on court for anyone waiting, on both the web and the phone. Scores are recorded against whoever is actually on the floor. Someone checked in after the squads were dealt now shows up as available instead of being stranded until a re-deal.
- Re-dealing keeps the split you picked on the phone, instead of silently going back to the suggestion.
2026.09.17.1
- Squads deal from a hand-picked pool, like two teams do — the generate endpoint honoured a chosen subset for two teams but always dealt squads from everyone checked in. One endpoint, one rule now; nothing changes when no subset is sent.
2026.09.15.1
- Deleting a roster entry works on iPhone — “Delete player” quietly deactivated instead, and on someone already deactivated it did nothing at all with nothing on screen to say so.
- The app now tells you when it can’t remove someone, and why — it was throwing the explanation away.
- A button that can’t do anything now looks like it — “Player is deactivated” was a live-looking red button that answered nothing.
2026.09.06.1
- Full QA pass on both apps — security review clean; 44 flows verified through the API.
- Squads night rosters stay right after a rotation — the phone could show, and record, the wrong players once the bench started cycling in.
- Both apps use the same words for the Squads threshold and the bench.
2026.09.04.2
- The two-game cap works on a three-squad night — it quietly needed four squads, so one squad could hold court all night.
- The odd player out now rotates in — with ten players and three squads, whoever was left over used to sit the whole night.
- Switching clubs works on iPhone — it failed with “The server didn't return a session.”
2026.09.04.1
- Squads Mode explains itself — it used to disappear entirely below nine people checked in, which read as a missing feature. It now says “Squads need 9 in” and how many there are.
- Start another club from More — if you play with more than one group, each club keeps its own roster, ratings and history. The button was previously only on the signed-out landing page.
2026.09.02.1
- Squads night was badly broken, and now works — waiting squads showed no players at all, and freshly dealt squads showed
#[object Object]instead of names. - Home and Schedule agree about whether a session is on — Home could say “Upcoming” for up to an hour after a session had started.
- The record book credits the right side — a game won 11–0 used to read “0–11” next to the winners’ names.
- A player’s profile no longer offers to delete them — every profile showed a destructive Delete button and claimed the player had never played. Deactivate is back.
- Achievements retuned — and two were broken — Blowout asked for a 15-point margin in games played to 7, 9 and 11, so nobody could ever earn it. Lockdown asked you to hold the other side under 10, which every game already did. Margins are ratios now, and there are 40 badges.
- Squads rotation moved to the server — two admins on two phones can no longer disagree about whether the winner-stays cap should fire.
- The app and the website agree about the shape of a night — twelve players used to be dealt four squads on the web and three on the phone.
- Team size follows the turnout — instead of a club setting whose controls were removed a fortnight ago.
2026.09.01.5
- Club codes can no longer collide with a page the app already serves.
2026.09.01.4
- Squads Mode: the winner-stays cap survives a refresh — the "two in a row" counter is stored with the night instead of living in one device's memory.
- An impossible split explains itself — hand-editing teams past 3–5 a side used to return a server error; it now says which split you made.
2026.09.01.3
- Squads Mode on the web — deal 3–4 balanced squads for a big night and run the queue, with winner-stays or rotate-all.
- Winners stay — one tap picks the winning five's next opponent.
- Generate for a subset — make teams for some of the people here without un-RSVPing anyone.
- Record is a scoreboard, substitutes can be marked, and a club that confirms scores says so before you save.
- Session pickers on Teams, Record and Results — Results can finally show an older night.
- Season recap — champion, most improved, best win rate and iron man.
- Import a club export or a roster CSV, and set the club's timezone.
- Scores awaiting confirmation now sit at the top of Home, and the standings show photos.
2026.09.01.2
- Groundwork for multi-team nights — winners-stay opponent picking and 3–4 squad dealing (used by the iPhone app first).
2026.09.01.1
- Groundwork for the iPhone app’s live session card and notification buttons. Nothing changes on the web.
2026.08.31.6
- Team rosters are now alphabetical everywhere.
- In the admin check-in panel, “in” is green and “out” is red.
2026.08.31.5
- Badges remember the game that earned them (used by the iPhone app).
2026.08.31.4
- The iPhone app can switch clubs and link a second sign-in provider. Nothing changes on the web.
2026.08.31.3
- Tapping a notification in the iPhone app now opens the right screen.
2026.08.31.2
- Real notifications on the iPhone app. The web app’s notifications are unchanged.
2026.08.31.1
- The iPhone app can now sign in with Google as well as Apple. Nothing changes on the web.
2026.08.30.1
- Exports are safer. A player name could be crafted so that opening the exported CSV in Excel or Numbers ran it as a formula. Exported cells are now always treated as text.
- Privacy and Terms now cover the iPhone app — what it stores, where, and that it contains no third-party tracking of any kind.
- Fixed a screen-reader glitch where a name with an apostrophe was announced as its raw code.
2026.08.29.4
- Faster Schedule tab. It was downloading every player’s answer for every session listed, to fill in a panel that wasn’t open.
2026.08.29.3
- Players with no login are tagged. Someone an admin added to the roster who has never signed in now shows an “unclaimed” badge, so you know whether to expect them to RSVP themselves.
- Admins can edit who’s in from the home screen. No need to go to the Schedule tab to fix the headcount.
- You can now mark someone out, not just in. The old tick list could only say “here” — there was no way to record that someone told you they can’t make it.
2026.08.29.2
- A new logo, again. Yesterday’s basketball still looked more like a globe. This one is a basketball’s seams on a wooden court — you’ll see it on the home-screen icon, the browser tab and shared links.
2026.08.29.1
- A new logo. The old basketball read more like a globe — its seams met in a cross at the centre. The new one is drawn as a tilted ball, so the seams curve the way a real basketball’s do. You’ll see it on the home-screen icon, the browser tab and shared links.
- Groundwork for the iOS app. Signing in now works from a native app as well as a browser. Nothing changes on the web.
2026.08.27.11
- Spectators no longer RSVP. They were being counted in the “in” total but then left out when teams were made, so the headcount could be higher than the number of people who could actually play.
2026.08.27.10
- Fixed: in clubs where only admins record scores, everyone else was still shown the Record button — and it failed when they used it. Doesn’t affect clubs where anyone can record.
- Tidying behind the scenes: removed some unused styles and corrected notes that had gone out of date.
2026.08.27.9
- Sessions now start and stop themselves. A session goes live 15 minutes before its time and closes 4 hours after, so nobody has to remember to tap Start.
- You can still say you’re in after it has started — turning up late still counts.
- Close and Reopen are still there for a night that finishes early or runs long. Once you use either, the clock leaves that session alone.
- Old sessions nobody closed will tidy themselves up.
2026.08.27.8
- A night of basketball is now called a “session” rather than a “run”, everywhere in the app. (“Run it back” on the sign-in screen stays — that one means something else.)
- Fixed: spacing under Activity log in More.
2026.08.27.7
- Calendar entries now say “<Club> Basketball” instead of “<Club> run”, which read oddly sitting between meetings in a calendar app.
2026.08.27.6
- “Support the Project” is now at the bottom of the Support page, after the troubleshooting rather than before it. The app stays free either way — nothing unlocks.
2026.08.27.5
- RSVP is now a three-way toggle — I’m out, —, I’m in — on both Home and Schedule. The dash in the middle means “no answer”, which is the default, and you can tap back to it if you hit the wrong one.
- A “Finish setup” card on Home for turning on notifications and adding the schedule to your calendar. It clears itself as you do each one, or you can dismiss it.
- Fixed: Home’s next-run location opened Maps at the name instead of the address.
2026.08.27.4
Two things that make scheduling a run quicker.
- A run now has a name and an address. The schedule shows the name you use — “Main gym” — and tapping it opens Maps at the actual address. Leave the address blank and it works exactly as before.
- “Copy details from” another run when scheduling. Pick last week’s run, set the new date, done. The date is deliberately left for you to fill in.
2026.08.27.3
- “Subscribe to this schedule” moved up, to sit between the last run and your upcoming runs instead of at the bottom of the page.
2026.08.27.2
Inviting people, and records that name everyone who holds them.
- Everyone can see the join code now, under “Invite someone” in More, so you don’t need an admin to bring someone along. Only admins can change or turn it off.
- Fixed: tied club records only named one person. Three players on a 7-game win streak showed as one. Ties now read as a list.
2026.08.27.1
Calendar subscribing where you actually want it, and a tidier More screen.
- Subscribe to the schedule from the Schedule tab. It was only tucked away in More. Every run appears in Apple or Google Calendar automatically and keeps updating when the schedule changes.
- Admin settings are grouped under one “Admin” heading in More instead of being mixed in among everyone’s settings. Players never saw them and still don’t.
- Recalculate ratings now folds away like “Fix a wrong player”, so a rare action stops looking like a routine one.
- Fixed: the calendar feed’s history window could be off by a day.
2026.08.26.4
Two bugs you reported, and what was behind them.
- Fixed: records and streaks were wrong for games played on a season’s first day. Those games were silently falling outside the season, so a 0–6 record showed as 0–5 next to a count of 6 games played.
- Fixed: every time shown in the app was off by a few hours — game times, the activity feed, achievement dates. Small enough to look right, which is why it lasted.
- Fixed: the Starts and Ends date boxes on Seasons ran off the screen on iPhone. The previous attempt fixed the wrong element.
- Fixed: some styling was missing since the last release — the join code, the rating graph, a few dropdowns and player photos.
- A game still waiting on score confirmation no longer counts as played until it is confirmed.
2026.08.26.3
Two small correctness fixes, both about promises this app makes.
- Security reports now go to admin@hardwoodclub.app, which is where legal and privacy mail already went. Bug reports and questions still go to support@.
- Removed the last route by which a third-party script could ever load. The privacy page promises there are none on any page; now nothing in the code can make that untrue.
2026.08.26.2
Housekeeping you mostly won’t see, and one thing you will.
- Every public page now has a proper footer — About, Privacy and Terms links, and the PieCrust Labs line. The Support page in particular was a dead end with no way back into the site.
- Tightened the security policy so the browser refuses inline styling outright. This closes off a class of injected-content attack; nothing about the app looks different.
- The app now scales up on large desktop screens instead of sitting small in the middle.
- Rounded corners and the copyright year are handled consistently across every page.
2026.08.26.1
An optional way to chip in, if you want to.
- A “Support Hardwood Club” link now appears on the About page and at the bottom of More. It is entirely optional — nothing unlocks, nothing is nagged about, and the app cannot tell who contributed.
- Payment is handled by Stripe on a page Stripe hosts. Hardwood Club never sees your card.
- The privacy page now says so: it lists Stripe as a company that is only ever involved if you choose to use the link.
- The help page is unchanged and stays free of any of this — Support is for troubleshooting, not money.
2026.08.13.28
Layout fixes and some behind-the-scenes tidying.
- Fixed: the season Starts/Ends boxes and the “When” box no longer overlap or run off the screen.
- “Default team size” is gone. Teams already picks 3v3, 4v4 or 5v5 from how many turn up, and ignored the setting — so it was a control that did nothing.
- The last run now sits above your upcoming runs on Schedule, as a single line with a link to the results.
- Removed the Schedule and Teams buttons from Home’s Next run card — both tabs are one tap away already.
- Privacy page corrected: it described a delete option that was removed a couple of releases ago.
2026.08.13.27
Fixing a wrongly recorded game, and a link that wasn’t there.
- Fixed: “View results” was missing from Home. It was supposed to ship last release and never appeared on the page.
- Edit players on the Results page, next to Fix score. Swap anyone in a game for anyone else on the roster — the score stays put, and ratings recalculate automatically when you save.
- The last run now shows on the Schedule tab under whatever’s coming up, greyed out, so you don’t have to switch to Past the morning after a game.
2026.08.13.26
A proper results page.
- New Results page — every game of a run with who was on each side, and the winning team highlighted. Open it from Home, or from any past run on Schedule.
- Home no longer lists the scores. “Team B won” means nothing a day later, since A and B change every game. Home now shows who played and how they did; the scores live on Results.
- Fixing a score moved to the Results page, alongside the games it fixes.
- “Wrong player?” moved off Schedule to More → Fix a wrong player. It’s a rare job and didn’t belong next to the buttons you use every week.
- Removed “Erase permanently” from the Danger zone. Deleting someone who has played would rewrite the recorded result of every game they were in — for everyone else too. Deactivate is the right answer there.
2026.08.13.25
Say no properly, and see who turns up.
- “Can’t make it” is now a real answer. Home shows 8 in · 3 out · 4 no answer, so you can tell who’s actually undecided.
- Reminders stop chasing people who said no. Only those who haven’t answered get nudged.
- Attendance is on the Standings tab — games played, percentage and current streak. Counted from games you actually played, out of runs that actually happened.
2026.08.13.24
Say you're in without leaving Home.
- “I’m in” is on the Home screen, right on the Next run card, along with how many have said yes so far.
- The bottom bar is now Home, Schedule, Teams, Standings, More. Standings is what most people open between runs, so it swapped places with Players — which now lives under More.
- Players is listed alphabetically instead of by rating, so you can find someone by name. Rating order is what Standings is for.
2026.08.13.23
Fix one game, or the whole night.
- Wrong player? now lets you pick which games the swap applies to. Everything is ticked by default — untick to correct just one game, for when somebody really did sub in.
2026.08.13.22
Recorded the wrong person? Fix it in one go.
- Wrong player? On any run that has games, admins get a button to swap one person for another across every game of that night. Scores and results stay exactly as they are; ratings and badges move to whoever actually played.
- If the replacement already played in one of those games, the swap is refused rather than half-applied — it tells you which games to sort out first.
2026.08.13.21
You can fix the teams now.
- Adjust teams. Tap Adjust on the Teams tab to move anyone between A, B and the bench — one tap each, and only the people you touch move. Regenerate is no longer the only way to fix one player.
- Anyone on the roster can be added, not just people already checked in — for when the person you need was never marked as here. Adding them checks them in.
- The balance number, both team averages and the guard/forward counts update as you move people, so you can see a swap go wrong before you save it.
- Teams are now listed by position — guards first — with a “2G · 3F” summary and each player's rating.
- Uneven teams (5v4) are allowed. Nobody gets a notification when teams are adjusted.
2026.08.13.20
Another go at the bottom bar coming loose.
- The bar no longer uses a frosted-glass blur. On iPhone that effect and a pinned bar interact badly, which is what let it drift up the screen mid-scroll. It was 92% opaque already, so the difference should be hard to spot.
2026.08.13.19
Two fixes from beta reports.
- Joining with a code works again. The sign-in buttons on the join page could silently do nothing, so people signed in from the main page instead and were told they needed a join code — while holding one.
- The bottom bar stays put. It was coming loose and drifting up the screen as you scrolled.
2026.08.13.18
You can delete players now.
- A player who hasn't played yet can be deleted straight from their profile. Good for duplicates and typos.
- A player who has played still shows Deactivate instead — deleting them would change the recorded result of every game they were in, for everyone else too. Deactivating hides them and keeps the history.
- If you genuinely need to erase someone and their games, that now lives in More → Danger zone, and tells you how many games it will destroy before you confirm.
- Deleting a player now removes their photo too.
- Fixed: the season Starts and Ends date boxes overlapped each other on a phone.
2026.08.13.17
Photo uploads fixed, reminders, and placeholder players.
- Profile photos work again. Uploads were being rejected as unreadable even when the picture was a perfectly good JPEG. That was a bug in the app, not in your photos.
- Add a player without an email. Useful for "Steve's mate" — they can play and be scored right away, and you merge them into their real account later.
- RSVP reminders. Every run now nudges anyone who hasn't answered, 36 hours before. Admins also get a Remind button to chase people right now.
- Changed a run? Tick "Tell everyone about this change" when saving and everyone gets a notification.
- Make teams now picks 3v3, 4v4 or 5v5 based on how many are in. You can still override it.
- Two new notification switches in More → Notifications, so you can mute run announcements without muting the reminder asking if you're in.
2026.08.13.16
Housekeeping on the website side.
- Mistyped links now show a proper "page not found" page instead of silently landing you on the sign-in screen.
- Sharing a hardwoodclub.app link in a chat now shows a proper preview card.
- Added a Terms page, and the Privacy page now explains exactly which cookies are set and how to get in touch.
- App icons are much smaller files, so the app installs and loads a little quicker.
- Search engines are now told to stay away from club pages entirely.
2026.08.13.15
Editing runs, a tidier tab bar, and a fix for duplicate players.
- Edit a run. Admins can now change the date, location or notes of any run — before or after it happens.
- Playing right now? Tick the box when scheduling and the run is created and started in one go. This replaces the + button that used to sit in the bottom bar.
- Players is now in the bottom bar, where the + button was. Recording a game moved to More, and is still linked from the run itself.
- Merge duplicate players. If someone signs in with a different email than the one on the roster, they end up with a second, empty entry. An admin can now merge the two from the player's page under Admin — games, badges and their sign-in all move across.
2026.08.13.14
Internal tidy-up.
- Nothing changed in the app — this removes some duplicated code behind the standings and last-run pages.
2026.08.13.13
Housekeeping before beta.
- Nothing changed in the app — this tidies up developer documentation and a deployment trap.
2026.08.13.12
Player photos.
- Add a photo from your own profile — tap your name anywhere, then "Add a photo". Admins can set or remove anyone's.
- Photos are shrunk on your phone before uploading, so it's quick even on gym wifi.
- No photo? You keep the coloured initials, same as before.
- Photos are only visible to people signed in to your club.
2026.08.13.11
Fix a wrong score without starting over.
- Tap Edit next to any of the last run's games on Home to correct the score. Ratings rebuild as part of saving — no second step, and no need to delete and re-enter the game.
- Admins can fix any score; everyone else can fix one they recorded themselves.
- Deleting a game now rebuilds ratings straight away too.
- Correcting a score never takes a badge away.
2026.08.13.10
Housekeeping.
- Nothing changed in the app — this cleans up misleading warnings in the developer test output.
2026.08.13.9
Optional score confirmation.
- Admins can now turn on "Scores need confirming by the other team" in More → Club. It's off by default and nothing changes unless you switch it on.
- With it on, a recorded score waits for someone on the other team to agree. Until then it counts for nothing — no ratings, no records, no badges.
- Anyone who played can flag a score as wrong, with a note. Nothing is deleted; an admin sorts it out.
- Scores waiting on you appear at the top of Home.
2026.08.13.8
Groundwork so last release's outage can't repeat.
- The app is now actually run — every page, every script — as part of the test suite, including for a brand-new club with no games yet. Nothing user-facing changed.
2026.08.13.7
Fixed: the app wouldn't load at all.
- The previous release had a mistake that stopped every page from rendering — a black screen in the browser and in the home-screen app. Fixed, with a new check so this particular kind of breakage can't ship again.
2026.08.13.6
Phone fixes.
- The Rating / W–L / Games / Badges tiles on Home now open your profile instead of doing nothing.
- Tapping a location opens Apple Maps on an iPhone or iPad, and Google Maps everywhere else.
- "← All players" now always works in the home-screen app.
- Tap any badge — on Home or on a profile — to see what it is, how to earn it, and when you got it.
2026.08.13.5
Fixed: lopsided big men.
- Teams could still come out with four big men on one side and two on the other. The "mix up who plays with who" rule was massively overpowering the positional balance rule — by about fifty times on a club that has played a lot together.
- Guards and forwards are now split evenly whenever the group allows it, and Regenerate still gives you genuinely different teams.
2026.08.13.4
Fairer benches.
- When more people turn up than fit, the app used to bench the lowest-rated players — which meant the same people sat out every single week. It now picks whoever has played most lately, so the bench rotates.
- "Reset ratings" moved into a collapsed Danger zone in More, away from the buttons you actually use.
2026.08.13.3
Fixed: resetting ratings didn't stick.
- If you reset ratings and later hit "Recalculate ratings", the old ratings came straight back — the two buttons cancelled each other out and nothing said so. Resets now hold.
- "Reset the season" is now called "Reset ratings", so it isn't confused with the new Seasons feature. It puts everyone back to 1500 and starts a fresh rating era; your game history and stats are untouched.
2026.08.13.2
Fairer teams, and safer join codes.
- Team generation now balances guards and forwards between the sides, instead of only checking each side had one of each. That's why you could end up with both centres on one team.
- Secondary positions finally matter: if someone can play guard or forward, the balancer uses that to even out an odd group.
- Guessing at join codes is now rate-limited. If you use a memorable code like BRIGHTON, remember anyone who guesses it can join — use Random for a club you want to keep closed.
2026.08.13.1
Seasons, and pull down to refresh.
- Admins can create seasons in More → Seasons. Everyone then gets a season picker on Home and Standings, with All time always available.
- A season is just a date range — games fall into whichever season covers the day they were played. Changing the dates re-files history, and deleting a season deletes no games.
- W–L, form and the rating graph follow the season you pick. Ratings themselves stay all-time, because a rating is one running number rather than something that restarts.
- Pull down on any page to refresh it.
2026.08.12.8
Runs in your own calendar, and tappable locations.
- More → Calendar gives you a personal link. Add it to Apple or Google Calendar and every run appears automatically, updating itself when the schedule changes.
- That link is personal — anyone who has it can see the club's schedule. You can revoke it any time and any calendar using it stops updating.
- Tap a session's location to open it in Maps.
2026.08.12.7
Pick your own join code.
- Admins can set a code like BRIGHTON instead of a random string — much easier to tell someone across a gym. More → Join code.
- Type it in any case when joining; it always works.
2026.08.12.6
A proper home screen.
- Last run — everyone who played, their record for the night, and what it did to their rating. One card for the whole session instead of a game-by-game list.
- Standings now show form, hot and cold streaks, and a little rating graph for each player.
- Club records — biggest win, closest game, longest streak, biggest rivalry, busiest run. Every one says who holds it.
- Your badges are on the home screen too.
- Tap any player anywhere on the page to open their profile.
2026.08.12.5
Push notifications actually work now.
- Notifications failed every time, for everyone, since launch — and the error message blamed your subscription, which sent you toggling settings for nothing. Sorry. It was two bugs in our sending code.
- If you turned notifications off while trying to fix it, turn them back on in More → Notifications and use "Send test".
- On an iPhone home-screen app, the line above the bottom tabs cut straight through the icons. Fixed.
2026.08.12.4
Fixed: you couldn't create a club.
- The Create a club page was missing its Google and Apple buttons entirely, so there was no way to finish. It works now.
2026.08.12.3
In more than one club? It finally works properly.
- More → Your clubs lists every club you're in, with your rating and role in each, and opens any of them in a tap.
- Signing in at hardwoodclub.app now asks which club you meant instead of giving up — or takes you straight there if you're only in one.
- Each club keeps its own rating, history and role. You're the same person, but a different player.
2026.08.12.2
Passwords are gone — sign in with Google or Apple.
- There are no passwords in Hardwood Club any more. Nothing to remember, nothing to reset, nothing to leak.
- If Google or Apple is your only way in, link the other one from More → Sign-in methods. It takes a few seconds and it is the difference between a lost phone and a lost account.
- Starting a club is now part of signing in: pick your club code, tap Google or Apple, and you're the first admin.
2026.08.12.1
Sign in with Google or Apple.
- You can now use Google or Apple instead of a password — and link either to an account you already have, from More.
2026.08.11.4
Fixed sign-up, which was failing for everyone.
- Creating an account returned an error every time. Password security is unchanged — the fix was in how the work is performed, not how much of it.
2026.08.11.3
Your club's own address now shows your club.
- Opening
yourclub.hardwoodclub.appshows your club's name and colours on the sign-in screen, and no longer asks for a club code you've already given by visiting the address.
2026.08.11.2
New name. Hardwood Club, on its own domain at hardwoodclub.app.
- Every club now gets its own address —
yourclub.hardwoodclub.app— so it's a real bookmark. - One sign-in covers the main site and every club.
2026.08.11.1
Two fixes found by checking the live site after the first deploy.
- Security headers were missing from every page — Cloudflare's asset layer was answering page requests before the app could add them. Pages now go through the app as intended.
- The offline/notification worker didn't install until after your first sign-in. It now installs on the sign-in page, which is where you add the app to your Home Screen.
2026.08.10.1
First release of the rebuilt app: a proper PWA on Cloudflare Workers and D1, replacing the FastAPI + per-club-SQLite version.
- Multi-tenant: many clubs in one database, isolated in application code with a query guard that fails loudly rather than silently crossing clubs.
- Achievements — 33 of them, every one checked to be actually reachable in a pickup league.
- Web Push notifications for new sessions, posted teams and unlocked achievements.
- Full JSON and CSV export, plus an importer for migrating off the old app.
- Bottom tab bar replacing the hamburger drawer.
- Ratings can be recalculated by replaying every game, so a mis-entered score is repairable.
- Network-first service worker, so a deploy is never invisible.