Read it now, not later

One Read serves exactly one article per day, optimized for readability, without all the garbage that litters online reading experiences. If you read it, your streak grows. If you don’t, it’s gone. There’s no archive, no backlog, no “save for later.” Tomorrow brings a different article, and yesterday’s is unrecoverable.

I built this little web app for myself and thought there might be at least a few other people who might want to use it. It’s still a little rough around the edges, but good enough.

My read-it-later queue is a black hole that just makes me kinda hate myself for not getting through it all. Same goes for my hundreds of browser tabs. So I got rid of the queue and built something simple that gets me to read at least one entire article per day. If I miss a day, tough. It just serves me another one the next day. I’ll never know what it was. If break my streak, I begin again. No queues. No self-hatred. Well, at least not as much.

While One Read is a simple idea, it was born out of thinking a lot about how I want to spend my time. Reading is something I love to do and I’ve been doing a lot more of it especially longer form articles and of course books. I’ve also been trying to spend more time creating things, usually in the form of writing or coding things for myself.

There has never been a better time be a creator, regardless of the medium. There has also never been more content to consume, much of which is increasingly being generated by AI. Companies continue to aggressively manipulate us, vying for every second of our attention. When we’re mindlessly consuming, it erodes our attention, our ability to notice and to think critically. I think worst of all, it robs us of the ability to create.

Maybe committing to reading a single article every day can be the beginning of your journey to take back a bit of your time. You gotta to start somewhere.

Now for the nerdier stuff. From a technical standpoint, I wanted to keep things as simple as possible and the first decision I made was to not have a database at all. I already save links to Raindrop.io, so Raindrop is both the inbox and the state store. Saving a link to a collection called “One Read” is the feeder for the app. Each day, a small server picks one unserved link and tags it oneread-served, plus a tag with that day’s date in Raindrop. Those tags are the persistence layer. They make “no going back” a property of the data rather than a UI choice. They survive redeploys and they work across devices. There’s even an admin backdoor: delete the tags and an article re-enters the pool, which came in handy as I was testing.

The rest is deliberately small. A Node/Express server fetches the day’s article and extracts the readable text with defuddle, Steph Ango’s excellent parser, plus a normalization pass that strips out all the publisher junk extraction leaves behind and reduces every article to a small allowlist of clean tags. The frontend is a single HTML file, vanilla JavaScript, no framework, no build step. Type is set in Literata. The streak lives in localStorage. And the whole thing is hosted on Vercel’s free tier, so my costs are literally just the cost of the domain.

I built the initial version of this in a single day. I wrote almost none of the code by hand. I described the product to Claude Fable. I was detailed in my rules, the feel, the parser I wanted and we just iterated. It built, I reacted. The typeface changed a few times. The margins changed a bunch of times. One of the biggest lessons was just how difficult it is to extract only the article body from web pages. I still don’t know if I got all of that right, but it was good enough to ship, but not before asking Codex to take a look at the work Claude and I had done.

I asked Claude to write up its own architecture doc, including a section candidly listing its weaknesses, and I handed the codebase to Codex for review. Codex found several major issues. As I’ve been working with Claude and Codex a lot, this has become a common experience. In every case I can think of, Codex just excels at coding while Claude excels at designing and writing, broadly speaking. Claude can code, but the quality and rigor of its work is not as good as Codex. This seems to be a common experience for people much more experienced than I am.

Deployment was fun! I’d been running the app locally for myself, which worked perfectly. As soon as I put it on Vercel, it crashed instantly. Ultimately, the back-and-forth between Claude and Codex made the code better than either would have produced alone. I probably would not have even been able to launch this without their help. And even if I did, it would have taken me a hell of a lot longer.

Drop me a note and let me know what you think.

Unimportant Email

I was catching up with a friend I hadn’t talked to in a while (hi, Ethan) and we got on the topic of AI. He asked me if I use AI with my email and I said something to the extent of, ‘Not really, but kinda.’

Email inboxes, much like physical mailboxes at home, are filled with junk. New junk arrives every day. Even the stuff that isn’t junk isn’t fun to open. It’s not personal the way a letter or thank you note is. Those are truly rare. I certainly get more personal emails than I do letters, but I often missed them because I hated wading through the junk.

Claude estimates that 98.7% of my email is garbage. On average I receive 122 emails per day and the last thing I want to waste my time doing is dumpster dive for the 4 emails that I actually should read and/or respond to.

I’ve tried using AI to help me with this problem and only recently did we come up with something that has truly made a difference. The way the vast majority of email services and apps work is they depend on filters or blocklists to filter out unwanted emails. Given that most email is junk, the process of creating filters is tedious and time-consuming. There are some exceptions out there like Hey, but for the most part there aren’t great solutions for utilizing allowlists or screening emails before they arrive in your inbox.

My main personal email account is hosted on Google Workspace. I’ve been using Gmail for decades at this point. Assuming you are familiar with Gmail, you know that All Mail is the unfiltered view of your email and Inbox is the filtered view. Tags are essentially folders. The way I use Gmail is that I go through emails in my Inbox and will skim through the All Mail view. I also have a limited number of broad labels set up for newsletters, paper trail, etc. but I don’t generally look at them unless I’m trying to find something or I feel like reading.

I also have a label, Unimportant, that I apply to everything that isn’t personal or important. I’ve been using this with manual filters for years, but it occurred to me that, with a little help from AI, I could build a script that would automatically create filters simply by applying the Unimportant label to emails. It does this by looking at emails from the last couple of weeks that have the Unimportant label applied but do not have a filter created. If it finds any matches, it creates a filter and I never see anything from that sender again. It works flawlessly. Here’s what my Inbox looks like right now

I now have nearly 1000 filters, most of which were created by the script. It runs every evening from an Intel Mac Mini running Linux and I finally have an inbox without the garbage. And if a little garbage gets in, all I have to do is apply the Unimportant label to keep it from ever showing up again. Give it a try for yourself and let me know what you think.

Bear blogger, Peter Gombos, created a simple, Bear-ish (Bear-adjacent?) called Moments that is really lovely. If you’ve been thinking about blogging for the first time or picking it back up, you can’t go wrong with Bear and Moments for sharing a little bit of yourself with the world.

Years of Light is a free art project and musical tribute to the work of Nas and DJ Premier, engineered and mastered by Green Studio NYC. I’m a few tracks in and this is absolutely awesome! (h/t Ian)

I was shocked and saddened to learn that Om Malik died. I always enjoyed his writing and his photography. I didn’t know him personally, but by all accounts, he was a really good human. Knowing that he had such a long battle with heart disease really reframes some of his writing, especially what is now his final blog post. I hope and trust that his family and/or friends will keep his online presence alive. The world is a better place with his words and photos available for others to enjoy. Farewell, Om. You will be missed by many.

Kinda crazy I waited all this time to finally buy a 3D printer. Bambu was having a sale so I picked up a P2S AMS Combo for $100 off. It took some time to set up, but it’s calibrating now! Kids might be more excited than me. What should I print first?

It was cool to see this BBC article on Oodi, the incredible public library in Helsinki. I spent some time then when I was in Finland in 2022. It had opened only a few years before. It was the most impressive library I have ever seen. I remember thinking to myself how all public libraries should be just like it. Here are a few photos I took inside.

My brother found some slides that had some never-before-seen photos of my parents. Here’s a great one of my dad. He was my best friend and such a gray dad. I am so lucky to have had him. I model a lot of my own parenting after him. He died from pancreatic cancer in 2007 and I’ve never stopped missing him. Happy Father’s Day (and first day of summer and Go Skateboarding Day) to all of the dads out there.

My guess is the Commodore Callback will sell, but it would sell a lot better if it was priced lower. I love the idea of it though. Not crazy about the form factor though.