▸ THE CHAPEL
Knotless
SaaS product · In active development
Knotless is the platform I am building for wedding and event professionals: one place to manage enquiries, bookings, proposals and clients, with an AI assistant that actually knows your business.
- Drag-and-drop block editor for proposals and emails
- Client-facing proposals with analytics and status tracking
- Claude-powered assistant with database query tools
- Gmail API + Resend sending with automatic fallback
- Real-time updates across the app via Supabase
Built with Next.js, TypeScript, Supabase, PostgreSQL, Claude API, Resend
▸ THE WORKSHOP
Macbelt
Native macOS app · Released
Macbelt is my personal tool belt for the Mac. It replaced two paid apps I used every day: clipboard history, screenshots, annotation, OCR and screen recording, all native, with no servers and no telemetry.
- Unlimited clipboard history with full-text search in SQLite
- Pinboards, paste stacks and quick-paste shortcuts
- All-in-one capture: select, annotate, OCR, pin or record
- Ignores password managers; your clipboard never leaves your Mac
Built with Swift, SwiftUI, AppKit, SQLite
▸ THE ARCADE
Name Game
Multiplayer party game · Live on web and iOS
Teams take turns describing names pulled from a shared bucket while their teammates race the clock. Play across phones in real time, or pass a single phone around the room.
- Authoritative real-time game server
- Web and native clients sharing one pure game-logic package
- AI-generated name packs with content moderation
- Pass-and-play mode for one device
Built with Next.js, React Native, Expo, PartyKit, TypeScript, Turborepo
▸ THE FARMHOUSE
Dish
Mobile app · Live on iOS
Dish is where my recipes live. Import one from anywhere or write it up, plan the week, and get a shopping list sorted by aisle. Share a kitchen with the people you cook with, and it all works offline.
- AI recipe parsing from links, text and photos
- Weekly meal planning with generated shopping lists
- Offline-first sync between household members
- Bundled grocery classifier to sort lists by aisle
Built with Expo, React Native, Fastify, PostgreSQL, Drizzle, PowerSync
▸ THE HILL
Gloaming
iOS app · coming soon · In development
Gloaming turns how you feel into a walk. Each day you take one step, onto ground as high as you felt, and over the months your own hill takes shape. Its colours come from a real Scottish dusk, the gloaming.
- Home screen is a hand-built contour map of your year
- Quick check-ins with feeling words, notes and intentions
- Home Screen, Lock Screen and Control Center widgets
- Optional Apple Health State of Mind and iCloud sync; private by design
Built with Swift, SwiftUI, SwiftData, WidgetKit, HealthKit, CloudKit
▸ HIGH STREET
Client work
Freelance · Live
Alongside my day job I build sites for small businesses. Each shop on this street is a real client, all from the bridal beauty world: polished, fast sites that win bookings.
- Brand-led marketing sites built to turn visitors into enquiries
- A course and training platform with accounts and an API on Cloudflare Workers
- Image- and video-heavy portfolios that stay quick on mobile
- The Bridal Etiquette: Bridal makeup artistry education: courses and immersive training days.
- Brooke Lilias Makeup: Luxury bridal and destination makeup artist based in Edinburgh.
- Brooklyn Bridal Artists: A Scotland-based collective of bridal makeup artists and hairstylists.
Built with Next.js, TypeScript, Tailwind CSS, Hono, Cloudflare Workers, Framer Motion
▸ THE STADIUM
FanDuel
Day job · since 2021 · Current role
My day job. Since 2021 I've been a front-end and mobile engineer at FanDuel, working on the Sportsbook product across the web and native apps with React, React Native and TypeScript.
- Sportsbook features for web and the iOS and Android apps
- React and React Native, written in TypeScript
- Working on a large, fast-moving consumer product at scale
Built with React, React Native, TypeScript
▸ THE POST OFFICE
Get in touch
Got a project in mind, or just want to say hi? Send me a letter and I'll write back.