Honest write-ups about what I've built, what broke, and what I learned. Organised by project.
After weeks of debugging a system that never quite worked, I stopped and asked a different question: what do I actually want from this? The answer was simpler than the system I'd been building.
An AI agent that builds a knowledge graph from everything you feed it, synthesises it into wiki pages, and briefs you proactively. This is how I got convinced to try building one — and what I thought I was signing up for.
Installing NanoClaw meant learning Docker, containers, and a new operating system at the same time. It took longer than expected — but when Lumi finally responded on Telegram, it felt worth it.
Lumi would summarise anything I sent her. She just wouldn't add it to the knowledge graph. Three sessions, multiple debugging attempts, and one failed research portal integration later — the core feature still wasn't working.
When each article ingestion costs 40 cents, the economics don't add up. I spent two weeks trying to fix the cost problem — through local models, then through routing calls via my Claude Pro subscription. Neither worked.
The original book search used AI to enrich whatever title you typed. It worked until it didn't — hallucinating wrong books with confident-sounding metadata. Replacing it with real databases fixed the reliability, but introduced a new problem with web search that took a separate pass to tune.
My son plays Minecraft. I thought: what if I could build things inside his game using code? It started as a way to connect with him and turned into a surprisingly satisfying project — at least for a while.
After two working house-building commands, a roller coaster seemed like the obvious next challenge. It turned out to expose something fundamental about what AI coding assistants can and can't do.
What happens when you try to add email to a live app and everything breaks. A story about serverless environments, IPv6 blocking, and why debugging is really just asking the right questions.
The features that made the app feel finished — and why the "small" UX details took just as long as the core features.
The meta-experience of building alvinbuilds.com — a portfolio site whose main content is writing about building things, including itself.
Deploying alvinbuilds.com turned out to be more complicated than building it. A walkthrough of DNS records, Railway port configuration, and the small misunderstanding that caused an hour of confusion.
I tried to move my project folder the obvious way. My computer crashed. Then I let Claude do it instead — and learned something about the difference between operating on a project and working inside one.
How I started building a tool to track MAS monetary policy decisions — scraping policy statements, extracting key parameters, and building a display that makes the data legible.
MAS describes its policy in words like "increased slightly" — relative changes with no published starting point. How I turned 20 years of prose into a chart, and why some of the numbers had to be found by trial and error.
The MAS tracker is live but not open. A walkthrough of the access-request model, the Railway deployment, password resets, and the security details I hadn't thought about until I had to.
I never managed to keep a journal until I removed the hardest part. A private app that collects notes throughout the day and uses AI to turn them into a diary entry — and a LinkedIn post.
Adding voice input to the daily diary app sounded straightforward. It wasn't. A walkthrough of the Web Speech API, why it behaves differently on every browser, and the workarounds that made it work.
The LinkedIn posting feature was always planned — the button existed but was disabled. Getting it working required understanding OAuth, handling a quirk in how LinkedIn rotates tokens, and figuring out that API tokens should be encrypted before going into a database.
I spent a session going back through all four apps looking for security gaps. What I found, what I fixed, and why none of this was on my radar when I was first building.
The app launched with support for publishing to LinkedIn, WordPress, Medium, and the alvinbuilds.com diary. Then I removed most of it. Here's what happened, what Lumi is, and why making an app smaller can make it better.
Meal planning is one of those problems that looks simple until you try to build a solution for it. Here's how Practical Chef came together: recipe scraping, an admin approval model, AI-assisted grocery lists, and several complete redesigns.
Voice dictation is fast but messy. Adding a Claude cleanup step between the microphone and the saved note turned out to be a small change with a noticeable effect on how the app feels to use.
Goodreads tracks what you read. ChatGPT knows about books but forgets them. Bookshelf is the gap between those two things — a personal library where every book has a conversation attached to it.
AI responses feel different when they stream versus when they arrive all at once. Getting streaming to work correctly in Bookshelf exposed a non-obvious bug about how network data actually arrives — and taught me something I'll use in every AI project going forward.
A session focused on feel rather than features — streaming responses, markdown rendering, per-message delete, and a book sharing link that generates a proper preview card on WhatsApp.
How a non-developer with a finance background built a full-stack web application in a matter of weeks — and what made it possible.