← Projects

Diple

A reading app that rewrites everything

2026  ·  Ultravox, Ably, SwiftUI, SvelteKit, & more  ·  Personal use; not distributed

I can’t keep up with my newsletters and feeds… and yet I keep subscribing to more. I don’t believe it’s actually possible to ever be “caught up” with all the great ideas flying around, but I really wanted a way to engage with them that felt calm, focused, and satisfying. Nothing I could find came close, so I built something of my own.

Diple home screen
The main reading screen, in full-screen view

The result is Diple, which comprises an extensive content processing engine accompanied by diminutive reading interfaces for iOS and the web. I have a dedicated email inbox just for newsletters, and that inbox forwards everything into Diple. I also have a set of RSS subscriptions that Diple regularly pulls in, and I can share content directly into the iOS app. All incoming content is broken up into points, which are key ideas from the content consisting of a one-line insight and a 5 to 7 sentence elaboration. The insight is functionally analogous to an article headline, but it’s designed to be a complete, standalone thought — no click baiting, no unanswered questions, no gratuitous ambiguity. Points are then prioritized based on a combination of my personal interests and time sensitivity, and served up roughly in priority order (with some surprises thrown in for variety).

One incoming newsletter could have multiple points extracted from it, but just as importantly, ideas from multiple newsletters could be compacted into a single point. The system treats articles not as immutable units of content, but only as temporary containers for a more malleable substance — information, ideas, knowledge — that can be molded into whatever shape we like. This also enables normalizing the tone of content: marketing hype gets turned down and technical drudgery gets lightened. To be clear, I believe there’s a lot of value still in reading words as the author intended them, in their original voice. As such, all points in Diple link to their sources, and in practice the point serves as an abstract that helps me decide whether I want to go deeper.

The app boots straight into the current point, and the current point is synced across devices in real-time — so whether I’m on my phone, laptop, or tablet, “the thing I’m reading” is universally consistent. This means there’s effectively no cognitive overhead to starting reading, and thus I can squeeze in bits here and there, even when I’m not sitting down for more focused time. There’s a few other controls in the app, but really… it’s about the current point above all else.

Diple menu screen
Menu, with access to RSS feed management, theming, and more

Now, so far I’ve mostly called Diple a reading app. And that’s true… but incomplete. It’s also a voice app. Not text-to-speech, mind you — voice. It will read the current point to you, but if you say you’re not interested, it will proceed to the next point. If you ask it to pause, it will wait, and then restart the current sentence when you’re ready. And if you ask it to wrap up, it will summarize what you talked about on that call. It’s a full call, too: You can lock your phone and keep listening, and even proceed to the next point from the dial pad. (I want to add the ability to ask the agent follow-up questions about the source content, but haven’t gotten there yet.) When you do look at your screen, the content highlights and auto-scrolls along with the narration. Designing a multimodal duplex interface — where two simultaneous interaction channels stay synchronized — was a deeply satisfying brain-twister.

Diple voice mode
Voice mode, including current sentence highlighting

I engineer cloud services at work, but this was my first true personal cloud application, and with free rein on the tech stack, I went wild… probably a little too wild. So wild, actually, that I built a whole app just to manage all the dashboards and portals. But I really wanted to see how it would feel to use the most developer-friendly solutions I could find for every one of my needs, and the sprawl was a price I was willing to pay.

The core of the content processing is handled by a Trigger.dev backend, which receives incoming emails, pulls RSS feeds, and grabs article content via Browserbase. Clients talk to the always-on Fly.io API app for content, and voice sessions are powered by Ultravox. Real-time state sync is mediated by Ably, following a poke-and-pull pattern. Data is stored in Neon, and inference is produced via OpenRouter. Here’s roughly how it comes together:

I left out Clerk for authentication, Sentry for error logging, Upstash for configuration management, and a few other things, but… you get the idea.

At this point, I read about three quarters of my news through Diple, and much of that other quarter is sources I haven’t integrated yet. (Social media in particular is tricky here.) Much AI-generated content is derided as slop, but this is sort of the opposite of that: it’s curated content, from sources I trust, with noise filtered out, sorted according to my interests, and rendered in a style that resonates with me personally. That said, I still have way more content coming in than I can keep up with, as evidenced by my stats. (Oh right, there’s an admin interface.)

Diple admin stats
Admin stats, showing ever-increasing content...

But who cares? I don’t have a goal of reading everything. I just want to read as much as I can about things I’m interested in, and feel content no matter what.