The breaking point
I'd been on Twitter (now X) for almost a decade. It used to be useful — a curated feed of people I followed, sorted in time order. I could open it for ten minutes, catch up, and close it.
Sometime in 2024, that stopped being true. The For You tab became the default. Promoted posts multiplied. Engagement bait became the dominant content style. I'd open X to check on three friends and close it 40 minutes later having read nothing I came for.
I tried the obvious things — switching to the Following tab, muting words, building lists. Each helped a little. But the For You algorithm kept resetting itself, the right sidebar kept showing me trends I didn't care about, and ads kept slipping through. There was no single place I could turn off the noise.
The first version: 200 lines of JavaScript
I wrote a small Chrome extension one weekend. It did three things:
- Hid posts marked "Promoted"
- Hid the right sidebar
- Forced the timeline to "Following"
That was it. ~200 lines, no UI, just toggleable from the extension icon. I shared the source with a few friends who also lived on X. They started asking for features.
"Can it mute accounts without unfollowing them?" Sure.
"Can it filter by keyword?" Yes.
"Can it summarize long threads with AI?" Hmm. That's an actual feature.
From script to product
The AI summary request was the moment it stopped being a hobby script. To do AI properly I needed:
- A backend (sending API keys from a Chrome extension is a security disaster)
- Authentication (so I know who's allowed to call the AI)
- Rate limiting (so one user can't drain my Gemini budget)
- Payments (so power users could pay for unlimited summaries)
None of that was in the original "weekend extension" plan. But I figured: if I'm going to build all that for one feature, I might as well build it properly so the rest of the extension can use it too — sync filters across devices, store preferences in the cloud, etc.
The hobby project turned into a full SaaS. Looking back: probably overkill for v1. But the parts I ended up keeping (auth, sync, payments) genuinely make the product better, so I don't regret it.
The tech stack
For anyone else who wants to build a similar small SaaS, here's what worked:
- Backend: Node + Express + tRPC + Drizzle, hosted on Railway. ~$5/mo.
- Database: MySQL (also on Railway).
- Frontend (site): Plain HTML/CSS/JS, no framework. Hosted on Cloudflare Workers. Free.
- Domain: Cloudflare Registrar. ~$10/year.
- Email: SendGrid free tier (100/day, plenty for a small app).
- Payments: Stripe Checkout + Customer Portal.
- AI: Google Gemini (free tier covers a lot before you need to upgrade).
Total monthly cost of running everything: under $10. The extension is in the Chrome Web Store ($5 one-time developer fee).
What surprised me
Auth is harder than it looks. Email + password with verify, reset, sessions, JWT, rate limiting on login — it's a long checklist. I would not have done it from scratch if I'd known the work involved. Use a library or a service if you can.
Stripe is easier than it looks. Two tRPC endpoints (checkout + customer portal), one webhook, and you're done. The hard part is getting your bank account verified, not the integration.
Chrome Web Store review is a moving target. My first submission was rejected for an unused permission. The second was approved within days. Each update goes through review again — be ready to wait 1-7 days for changes to ship.
What's next
The extension is live, the site is up, payments work end-to-end. The next ~3 months are about distribution: blog posts (you're reading one), Product Hunt launch, Reddit, IndieHackers.
If you've got an X / Twitter feed that bothers you, I'd love it if you tried it. Free tier covers most of what most people need. And if you have feedback, my email is in the footer — I read everything.