N17 Time proved that a football club's next match could be one page on a free tier, refreshed on the hour from a feed. The feed does not reach National League North, the sixth tier of English football, where Hereford FC play and where the same question is harder still to answer. HR4 Time is the same page for Hereford: built from N17 Time's code in a Sunday afternoon and a Monday, fed by two free sources that between them know what the one feed knew, and run by a schedule that stopped expecting any attempt to succeed first time.

HR4 Time is the practice's own product, and an unofficial one. The front page shows Hereford's next match: opponent, home or away, kickoff in the reader's local time with a countdown, the ground and its address with directions on an away day, the opponent's last five league results, and the club's place in the table. Behind it sit the season's fixtures and results, and the division's table. It sets no cookies, carries no crest, nickname or photograph, works with scripting disabled, and reads offline once installed. The name is Edgar Street's postcode area, not a club mark, and the icon is those three characters over a small clock reading three o'clock.

Two sources where one used to do

The first day went on data rather than code. Half a dozen sources were looked at and set aside, for coverage or for terms, before two free ones were chosen: Hereford's own public calendar, which knows each match's kickoff, ground, address and the link to its match centre, and a sports-data source that knows the whole division, every round and every result. Neither needs a credential, so the worker holds no secret at all. The whole season was captured that Sunday and the merge written against the captured data rather than the documentation: the division's rounds are the base, the club's calendar is the authority on time and venue, a match the club has moved is followed to its new date, and anything only the club knows about becomes a cup tie.

Two things were learned from the data rather than assumed about it. A rearranged match carries no status at all, only a date away from the rest of its round, so that is how one is recognised. And the source's own league table ran a result behind, so the page works the table out from the results instead. The whole division's results ride in the stored snapshot, about twenty-five kilobytes, so the opponent's form and the table cost no extra calls. The season is fetched nightly in two halves, to stay inside the free plan's budget for one run, and the hourly refresh touches only the rounds within three weeks.

A refresh that stopped expecting to succeed

The page went up on the platform's free hostname on the Monday afternoon and was left alone. Its first hourly refresh was refused by the data source, while the same request from a laptop a few minutes later was answered. The obvious suspect was the hour itself, when every scheduled job in the world wakes up, so the refresh moved to fourteen minutes past. The next one was refused too, and four requests sent from the laptop at the turn of that hour, exactly when the suspect said they should fail, were all answered. The source limits requests by address, and a serverless function's outbound address is shared with every other function running in the same place, some of them evidently drawing on the same free allowance. No choice of minute makes a shared address quiet.

So the schedule stopped expecting any single attempt to succeed. Every refresh falls due at fourteen minutes past and is tried again on each two-minute tick until one run writes; a refused attempt costs a request or three and writes nothing, so the last good page stays up throughout. Of the first four attempts, three were refused, and the fourth got through. One night's full refresh took half an hour of ticks. Three days on, unattended, the page was still writing itself afresh every hour, and only then was it called working.

— On first attempts —

Nothing had to work first time. It only had to fail safely.

Rules the data taught it

More rules arrived after launch, each from something the data did. The first postponement came in the club's calendar as a cancellation on the original date, while the club's own page called the match postponed and the sports-data source still had it as not started three days later. So a cancellation in the calendar now reads as a postponement, and the page follows the match to its new date once the club sets one. A calendar entry with a date but no time shows the day and Kickoff TBC, with no countdown. A cup tie is learned of from the calendar and its result found afterwards by searching the sports-data source for the competition, the date and the side. Form stays league-only: a cup opponent from outside the division has no league results, so the card shows no strip rather than a partial one.

Launched, then checked, then named

The launch checks were run against the deployed page. Accessibility scored in full on both pages in both themes, with every text colour pairing computed rather than sampled; one pairing, the amber of the line that warns of stale data, fell short on the light background and was darkened. No cookies, and no request beyond the page's own domain. With scripting off the page shows UK time; with it on, the reader's own. Under fifty kilobytes a page, and no sideways scrolling on the narrowest phone. Installed on both kinds of phone, and opening in flight mode after one visit.

The brief said zero cost, and the brief gave way the afternoon the page launched: a domain of its own, about twelve pounds a year at cost from the platform's registrar, its only spend. The free hostname was kept on beside it, so the copies already installed on phones kept working. The domain also brought the platform's cookieless analytics, injected at the edge on the domain alone, and their beacon is the one request the page makes beyond its own domain. A monitor on a free plan fetches the page every five minutes and alerts not when it stops answering but when a phrase appears: the line the page prints once its data is more than a day old, which means the refresh has been failing for a day behind a page that still looks fine.

What went back

Within a fortnight the sibling had started giving features to the original. Cup ties, a league table page and directions to away grounds were built here on a Thursday and reached N17 Time the next day, each answered differently because the data behind it is different. The table page lists all twenty-four clubs with each club's last five results, Hereford's row marked and the promotion, play-off and relegation places ruled off; the win, draw and loss columns are hidden on the narrowest phones so that nothing scrolls sideways. Directions are a plain link to a map search, which requests nothing until it is tapped. The following day every result tile gained its detail, the score, the opponent and the date, on hover or on a tap, with no new requests and no new tab stops.

The live score is the one feature N17 Time has that this page does not, for the reason that put it on N17 Time: measure first. On Hereford's first home match under observation, two free sources were polled every two minutes from just before kickoff until well after the whistle. Only one moved during play, between two and seven minutes behind the pitch, and showed full time about five minutes after it; once, a score elsewhere in the round went backwards between two reads. Whether that is close enough is what the exercise was for. The evidence is written down beside the feature, and the decision has not yet been taken.

What it costs to run

Everything it runs on is a free plan, shared with N17 Time: the worker, the store, the static files, the analytics, the monitor. The footer credits both sources and says plainly that the page is unofficial. The domain is the only bill.

HR4 Time took a day and a half to build because N17 Time had been built to be forked, and it was worth building because the data underneath was different enough to teach the original something. The sources were verified before a line was written. The rules came from what the data did, not from what it was supposed to do. The schedule assumes it will be refused, and fails safely when it is. And the one feature not yet built is the one whose measurements are still being weighed.