Commit Graph
15 Commits
Author SHA1 Message Date
hansdezwartandClaude Opus 5 6653541bb9 Release 1.7
versionCode 8. public_html/ changed, so the service worker cache goes to
bgclock-v23.

Confirmed on device from a debug APK: the tally reads as a tally in the bar at
arm's length, and from the far side of the board.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 12:47:49 +02:00
hansdezwartandClaude Opus 5 7095e2b86e Draw the score button as a tally
The ruled card it had been reads as a document, a table or a form at the size
it actually renders — six strokes inside a 16x18 box at clamp(23px,6.4vw,32px)
— and nothing in it said score. A tally does, with no box around it to explain
itself, and it is the one score mark that survives being seen from the far side
of the board: upside down it is still a tally.

Three uprights and the slash, not four and the slash. At 23px a fourth upright
closes the gaps and the whole glyph turns into a picket fence; the slash is kept
inside the uprights' span for the same reason, since running it past them made
the icon read wider than the gear and speaker beside it.

Drawn against six alternatives in two passes, judged rendered in the real bar
at both ends of the size clamp rather than described. The passes that lost are
worth a line each, because the reasons were not visible in the geometry: two
stacks of checkers flips to say the other player is ahead when the far player
looks at it, which is worse than merely asymmetric; a bar chart is the stock
analytics glyph and says statistics rather than this match; and a tally inside a
card is smothered by the card, whatever the count.

Screenshots 1 and 5 are redone. Not 2 and 3, where the open sheet covers the bar
and the icon is not in shot at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 12:47:37 +02:00
hansdezwartandClaude Opus 5 5ad69c6ff2 Release 1.6
versionCode 7. public_html/ changed, so the service worker cache goes to
bgclock-v22.

Confirmed on device, from a debug APK over the top of 1.5: the settings kept
from 1.5 came back on the You row with the switch off; the gear stayed
reachable with the two bases set apart, which is the failure that would have
had no way out; each side ran on its own delay, including a player set to zero
starting on their reserve immediately; and a turn left running well past the
delay, force-quit and reopened, came back paused with the split still in force.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 11:55:33 +02:00
hansdezwartandClaude Opus 5 a34d6058a1 Set the time and the delay per player
A handicap match had no way to happen: one time control, one delay, both
players. The settings sheet now carries a switch between Match and Time —
"Different time per player" — and turning it on gives Time and Delay a second
row each, labelled You for the bottom half and Them for the far end, the same
way round as the score sheet. Them starts as a copy of You. Turning it off puts
both players back on You's value, so the row that survives is the one still on
screen; turning it on again re-copies rather than remembering what Them used to
say. The presets go while it is on, because a preset is one pair of numbers and
there are two players to give it to.

Underneath, cfg.base and cfg.delay are arrays indexed like st.reserve and the
panels, and they are arrays whether or not the switch is on. Split is a fact
about the sheet, not about the clock: render() and tap() read their own side's
number and never ask which mode they are in, and shared is simply the state
where the two entries are equal, kept that way by one line in the setter. The
line that mattered most was matchPristine(), which compares both sides now —
left alone it would have made the gear unreachable the moment the two bases
differed, silently and with no way back but clearing storage.

bg.base and bg.delay still mean what they always did, which is side 1, so an
install from before this lands symmetric and an older build reading the same
storage still finds its own settings. bg.split, bg.base.them and bg.delay.them
are the new keys, and all four are clamped on the way in — points was the only
setting ever validated at load, which was survivable while nothing but our own
steppers could write these.

The sheet loses two rows that earned nothing. Sound duplicated the speaker
button that is in the bar at all times, including mid-match when the sheet
cannot be opened at all; the hint under Done repeated what the sheet's own
behaviour teaches. The score sheet's hint now names the match it would restart
within, and the Time copy ends in a colon and puts its two sums on their own
line, where they fit without breaking mid-sum.

Two bugs worth recording, both invisible in the diff and both caught by
rendering rather than by asserting. The Them rows are .side elements and
.side{display:flex} beat the hidden attribute, so both stepper rows showed in
shared mode — the probe asked for the hidden property, which was set correctly,
and passed. And data-them was already the panels' opponent-score span, so
hiding the sheet's Them rows blanked the score on both halves and collapsed the
head grid; it is data-them-row now.

Screenshots 2 and 3 are redone. The other three are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 11:55:20 +02:00
hansdezwartandClaude Opus 5 e207478e79 Release 1.5
versionCode 6. public_html/ changed, so the service worker cache goes to
bgclock-v21.

Not confirmed on device: the force-quit-and-reopen check from RELEASING.md
step 4 has not been run for this build. Nothing in it touches storage, timing
or the state machine — the change is a label, an inherited colour and a lit
button, all written from render() — but the check is still owed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 10:42:35 +02:00
hansdezwartandClaude Opus 5 3f6fe5abf1 Say Paused on both halves while the clock is stopped
A stopped clock looked exactly like a running one. The panel keeps its accent
while paused, and isLive() counts a paused side as live, so the delay bar just
freezes mid-drain — nothing about either half says the clocks aren't moving.
The only tell was the play glyph in the bar, which is small, grey, and upside
down for one of the two players. It matters most in the state the app is
designed to land in: a match restored from localStorage comes back paused on
purpose, and nothing said so.

So both halves say it in words, under the delay bar, sized to sit between the
bar and the clock: wider than the bar at every screen size, narrower than the
clock at m:ss. The band is tighter than it sounds, since "3:00" is only about
2.2x the bar, so part of the width comes from the tracking rather than the
glyph size. Measured from 320 to 1024px wide it lands at 1.3-1.4x the delay
row and 74-82% of the clock. It is wider than the clock in the last ten
seconds of a reserve, where the readout drops to three narrow characters —
unavoidable inside these bounds, and the two are never confusable at four
times the height.

The word hangs off the delay row rather than joining .stack, so the big clock
does not move by a pixel when the clock stops. It cannot live inside .delay
either: that is opacity:0 whenever no delay is running, and a child can never
be more opaque than its parent, which would lose the word on the waiting half,
on a spent delay, and at a delay of 0. It takes no colour of its own, so it
wears whatever ink the clock above it is wearing, in every theme.

The play button lights up while paused, the same --icon-hot a held Reset uses.
Both toggles live in render() rather than in paintPlay(), for the reason the
comment there already gives: state written from the render loop cannot go
stale.

Screenshot 2 is redone — the score sheet pauses, so the word shows behind the
scrim. The other four are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 10:42:25 +02:00
hansdezwartandClaude Opus 5 7f1b246679 Release 1.4
versionCode 5. public_html/ changed, so the service worker cache goes to
bgclock-v20.

Confirmed on device: a turn left running well past the delay, force-quit and
reopened, now comes back with the time it had actually spent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 15:07:26 +02:00
hansdezwartandClaude Opus 5 bf3f565dd0 Release 1.3
versionCode 4. public_html/ changed, so the service worker cache goes to
bgclock-v19 — without it an installed web user would keep serving the old page
from cache indefinitely.

The five store screenshots are untouched: the ring only exists while a finger
is on the button, and none of them shows that.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 14:51:14 +02:00
hansdezwartandClaude Opus 5 b31087223a Release 1.2
versionCode 3. public_html/ changed this time, so the service worker cache is
bumped to bgclock-v18 — without it an installed web user would keep serving
the old page from cache indefinitely.

Nothing to do in fdroiddata. The recipe landed with the 1.0 submission and
carries UpdateCheckMode: Tags and AutoUpdateMode: Version, so their bot finds
this tag, resolves it to a commit hash and writes the build entry itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 13:41:48 +02:00
hansdezwartandClaude Opus 5 404fdb5538 Raise the contrast of the labels, digits and delay readout
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>
2026-08-15 13:41:40 +02:00
hansdezwartandClaude Opus 5 ac144f2eb1 Release 1.1
versionCode 2. The one user-visible change since 1.0 is the navigation bar
staying on screen; public_html/ is untouched, so the service worker cache
keeps its name and no web user sees a different page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 11:13:55 +02:00
hansdezwartandClaude Opus 5 31fcaf8282 Rewrite the store descriptions around what the app does
Hans's edit. The long description is a feature list now rather than prose,
and both mention the scorekeeping, which the old text left out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 11:08:00 +02:00
hansdezwartandClaude Opus 5 c27878b826 Refresh the screenshots, and Hans's description edit
All four listing shots were captured before the sheet-shadow fix, so each
carried the dark band along the bottom. Regenerated against the fixed
build; every one now measures a flat bottom band. The score sheet shot is
byte-identical and unchanged — an open sheet covers the bottom of the
screen, so the closed sheet's shadow was never visible in it.

Adds a fifth shot of the timeout, the most distinctive thing the app does
and the one state that had no picture.

Hans's description credits the design and the Chess.com inspiration.
Checked against F-Droid's documented limits: title 16/50, summary 66/80,
description 1644/4000, changelog 180/500, and <b> is the only markup, on
their allowed list.

.gitignore picks up *.swp and *~ so an editor swap file can't be
committed by accident.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 20:20:52 +02:00
hansdezwartandClaude Opus 5 efef1480ba Hans's edits to the F-Droid listing text
Tightens the summary and cuts the description back: the Backgammon
Galaxy reference and the "How it works" list are gone, leaving the one
line about tapping your own half. His wording, his call on what a listing
needs to say.

Line endings checked across all four files: LF throughout, no CRLF, no
BOM, trailing newline on each. Summary is 66 of the 80 characters
allowed, description 1552 of 4000.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 19:36:41 +02:00
hansdezwartandClaude Opus 5 11ec616270 Add the MIT licence and the F-Droid listing
"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>
2026-08-11 19:28:05 +02:00