What it does8 things
- Calls 1–90 out loudUses the phone's own voice — the Capacitor TTS engine on Android, the Web Speech API in a browser.
- Traditional housie rhymes“Legs eleven”, “Two little ducks” — a rhyme for every number, toggled off for plain calling.
- Full board, colour-codedAll ninety numbers in a 9×10 grid, banded by decade, with the last call ringed.
- Auto-call at 5, 7 or 10 secondsOr step through manually at whatever pace the room is keeping up with.
- Undo the last callFor when someone talks over the caller and the number has to go back in the pool.
- Prize trackerEarly Five, Top, Middle and Bottom Row, Full House — tap to mark a prize claimed.
- Counters and a game timerCalled, remaining, elapsed time, and the previous five balls always on screen.
- Light and dark themesBoth hand-tuned, plus an automatic mode that follows the phone.
Screens4 shots
ReadyBoard empty, ninety left, timer at zero.
Calling62 — “Turn on the screw”, with the previous five balls alongside.
PrizesEarly Five, Top Row and Middle Row gone; Full House still open.
DarkThe same game after sundown.
How it's built~1.2k lines
web
- React 19
- Vite
- Plain CSS
- No state library
One screen, one hook. useGameState.js holds the pool, the draw, the
undo stack and the speech queue; TambolaApp.jsx renders it.
android
- Capacitor 8
- TTS plugin
- Splash + status bar
- Signed AAB
The web build is wrapped rather than rewritten — npm run release goes from
source to a signed bundle in one step.
runtime
- Offline
- No accounts
- No ads
- No SDKs
Zero network requests. The draw is a uniform pick from the remaining pool, so aeroplane mode at a family function changes nothing.
Privacyno data
- No analytics, no crash reporting, no advertising ID.
- No permissions beyond what Android needs to run an app.
- Nothing leaves the phone — there is nowhere for it to go.