You said the app felt complicated. Our answer wasn't a rebuild — it was to put the right buttons in front of every role, add one-tap Help on every page, and give first-timers a chatbot that answers "how do I…" in plain language. Nothing you rely on changed; everything was added on top.
Everyone used to land on a page with no obvious next step. Now each role's home opens with a row of the things they do most — not a generic menu:
Captain: Plan a line-up · Standings · Schedule · Help | Player: My profile & DUPR · Edit details · Clubs & teams · Today's schedule | Finance: Registration receipts · Unpaid teams | Spectator: Watch live · Schedule · Rankings
Rather than adding Help page-by-page, we made it a single widget that appears on every page automatically — so a beginner always has one-tap guidance, wherever they are, and it can never be "missing" on a page again.
A first-timer can just ask, in Cantonese or English (by voice or text) — and get a plain-language answer that quotes your rulebook. Example, live: "How do I submit a score?" →
"Score submission is handled by the Home team captain… submit a photo of the signed score sheet and input the scores digitally within 3 days after the match [§4.0]… [sign in] to submit."
The top navigation is now a single shared header used across the site (so it looks and behaves the same everywhere), and it's shorter — we dropped the redundant Home link (the logo already goes home) and duplicate All Players / All Clubs, and moved Rules under Help.
A + Register team button now sits on your managed-club card, and a top strip shows "what needs your attention" — no digging.
The "This Week" results box and the shareable match-result card were black/off-brand — both are now the site's crisp white with a green accent and a lime WINNER badge.
On top of the automatic HKO T8 / Black-Rain postponement, admins can now manually stop play for a day — every scheduled match that day is postponed in one click, and a matching Resume day button puts them back.
When the committee upholds a dispute, you can now enter the corrected score in the same action — the app recomputes the winner and updates the standings automatically, no separate edit.
A club manager kept access to all their club's teams even after a captain handover — full captain-level control across the club. (For fairness, a manager still can't sign both sides of a match — two-party confirmation is preserved.)
The match-up page now shows each team's full roster as tappable chips — pick any 1v1 or 2v2 and the win-probability updates live.
The "player registration deadline" field was hard to find because of the jargon. It's now labelled "Roster lock date (roster changes close)" with a hint that existing players keep playing.
The bug-report / feedback widget used to be missing on ~48 pages. It's now added automatically site-wide, so members can report an issue from anywhere.
In Round 19 we started showing the ⚖ tie-break reason on each row. Since then we checked it line-by-line against your Rules & Regulations v3.4 — and found the order wasn't exactly right. This is the correction.
The correct order is: 2 teams tied → head-to-head · 3+ teams tied → most games won · then net points · then a re-match.
The tie-break is now a single rule the app reads, not logic scattered across the code. If your rules ever change, you edit that one rule and the ranking, the "ranked by…" line, and every ⚖ reason all update together.
Round 19 made the standings read correctly in Chinese. Since then we've finished the job on the pages your captains and committee actually work in — these were still English-only.
Every word on Plan line-up now follows the language switch — match card, roster, the "reveal line-up" flow, borrowing a player, game names (女子/男子/混合雙打), and every prompt.
The three staff work-surfaces were English-only. They now localise end-to-end: titles, filters, every dispute row, all action buttons, the re-match form, and every confirmation.
We drove a complete match through the live app: both captains set their line-ups, entered the five game scores, and gave their co-signatures. The app validated the scores, decided the winner, and updated the standings — with no manual steps.
Each game is to 21. A legal final is exactly 21 to 0–20 (so 21:20 is valid — sudden death, no win-by-two). Anything else turns the cell red before you can submit.
Typing "21" came out "12", "15/17" as "51/71". Fixed — scores now read exactly as typed.
The sheet used to pre-fill players from your last match and lock them. It now starts empty until you set the line-up.
Once a match is finished, the Reschedule and Plan-line-up buttons are hidden — no confusing dead actions.
Roster rows are now all tappable — with or without a DUPR id — opening the player's profile.
Name-less applicants now show their email + a "no name on file" flag instead of a wall of "Unnamed applicant".
Approving a player onto a team now auto-cancels their other pending requests in the same division — no more misleading "waiting".
Added a visible Sign out to the sticky admin header (it was buried at the bottom of the sidebar).
Users & club-player tables sort by any column; the side-menu's duplicate "System" header is merged; raw rule codes now show plain-English labels.
The settings page (name / phone / DUPR / language / photo) was hard to find — now a one-tap shortcut on the player home.
Five pages (Register, Club leaderboard, Players, Stats, Match-up) were missing the footer / bottom navigation — now present everywhere.
The player profile printed the name in both the banner and the card — de-duplicated to a single clean header.
The admin live-branding preview now reflects the chosen colours; photo albums without a cover now show a proper image instead of a flat grey.
A player's profile counted matches but labelled it "Games played" — it now reads "Matches played", matching the standings table.
The tie-break ⚖ note only shows where it's accurate (below a same-points team); and the "Back to Admin" button no longer appears to staff who can't open the admin page.
We checked every staff page and sensitive data feed as a low-privilege user (player / spectator): all correctly blocked, including write actions. A member on the wrong tenant cannot see another league's data. Zero leaks.
We signed in as each role on a mobile screen and clicked through their shortcuts to the real destinations — Captain, Player, Registrar, Referee, Finance, Spectator, Admin — every link lands on a working page, with a ❓ Help button on each.