// 24 / FOR EVERYONE · 30 Oct 2026
// the idea
Every weather app answers the same question — what will it be like? — and leaves you to do the second step yourself: squint at seven little icons and work out whether Thursday afternoon is any good for the bike ride. The second step is the only one you actually cared about.
Weather Window starts from the thing you want to do. A ride, a run, painting outside, people round for a barbecue, washing on the line, the dog's walk, stargazing. Each one has its own definition of good weather — a painter needs it dry and still, a runner doesn't mind a breeze but minds the heat, the washing wants a breeze and low humidity, stars want a clear sky after dark. The page reads the week ahead hour by hour for your town, scores every hour against your activity's rules, and hands you the best three windows with the reason. Below that, the whole week as a grid of hours, coloured good, marginal or no, so you can see the shape of the week in one glance and overrule it.
Say it's Wednesday and you want to stain the back fence, which needs about three dry hours. You pick paint or stain outside, "at least 3 hours", your town, and get:
best Tomorrow 3pm – 6pm · 3h 64°F · 5% rain · wind 7 mph · 20% cloud
#2 Saturday 10am – 2pm · 4h 61°F · 10% rain · wind 9 mph · 35% cloud
#3 Monday 1pm – 4pm · 3h 68°F · 5% rain · wind 12 mph
slightly off: wind
good means: under 15% chance of rain, wind under 20 km/h,
10–30 °C, humidity under 80%, daylight
Tomorrow afternoon it is, then. Monday's window is flagged honest-yellow because the wind is a touch over the limit for painting — fine for a bike ride, which has a different rule. The point is that the rules are written down under the controls, so when the tool says "no", you know exactly which number it objected to and can decide you don't care.
Try it — no sign-up
Type a town or hit 📍 Me, pick an activity, and the windows appear. Change the activity and watch the whole grid recolour for a different idea of good weather.
// what it does
Twelve activities, a minimum duration from one to six hours, a town box with a use-my-location button. Under them, in plain words, the rules the chosen activity uses — chance of rain, wind, temperature range, humidity, daylight — so the verdict is never a mystery. The last place you looked up is remembered in your browser, so next time it just loads.
Up to three, one per day, ranked. Each card: the day, the hours, the average temperature, rain chance, wind and cloud across the window, and a note if any hour was marginal and why. A unit toggle flips between °F/mph and °C/km/h; it guesses from your browser's language and remembers nothing else.
Seven rows of twenty-four cells. Teal is good, amber is marginal, grey is no, hatched is dark, faded is already past. Hover any cell for the numbers and the one-line reason. This is the panel people end up using most — it turns "when's good?" into a picture.
// how it was built
Each activity is a short list of named tests. A test returns ok, marginal or no: within the limit, within a small slack band past it, or beyond that. An hour is good if every test passes, marginal if exactly one is in its slack band, and no if anything fails outright or two things are marginal. That three-level grading is what makes the grid honest — a binary yes/no would call a 16 mph breeze "no" for painting and leave you wondering why.
// value within [lo,hi] → ok; within slack of it → marginal; else no
const between = (v, lo, hi, slack) =>
v >= lo && v <= hi ? 'ok' : (v >= lo-slack && v <= hi+slack) ? 'meh' : 'bad';
paint: { day:true, rules:[
['dry', h => atMost(h.pop, 15, 15)],
['no rain', h => atMost(h.rain, 0, 0.1)],
['wind', h => atMost(h.wind, 20, 8)],
['temp', h => between(h.temp, 10, 30, 3)],
['humidity', h => atMost(h.hum, 80, 8)] ] }
Within each day, runs of consecutive non-bad hours are found; within each run long enough, every sub-window of at least the requested length is scored on the mean "niceness" of its hours, with a bonus for being all-good and a small bonus for being longer than asked. The best sub-window per day goes forward and the top three days are shown. It's brute force over at most twenty-four hours a day, which is nothing.
It's a public forecast API that needs no account: one call for geocoding the town name, one for seven days of hourly temperature, precipitation probability, precipitation, wind, cloud, humidity, UV and a day/night flag, plus daily sunrise and sunset for the golden-hour activity. Times come back in the location's own clock, which the page is careful to keep in local terms rather than converting through UTC and back — the one bug the first version had.
// what this demonstrates
It's a small, cheerful demonstration of the thing that makes software useful: starting from what the person wants rather than from the data you happen to have. The forecast already existed. The work was deciding what "good" means for each activity and being honest about the edges.
And there's no AI in it at all, on purpose. Twelve activities with written-down rules will out-perform a model being asked "is Thursday good for painting?" every time, and the rules can be read and argued with. Alongside Plain English, which leans on a model for the thing only a model can do, it's a pair: use AI where the problem is language, and don't where the problem is arithmetic.
Set the limits yourself — "I'll run in anything under 28° if it's dry" — and save it in the browser.
A link that opens on a given place, activity and window, for sending "Saturday 10–2 works" to the group chat.
Compare home and the coast side by side for a day-trip decision.
Open-Meteo has both; runners and hay-fever sufferers would want them as rules.
The tool is the source — view the page and it's all there, MIT. weatherwindow.html