F-Droid's reviewer measured the score and move lines at 2.1:1 against the
4.5:1 normal text needs. Raising them past 14pt bold puts them under the 3:1
large-text bar instead, which is the only way ink still readable as "muted"
can be conformant on a mid-tone accent: reaching 4.5:1 at the old size would
have taken near-black labels on plum and slate, out-shouting the clock digits
above them. Hence the 19px floor, with a comment saying so — lowering it
breaks the contrast claim silently.
Measuring turned up a second failure nobody had flagged: the active player's
clock digits are white on the accent, and brass sat at 2.46:1 against the same
3:1 bar. Sage and brass are darkened just far enough to clear it, scaled in
linear light so only lightness moves. Slate, teal and plum already passed and
are untouched. Darkening further was tempting and wrong — it would have taken
the headroom the muted labels need.
--accent-mute was doing double duty as the delay bar's background, where it
only ever agreed with the bar by accident. Splitting off --track keeps the bar
pixel-identical: 234px wide, fill and unfilled segments unchanged.
The delay number is right-aligned in a box exactly two digits wide. The bar and
the number together now sit within a pixel of the panel's centre rather than
10px left of it, and the digit that changes every second stays put instead of
sliding when the count drops out of double figures; the gap absorbs it.
The settings sheet's Done button and preset chips are still white on accent at
15px, which needs 4.5:1 and gets 3.2:1. Known, and left alone: fixing them
means 19px floors and visibly taller buttons.
Screenshots come from tools/screenshots.py now instead of being made by hand.
It seeds localStorage and lets the app render its own saved state, so scenes
are reproducible. The traps are in its docstring and RELEASING.md — including
one that cost an afternoon today: snap-confined Chromium cannot write into any
hidden directory, and says only "Permission denied".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Do whatever you like with it" isn't an SPDX identifier, and without one
F-Droid won't take the app at all. Same intent, now in a form a machine
can read.
The listing lives in fastlane/metadata/android/en-US/ so F-Droid reads it
out of the repo and it stays in version control: title, a 65-character
summary, a description adapted from the README that leads with the empty
permission list, a changelog and four screenshots.
The screenshots are generated from the same HTML the app runs, at
1170x2532. The harness freezes the render loop once the wanted frame is
painted — a headless capture otherwise lands whenever the virtual clock
runs out, by which time the delay bar has always finished draining, and
the delay is the thing worth showing. Shot one is a 5-point match at 2-1
with the bar half spent; the others are the score sheet, the settings
sheet from a pristine match (the gear is gone once a match is running, so
that is the only honest way to show it), and a 1-point game with the
score chrome absent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>