#82 Gemini’s “URL Context” feature is 90% hype, 10% value

I’ll admit—I was pretty excited when Google announced that the Gemini API would support a new “URL Context” tool. The idea: you could “ask” Gemini about the content of a specific web page, with Google handling all the heavy lifting. The documentation even shows a neat example: send Gemini two recipe URLs and prompt it to compare ingredients and cooking times. If it worked, this would’ve been a game-changer for poketto.me: ...

September 20, 2025

#80 There is no cloud (it’s just somebody else’s computer)

…and ultimately, that “someone” is going to send you a real invoice for actual money. In my case, I’m running poketto.me almost entirely on Google Cloud. While it’s not terribly expensive right now, it is a cost I had to factor into my pricing strategy. But here’s the good news: Google offers various programs to support early-stage startups! Check out https://cloud.google.com/startup?hl=en for details. Today, I’m happy to share that poketto.me made it into the “START” tier of that program, which means: no Google Cloud bills in my mailbox for the foreseeable future! ...

September 18, 2025

#77 In-place DOM manipulation: Thorny as ever 🥀

The “highlights” feature in the poketto.me reader looks deceptively simple: select a text range, and it gets highlighted in yellow. Clicking a highlight opens a small context menu to change its color or delete it. But the implementation? Much thornier than you’d think. Why? 1️⃣ Browser selections are relative to visible text, not the underlying DOM tree of the rendered HTML. 2️⃣ A selection is defined by the text plus its start offset (characters before the selection) and end offset. 3️⃣ To do anything useful with a selection (beyond copying text to the clipboard), you have to map it back to its position in the DOM tree. 4️⃣ That “mapping” is, to some extent, impossible to get perfectly right. A selection can span multiple nodes, start and end at different levels of depth, and include irrelevant nodes. ...

September 15, 2025

#76 Posthog also works well for feature flagging

Since adopting Posthog for user analytics at poketto.me, I’ve grown pretty fond of the tool. Beyond the basics and advanced insights, I’m now also using it for feature flagging. Fine-grained control (and easy rollback) of new features or major changes is becoming increasingly important as the poketto.me user base grows. Why? 🤕 In a B2C app, you can’t count on users to complain when something breaks—they’ll just leave. Especially for early-stage products, every irritated user is a missed opportunity. ...

September 14, 2025

#74 Firefox extensions (mostly) work on Firefox on Android as well

A poketto.me Firefox user recently pointed out that Firefox on Android also supports browser extensions– but that the poketto.me extension didn’t appear on Mozilla’s Add-Ons page there. Turns out: Any modern browser extension built on the standard APIs (Chrome, Firefox, Edge) can also run in Firefox on Android. But when publishing, you have to explicitly test and target Android. Technically, the extension “just works”—as long as you’re not doing anything exotic with the APIs. But aesthetically, there’s one big caveat. ...

September 12, 2025

#73 trafilatura’s image extraction is a bit too cautious for my taste

A poketto.me user recently filed a curious bug: They had saved a page that clearly contained images — but in the reader view, no images showed up. I expected some quirky HTML. But when I checked, the <img> tags looked perfectly normal (see Exhibit A). Yet, after passing the HTML through trafilatura (which I use to convert HTML to Markdown), the images had simply vanished. 🔎 The culprit? Trafilatura is very cautious with images. It only accepts <img src=...> URLs that end with a known extension (.jpg, .png, .gif, …). The site in question served images from URLs without extensions — so trafilatura just ignored them. ...

September 11, 2025

#72 Product analytics is more than DAU and WAU

Recently, I wrote about adopting Posthog for poketto.me. At first, I thought I’d use it for the basics: 📆 Daily & weekly active users (DAU/WAU) 📎 Core events (URLs saved, links shared, etc.) 🚨 Error tracking and alerting But then I realized: analytics can do much more. In fact, Posthog replaced one of my home-grown tools — my “podcast heuristic accuracy guestimator.” Let me explain. When a user adds content to their podcast feed, poketto.me has to gauge three things: ...

September 10, 2025

#71 Entitlements are easy (until they’re not)

Early-stage products are all about uncertainty. With poketto.me, I started by building something I wanted to use — and gave it away for free. Then came early adopters asking for features, and eventually I began experimenting with monetizable “premium” features: personalized podcasts, news aggregation, summaries, contextualization, etc. That third bucket quickly gave me headaches. I needed a way to put usage guardrails around these features: 👉 to separate free from premium, 👉 to distinguish “beta” from production-ready, 👉 and to keep my future monetization options open. ...

September 9, 2025

#70 A room without a dustbin will never be clean

This is a roundabout way of saying: make “good” behavior the easy choice. But there’s an interesting backstory to the saying. I come from a family of manual laborers. My dad, all of my uncles, and most of my many cousins work in trades ranging from carpentry to plumbing to house painting. And one of the first things any good craftsman does when setting up at a new site? Installing a dustbin. ...

September 8, 2025

#69 Debugging your Stripe integration is easy with Stripe CLI

I put off building checkout and payments for the premium version of poketto.me for way too long. The thought of integrating with Stripe — keeping “their” and “my” data in sync, handling callbacks, connecting the UI, smoothing out user flows… it always felt like too much to tackle on any given day. But once I committed to a GA date for the premium version, I had to bite the bullet. ...

September 7, 2025