A morning paper my desk prints for me
· Json Knepper
Every morning at six, a script on my desk puts together one page of news and emails it to me. It’s called The Seal Beach Morning. The tagline is “One page. Then it ends.” That line is the whole design brief.
Why I built it
My mornings used to start with a handful of apps and a feed that never ran out. I’d open one thing to check the weather and look up twenty minutes later. None of those apps were built to let me stop.
A newspaper has an end. You read the last page and you’re done. I wanted that back, filled with the handful of things I actually check before work.
What’s on the page
The paper reads from a small settings file. It holds my town, the coordinates for the weather and for the water just offshore, the teams I follow, the topics I care about and a short list of markets. Change the file and the paper changes.
Weather and the water. The day’s high and low, the chance of rain and the sky, plus sunrise and sunset. A marine reading for the water off Seal Beach sits beside it.
Scores. Last night’s result and today’s game for the Dodgers and the Lakers, pulled from the league schedules.
A topic. Right now it’s one: running AI models locally on a Mac. The paper pulls a few recent headlines from news searches and from Hacker News and lists them with their sources.
Markets. A few prices I follow, a handful of coins, and a couple of headlines about them.
That’s it. It doesn’t have a feed or a “load more” button, and there’s nothing to scroll past the last line.
How it’s made
Every source is free and needs no key. The weather comes from Open-Meteo. Scores come from the MLB Stats API and ESPN’s team schedule. News comes from Google News RSS and the Hacker News search. Coin prices come from CoinGecko.
The script turns that data into plain sentences. It doesn’t ask a model to write the news. If the data says it’s partly cloudy with a high of 72, the paper says that and nothing more. Nothing on the page is invented. If a source fails that morning, its section is missing rather than filled with a guess.
It also filters out junk. Some headline sources are full of prediction-market filler and auto-written price posts, and the script drops those before they reach the page.
The page itself is built to survive email. Tables, inline styles and web-safe type, because email apps strip most of what a modern web page relies on. It goes out through the same mail relay my studio uses for its own designed emails, and each day’s edition is saved to an archive folder by date.
What I took from it
The useful part wasn’t the code. It was deciding what not to include. Each section had to earn its place by being something I’d otherwise go open an app for. Most things didn’t make it.
It’s the same question I ask on a client’s home page. What does this person actually need before they close it? Put that on the page, then let it end.
It’s also a good small example of how I like to use automation. Free, public data on a fixed schedule. Sentences written from the numbers and nothing added. One output that a person reads, and when something’s missing it’s left out.
Prefer us on Google If you read us often, tell Google to show our pages first.