Simple Scoring
The score sheet for word-game night, with friends following live







01 The story
A fast, private score sheet for 2 to 4 player tabletop word games: one tap per turn, end-game racks done for you, and a Live Table where friends join with a code and follow the score on their own phones. Built in Flutter and live on Google Play and the App Store.
Simple Scoring replaces the paper score sheet at word-game night, for tile games like Scrabble. It isn't a digital board game and never suggests moves: one phone or tablet sits on the table, players enter their points on a big keypad, and the app keeps the arithmetic, the turn order and the history honest.
I started it in January 2026 in React Native, moved it to Flutter in March and shipped 1.1.2 to the App Store on March 30. The September 1.2.0 release was a quality pass: ties handled correctly on every screen, a tile-bag counter that survives restarts, a quick calculator with a one-tap +50 bingo bonus, and official end-game rack scoring with a final-score preview.
Version 1.3.5 in October 2026 added Live Table. The host opens a lobby, friends join with a short code or QR and show up with the name and color saved on their own phone, and everyone follows the turn, the standings and every play live while their phones sleep between turns. Joining and watching are free. Hosting after the first free game is part of Simple Scoring Plus, a $2.99 one-time purchase that also removes ads and adds full score-sheet exports and game-night records.
Scoring stays local and offline: games, players and groups live on the device with backward-compatible saved data and migration tests, and the host keeps scoring if the connection drops. Live Table rooms are short-lived Firestore documents guarded by 313 lines of security rules with their own emulator test suite. Word Check works offline from a 5 MB gzipped SQLite dictionary I built from the Wordnik word list and Open English WordNet, with definitions mapped to inflected forms.
Version 1.3.9 reached both stores on October 27, 2026, the end of a busy October: a tactile tile-button redesign, offline Word Check, two-pane tablet layouts, support for very short screens and 200% text, and about 200 automated tests behind it.
02 What it does
- 01
One-tap turn entry on a large keypad, plus passes, tile exchanges, undo, redo and fixing any earlier turn
- 02
Live Table: friends join with a code or QR and follow the score on their own phones
- 03
Official end-game scoring: rack penalties and went-out bonuses calculated for you
- 04
Table View: a big same-device scoreboard for portrait or landscape, with high contrast
- 05
Offline Word Check with definitions and point values
- 06
Turn timers from 15 seconds to 15 minutes, a tile-bag counter and a +50 bingo shortcut
- 07
Match history, head-to-head records, saved players and groups, and shareable result cards
- 08
Backup and restore, plus PDF, image, text and CSV score-sheet export with Plus
03 How it's built
Scoring is fully local and works offline. Only Live Table touches the cloud: the host's app publishes a snapshot to a short-lived Firestore room that guests join with a code and read live.
All 7 connections, as text
- Host phone (Flutter app) → On-device games, players, history: every turn saved
- Host phone (Flutter app) → Offline SQLite dictionary: Word Check
- Host phone (Flutter app) → Firestore liveRooms / liveCodes / presence: publishes score snapshots
- Guest phones (same app) → Firestore liveRooms / liveCodes / presence: join by code, follow live
- Host phone (Flutter app) → Firebase anonymous auth + App Check: anonymous sign-in
- Guest phones (same app) → Firebase anonymous auth + App Check: anonymous sign-in
- Host phone (Flutter app) → App Store / Play billing, AdMob: Plus purchase, ads
04 Engineering notes
Live Table on Cloud Firestore: short public codes, expiring rooms with lobby/active/final/closed states, viewer presence and host-only writes enforced by 313 lines of rules with an emulator test suite; write volume trimmed in 1.3.7
Offline Word Check: a Python build step turns the Wordnik word list and Open English WordNet into a 5 MB gzipped SQLite dictionary with definitions mapped to inflected forms, opened read-only on device
Local-first persistence: SharedPreferences JSON kept backward compatible with safe defaults and migration tests; any action that changes a game is saved before navigation or suspension
About 200 unit, provider and widget tests, plus Android integration tests and an integration test that captures the store screenshots
Privacy by design: no account needed, anonymous Firebase sign-in only for Live Table and anonymous game reports, App Check, and no player names in analytics
Adaptive layouts: two-pane tablet scoring, tablet Table View, iPhone Duo short screens and a scoring screen that fits a compact phone at 200% text
05 By the numbers
- 1K+
- Google Play downloads
- March 30, 2026
- On the App Store since (v1.1.2)
- About 200
- Automated tests
- $2.99
- Simple Scoring Plus, one-time purchase
06 Stack
App
- Flutter
- Dart
- Provider
- google_fonts
- audioplayers
- qr_flutter
- mobile_scanner
- share_plus
Backend
- Cloud Firestore (Live Table)
- Firebase Auth (anonymous)
- Firebase App Check
- Firebase Analytics
Data
- SharedPreferences (JSON)
- sqflite (offline dictionary)
- local backup files
Infrastructure
- Google Play
- App Store
- AdMob + consent
- in_app_purchase (one-time Plus)
- Fastlane (iOS screenshots)
Tooling
- Python dictionary builder
- Python store-panel renderer
- Firestore rules emulator tests
- integration_test
- Play publishing script
Lines of code (approx.)
- Dart (app)27,556
- Dart (tests)5,782
- Python999
- Firestore rules313
≈ 34,650 lines
Repositories
- simple-scrabble-scoringprivate
One repo, 75 commits. The January to February 2026 commits are a React Native version with game state in React Context; the 2026-03-17 commit 'Migrate fully to Flutter App & remove React Native codebase' replaced it with the Flutter app in flutter_app/. There were no commits from 2026-03-30 to 2026-09-12.