Projects

I build software with AI agents, and I keep it honest with tests. Below are fifteen working applications I designed, built, and shipped on my own time using agentic command-line tools, primarily Claude Code. They span web apps, a terminal interface, data pipelines, and integrations with both external APIs and local data. Each one answers a small real question in my life, and each was built the same way: write the requirements, let the agent execute, check the result against a test, and loop until it holds. The tools move fast. The tests are what make the speed safe.

Available for workResume
Screenshot of Elvis: dbt + DuckDB Portfolio

Elvis: dbt + DuckDB Portfolio

Named after Las Vegas's most recognizable figure, this project explores free datasets about the Las Vegas Valley using dbt and DuckDB, surfaced through a Streamlit app. Built to learn analytics-engineering patterns: modular transformations, testing, and dimensional modeling.

Claude Code, analytics-engineering patterns, with dbt tests on every model.

Production analytics engineering, an extract, load, model, test, and serve pipeline run the way a data team runs it.

Analytics EngineeringData Engineering
dbtDuckDBStreamlitSQLPythonRailway
Details
Screenshot of Atmosphere: A Personal Weather App

Atmosphere: A Personal Weather App

A calm, ad-free personal weather app built around the two things a weather site is actually for: a 10-day forecast and live radar, over a dark, sky-reactive backdrop that animates with the current conditions and the time of day. It adds saved locations, a keyboard command palette, and an installable PWA. Every data source is keyless.

Claude Code through a Requirements, Orchestrate, Check, Review loop from a PRD and task board: logic tested first, adversarially reviewed on every merge, with a unit and Playwright suite in CI and data from keyless public APIs (Open-Meteo, RainViewer).

A polished, accessible front end on keyless public APIs: an interactive radar map, forecast charts, a sky-reactive animated UI, favorites and a command palette, and an installable PWA, with nothing to configure.

Full-Stack
Next.jsTypeScriptTailwind CSSMapLibreuPlotPWAVercel
Details
Screenshot of McCoy: Spotify Listening Dashboard

McCoy: Spotify Listening Dashboard

A personal Spotify listening-habits dashboard with a DJ-style record-flipping playlist builder. Visualizes weekly listening trends and turns them into new playlists.

Claude Code with external-API integration (Spotify), tested end to end.

External-API integration end to end, from an OAuth data pipeline to weekly snapshots and a live dashboard.

Full-StackForward Deployed
PythonPlotly DashSpotify APIRailway
Details
Screenshot of Robbins: Seattle Open-Data Explorer

Robbins: Seattle Open-Data Explorer

An interactive, multi-page explorer over free public datasets about the Seattle metro (King County core, extending to Pierce and Snohomish), presented as maps, trends, and searchable tables. Ingests two access patterns, Socrata's SODA API and ArcGIS FeatureServers, into a DuckDB warehouse modeled with dbt.

Claude Code, multi-source ingestion across two public-data APIs, warehouse baked fresh on every deploy.

Multi-source ingestion and dimensional modeling, pulling two public-data APIs into one tested warehouse.

Analytics EngineeringData Engineering
dbtDuckDBStreamlitAltairPyDeckRailway
Details
Screenshot of Groening: Portland Open-Data Explorer

Groening: Portland Open-Data Explorer

An interactive, multi-page explorer over free public datasets about the Portland, OR metro (Multnomah, Washington, and Clackamas counties), surfaced as maps, charts, and searchable tables. A Portland port of Elvis: same architecture, a DuckDB warehouse modeled with dbt, different city.

Claude Code, a reproducible ELT-plus-dbt warehouse baked at build time, with the city-specific config isolated to one file.

A reproducible dbt warehouse baked fresh at build time, with the city-specific config isolated to one file.

Analytics EngineeringForward Deployed
dbtDuckDBStreamlitAltairPyDeckRailway
Details
Screenshot of Spooky: X-Files Episode Explorer

Spooky: X-Files Episode Explorer

An episode data explorer for The X-Files, built around the fact that nobody agrees which episodes are 'mythology.' It stores three sources' verdicts per episode, derives a defensible label by vote, and renders the disagreement as a first-class feature with contested-episode badges and per-source breakdowns.

Claude Code with TDD against recorded API payloads, plus legal-shape and provenance tests in CI.

Test-driven data work, with recorded-payload TDD plus provenance and legal-shape checks running in CI.

Data EngineeringDeveloper Advocacy
PythonPlotly DashpandasRailway
Details
Screenshot of Benten: Music Workshop

Benten: Music Workshop

A personal music workshop named after the Japanese goddess of music: practice logs, theory notes, a riff library, and composition sketches, paired with an interactive app for playing chord progressions on a fretboard, recording and overdubbing takes, building effect chains, and searching tabs. Everything it writes stays clean, hand-editable Markdown.

Claude Code, logic tested first with pytest and Node, then the interface, then a full walk through in a real browser.

An interactive full-stack build, Web Audio in the browser with logic tested first in pytest and Node.

Full-StackDeveloper Advocacy
PythonJavaScriptWeb Audio APINodeRailway
Details
Screenshot of Wordly: Private Word Game

Wordly: Private Word Game

A private, invite-only word game in the Words With Friends style for a small circle of friends and family, with no ads, no paywalls, and no power-ups to buy. It is an installable web app: async turn-based play, a faithful 15 by 15 board and tile bag, live dictionary-checked scoring, and a ping when it is your turn.

Claude Code from a written PRD, with the game rules and scoring tested first, then magic-link auth, a Postgres data model, and email plus web-push notifications wired end to end.

A full-stack multiplayer app end to end, from magic-link auth and a Postgres data model to email and web-push notifications.

Full-Stack
Next.jsTypeScriptNeon PostgresDrizzle ORMResendWeb PushVercel
Details
Screenshot of Boor: AI Dungeons & Dragons Table

Boor: AI Dungeons & Dragons Table

A web-based virtual tabletop for running a persistent D&D campaign that keeps going when players cannot make it. When someone is absent, an AI plays their character in their voice and within limits they set in advance, so the party stays whole and the session happens as planned. The DM role is just as flexible: a human can run the game, or the AI can.

Built with Claude Code from a written PRD on the RECL loop. The language model proposes each in-character action, a pure guardrail layer checks it against the player's red lines, and a deterministic 5e rules engine adjudicates the result. Model-mocked pytest plus an eval harness keep it honest.

A bounded LLM agent that takes real in-character actions through a deterministic rules engine, refuses actions that cross the player's stated red lines, and is graded by an eval harness for mechanical validity and persona fidelity.

AI EngineeringFull-Stack
PythonFastAPIClaude APITypeScriptNext.jsPostgresWebSocketspytest
Details
Screenshot of Gregan: Glendora Open-Data Explorer

Gregan: Glendora Open-Data Explorer

An interactive, multi-page explorer over free public data about Glendora, California and its San Gabriel foothills setting, surfaced as maps, charts, and searchable tables. It ports the Elvis and Robbins engine to a new city, fetching city, county, state, and federal open data into a DuckDB warehouse modeled with dbt.

Claude Code on the RECL loop, a reproducible ELT-plus-dbt warehouse baked at build time, with dbt tests on the models.

Multi-source ingestion narrowed to one small city, pulling three access patterns (city ArcGIS, filtered county and federal files, and Socrata-style APIs) into one tested DuckDB and dbt warehouse.

Analytics EngineeringData Engineering
dbtDuckDBStreamlitAltairPyDeckRailway
Details
Screenshot of Roodle: Draw and Guess with Friends

Roodle: Draw and Guess with Friends

A small, private, ad-free drawing-and-guessing game, the Draw Something experience without the ads, coin shops, and upsells. A few friends take turns: one draws a word on a canvas, the others open the app later, watch the strokes replay, and guess by tapping letter tiles. Deliberately simple, cozy, and built for people who already know each other.

Claude Code from a written PRD, with the turn and scoring logic tested first, then magic-link auth, a Postgres data model, and vector stroke capture for the drawing replay.

An async multiplayer game end to end, from magic-link auth and a Postgres data model to canvas stroke capture, replay, and tile-based guessing.

Full-Stack
Next.jsTypeScriptPostgresDrizzle ORMCanvasRailway
Details
Screenshot of Guzzolene: Gas Economics Tracker

Guzzolene: Gas Economics Tracker

Tracks personal gas purchase history for a Mazda 3 Sport to see whether fuel economy has measurably changed, and to put price swings in the context of geopolitical events. Plots cost per mile overlaid with WTI crude oil prices.

Built with Claude Code on the RECL loop, with pytest guarding the data and the pipeline. Public on GitHub.

Turning a personal logbook into analysis, plotting real fuel-economy and price data against world events and WTI crude oil.

Data Engineering
PythonJupyterpandasMatplotlib
Details
Screenshot of Olympic: Health Tracker

Olympic: Health Tracker

A personal health-tracking app that ingests data from multiple sources, including ResMed/CPAP therapy data, into one unified dashboard.

Claude Code, multi-source data ingestion and visualization, verification-first.

A single dashboard that unifies several personal health sources into daily and weekly trends, streaks, and personal records.

Full-Stack
Next.jsTypeScript
Details
Screenshot of enki: Personal Website

enki: Personal Website

This site: a clean, data-driven portfolio built with Next.js App Router, Tailwind CSS v4, and TypeScript. Zero-config Vercel deployment.

Designed and shipped with agentic tooling, with Vitest holding the components steady. Public.

A fast, accessible, data-driven site where every project, resume, and essay is one typed record rendered by shared components.

Full-Stack
Next.jsTypeScriptTailwind CSSVercel
Details
More projects (one)

Ansel: Resumable Photo Captioning CLI

A macOS command-line tool for captioning and tagging your Photos library incrementally, in short sessions spread over months. Progress lives in a local SQLite database keyed by each photo's UUID, so you can quit at any time, including Ctrl-C, and pick up exactly where you left off.

Claude Code, test-first, with reads through osxphotos and writes through photoscript's AppleScript bridge so captions and keywords are real Photos edits.

A resumable, local-first batch tool built around interruptibility, with a UUID-keyed SQLite checkpoint so a months-long job survives quitting at any point.

Developer Tooling
PythonSQLiteosxphotosphotoscriptuv
Details

Work in progress

A few projects still in the workshop: specs written, scaffolding up, not yet something I would call shippable. They are here for the same reason the rest are, so you can see how I work, and the source is on GitHub as it lands.

Work in progress

niu_ma: Chinese-Standard Mahjong

Async Chinese Official (Guobiao) mahjong for a fixed group of four friends, a drop-in web app where turns happen over hours and days and the game state persists between visits. The rules and scoring engine is a pure, deterministic core kept free of time and IO so it can be exhaustively unit-tested.

Claude Code from a written PRD, with a pure deterministic rules-and-scoring engine tested first, then FastAPI, a Postgres store, magic-link auth, and email nudges.

PythonFastAPIPostgreshtmxResendRailway

All source is on GitHub. Questions or a role in mind? appelew@gmail.com.