Project File / 01 / Personal utility
I wanted a morning scroll that did not ruin the morning
A daily anti-doomscroll feed that learns which kinds of good news are actually interesting to you.

I did not need another wellness app telling me to put my phone in a drawer. I needed the phone to stop opening with a wall of disasters.
Positive Morning started with a smaller question: what if the morning scroll still felt like a scroll, but the material was selected to leave you curious instead of vaguely poisoned?
01.01
The problem was not scrolling
Scrolling is useful. It is fast, low-friction, and very good at delivering novelty. The problem is that most feeds optimize novelty through outrage, fear, and status anxiety because those emotions are easy to measure.
So I kept the behaviour and replaced the objective. The product serves twenty positive internet stories, refreshed daily. Not affirmations. Not beige lifestyle advice. Actual developments in science, conservation, communities, health, art, and the occasional animal doing something excellent.
Product betDo not fight an entrenched habit. Give the habit a better destination.
01.02
Positive is not the same as interesting
The first feed proved something immediately: a page full of nice things can be just as boring as a page full of bad things. The curation had to understand taste, not merely sentiment.
The pipeline pulls from positive-news RSS and search sources, filters obvious doom terms, infers topics, and ranks the remaining stories. There is also a fallback set, because protecting the morning includes not showing a broken empty screen when a source disappears.
The useful constraint is twenty. Enough range to discover something. Few enough that the feed can end.
01.03
One slider instead of a personality quiz
Each story gets a red-yellow-green interest slider. Red means less like this. Yellow is neutral. Green means bring me more. The score updates preferences for topics and sources, then the next curation pass ranks accordingly.
That signal is deliberately more specific than a like button. A story can be good for the world and still not be for me. The product gets better by learning that distinction instead of pretending all positivity belongs in one bucket.
Verified behaviourThe ranking tests explicitly prove that greener topics rise above redder ones while neutral stays neutral.
01.04
The quiet machinery
Hermes refreshes the feed on a schedule, watches the sources, and keeps the curation loop moving. Convex stores the active stories and the feedback. The interface itself stays almost aggressively plain: headline, story, source, signal.
That is the part I like most. A fair amount of machinery exists so the product can feel like almost nothing at all.
What survived
Three things I would carry into the next build
- A better default often beats more self-control.
- Sentiment is a filter. Taste is the product.
- A feed should be allowed to end.