Diamond EdgeCutting edge. Rock solid.

Case study · Napkin Scores

A small app with its own look, finished properly

Napkin Scores is a score pad for card nights on Android and iOS. It's small on purpose: two screens, no sign-in, no ads, no analytics. It's also the kind of app agencies get asked for every week, and it got the same release discipline as the big ones.

The brief

What I built

  1. The look first, as a library. Napkin is a Compose Multiplatform theme in which every Material 3 component is sketched at runtime. Each outline is drawn from a seed, so it wobbles like a pen line but stays put between frames. I open-sourced it.
  2. Design that carries meaning. Each player writes in their own pen colour, and that colour follows their seat everywhere: the seating list, the column header, every round and the running total. The leader's total is circled in their pen, the way you'd circle it on paper. Beyond that, colour stays rare, so it means something when it appears.
  3. Features for the regulars. Saved game types with the right win direction and end condition, and recent games that re-seat the same players in one tap.
  4. Reuse instead of rewrite. It's built on the same shared modules as Diamond Tabletop. Sharing a recommendation goes through the same code the games use for invites, so the feature added no platform code at all.
  5. The release work nobody sees. The privacy label backed by an empty privacy manifest. App Review's questions answered with evidence from a real iPhone. A reproducible App Store build, store screenshots captured by script, and on Android, an invite link that survives the trip through the Play Store install.
The Napkin theme's demo: hand-drawn buttons, checkboxes, radio buttons, a text field, a progress bar and a sticky note
The Napkin theme's demo screen: standard Material 3 components, drawn by hand at runtime.

A feature I didn't build

An iOS App Clip would let someone at the table use the score pad without installing anything. I measured it first: a clip is capped at 15 MB, and this app's iOS binary is 31 MB, almost all of it Compose itself. A clip would have meant a second score pad, written separately in SwiftUI, to maintain forever. Not worth it, so it isn't there.

Small apps go wrong by growing. Keeping one small is a series of decisions like this one, made with numbers rather than enthusiasm.

What this could look like for you

Have an app your client needs by a date?

Tell me the date you're working against. Thirty minutes, technical, no deck.