Labs (AI & Projects):
01. AI-Powered Shopping Aggregator


My first project experimenting with Google Antigravity. I built a modern aggregator for shopping carts across Amazon, AliExpress, and more. I use local LLMs (Ollama) to automatically categorize thousands of items, predict their destination room, and shorten bloated product titles into human-readable strings. The project also features a D3.js graph view where AI embeddings cluster similar items visually like Obsidian.
Problem:
I have too many items saved in my shopping carts and wishlists across Amazon and AliExpress. This makes it impossible to compare items in a single view.
Context:
I chose shadcn/ui as my templating language and created this app in React — I chose to manually save each cart and wishlist as HTML and play with the markup offline as it was easier and cost less agent tokens. I used Ollama and gemma2:2b to clean up names, put the items into categories and groups, and even made an Obsidian-style network graph of how similar products are.
Outcome:
A centralized aggregator using local LLMs (Ollama) to categorize products in an easily viewable page.
Learnings:
I created a nice interface to view all items, but the graph feels like overkill and doesn't provide a good way of looking at similarities. In the future, I would make it simpler and instead use Gemma to tell me patterns and what I really want to buy, or at least what is most useful to me.
02. AI Movie Recommendation Engine


My second project playing with Antigravity — this idea grew from my frustrations of not being able to find good movies on TV like the old days during the Christmas period. My dataset of movies I already rated on Letterboxd would be the ideal way to hone the taste of what I would want to watch. Based on this, I created a persona for my Ollama-powered Gemma "watch buddy." With information it scrapes from a popular TV listings website, it then gives me recommendations on what to watch — this is my favourite project so far and one I still use every week.
Problem:
TV guides are full of noise. Scrolling through 100+ channels during Christmas trying to find a decent film shouldn't take longer than actually watching the movie (lol).
Context:
I built "What's On Tonight?" to aggregate film schedules from a popular TV listings website and cross-reference them with my Letterboxd history. I used Gemini-3-flash-preview (via an Ollama proxy) to act as a "Casual Buddy" who recommends films based on directors and actors I've already rated 4+ stars. I even built a custom SSE (Server-Sent Events) bridge to stream real-time sync progress directly to the UI (I was using CLI scripts to do the hard work but made them buttons in the UI so I didn't have to use a terminal to update future listings).
Outcome:
A high-performance guide that intelligently badges "Worth a Rewatch" films and gives personalized advice on new stuff.
Learnings:
Gemini-3-flash is ridiculously fast for this kind of project. The "Casual Buddy" persona makes the logic feel way more human than a generic star rating.
03. AI-Driven Habit Timeline


Consumer is my take on an idea I've been obsessed (opens in new tab) with since 2008 — a unified timeline of my habits. Last.fm (been using for at least a decade) for music, Goodreads for my new book reading habit, Trakt for TV shows, and Letterboxd for movies (yes, this idea spawned from the project above). I used AI agents to automate the end-to-end testing of the dashboard, again using Ollama and this time gemma2:2b.
Problem:
My habits are scattered across too many apps: Last.fm, Goodreads, Trakt, and more. I wanted one unified "Timeline of Me."
Context:
This is my most ambitious data project. I used Next.js 15, Drizzle ORM, and SQLite (my first project where I switched from JSON to using databases). I used AI agents (specifically agent-browser) to automate the E2E testing and build out the diagnostics dashboard. It was my first time really letting an AI agent handle the "grunt work" of verifying data integrity across thousands of synced records.
Outcome:
A beautiful, centralized dashboard that handles everything from scrobbles to book page progress.
Learnings:
Managing a local SQLite DB for this much data is way more satisfying (and faster) than using JSON. Having an AI agent perform my visual cache health checks saved me weeks of manual debugging. It's missing a few things — next I'll be looking at Apple Health integration so I can see if my mood and fitness correlates with what I consume.
04. Inclusive Stories

This was an idea for my Indian/Filipino Goddaughter; it's dedicated to her. A curated platform of children's books featuring diverse characters and authors. This project aims to ensure every child can see themselves represented in the stories they read, bridging the gap identified in Arts Council reports on BAME protagonists in literature.
Problem:
I wanted to make sure my Goddaughter felt represented and seen in the books she was reading — representation matters, and it's hard to find diverse stories for kids.
Context:
I built this for my Goddaughter, Neriah. It's a curated platform focusing on high-quality metadata and book covers for diverse literature. No AI here, just manual raw curation and a focus on making these stories easy to find for parents.
Outcome:
A reliable, curated resource that helps children see themselves in the stories they read.
Learnings:
Good data curation was the hardest part of this project - i manually searched blogs and reccomendations for a good starting point, but it was time-consuming to get the info I needed even though I created handwritten scripts to scrape information and images from online stores. This still needs work to automate more of it.
05. Folaju's List

My friend Folaju spent years updating an Apple Note with friends' spots to eat and hangout, but that's all it was — a Note. I wanted to make it a bit more tactile; of course, I had to make it Craigslist-inspired.
Problem:
An Apple Note is a cluttered way to keep track of spots. I wanted to add some context like opening and closing times and addresses, and something easier to share with friends.
Context:
I went for a full-on "Craigslist" aesthetic — zero fluff, pure utility. I used hand-crafted D3.js for some of the underlying data structures and kept the UI as brutalist as possible for speed. It's basically a Digital Rolodex for the London spots that actually matter.
Outcome:
A minimalist, lightning-fast directory of curated sushi, coffee, and chill spots.
Learnings:
Aesthetics don't always need to be "premium" to feel valuable. Again, as with the above, it is a bit cumbersome to update — I need to rewrite the scripts and possibly update the UI to make it run faster and better.