Projects
Threads Clone
A pixel-perfect clone of the Threads social media app. Includes a suite of automated end-to-end and integration tests, custom auth with email verification, and AI content moderation. Built with Next.js 15, React 19, Drizzle, and SQLite. I spent several months working on this daily, focussing on matching the UX, accessibility and performance of Threads. My only regret is using Next.js — I have learned so many framework-specific patterns and gotchas at this point but I would rather have focussed on core web platform skills and patterns.
BizPortraits
An AI-powered headshot generator that transforms selfies into studio-quality portraits in seconds, with Stripe integration for secure payments. This was my first experiment with AI agents. I noticed a market gap for affordable headshots using bleeding-edge AI workflows and wanted to launch quickly. Consumer models caught up rapidly, so I shipped a simple MVP instead of continuing full development.
Paragliding Dashboard
A weather dashboard for local paragliding pilots. Features a scrollable dynamic wind graph, displays for multiple weather APIs, an interactive UI for viewing windgrams, and a live camera feed of the local mountain. It's a pretty simple tool but it's used daily by all active pilots in the area. I filed detailed issues and proposed improvements to several upstream projects during development, helping to improve the tools it depends on.
File Uploader
A cloud storage application for file management and sharing. Built with Typescript, Express, EJS and Web Components. Features a modular architecture with various performance and security optimizations. This was an experiment in building a multi-page SSR app. I gained significant experience with performance tuning, security best practices, bundling strategies, and the limitations of this stack.
Messaging App
A real-time messaging app built with Next.js using React, Tailwind, Prisma, Postgres, NextAuth, and Pusher. Although this was initially modelled on a tutorial with a slightly different stack, I spent a few weeks addressing issues, improving privacy, security, and performance, replacing dependencies, and adding new features of my own.