Three of my apps are now open source
The code for Rally Point, Practice Time and Meal Tracker is now public on GitHub under the MIT licence. What each app does, which parts of the code are worth reading, and what I checked before making a repository public.
I build small apps in the evenings and at weekends, mostly to answer a question I could not answer by reading about it. Until now the code sat in private repositories. Three of them are now public on GitHub, under the MIT licence, so anyone can read the code, run it or reuse it:
- Rally Point: badminton rules you can watch, and a scorer an umpire can use on court. Open the app.
- Practice Time: a learning app for children in Reception and Year 1.
- Meal Tracker: a meal log that starts with a photo.
All three run on Firebase’s free Spark plan, and none of them has a server of its own.
Rally Point
Rally Point has three parts. Learn is twelve animated lessons on the rules: the court, rally scoring, serving in singles and doubles, faults, lets and changing ends. Umpire scores a real match: you tap the side that won the rally, and the app tracks the score, who serves, where everyone stands and when the interval is due. A live link lets people follow the score on their phones. Play is a small rally game against the computer.
What is worth reading in the code:
- One scoring engine for everything.
engine.jsholds the rules as pure functions, with unit tests. The umpire screen, the animations and the game all call it, so a rule change is made and tested in one place. That mattered here: badminton moves to 3 × 15 scoring on 4 January 2027, and the classic 3 × 21 system stays as an option. - A court at real size.
court.jsdraws the court in SVG in metres, andscene.jsturns a match state into player positions. - Live links without a backend. Spectators read the match from Cloud Firestore. Anonymous sign-in and the security rules mean only the device that created a match can change it.
- No build step. Plain JavaScript, HTML and CSS, with a service worker so it works offline and installs on a phone.
I wrote up how it works, including the rules from the basics, in Rally Point: badminton rules you can see.
Practice Time
Practice Time is a daily timetable and a set of short games for four to six year olds: spelling, phonics, handwriting, number bonds, telling the time, money, shapes, reading and more. A child picks one of four cartoon cubs as a companion. Progress is shared live between both parents.
Three things in it that I would point a reader to:
- The cubs are drawn from code. Each one is SVG built from a few numbers in
species.js, which follows the proportions that make a character look young: a large head, eyes set low and wide, and features packed into the lower part of the face. Every character and sound in the app is original; the sound effects are synthesised in the browser. - The model is checked, not trusted. Gemini, through Firebase AI Logic, listens to a word read aloud, checks a letter drawn on a canvas and writes new practice questions. A generated “find the answer” reading question is thrown away unless its answer really appears in the story.
- A plain-English privacy and AI notice, written against UK GDPR and the transparency duties in the EU AI Act, listing every place AI is used and what it deliberately does not do.
Meal Tracker
Meal Tracker is a React Native app built with Expo. You photograph a meal, Gemini estimates its calories, you correct the number if you need to, and the meal is saved to Firestore. The prompt asks for a single number and the app rejects anything that does not parse, so a chatty answer never reaches the log. Firebase AI Logic means the app calls Gemini without a server and without a Gemini key in the code. I wrote more about it in Meal Tracker: log a meal by taking a photo.
What I checked before publishing
Once code is public, you cannot take it back, so before each repository went public I checked five things.
- No secrets, in the code or the history. Each public repository starts from a fresh commit, so nothing from the private history comes with it. Firebase web config is read at runtime, from a local environment file, or left as placeholders for whoever deploys it.
- Nothing I do not own. Every character, drawing and sound is original. I removed recorded audio clips and hotlinked pictures I had no right to redistribute.
- Security rules in the repository. Each app ships its Firestore rules, so anyone who deploys it gets the same protection: a user can read and write only their own data.
- A README that explains how it is built, not only how to run it, and an MIT licence. Third-party pictograms keep their own licence.
- Personal work only. These are apps I built in my own time with my own accounts. None of them contains code from my job.
The full list of apps, with live links, is on the apps page. If you build on any of them, I would like to hear what you made.