Open sourcing Listkeeper: Looking back at my suspended Twitter app
Twitter has finally terminated API access for my app Listkeeper. This unfortunate move is no surprise considering Twitter’s recent history of suspending applications that still use their free legacy API.
To make the best of the situation, I decided to release all of Listkeeper’s code on GitHub.
This post explores the why, how, and what of Listkeeper1, starting with a short overview of what it does in the first place.
WHAT
The (admittedly dull) H1:
Listkeeper keeps track of your Twitter followers and unfollowers.
Twitter itself won’t notify you about new followers whose accounts are protected. And it won’t tell you about lost followers at all. Listkeeper does both – or rather did before Elon pulled the plug.
Here are some product screenshots of the landing page, the in-app event feed, and – what used to be my favorite feature – Slack notifications:
Thanks to the event feed, I could call out several “thought leaders” for using auto-(un)follow tools to attract attention. I also made it a habit to say goodbye to people who dared to stop following me. We all need a little fun now and then. 🙃
HOW
Let me quote the README I wrote when starting the project in 2020:
Listkeeper is supposed to be developed and maintained by a single person, which imposes constraints on how the service can be implemented (a good thing!).
To that end, Listkeeper’s architecture and design need to be simple, robust, and cost-efficient – all while keeping the primary goal of delivering value to users in mind. Scalability must not be a concern at this point.
Servers are a distraction; Listkeeper aims to be a 100% serverless solution powered by AWS Lambda, DynamoDB, and other managed cloud services.
Given my background, I expect frontend development to be both the biggest obstacle and greatest opportunity to learn.
Even though I felt short on the “delivering value” part (more on this in a bit), I still admire everything about this mindset:
- Embracing constraints and letting limitations guide me to creative solutions
- Going fully serverless without obsessing over scalability
- Deliberately practicing something I wasn’t good at (frontend development)
Besides, I was pleasantly surprised by the convenience of having an always-on environment available to test new AWS features – see my post on AppSync JavaScript resolvers – or really do any experiments I fancied in the frontend or backend.2
In terms of size, Listkeeper’s monorepo is at the small end of things and contains about 4,000 lines of code in total:
- Lambda functions - 2,000 lines of Go
- CDK stacks - 500 lines of TypeScript
- React frontend - 1,000 lines of TypeScript
- Plus Makefiles, config data, etc.
Follow the links to learn more about the actual implementation. I also created a stunning architecture diagram just for the release.
WHY
Again, I think I put it best in the README:
Listkeeper is my take on building a micro-SaaS from scratch. Rather than just following other founder’s adventures, I’m using this project to actually explore many aspects of creating a real product for real people.
While for the most part a labor of love – I don’t plan on monetizing a B2C product directly – I do hope for Listkeeper to lay the foundation for future online businesses.
For this reason, it’s essential to treat Listkeeper as a best-work project that takes time, energy, and attention to complete before I can move on to the next idea.
Fairly aspirational.
In reality, Listkeeper has gained only a few users for multiple reasons. For one, it was invite-only, mainly because I didn’t want to deal with the legal side of things.3 The people who used the app (mostly friends) often never returned. I can’t blame them; the product’s value proposition was questionable at best.
Overall, I clearly prioritized learning new technologies – Listkeeper was my first React SPA – over making something people want. Given my stated goals, I can live with the outcome. Then again, would I’ve minded more users and more learning opportunities, especially on the business side? Of course not.
What’s next
Listkeeper was my first foray into full-stack product development after ten years as a cloud/backend engineer/consultant. I completed most of the app’s features in 2021 and have dabbled with Next.js, Remix, and Astro since then.
I love being able to create products from start to finish.
At the same time, I’m well aware that you could fool yourself for years by building side projects that go nowhere because you’re afraid of doing marketing, dealing with legal matters, or overcoming other obstacles.
I know that’s something I shall have to remedy.