Ryan Hills
COMMERCIAL PILOT & VIBE-CODER

Flying jets by day. Shipping code on layovers.

A family dinner planner for a household of five, built around how the fortnightly shop actually works rather than around recipes. Two people plan a fortnight of dinners from a shared library, and the app produces a single Swedish shopping list ordered by the walking route through our supermarket, with quantities scaled to five servings and duplicate ingredients summed across recipes. One of the children has a life-threatening peanut allergy, so the allergen check is three layers of plain tested code with a hand-audited blocklist and no model call anywhere near it — it also has to know that "nötkött" is Swedish for beef, not a nut. Backed by Supabase with row level security as the entire boundary, so the browser holds no trusted secret. Currently in build: the data layer, allergen screen and shopping-list logic are done and tested, the screens are next. Runs privately for our family, so there is no public link. Spec'd, planned and built with Claude, one task at a time with an independent review on each.

Tech Stack
React TypeScript Vite Tailwind Supabase PostgreSQL Row Level Security PWA Vitest Netlify Claude

A single-user personal dashboard that replaced my paper journal. The Personal tab tracks daily habits with an XP/leveling system, sleep, weight and step metrics, a movement log, and journal entries; the Work tab pulls my real flight roster and per-station weather straight from my calendar; Home covers shopping, meal planning and maintenance; Business Projects tracks each idea from validation through build with a cost/revenue chart. Password-gated behind a single shared login and runs locally rather than hosted — it holds my actual flight schedule and personal data, so there's no public link to share. Styled to match this site's Terminal design system. Spec'd, planned and built with Claude, task by task with an independent review on each.

Tech Stack
Next.js TypeScript Tailwind Drizzle ORM SQLite iron-session CalDAV Recharts Claude

A habit tracker built around Noah Kagan's "Law of 100" — the idea that you commit to 100 reps of something (100 videos, 100 cold emails, 100 workouts) before you let yourself judge the results. Each challenge is a 10×10 grid: tap a cell to log a rep and watch the percentage climb. It runs fully offline with no account and no backend — all data stays on your device — and adds momentum tracking, streaks, a "finish-by" projection, milestone nudges at 25/50/75, backdating, quantity logging, and a JSON export/import backup. Written once in React Native and shipped three ways: as a web app, as an installable home screen app, and as a real native build. Spec'd, designed, and built with Claude in VSCode.

Tech Stack
Expo React Native React Native Web TypeScript expo-router AsyncStorage Reanimated PWA EAS Update Netlify Claude
How To Use It
  1. Just open it. Hit "Open the app" below — it runs in any browser, on desktop or phone. No install, no sign-up, nothing to download.
  2. Add it to your home screen to use it like a real app, full-screen and offline. On iPhone: open it in Safari, tap the Share button, then "Add to Home Screen." On Android: open it in Chrome, tap the ⋮ menu, then "Install app."
  3. Tap New challenge, name your 100 (100 Reels, 100 cold emails, 100 workouts), and pick how a rep counts — one tap, a quantity, or once a day.
  4. Tap a cell in the grid each time you do a rep. Your streak, weekly pace and projected finish date appear once you're going.
  5. Moving devices? Settings → Export backup saves a JSON file; Import loads it on the other device.

Your data is stored only in your own browser — there's no account and no server, so nothing you log ever reaches me. That also means each device keeps its own separate set of challenges.

Prefer the real native version? The QR above opens it in Expo Go — scan it with your iPhone camera, or with Expo Go's own scanner on Android.

A browser game where you whack cartoon Donald Trumps as they pop out of the ground, racking up as many hits as you can in 60 seconds. It is a single HTML file with no framework and no backend, so it loads instantly and runs anywhere, including on a phone. The characters pop on a difficulty curve that speeds up as the clock runs down, each hit fires a synthesized smack sound built with the Web Audio API, and your best score is saved on the device. Spec'd, designed, and built with Claude in a single session, then deployed to Vercel.

Tech Stack
HTML5 CSS3 Vanilla JS Web Audio API localStorage Vercel Claude
Play the game

An offline-first iPhone workout tracker I built to replace RepCount. It is a Progressive Web App with no framework and no backend, so it installs to the home screen and runs fully offline, with every bit of data kept on the device. It follows the 2-2-2 training method with automatic progression, a rest timer, progress charts, and a quick-log option for travel days. Spec'd, designed, and built with Claude across several sessions.

Tech Stack
HTML5 CSS3 Vanilla JS PWA Service Worker localStorage Chart.js Netlify Claude
View the project

A personal portfolio site built in the style of a 1980s phosphor-green CRT terminal. Designed as a single HTML file with no build step or frameworks — just HTML, CSS, and a little vanilla JavaScript. The animated background is a faint Matrix-style code rain, rendered in phosphor green with the same code glyphs used throughout the terminal theme. The whole thing was spec'd, designed, and built collaboratively with Claude (Anthropic) across a single session.

Tech Stack
HTML5 CSS3 Vanilla JS JetBrains Mono Canvas API Formspree Netlify Claude
ryanh:~$ send_message --init
ryanh:~$ buy_me_a_coffee --support

I build weird and wonderful things with AI and share them here just to see what happens. This whole operation runs on curiosity, caffeine, and stolen hours between flights. If something on this site was useful (or just fun), buying me a coffee keeps the projects coming. ☕

buy me a coffee ☕
ABOUT ME

ryanh:~$ cat about.txt
  • Airline Captain — Embraer E-195
  • Australian expat living in Sweden
  • Building AI-first side projects between flights
  • Former professional photographer
  • Learning to vibe-code with Claude, Bolt & Lovable
  • Interests: Aviation, Reading, Movies, Photography, Motorsports, Poker
ryanh:~$ ask_ai --about ryan

Get an AI-generated summary of who I am, straight from an assistant of your choice.