Portfolio · An AI music teacher

Tom. Teacher of Music. An AI music teacher who has ears.

I had a practice tool that listened to me play — highlighted where the timing drifted, where a note was wrong, where I was getting stronger. When it was removed, so was my progression. I wanted a teacher who could see my score, hear me play, and know me well enough to push where I was ready and back off where I wasn't. No product does this. So I'm building one.

§ Two — Today

Tom today

Tom is running. I practise with him every day.

Beat 01

Tom runs the lesson — he doesn't just talk about it. Tom lives inside the practice app, not beside it. When I talk to him he doesn't only answer, he acts: opens the right drill, sets the scale visualiser to the key I need, lays out the week's plan, moves me to the next screen. He drives the same app I do, through a set of typed tools — the same way I'd tap the buttons myself.

A real practice app — here's what Tom drives.

Scale visualiser Live · interactive
The actual screen: every scale and mode on the fretboard in the app's 12-note colour system. Tom sets the key and pattern through a typed tool — try the controls.
Chord practice Live · interactive
The actual screen: metronome, transposition and drill modes. Tom opens the drill and dials in the tempo on your behalf.

Beat 02

He remembers me — and he keeps working when I've stopped. What's hard, what's clicking, the pieces I'm on — it all lives in a memory Tom reads before he says a word, so he never starts from scratch. And every night, while I'm not practising, he reviews the day and adjusts tomorrow: nudges a tempo, swaps a drill, rewrites the plan around what actually happened.

Tom system architecture The learner uses an Angular practice app. It connects over SignalR — the AppStateHub — to a .NET API, which calls a FastAPI wrapper around Claude. The wrapper exposes typed MCP toolsets (tom-practice and tom-memory) and a persona to Claude, so Tom can both converse and operate the app. The .NET API owns a Postgres database holding the event stream, the skill graph and its projections; the wrapper reads and writes longitudinal memory in mem0 with vectors in Qdrant. Every connection is two-way — Tom drives the same app the learner does. SURFACE API AGENT MEMORY & STATE Angular practice app the learner taps the buttons — Tom drives the same ones .NET API SignalR hub · controllers · tools FastAPI · Claude wrapper MCP toolsets — tom-practice, tom-memory · persona Claude reasons · calls tools SignalR streaming HTTP MCP Postgres event stream · skill graph · projections mem0 episodic memory Qdrant vectors
Angular ↔ SignalR ↔ .NET API ↔ a Claude wrapper exposing typed MCP tools. Tom drives the same app the learner does, over one shared, longitudinal memory.

Beat 03

Underneath is a map of everything there is to learn. Tom builds a graph of skills and the prerequisites between them, and grows it as I progress. A node only lights up when I've actually demonstrated the skill — not just practised it. Effort and mastery are deliberately separate currencies, so "progress" means I'm genuinely better, not that I simply turned up.

Skills Live · interactive
The skill graph as a star map — a galaxy per instrument, skills as nodes wired by prerequisite. A node only lights up on demonstrated mastery. Click a galaxy to climb into it.

Tom adapts to the pieces I'm actually working on, and runs quietly on my own server, every day.

§ Three — Tomorrow

Tom tomorrow

What Tom is today is a foundation. What he becomes is a teacher who can see the score, hear the performance, and close the loop between the two.

AppFactory

This is a large build — larger than I would attempt alone. AppFactory is what makes it feasible — the agent-system that turns architecture decisions into shipped software. Tom is the first real demonstration of what one engineer can build with AppFactory behind them.

The stack

Every way in, one teacher — and a widening library to teach from.

  • Text Conversations in the practice app, with memory that persists across sessions.
  • Vision Captioned manual imagery inside Tom's knowledge base.
  • Time-series Session logs, BPM progression, a model of how I actually improve over time.
  • Practice & theory Chords, scales, ear training and rhythm — a growing library of practice tools and theory studies Tom teaches from.
  • Structured score MusicXML ingested from score PDFs via OMR, rendered in-browser with OpenSheetMusicDisplay.
  • MIDI Piano performance captured natively over USB, diffed against the canonical MIDI of the piece. Coming soon
  • Audio Guitar recorded through the browser, pitch and timing extracted with basic-pitch and DTW. Coming soon

Asymmetry

One subtle call: piano and guitar need different pipelines. Piano emits MIDI natively — a clean, millisecond-accurate signal. Guitar emits audio through a pickup — messier, polyphonic, needs inference. Same teacher, two capture paths. The architecture mirrors the instruments rather than flattening them into one pipeline.

Score-Match

At the end of that pipeline: a score-aligned playback diff. Record a take, compare it to the score, colour each note as I played it — green correct, amber timing off, red wrong note, grey missed. The capability whose removal stalled my own progress — rebuilt, and this time it lives inside a teacher who knows me.

Score-aligned playback diff — rebuilt, inside a teacher who knows you.