Projects

I build software with AI agents, and I keep it honest with tests. Below are eleven 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 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 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 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
More projects (five)
Guzzolene: Gas Economics Tracker logo

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.

PythonJupyterpandasMatplotlib
enki: Personal Website logo

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.

Next.jsTypeScriptTailwind CSSVercel
Olympic: Health Tracker logo

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.

Next.jsTypeScript

Lucre: Personal Finance PWA

A single-user personal-finance PWA covering balances, net worth, subscriptions, spending, and bill alerts, backed by Plaid for bank data and continuously-replicated SQLite.

Claude Code, Plaid data ingestion and analysis, validated with pytest.

PythonFastAPIHTMXPlaidSQLite + LitestreamRailway
Bartleby: Collaborative Notes logo

Bartleby: Collaborative Notes

A self-hosted, real-time collaborative notes app for a small group of friends, with two first-class clients, a SvelteKit web editor and a Python TUI, editing the same documents live via a shared CRDT.

Claude Code across two clients from one core, with tests holding the shared logic steady.

SvelteKitNodePythonCRDT (Yjs)SQLiteDocker

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

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.

Claude Code from a written PRD, a Python service and a TypeScript web client, with believable AI stand-ins as the north-star bet.

PythonTypeScript
Work in progress

Seer: Handwriting to Markdown

Turns phone photos of handwritten notebook pages into clean, versioned Markdown in a Git repo. Claude's vision model transcribes each page verbatim, flags uncertain words, and the author reviews the result side by side with the original before it is committed. The original images are preserved alongside the text, so the archive stays greppable and future-proof.

Claude Code from a PRD, vision transcription with a human review gate before anything is committed.

Claude APIMarkdownGit
Work in progress

Weather: Ad-Free Forecast and Radar

An ad-free reproduction of the only two Weather Underground features worth keeping: a clean 10-day forecast and an interactive radar map. No ads, no trackers, no account. Every data source is keyless, so there are no secrets to configure.

Claude Code from a PRD and task board, data from keyless public APIs (Open-Meteo, RainViewer).

Next.jsTypeScriptTailwind CSSMapLibreVercel
Work in progress

Wormsworth: Poetry Commonplace Book

A poetry commonplace book that a machine can also read. Every entry does three jobs at once: a working notebook of notes on poets and poems, a structured dataset with consistent YAML frontmatter so the collection is queryable, and a context store an LLM can be handed as background. The design constraint that reconciles them is prose a human wants to read, wrapped in metadata a machine can parse.

A human-first notebook wrapped in machine-parseable metadata, with a status pipeline tracking what has actually been read versus merely shelved.

MarkdownYAML
Work in progress

learn_typescript: Graded TypeScript Ladder

A graded-exercise learning ladder for TypeScript aimed at AI-development work. Each exercise ships a failing Vitest test as the spec, and you drive it green. The ladder starts at fundamentals like discriminated unions, narrowing, and generics, then climbs to runtime validation with zod, typed tool schemas, and a capstone agent loop that calls a live Anthropic model.

Test-first by construction: every exercise is a failing spec you drive green, with a hidden reference generating the golden output.

TypeScriptVitestzodAnthropic SDK
Work in progress

learn_sql: Graded SQL Ladder

A graded-exercise learning ladder for advanced analytical SQL, backed by DuckDB. Each exercise ships a failing test as the spec, and you drive it green against real, messy public data (the Olist e-commerce dataset). The ladder starts at intermediate level and drills window functions, set-based joins, and analytical patterns like funnels, cohorts, and gaps-and-islands.

Golden-output grading against a hidden reference on committed sample data, so exercises run offline and instantly.

SQLDuckDBPythonpytest
Work in progress

learn_AI: Project-Driven AI Path

A project-driven path into modern AI and machine learning that works through the full stack of an AI application: model, API, context, tools and agents, retrieval, evaluation, and deployment. The method is deliberately hands-on: read just enough theory to unblock the next build, make it move, then look inside to see why it worked. Local inference runs CPU-only through Ollama.

Every module ends in a build, with math taught just in time through code rather than as a prerequisite gate.

PythonOllamaAnthropic SDK
Work in progress

learn_spark-databricks: Spark in a Weekend

A sprint-based plan to go from an experienced data engineer who has not touched Spark to someone who can talk about Spark and Databricks credibly, by building one real pipeline end to end. It maps existing data-engineering knowledge (partitioning, ETL, schemas, idempotency) onto Spark's names for things, then drills the handful of places where Spark's execution model genuinely differs.

One real pipeline end to end, mapping existing engineering intuition onto Spark's execution model.

SparkDatabricksPythonDelta Lake

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