How I Built the NBS App, Part 2: Live Scores, a Test Site and a Team of AI Bots
1 Nov 2026
In part 1 I covered how the Nova BadmintonSpace (NBS) site came together: a spec first, simple tech, the first admin tools, and the iPhone "Loading…" mystery. Since then the app has grown up quite a bit, mostly to get ready for our first internal tournament. Here's what changed under the hood.
Live results, entered by players
Our games are self-umpired, so the people who aren't on court enter the scores on their phones. Friends and family can then follow the results and the leaderboard live, at the courts or from home. Only each game's final score goes up, not every point, which keeps it quick for volunteers.
The public scoreboard also has a big-screen mode for a TV or a tablet on a stand: bigger names and scores, no menus, and a quick pulse on any score that changes. Any result, or the final standings, can be shared as a designed picture card.
Scoring that doesn't lose scores
Scores get entered on phones in a noisy hall, so they need to be hard to lose and hard to get wrong:
- Unsaved scores stay on the phone. If someone refreshes by accident, the score comes back with a prompt to save or discard it.
- No silent overwrites. If two people save the same game, the second one is told to reload instead of quietly replacing the first.
- Impossible scores are refused with a plain message.
- A Scorer role lets a volunteer enter scores without being able to change anything else.
- Clear stages. A tournament moves from registration to draw to play to finished, with a way to step back and fix the draw before play starts.
We tested all of it with made-up players and fixed what came up.
A test site, and nothing goes live until I say go
Part 1 ended with a separate test site on my "coming soon" list. It's built now: a private TEST copy of the whole app with its own data. Every change lands there first, and only reaches the real site when I say go.
Small things that make a big difference
- A friendly reload message. If the app fails to load right after an update, it now says "NBS was just updated. Please tap Reload" instead of showing a technical error.
- Phones always get the latest version, instead of hanging on to an old copy after an update.
- Admin tabs. The admin page used to be one long scroll. Now it has tabs, each person only sees the ones their role needs, and on a phone they wrap onto a second row.
- Mind the contrast. My first version of those tabs was hard to read in light mode, so it became a rule for every bit of UI: easy to read in both light and dark mode.
- A tagline: Novel · Brave · Superb. Yes, it spells NBS.
Counting visitors without cookies
I wanted to know whether anyone visits, without cookie banners or third-party trackers. So the app keeps anonymous, cookie-free page counts: nothing is stored on visitors' phones, nothing identifies them, and browsers that ask not to be tracked aren't counted at all.
The admin Analytics page puts weekly visits next to social sign-ups, so I can see whether visits turn into people joining. There's also a QR code for a poster at the venue, with its scans counted separately, so I'll know whether a poster on the wall actually brings anyone in.
Looking after security
Admin sign-in still uses an authenticator app on top of a password, permissions are enforced on the server rather than just hidden in the page, and every change passes automatic checks before it can reach the live site.
From one assistant to a small team
In part 1 I worked with one AI assistant. Now I have a small team of Grok Bot assistants, each with its own job: BAB (Baddy App) builds the NBS app, PWB (Personal Website) looks after this site, MSM (Marketing & Social Media) handles promotion, and GBL (Grok Bot Lead) keeps everyone on the same page.
To keep them in line, I made up my own slash commands. I explained each one once, and the bots remember it:
| Command | What it means |
|---|---|
| /btw | A side question. Answer it, but keep doing what you're doing. |
| /batch | List what's queued, but don't start any of it. |
| /go #N | Start only item N from that list. |
| /fya | Go for this one task, then go back to quiet. |
| /ease | Stay quiet and start nothing until I say go. |
/ease is the one I use most. It's how I keep a team of bots from getting ahead of me.
A few habits have settled in too. The bot explains a problem and its suggested fix before touching anything, related fixes go out together as one batch, and nothing reaches the live site until I've said go. I always know what's changing and why.
What's next
Next up is a dress rehearsal and a feature freeze before match night. After that, I'll write up how the app held up with a full hall.
If you work with an AI assistant, what would your first custom command be?