A machine that hears every note, and a reason to play one more time.

01 · Inspiration

Learning piano alone, you get lost. You don't know what to practice, whether you're getting better, or why you keep missing.

We saw it on the first night. Eric and his roommate played one-hand Twinkle on a Yamaha DGX-660 in an early build. Eric scored about 10% on his first runs and his roommate about 15%. In their words: "We don't know when to press the key."

The apps don't fix this. We checked the four leading ones: Simply Piano, Flowkey, Yousician and Playground Sessions. They cost about $100 to $150 a year, they grade which notes you hit but not how you played them, and they top out around intermediate.

The best fix today is a person. A good tutor hears how you played, remembers what you know, and always knows what you should work on next. But tutors are expensive, and there aren't enough of them. We wanted that tutor for everyone who sits down at a piano.

02 · What it does

Étude is a piano tutor that ends feeling lost. It hears every note to the millisecond, names the one thing to fix with real numbers, and picks what you practice next.

Plug a real 88-key piano into Chrome over USB, or play on laptop keys. Notes fall toward the keys, and every note is judged against the chart's clock:

$$\Delta t = \text{when you pressed} - \text{when it was due} - \text{your latency offset}$$

PERFECT is within 40 ms, GREAT within 80 and GOOD within 120. A note with no matching key in time is a MISS, and an extra key is WRONG.

The results screen grades how you played, not only which notes you hit. It shows your accuracy bar by bar, brackets the weakest bars, gives your average timing early or late in milliseconds, and offers one button: practice those bars at 70% speed.

The results screen after a test run of Twinkle: accuracy by bar, the weakest bars bracketed, and one button to practice them.

03 · Arcade Mode

A tutor only helps if you keep coming back, so the arcade is how Étude teaches, and every effect has a job. The millisecond readout tells you how late you were. Practice in chunks starts on the whole song at 70% tempo, narrows onto the bars you missed most, and grows again after two clean takes. Wait mode holds each note until you find it. Flow mode follows your tempo, so a beginner isn't left behind. The combo, fever and the crowd are there to make you play one more time.

04 · Arcade Mode vs Learn Mode

The game (Eric). The arcade, the judge, the practice engine, wait and flow modes, adaptive practice, and panels for timing, evenness and dynamics. 48 songs, each charted from a cited score, from Twinkle to Chopin.

The tutor (Andres, at /learn). A new student names the songs they want to play and takes a diagnostic of up to 15 minutes. Then /learn opens on a map of 207 music skills joined by 481 prerequisite links. Every skill cites a source, 146 titles in all, and 433 items test them: 278 theory questions and 155 passages to play. The tutor hands you one step at a time. You explore an idea with a chat that asks guiding questions and never gives the answer, recall it, practice it with help that fades, then prove it in a cold check: at tempo, both hands, no help. A take only counts when help was on for 30% of it or less. The tutor listens over Web MIDI with its own scorer for note order, timing, evenness, legato and pedal.

The tutor has a body: ink. It moves through every /learn page, trails your pointer, blooms on a right note, knots on a wrong one, and keeps out of the way of text. It merged today, and no student has tried it yet.

The tutor's map at /learn, captured before the ink landed: the skill regions, with the next step ready to start.

The Lab. Experiments live off the main path at /lab. Three favorites: Real Keys lays the falling notes onto a live camera picture of the real keys, Conduct lets your hand at the laptop camera lead the piano, and The Round plays your own take back as voices two, three and four. They're built and tested, not tried with players.

05 · How we built it: Stateful learning

A model call starts from zero. A tutor is worth paying for because they remember you. So in Étude the state holds the student, and Claude Opus 5.5, released September 22, 2026, brings the judgment.

  1. Every attempt is kept. Each answer and each played passage is saved, right or wrong, cold or helped, on the device first and then in Supabase, along with the student's goal songs.
  2. The history becomes a state. The engine replays every attempt into a belief for each skill and a date for its next cold check, after 1, 3, 7, 21 and 60 days. A skill counts as mastered at a belief of 0.95. These are standard knowledge-tracing values, not yet calibrated on real students.
  3. The graph gives the state meaning. What you know says what you're ready for.
  4. The state is the model's context. Before each session the server rebuilds the state and turns it into up to 20 candidate skills, each with its evidence: the belief, the counted attempts, a due check, links to what you've mastered, and the goal songs that need it.
  5. The model brings judgment, and the graph checks it. Opus 5.5 weighs that evidence against seven learning principles, picks 3 to 5 steps, and tells you why in one line. A pick outside the candidates is rejected, and with no key or an error the top candidates are used.

The model holds no student. The state does. That's how one tutor's judgment reaches every student, each on their own history. We ran the engine on 200 seeded synthetic learners through the real diagnostic, scorer and fallback planner; that run never calls the model.

We built Étude the same way. Three of us worked with a team of AI coding agents that kept their memory in files, not in chat. The spec on main is the source of truth, each person owns a lane that CI enforces, in the learning lane a talking agent hands each slice to a fresh worker session, and CI integrates every PR. From the first commit on Friday at 8:39 PM ET to Sunday at 4:06 PM: 872 commits, 843 merged PRs, 206 finished features with a done note, 208 test files and 84 browser checks.

The stack: Next.js and TypeScript in Chrome, Web MIDI and Web Audio, Supabase where the browser never writes, the Anthropic API for the tutor, and an ESP32 driving an LED strip over the keys.

06 · Challenges we ran into

  • Strict mode lost a real pianist. On a hard piece, a real pianist scored 10 to 20% and couldn't rejoin. That became flow mode, merged about an hour after Eric approved it.
  • A playtest ran on a build 9 hours old. Now the song select shows the commit it serves and its age.
  • /play lagged. We measured before fixing: it drew 53 canvases and 436 megapixels a frame. Now it draws 3 canvases and 9.4 megapixels.

07 · Accomplishments that we're proud of

  • /veritas puts the judge on trial. Test players plant known mistakes in real songs. On Für Elise: 2 planted, 2 found, 0 false alarms. On every committed song it catches exactly what was planted, except rushing.
  • The laptop hears every key. Two keys grazed together arrived 3.1 ms apart, as two separate events.
  • A tutor with sources. Every skill in the graph cites one, and a test fails the build if one doesn't.
  • Mouse-first and keyboard-friendly. Every key action has a button, ? lists every control, and the song select has screen-reader support built in.

08 · What we learned

  • Memory belongs outside the model. Our tutor and our agents both work because their state lives in data and files, not in a chat.
  • Check what you're testing before you test it. One playtest ran 233 commits behind main.
  • Measure before optimizing. The lag fix started with a probe, not a guess.
  • Say what isn't true yet. Keeping built, merged, verified by CI and tried by a person apart kept us honest about what works.

09 · What's next for Étude

  • The tutor doesn't read your game takes yet. Next, every take on /play feeds the learner's state.
  • Theory at the moment you stumble is proposed, not built. Next, the results screen hands the stumble to the tutor.
  • The tutor's numbers aren't calibrated. Next, tune them on real students.
  • No beginner has a second take yet, so we claim no improvement. Next, the same beginner, a week later.
  • Flow mode and practice in chunks haven't been played on the piano, and a flow-mode take saves as all misses. Next, fix that and play them on the DGX-660.
  • The judge can't flag rushing yet.
  • The LED strip lights for keys played on the DGX-660, and the game's hints pass on a simulated board, 42 of 42. The game driving the real strip during a song isn't proven yet.
  • The live site still needs its keys. Until then the planner uses its fallback and the theory chat is off.

Built With

Share this project:

Updates

Submission history