Earning the interruption
Inside NextUp's notification system: AI-enhanced notifications, granular user control, and a personal TV guide built for the streaming era.

A NextUp notification on the lock screen. Claude writes the prefix per episode; the builder handles the badge, still image, and service context.
Push notifications are a broken contract. Every app asks for permission, most abuse it, and users learn to tune everything out. When I built the notification system for NextUp, an iOS app for tracking TV shows, I wanted every notification to earn its interruption.
What changed
For decades, you didn't have to think about what was on and when. Fewer channels, stable schedules. You discovered new shows just by watching TV. Cable started to stretch that. Hundreds of channels meant program guides and DVRs. Streaming broke the model completely. Your shows are scattered across services that don't talk to each other, each with its own way of surfacing what's new, or no way at all.
NextUp is built to give that back. It pulls your shows together across services, recommends new ones based on what you already like, tells you when something new is available, and gives you real control over what gets through. Every layer of the system errs on the side of staying out of the way.
The control layer
The relationship starts with the permission request, and most apps blow it. They throw the system prompt at you cold, before you have any idea what you're saying yes to. NextUp's onboarding shows you the actual notifications before it asks for permission. A carousel cycles through real show posters, exactly as they'd appear in your tray. You see the actual experience before you make the decision.
Onboarding leads with the sample, not the ask. Three notification types, three familiar shows, before the system prompt appears.
Once you've opted in, the settings give you real control. You can toggle notifications on or off for any individual show, and shows that have ended get archived automatically.
Toggling notifications happens wherever it's natural. You can flip a show on or off from its detail screen, or manage everything from a central settings view with search and bulk controls. Changes are instant. The sync happens in the background. And when a notification does arrive, tapping it takes you directly to the show.
One tap to mute Euphoria, no hunt through buried menus. Every show has its own toggle, reachable from settings or from a show's detail screen.
The intelligence layer
A notification from HBO looks the same as one from Hulu looks the same as one from Netflix. "New episode available." "Now streaming." The content is technically correct but completely generic. Nothing about the notification itself reflects the show it's about.
The system uses Claude Haiku to give each show's notifications a distinct voice, one that actually sounds like it belongs to the show.
You are a creative copywriter crafting notification prefixes
for a TV show tracking app.
Show Details:
- Name: ${name}
- Genres: ${genres}
- Overview: ${overview}
Generate exactly 5 short, punchy notification prefixes (2-8 words max).
Capture the show's tone. Use iconic quotes when the show has them.
Each prefix should feel specific to this show and no other.Here's what the prompt produces for three shows with very different registers:
{
"House of the Dragon": [
"Fire and Blood!",
"Dracarys!",
"The dragons return."
],
"Rick and Morty": [
"Wubba Lubba Dub Dub!",
"It's time to get Schwifty!",
"Turn up the Snake Jazz!"
],
"The Last of Us": [
"Endure and survive.",
"When you're lost in the darkness...",
"The journey continues."
]
}There's no "AI-powered" label anywhere in the app. You just get a better notification and probably don't think about why. The generation refreshes each season to keep up with how a show changes over time, at a fraction of a cent per show.
The system is also context-aware. A season premiere gets different copy than a mid-season episode; a finale gets its own treatment. Writing custom notification copy for a premiere is the kind of thing Netflix has a team in place for. This system does it for every episode of every show, automatically.
Two layers of generation in one House of the Dragon notification. Claude writes the "Dracarys!" prefix, the message builder adds the "Season Finale" badge.
The details add up. Notifications from the same show are threaded together on the lock screen using APNS thread IDs, so a busy premiere night doesn't become a wall of individual alerts. When an episode still image is available, a notification service extension downloads it and attaches it to the notification before it's displayed. The result is a notification that looks and feels like it was crafted for that specific show, that specific episode, at that specific moment.
The delivery layer
Most apps treat every touchpoint as a chance to pull you back in. NextUp is built to send you away. Google's official philosophy page still claims their goal is to have users leave the site as quickly as possible. Then they built AI Overviews, which cut link-clicks nearly in half and dropped publisher traffic by about a third in 2025. The philosophy stayed on the page; the incentive won.
The calendar feed is built on the older principle. You can subscribe to a feed with all your upcoming episodes, in whatever calendar app you already use. It's a personal TV guide that shows what's coming and when, across every service. You can share it with your partner, your friends, anyone who wants to follow along. The information lives wherever you already manage your time.

Upcoming episodes for the shows you follow, across every service, in the calendar you already use. Share it with the people you watch with.
On iOS, subscribing is a single tap. The app converts the feed URL to a webcal:// link and hands it off to Apple Calendar. From there, upcoming episodes show up alongside your meetings and reminders. The feed updates automatically. There's nothing to manage.
The infrastructure underneath
The backend runs on Firebase Cloud Functions. A scheduler checks for new episodes every six hours and creates Cloud Tasks timed to each episode's exact air time, so the notification fires when the episode actually airs, not on a delay. When a task fires, it validates the episode, attaches a still image if one is available, and routes to delivery. Shows with fewer than 1,000 followers get processed inline; larger shows fan out through Pub/Sub to parallelize across subscriber shards.
The sharding is necessary because Firestore documents have a 1 MB size limit. Subscriber lists are split into shards of 1,000 users each. Each shard becomes a separate Pub/Sub message, processed by its own worker in parallel. Whether a show has a thousand followers or a hundred thousand, the notification arrives at the same time for everyone.
From Cloud Scheduler to device push. Tasks wait until air time, then fan out across shards so every follower gets the notification in the same window.
At scale
The whole system runs without human oversight. That's a deliberate tradeoff for a solo developer. AI can approximate a show's voice, but it can't replace the editorial judgment of someone who actually watches it. At scale, you'd want the automation handling the long tail and an editorial voice refining the tone for the shows with the biggest audiences. The automation handles the volume. A person would handle the nuance.
The user, not the app, decides what's worth being interrupted for.
About the author
Pat Dugan is a designer and engineer who has spent the last decade and a half shipping consumer products, building design systems, and growing teams at Google, Meta, Quora, Nextdoor, and the Chan Zuckerberg Initiative. These days he’s mostly thinking about how AI changes the way we make things.
Read next
AllBuilding recommendations with nothing to sell
The reason most recommendations feel off isn't the algorithm. It's that the platform recommending content is also the platform selling it. I built a cross-platform alternative to test that theory.
·5 min readA modern approach to testing Swift
How I built a multi-tiered testing system for an iOS app. Not for the coverage metric, but to give an AI coding agent the confidence to make sweeping changes without breaking things.
·7 min readSome itches you just have to scratch
A Raspberry Pi, an e-ink display, and thirty minutes on a train turned a years-old idea into a live MLB scoreboard on my desk.
·6 min read