some of my favorite projects


personal

what i spend time on outside of my job.

Life Hub

a personal context layer that AI assistants read and write through one MCP connector

A semantic layer over my life data. Each app (Recipe Hub, Music Hub, Wealth Hub, etc.) owns its data in portable formats: ChordPro for music, JSON for the rest. All data is backed up nightly. Life Hub ties it together into one model of people, things, places, events and decisions, with references back to the apps that hold the detail.

All of it is exposed through a single hosted MCP connector with OAuth, so any AI agent from any provider (ChatGPT, Claude, whatever comes next) can read and update my life data. The data stays mine and portable; the assistants are interchangeable.

Every record keeps its provenance: whether I said it, an app recorded it, or an AI inferred it, with a confidence and who asserted it. My own words are stored verbatim as the source. Every change is a new version I can see and undo.

ChatGPT Claude any agent MCP connector OAuth sign-in limits · audit log tools capture · search · get retract · open items songs: add · edit · undo Life Hub records entity · relationship · event decision · source provenance stated · recorded · inferred confidence · asserted by history every change kept, undoable Recipe Hubown connector, moving in Music Hubtools via Life Hub Wealth Hubplanned refs refs nightly snapshots, all hubs
  • Any AI agent ChatGPT, Claude or whatever comes next, through one MCP connector: OAuth sign-in, per-connection limits, an audit log, and a fixed set of tools (capture, search, get, retract, songs).
  • Life Hub Records (entities, relationships, events, decisions, sources), each with provenance (stated, recorded or inferred; confidence; who asserted it) and full, undoable history.
  • The apps Recipe Hub and Music Hub hold the detail; Life Hub records link to them. Wealth Hub is planned.
  • Backups Nightly snapshots of every hub.
  • MCP
  • OAuth
  • Cloud Functions
  • Firestore
  • append-only versions

Recipe Hub

a cooking log, built AI-first

Recipes with versions and baker's percentages, sessions with a step-by-step walk-through, ratings and push reminders. It started as a sourdough log and grew. Most entries arrive through a chat with ChatGPT or Claude; the app is where I check, cook and rate.

A recipe in Recipe Hub: ingredients in grams and baker’s percentages, then steps
a recipe, scaled in grams and baker's %
A bake session in progress, with servings and ratings
a session in progress
  • vanilla JS PWA
  • Firestore
  • web push
  • MCP connector
  • Playwright

Music Hub

my chord sheets as plain text, in the keys I actually play

Songs are stored as ChordPro, an open text format. It imports from the web or a photo, transposes, and keeps every change with before and after, so an assistant can fix a chord and I can undo it.

The Music Hub song list: Alison, All These Things and I Thought I Was a Child, each with its key
the song list
Alison by Elvis Costello open in Music Hub, with chords placed over the lyrics
Alison, chords over the syllables
  • ChordPro
  • vanilla JS PWA
  • Firestore
  • MCP tools via Life Hub

Ziggy

a small rolling companion robot

Ziggy talks, remembers what you tell it, says what it sees, drives to named rooms, carries messages between them, and has a locked-down mode for playing on the floor with a toddler. The talking half comes first; the wheels are mostly a robotics-learning project.

cloudfrontier modelconversation and reflection
Jetson Orin Nanothe mind on boardmemory, identity, senses, voice · ROS 2
ESP32-S3the reflexesreal-time motor safety
  • ROS 2
  • Jetson Orin Nano
  • ESP32-S3
  • Python
  • PlatformIO

Kids Physics Sandbox

a calm physics toybox for ages 2–5

Drag, throw, drop and splash colorful shapes and animals that bump into each other and float in water. Tap something and it says its name out loud and shows the word; tap empty space and a new one appears, named the same way. Preset scenes (farm, desert, beach, under the sea), bold high-contrast shapes, and no goals or failure: pure cause and effect, with a few new words along the way.

The farm scene: a red barn and a chick, cow, sheep and pig standing on green grass
the farm
The desert scene: camels, a cactus, a worm and big gray boulders on sand, with a red ball
the desert
  • Godot 4
  • GDScript
  • iOS first
Santa Barbara Unfiltered logo

Santa Barbara Unfiltered

a local lifestyle publication: the food, sights and news of Santa Barbara

A solo project from the ground up: a place for my wife and me to record and share our love for Santa Barbara. Originally Next.js on Vercel, since rebuilt on React Router, with AI-assisted publishing tools and an MCP connector so ChatGPT and Claude can search it.

Santa Barbara Unfiltered on phone, laptop and tablet: local stories, events, weekend guides and notes
  • React Router
  • Supabase
  • Fly.io
  • Cloudinary
  • OpenAI
  • MCP

work

Sinclair Broadcast Group logo

Sinclair Broadcast Group

websites and mobile apps for 80+ local news stations

The Sinclair Digital team builds and maintains the web technology for every local news station SBG owns. I helped build a new hybrid mobile app in React Native and maintained the existing web apps.

The interesting challenge was white-labeling: one codebase that serves every station, configured for each one's branding and content.

KOMO News app (App Store screenshot): Newsfeed: top stories with a lead image
KOMO News app (App Store screenshot): Watch: a live broadcast with autoplay next
KOMO News app (App Store screenshot): Weather: current conditions and a 7-day forecast
KOMO News app (App Store screenshot): Article: an in-depth story

the KOMO News app (Seattle), one station's build of the white-label app

  • React
  • React Native
  • white-label platform
Cabana logo

Cabana

luxury camper van rentals, with a shower, toilet, wifi and kitchen in every van

I led the front-end team and worked hands-on across the whole system, designing and building it end to end. We were a scrappy team of six, and we helped grow the startup to ~$30 million in funding and ~50K monthly unique users.

We wrote an enormous amount of code and shipped features at a blazing pace. The demo above walks through the three core apps we built and ran: the customer web app, the mobile apps and the back office.

  • React
  • Flutter
  • Hasura / GraphQL
  • PostgreSQL
  • Firebase / GCP
  • AWS
  • Stripe
  • Invers telematics
  • A/B testing