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>
Backgammon Clock
A two-player match clock with simple delay you can actually see. Reserve time plus a fixed number of free seconds each turn that never carry over — the Backgammon Galaxy control. Defaults to 3:00 + 12s.
Plain HTML, CSS and JavaScript. No frameworks, no fonts, no images, no network.
There's an Android package too, in android/ — a WebView around the same
public_html/, so the two can't drift. It declares no permissions at all. See
RELEASING.md for how to cut a new version for F-Droid.
Getting it onto your phone
Chrome will only offer a real install over HTTPS, so the file needs a host. GitHub Pages is free and takes about two minutes:
- Create a new public repository, e.g.
bgclock. - Upload all six files from
public_html/to the root:index.html,manifest.webmanifest,sw.js,icon-192.png,icon-512.png,icon-maskable-512.png. - Settings → Pages → Source: Deploy from a branch →
main/(root)→ Save. - Wait a minute, then open
https://<you>.github.io/bgclock/on your phone. - Android, Chrome: menu (⋮) → Add to Home screen → Install. iOS, Safari: Share (□↑) → Add to Home Screen → Add. It has to be Safari — Chrome and Firefox on iOS can't install a web app.
Open it from the home-screen icon and it runs fullscreen with no browser chrome, offline, with the screen kept awake while a game is on.
On iOS a few things behave differently, none of them fatal:
- Install from Safari, and play from the home-screen icon. In a Safari tab you lose a strip of the screen to the toolbar, and iOS clears the saved settings of a site you haven't visited for a week. The installed app keeps its own storage and doesn't get pruned that way.
- The ringer switch doesn't mute the clock. The page claims a playback
audio session so you can hear the delay tick with the phone silenced, which
in exchange pauses any music you had going. If you'd rather keep the music,
delete the
navigator.audioSessionline inindex.html. - Screen wake needs iOS 16.4 or newer. Below that the screen dims on its usual schedule mid-game.
If you're using a different path than /bgclock/, edit the "id" field in
manifest.webmanifest to match, or just delete that line.
To try it before hosting, open public_html/index.html in any browser —
everything works except installation and the service worker.
Using it
- Tap your own half to end your turn and start your opponent's clock. At the start, whoever taps first sets the other player going.
- The waiting player's taps are ignored, so a stray hand won't stop the clock.
- A tap counts when you lift your finger, and only if it didn't move. A swipe does nothing, so Android's swipe-up-from-the-bottom and the status-bar pull-down work over either half without costing anyone their turn — and a hand dragged across the panel won't change it either.
- Your clock runs until you lift. Holding a finger on the panel costs you the time you can see counting off, and holding it past zero flags you, exactly as if you hadn't touched it at all.
- The bar under the big time is the delay draining. When it empties you get a soft tick and your reserve starts moving. That's the moment worth hearing.
- Run out and your half turns red and reads "Out of time", in letters sized to whatever room that half has left, so it's readable from across the board. The other half keeps showing its own remaining time.
- Reset starts a whole new match: clocks back to full and the score back to 0–0. It takes two taps: the first arms the button — it lights up and a ring unwinds around it — and a second tap within those two seconds does it. One stray thumb can't wipe a live match. It's absent on a fresh match, where there is nothing yet to wipe.
- Pause freezes mid-turn and resumes exactly where it stopped, delay included. Both halves read Paused underneath the delay bar while it is, in the same ink as the clock above it, and the play button lights up — so a stopped clock can't be mistaken for a running one from either side of the board. Opening either sheet pauses automatically. The settings sheet leaves it paused — everything in there resets the clocks anyway — while the score sheet picks the turn back up when you close it, so glancing at the score doesn't cost you a tap on play. It's absent whenever there's no clock running to freeze: before each game's first tap, and once someone has run out of time.
Both buttons keep their space in the bar while they're away, so nothing shifts under your thumb — the same as the gear.
- Settings are only reachable before a match starts. Every control in that sheet resets both clocks, so the gear disappears the moment the first tap starts the clock and comes back after a reset. Its space in the bar is kept empty, so nothing else shifts. That means a mistake in the time or delay can only be fixed by resetting and starting the match again — deliberately, since the alternative is wiping two live clocks by accident. Correcting a clock mid-match is what the score sheet is for.
Backgammon clocks pause between games, and after a cocked die the delay is normally restarted — use pause and reset for those.
Matches
Set Match in the settings to the number of points you're playing to — 1, 3, 5 and up to 29. The time you set is per point, so a 5-point match at 2:00 a point puts 10:00 on each clock, and the settings sheet shows you that sum — one sum, or one for each player if you've set their times apart.
Each half reads the state from that player's own side of the board:
You: 1 out of 5
Them: 3
Moves: 7
So "You" always means whoever is sitting at that end — both players read their own score on the top line, and the two halves show mirrored numbers.
At 1 point there's no match to keep score of, so the score lines and the score-sheet icon all disappear and you get the plain single-game clock with just its move count. Set the match to 3 or more and they come back.
The score sheet is the middle icon in the bar. It's filled in from the phone holder's side: You is the bottom half, Them the far end.
Nothing in that sheet takes effect until you press Done:
- Done with nothing changed leaves everything exactly as it was — same turn, same delay part-spent, same move counts — and the clock picks up where it left off. Tapping outside the sheet is the same as changing nothing, so a stray tap can't restart a game. A pause you set yourself before opening the sheet survives; only the sheet's own pause is undone.
- Change a score and the game restarts when you press Done: move counters back to zero and the turn back to the first tap, waiting on whoever rolls the lower die. The clocks keep whatever they were showing.
- Change only a clock — the sheet also lets you correct either player's time to the second — and the game carries on undisturbed and running: same turn, same delay position, same moves.
Shortening the match to fewer points than someone has already won pulls their score down to fit.
Settings
Under Delay are three presets — 2m / 12s, 3m / 12s and 3m / 15s. Tapping one puts both the time and the delay there and lights it up. Change either by hand and the highlight goes out; land back on a preset's numbers and it comes back on.
Different time per player — the switch under the Time steppers — gives each player their own time and their own delay. Turn it on and a second row appears under both, labelled You for the bottom half of the phone and Them for the far end, the same way round as the score sheet. Them starts as a copy of You; change either from there. Turn it back off and both players go back to whatever You says, so You is always the row that survives — set the shared time first and split it afterwards, not the other way round.
The presets are gone while that switch is on. A preset is one pair of numbers and there are two players to give it to, so there is nothing sensible for it to mean. A handicap match is the point of the switch: give the stronger player less time, or take one player's delay down to zero and leave the other's alone.
| Setting | Range | Default |
|---|---|---|
| Match | 1 – 29 points, odd | 1 |
| Time | 0:15 – 99:00 per point, per player | 3:00 |
| Delay | 0 – 60 s, per player | 12 s |
| Different time per player | on / off | off |
| Colour | Sage, Brass, Slate, Teal, Plum | Sage |
Sound isn't in the sheet — it's the speaker button in the bar, reachable at any time, mid-match included.
Brass is the colour in the chess.com app, if you want the exact original look. Changing match, time or delay resets the clocks — the score is left alone, so you can fix the delay mid-match without losing where you are.
Settings and the match in progress are kept in localStorage, so they
survive closing the tab, force-quitting the installed app and rebooting the
phone — the app also asks for persistent storage so they aren't evicted when the
device runs low on space (Chrome honours that request; Safari ignores it).
Reopening restores the score, both clocks, the move counts, whose turn it is and
how much delay was left — each player's own delay, if you've set them apart. The one thing it can't restore is time passing while
the app was closed, so it comes back paused rather than charging anyone for the
gap: a crash shouldn't decide a game.
Sounds
All three are generated with the Web Audio API, so there are no audio files to download and nothing to attribute.
- Turn change — a soft rising fifth with an octave partial, marimba-like.
- Delay expiry — a single quiet 300 Hz tick, deliberately easy to miss unless you're listening for it.
- Time out — a falling triad, loud and unambiguous.
Licence
MIT — see LICENSE. Do whatever you like with it, in other words, but now in a form F-Droid and everyone else can read.