Side project · dayfall.app · August 2026

A memory app wearing weather's clothes.

Building Dayfall with three Claudes — and what a weather page taught me about product voice, color systems, one spectacular browser freeze, and what it takes to get 530 days of history right.

212
commits
530
public days
11
prompt revisions
3
Claudes

Dayfall takes a moment — "Jackie Robinson's debut," or your wedding day, or just a date and a place — and shows you what that day felt like: a satellite photo of the spot, a short piece of prose about the weather written like a memory, and a band of the day's light you can scrub with your finger. Try it at dayfall.app, then send a day to someone who was there with you. That send is the whole product.

The Dayfall create page — a night-blue screen with the words 'You remember the day. Feel it again.'
The create page. The app is night until you name a day.

The idea

Every weather app tells you what tomorrow holds. Nothing tells you what a day in your past felt like — the day you got married, the day your kid was born, the day it snowed on the Colosseum.

The framing that decided everything downstream: this is a memory app wearing weather's clothes. The user brings the moment. The weather is the sensory key that puts them back in their body on that day. "It was raining that morning" does something to a memory that a photo doesn't.

If sharing is the growth motion — you look up a meaningful day and send the link to someone who was there — then every moment has to be a permanent, stateless link. So a personal moment lives entirely in its URL: place, date, coordinates, nothing else. No accounts, no stored history. The one database that arrived later holds the written testimony (the day happened once; it gets written once) and the public corpus described further down — never who you are or what you typed. The privacy note on every page says exactly that, in one sentence, because I cut it to one.

An early Dayfall build rendering D-Day — dark page, satellite coastline, testimony prose
An early build, a few days in: D-Day as testimony. Everything dark, the band still a box at the bottom of the page.

Prose first, numbers as texture

The first product law: the output must read like testimony, not a forecast. Precision is for forecasts; history wants adjectives.

The prose is written by Claude per moment and cached forever — the day happened once, it gets written once. The prompt is the voice, and I treated it like product code: it lives in the spec, it's versioned, and it took eleven revisions to get right. The prompt's core conceit is a set of blindfold rules: the writer knows only what a body could feel. Temperature on skin, wind, wet, the quality of light through closed eyes. Nothing invented — no petrichor unless it rained, no seasonal language the hemisphere doesn't support.

My favorite iterations, because each one came from a real failure on a real page:

A day is remembered by its exception, not its average

My favorite product bug: the Colosseum page for the day it famously snowed in Rome opened saying clear and cold, 25° — because the page opened at noon, and by noon the snow had stopped. Technically correct. Completely wrong.

A day is remembered by its exception, not its average.

The fix became that principle. The page now opens on the day's notable hour, chosen by hard precedence — snow beats storm beats rain beats fog beats grey beats clear — clamped to daylight, centered on the heaviest stretch. Two hours of snow on an otherwise clear day is the day. Every surface tells that one story from the first frame: the headline, the light, the photo treatment, even the link preview.

Dayfall's Rome page — 'Rare snowfall at the Colosseum,' snow marks drifting over a pale grey page
Rome now opens on the snow. The marks drifting over the page are the day's weather, drawn in the band's own vocabulary and pinned to the glass like snow on a window.

The page is lit by the day

There's one axis of meaning in the whole design: light. Every color on the page derives from the weather — nothing is themed, everything is computed. Getting that derivation right was the most iterated system in the project, and every revision came from staring at a page and asking why it felt wrong:

Tokyo's page tinted faintly olive-green
The bug: Tokyo's 95° page reading faintly olive — a saturated warm hue at high lightness reads green.
The same Tokyo page rendering as a bright, hard off-white
The fix: the same day under "heat is brightness." A hot clear noon is a harder light, not a yellower one.

The ridge

The sky band went through three full designs. It started as what you'd expect — a little boxed chart of the day. It read as a widget, and a widget was exactly wrong on a page trying to be a memory.

The first band: a boxed chart with a white temperature line, axis labels, and hour ticks
Generation one: a chart. Ticks, labels, a panel — honest, and completely wrong for the page.
The second band: a rounded dark strip with a day-to-night gradient and a thin contour line
Generation two: the chrome mostly gone, the day's light as a gradient — but still a rounded object sitting on the page.
The final ridge on a dark Tokyo page: an amber daylight contour over a horizon that dissolves into the page
Generation three, with Claude Design: the ridge. A horizon, not a widget — the fill dissolves downward until the band simply becomes the page.

For the final version I worked with Claude Design, going back and forth in its canvas until we landed on what we called the ridge: the temperature contour as a horizon line, the day's light as the sky behind it, precipitation falling in the space above it — and no container at all. The fill dissolves downward into the page; the band has no bottom edge, it simply becomes the page. The handoff was a spec I dropped into the repo for Claude Code to implement, with one note I flagged as load-bearing: no chrome. No axis, no ticks, no border, no shadow. The moment any of it returns, the whole thing reverts to reading as a chart.

Three Claudes, one side project

The workflow turned out to be one of the most interesting parts:

My job was creative direction and taste: deciding why, writing the laws, saying no. The brief became the medium — every hard-won rule ("the weather is never painted onto the photograph," "the prose is one voice in one colour") is written down with the failure that produced it, so no future session relitigates it. Two hundred and twelve commits in, the spec is the most valuable file in the repo — it is on its third version, and the accuracy machinery got a document of its own.

The freeze: a detective story

The best engineering story in the project started with a feature request I'd rate as innocent: can the background color ease smoothly while you scrub the band, instead of snapping?

Three easing systems later, fast scrubbing could freeze the entire page — frames seconds long, memory climbing past 1.8GB, sometimes a dead tab. What followed was a genuinely fun forensic hunt:

The Rome page with a green diagnostic overlay in the corner reporting frame gaps, heap, and DOM churn
The freeze-o-meter: a diagnostic overlay built into the page behind a URL flag. This frame is healthy — 6MB heap, zero long tasks — because the animation is off.

The resolution was a design decision disguised as a bug fix: the light snaps. The text color always snapped by design (it must flip at the readability boundary, never linger in the unreadable middle) — now the whole page changes in a single decisive frame, and honestly, it reads better. The constraint produced the right answer; the investigation continues as a minimal repro for an upstream report.

Honest data is a product feature

A detail I care about: the archive data (ERA5 reanalysis) averages weather over a ~31km grid, which smooths single-cell thunderstorms into drizzle. The famous "rain show" Taylor Swift played in Nashville — roughly two inches of rain at the stadium — records as half an inch in the archive. For a memory product, quietly rendering someone's unforgettable storm as a mild wet afternoon is a betrayal. So every page carries an era note ("An impression of the day, not a measurement" for pre-1950 dates), the prose softens numbers on old dates, and convective days are an open honesty question I've written down rather than papered over.

530 days, checked against the sky's own record

The second month was a different project wearing the first one's clothes. Personal days are private and infinite; a public day — the handover of Hong Kong, the night of the Centennial Park bombing, Bolt's 9.69 — is one page that many people were at. So Dayfall grew a corpus: 530 public days from 1940 to this summer, each with its own permanent page, each with a paragraph written by hand under the same blindfold rules the model works to, and a one- or two-sentence "As it happened" note underneath it.

The rule for the notes came from reading the first fifteen: the good ones are a small, documented, human detail that puts you in the room — the Cubs' rain-delay clubhouse speech, Prince playing Purple Rain in an actual downpour, Bowie reciting the Lord's Prayer at Wembley. The weak ones restate the sky the paragraph already described. Titles got a rule of their own after I hit one that read "Athletics begins in Atlanta": a title says what happened, not the sport or the city.

Accuracy of the day is more important than the writing. People who experienced those days need it remembered back to them properly, or they lose trust in the whole thing.

I wrote that into the brief as law, and it reorganised everything. The archive is a weather model. Models miss thunderstorms, invent drizzle, and put a coastal airport's temperature over an inland city. So every corpus day now gets a second opinion from NOAA, in two layers:

Getting the hourly layer to tell the truth was its own week of rules, each from a page that lied: a station that never files rainfall can't vouch for a dry hour; a wet weather code keeps an amount even when the gauge is empty; a 24-hour total smeared evenly across the hours is not a rainstorm (Hong Kong's handover day showed 8.9 inches at 0.4 an hour); a Manhattan heliport reporting 135 inches of rain is a decoding error, not a flood; a station that reads 47° for twenty-four hours straight in Turin in February is broken.

The Hong Kong handover page: a rain-greyed satellite view of the harbour, the headline and date, the label 'rain 8am–7pm · 91°', the ridge, and the testimony beneath
A corpus day. Hong Kong, 1 July 1997: the ceremony was held in a downpour, and the page is grey and streaked with rain from the first frame.
The tail of the same page: the 'As it happened' note, four measurements, and a starred line about the King's Park station recording more rain than the model shows
Under the record, the second opinion. Here the station and the model disagree, and the page says so rather than picking the prettier number.

The last check was the one I should have built first. Reading ten pages before opening the site to Google, I found that half the paragraphs were a few degrees off the band beneath them — 52° in the prose, 49° on the ridge. The cause was archaeological: the earliest rounds had been written to air temperature before the feels-like rule existed, and the band shows feels-like. So there is now an audit that reads every paragraph against the exact hours its page renders, and one rule with no tolerance in it:

Every temperature in the paragraph is an hour on the band.

Eighty-nine paragraphs were re-numbered; the insert step refuses anything that breaks the rule; and wind, which had been "gusts past 28 mph" to a reader who has no idea what 28 mph feels like, became words — a stiff breeze, a strong wind, a hard wind, gusts near gale force.

Then robots, a sitemap of 531 URLs, and Search Console. Personal moments stay out of the index — place × date is an infinite doorway space — and the corpus is the site Google sees. You can browse every day in the corpus from one page.

For the record, redrawn

The record line was the dashboard that kept trying to come back. It had a heading, a rule above it, and a table of eleven numbers behind a tap. The current version has none of that. Under the note sit four measurements with no heading at all, chosen per day by how much they say about that day: a measurement scores on its distance from unremarkable, and one the day gave nothing to say — rain 0.00" on a June afternoon in Phoenix — is not offered. Phoenix leads with humidity 13%. London on 5 December 1952 leads with humidity 97% and wind 5 mph, which is the entire reason the Great Smog happened.

The record open on the Atlanta page: rain, humidity, wind and daylight lead; the rest unfurls beneath, ending with the station-source line
The record open. The four lead measurements hold their positions and the rest unfurls below them in a single eased motion — the one named exception to the rule that fades are the only animation. The last line names the station whose hours drew the page.

Two smaller rules came out of the same week. Rain means rain: the row had been reading total precipitation, which folds in the water a day's snow melts down to, so the blizzard of 23 January 2016 showed "Rain 1.73"" on a day that recorded twelve inches of snow and no rain at all. And amber is daylight, so it goes only on what the day owns — the place line, the condition line, the band — and everything that belongs to Dayfall is ink.

Small things I'm fond of

An iMessage bubble showing a Dayfall link preview: satellite map of San Francisco, 'Saturday, March 4, 1978,' and a small rain band
The whole product in one iMessage bubble — the test that matters most for a share-driven app.

What's next

The name is settled — Dayfall, at dayfall.app. The print door is live as a fake door (leave an email, we'll save you one), waiting for the fulfilment side. Next is the footer: five specific days you can go to in one tap from any page — yesterday, tomorrow, and three other years at the same place — because a year is a link but a morning is a memory. Then unit toggles, a client-side history of the days you've visited, and the print itself: a day as a physical keepsake, the giant date, the testimony, the ridge as artwork. The kind of thing you'd frame for someone about the day they were born.

Dayfall is a side project built with Claude Chat, Claude Design, and Claude Code. The satellite imagery is Mapbox; the weather is Open-Meteo's ERA5 archive, 1940 to five days ago, checked on the public days against NOAA's own stations; the prose is Claude, blindfolded — and on the 530 public days, written by hand under the same blindfold.