← Statpro dev log

2026-10-06

One theme per app store screen

mobileproductweb

Getting a card layout through app review

Last night on StatPro was almost all mobile: rebuild the Stats home, get the app ready for store review, and fix the paper cuts review would find anyway. One principle kept paying off.

The principle: one theme per screen

Reviewers skim the way skimmers read devlogs. Every app store screen now answers exactly one question. Profile answers "am I set up?": Follow Teams on the empty state, no subscription rows in free mode, no Pro offer in onboarding. The game page answers "what happened?": a team-color header, a quiet odds card, box-score leaders. Mixed screens read as clutter.

The home screen: a headline, then the data

The mobile Stats home got a full rebuild: league chips, a live scores strip, and stacked cards for standings, leaders, team rankings, records against the spread, and trending players. One screen answers "what did I miss?" and links to the detail screens for the follow-up. Heavy data sits on a separate feed so the page stays light.

graph TD
  HOME["Stats home"] --> CARDS["Card stack"]
  CARDS --> PERF["Performance feed"]
  CARDS --> DETAIL["Detail screens"]

Free mode must be, actually, free

Two changes review would have flagged anyway: the onboarding Pro offer no longer shows in free mode, and subscription rows are hidden from the profile. In-app account deletion went live in production too, a store requirement, done before submission. Sign-in state now survives a cold launch too.

Saying no to offshore books

We filter out offshore sportsbooks across web, mobile API responses, and the welcome page, plus responsible-gambling notices. Odds stay out of ranked betting lanes for now. That compliance pass got us to a mature age rating with real confidence, and the checklist now lives beside the listing copy.

Flaky CI: fix the clock, not the test

The cache handler deadline test failed twice on main and held a deploy. Cause: real timers against a 70 ms budget, so a loaded runner can lose the race before the first tick. Fix: a virtual clock. Fake Redis time plus a simulated 30 ms command latency makes the result deterministic, and the quarantine entry is gone. If your test measures elapsed time, own the clock.

this is the build log of statpro · statpro.io · all entries · essays