I have been finding it hard to read the articles I'd been leaving open in my browser. Approx a million tabs or something, I just couldn't get through the clutter. Call it ADHD, or just laziness, I was feeling the urge to build something to close the gap and help me learn better. I've previously been a power user of pocket (rest in peace), a million or so articles still lie unread within my account and are now lost forever, in the ether :P

So I pulled out claude code and got it to write me a solution...

It worked, on my machine

The initial version was a simple Firefox extension that sent the article's text to Kokoro, a tiny voice model running on my Mac, the result was a voice that spoke like butter.

But it also meant installing a background service and I can't just ask a stranger to do that, especially not if it's just to hear an article being read out. Could all of this just run inside the browser instead?

Rust? WASM? Maybe not...

The only recurring theme in my life, I admit, has been advocating #RIIR. But of the few options I experimented with, one library could only use the CPU in the browser, another produced the wrong audio, and a third, for some reason, sent usage data to a server and could not be turned off. Yeah, NO.

Could I have made it work? Maybe, but I was trying to build myself a reader, not an entire runtime or innovate a new web technology. So the boring option won, Kokoro, using WebGPU inside Firefox. About 5 seconds to the first word, then 2 to 3 times faster than speech, all you had to do was install the add-on.

Peculiar things...

I ran into a few crazy kinks in the path. A curly apostrophe turned "It wasn't" into "It was", which is a fun way to flip the meaning of a sentence. Dates became "2026 to 10 to 12". Skipping quickly through paragraphs once even made my Mac hang, every press the user made was boarding more sentences onto a bus which nobody was going to ride.

Pictures had to give way too. Image models in the browser took 15 to 30 seconds per image, so describing figures stays limited to an environment where you can run the models with the helper, but the add-on continues to read the alt text and captions, so you might not be missing much!

Then came the languages. Most Indian languages worked fine through Kokoro's Hindi voice, but Malayalam came out completely garbled and I don't want to cause trouble at the next Kochi FOSS("kelkado" literally means listen in malayalam, lol). So, I learnt about Piper TTS and integrated it.

Re Think, Re Architect, Re Write

Ok, so this is where things turned out to be really fun. I wanted to build everything from scratch once I had the MVP working. I asked claude-code to look at what we had been building so far and think about how the article extraction, data streaming and the model selection flow can be improved.

The suggestions were all trash.

I got it to write an architecture doc, explaining how each component was currently talking to the other. Used the architecture doc to understand the bottlenecks, asked claude to streamline the parts that people interacted with, make it essentially fixed part and leave everything else to be flexible. So now there's a queue, a router, a literal PROTOCOL, a helper and more... you can read the DESIGN.md to understand it better.

What next?

I have been on a break for about 7 months now, this was my first side project after a long time, the first that was purely vibe coded. The joy of programming has well and truly dissipated, but maybe this experiment has introduced me to the joy of architecting?

My main project continues to be jogga.fit and I will be writing about that soon.

Your next project could be checking out the extension on tangled. It is yet to be listed on the add-ons marketplace, and I am not publishing it to the Chrome Web Store for now, so you can try installing it from the repo release artifacts yourself.