Unimportant Gmail now avoids filter limits

Welp, after running the script for a while, I hit a limit. Apparently Gmail has a limit on the number of filters you can create. Every time I applied my Unimportant label to a new sender, the script would notice that sender and create a Gmail filter for it. One sender, one filter. It worked well, but once I hit the 1000 filter limit, it stopped being able to create new ones.

I worked with ChatGPT on a fix. I’ve been using it more for coding work lately. We ended up making the filters more dense without changing the overall behavior. Instead of creating one Gmail filter per sender, the script now groups multiple senders into a single Gmail query filter, which is something I used to do manually. Here’s what that looks like:

{from:a@example.com from:b@example.com from:c@example.com}

It still matches exact senders, but it uses a single filter instead of three. Consolidating filters reduced the total count dramatically while keeping the same basic workflow and ChatGPT handled the consolidation over the course of a few hours.

I also tightened up the operational side. The script now understands grouped from: query filters when it checks whether a sender is already covered, so rerunning it should not create duplicate coverage. I had some dupes that were left over from the manual work I was doing before I worked on the script. I also documented the setup a bit more thoroughly so it covers how to run it on a schedule, how to verify it, what files should never be committed, and details rollbacks.

Software still needs to be maintained. Go figure. Small automations are still systems.

Jasmine Sun on the whole data center thing

This week I had a lot more time in the car to listen to podcasts. I’ve been following a lot of the discussion and reporting about data centers. Jasmine Sun is doing some of the best reporting on the topic you will find. I haven’t come across anyone else doing the depth of investigative reporting that she is doing. By all means read the article, but her conversation with Ezra Klein was great, but I particularly enjoyed her conversation with PJ Vogt.

I continue to use AI in my work and personal life and still find it exciting and ever more useful as time goes on. I use it mostly to build things for myself. That said, I really don’t like that AI companies have vacuumed up so much creative work for training without compensating creators. I also hate all the slop that makes up such a massive amount of content and traffic on the web. Every day I think about deleting my blog and just retreating to a dark forest.

I’ve really been enjoying the work that the DFOS team is doing. I created a space called Ohey Computer. If you want to check it out, this invite code is good for the first 10 people who use it.

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.