Piano plays a score as notes falling onto a keyboard, and then teaches it: it waits for you, tells you which bars went wrong, and raises the tempo each time you get a passage right. Its plugin gives Claude Code fifteen tools to write the piece you asked for, check it, keep it in your library and play it in the window in front of you.
› /piano:compose a short waltz in G, beginner, right hand writes
› validate_score checks
› save_score keeps
› play plays
› practise bars 1–4, right hand, from half speed teaches
A scripted session with the replies shortened. The tool names are the server’s own, read out of its source when this page was built. The server takes no file path and runs no command: save_score writes into ~/.piano/library and nowhere else.
Most of what stands between a person and a piece they want to learn is the score: finding one at the right level, in a form the app can read. Here that is Claude Code’s job, and the app’s job is everything after it.
The app is a piano before it is a tool: everything the plugin can do, the window also does with its own controls, and it opens with scores to play before Claude has written one.
Binding in the sense that a feature breaking one is wrong even if it was asked for. Each names the mistake it prevents.
“82%” tells nobody what to do next. “Bars 17 to 20, left hand, late” does, so the report is per bar and per section.
Its transport takes a closed set of requests, so a score Claude writes can only ever be a score filed in your library.
Every reader and writer goes through packages/score-format, and a check refuses a second copy, so the app never accepts a file the server rejects.
A beginner arrangement derived from the score removes notes and never invents one, so what you learn is still the piece.
It is a view of the score, not an editor, so the file you practise is exactly the file that was written.
Library, practice history and settings are local files. The one outbound request is the recorded piano, and only when you ask for it.
Each is a reason somebody stops practising, and each is answered here by what the app does rather than by a setting.
A synthesised piano sounds the moment the app opens, matched in loudness and attack to the recorded one, so nothing waits on a download. The recorded piano is offered after, with its size stated first.
Each note comes back in time, early, late, wrong or missed, gathered per bar. The drill repeats the passage that needs it and moves the tempo by what you just played.
Ask for a piece at your level and Claude writes it. For a piece still under copyright it offers an original in that style instead of a copy.
The piano roll is drawn from the audio clock rather than the screen’s, so a note lands on its key at the moment it sounds, whatever the frame rate is doing.
L from the keyboard.A level is a way of playing the same piece, not a different piece. Where the score has its own arrangement for a level the app uses it; otherwise it derives one by taking notes away.
The melody in one hand at two thirds tempo, with the score waiting for you.
Both hands a little under tempo, playing along rather than being waited for.
The score as written, both hands, nothing waiting and a tight window.
A fresh install opens with Minuet in G, Ode to Joy and Prelude in C, bars 1 to 19: public domain, each with its own beginner, intermediate and advanced arrangement.
~/.piano/library, searchable by title, composer, level and tag..mid, .musicxml or .mxl into that folder and it is imported; drop one on the window and it opens.Each has a page to link at, whether from a README, an issue or a search result.
How Piano draws a score as notes falling onto an on-screen keyboard, in time with the audio rather than the screen, and what the roll lets you do with a passage.
Read the page →The same score as engraved sheet music, one stave per hand, with a band that follows the playhead. A view for reading, never an editor.
Read the page →Wait mode, grading per note gathered by bar, three strictness settings, a drill whose tempo climbs, latency calibration and a history kept on your disk.
Read the page →A local library that opens with three public-domain scores, imports MIDI and MusicXML, and a recorded grand piano downloaded only when you ask.
Read the page →A score is one JSON object: notes in ticks with a hand, a part and a finger, a tempo map, sections, and an arrangement per level. Validated by one package that owns it.
Read the page →Written down so they can be pointed at. Each one is somebody else’s product done well, and doing it here would make this one worse.
The sheet view is for reading. Writing the score is Claude Code’s job, in the score format.
Export MIDI and use a DAW, which will always do it better.
The library, your progress and your settings stay on your own disk.
It is a piano, and every screen assumes one.
Input is a MIDI keyboard or the computer keys, which say exactly what was played.
MP3, YouTube and scanned sheet music are not scores, and guessing at them teaches the wrong notes.
What ships is public domain, with its source and licence recorded in the file.
It is a desktop app, where MIDI and low latency are.
The plugin brings the MCP server and the commands. It needs only Node 20.11 or later, and the tools that write, check and keep scores work before the app is installed.
/plugin marketplace add alegauss/piano
/plugin install piano@pianoThe release page has an installer for Windows, a disk image for each kind of Mac, and an AppImage for Linux. They are not signed yet, so your system warns the first time; the release notes show what it says and how to get past it.