I turn frustrationsinto features
As a user-centered systems builder, I thrive on translating chaotic systems, confusing workflows, and cluttered spreadsheets into thoughtful software. Nothing excites me more than digging beneath the surface of a system to uncover the hidden bugs, flaws, and assumptions others miss.
Selected work
Frustration in. Feature out.
Frustration
Students and instructors click through a dozen Canvas documentation pages to answer one simple question.
Feature
CPALCanvas Personal Assistant for Learning
A RAG-based LLM-powered chatbot gives answers on the spot.
FastAPI · React · TypeScript · Python · RAG
Frustration
"Neural network" felt like a black box I could call but not truly understand.
Feature
T-Cubed ↗Neural Network Tic-Tac-Toe
A from-scratch neural net that learns to play, with a Go backend, bitwise operations, Protocol Buffers, and a React UI.
Go · TypeScript · Protobuf · Neural nets
Frustration
A bug in Canvas LMS that bit me every single week as an administrator.
Feature
Canvas LMS ↗Open-source contribution
Fixed it myself. Merged by Instructure and shipped to production.
Ruby · JavaScript · Open source
How I work
Beneath the surface, every time.
- 1
Dig
Sit with the people who live in the system. Watch where they sigh. That's where the work is.
- 2
Uncover
Trace the sigh to its root: the hidden bugs, flaws, and assumptions everyone else stepped around.
- 3
Fix
Build the smallest thing that removes the frustration for good. Then make it reliable.
- 4
Ship
Put it in real hands, measure it, and keep listening. Shipping the feature is just the beginning.
My journey
Four roles. Four kinds of frustration I learned to fix.
- 01
Music Teacher
Thirty kids, one hour, and a concept that doesn't land.
Learned to break hard things into steps that stick.
+ More
Years in classrooms taught me what makes learning work and where it breaks. I didn't just teach music; I studied how people learn, and even published peer-reviewed research on it. Every user flow I've designed since then starts there.
- 02
Instructional Designer / LMS Admin
Canvas workflows held together with copy-paste and hope.
Scripted the chaos away: extensions, automations, clean data.
+ More
I lived inside Canvas as both a course designer and administrator. When the platform fell short, I extended it with browser extensions, userscripts, automations, and clean data pipelines. When a search-highlighting bug was weeks from a fix, I contributed an HTML parsing algorithm to Instructure's codebase and fixed it myself.
- 03
LLM Quality Analyst
AI that sounds confident and is quietly wrong.
Evals, prompts, and guardrails teachers can trust.
+ More
At MagicSchool, I'm constantly improving the AI systems used by teachers around the world. A confident-and-wrong LLM is frustrating; my job is building evals, designing tool calls, and tuning prompts that give teachers reliable AI features.
- 04
AI Engineering Projects
Complex workflows nobody has time to untangle.
Agents, RAG, and LLM tools that do the untangling.
+ More
When I was tired of searching Canvas documentation for answers, I built a Go web scraper to feed a Python RAG data pipeline, and created an AI chatbot that gave grounded, cited answers to frequently asked Canvas questions. TypeScript, Python, Go, Postgres: I use whatever tool best solves the frustration.
AI & systems
The toolbox.
LLMs
AI SDK · OpenAI API · Anthropic API · OpenRouter
RAG
Chunking · Embeddings · Vector search · Reranking
Evaluation
Eval development · Prompt engineering · Braintrust
Agents
Guardrails · Tool calling · Multi-step workflows
- TypeScript
- React
- Python
- PostgreSQL
- Go
- Java
- Next.js
- Tailwind
- FastAPI
- Docker
- Git