Projects

Pocetude – Spaced Repetition for Music Practice

React
TypeScript
Django
PostgreSQL
PWA
Music
Spaced-Repetition

A practice scheduler for musicians that applies spaced repetition to scales, patterns and rhythms, with real notation, audio playback and BPM tracking.

Why I Built This

Every other music practice app is a timer or a logger. None of them answer the question that actually matters: what should I practice today, and what am I about to forget?

Pocetude applies spaced repetition, the science behind tools like Anki, to music practice. It schedules scales, patterns and rhythms so each exercise comes back right before you’d forget it. The payoff: solid muscle memory in every key, faster sight reading, and vocabulary you can improvise with.

What It Does

  • A practice queue instead of a to-do list: Pick keys, scales, patterns and rhythms; the scheduler decides what you practice and when, based on how well you actually play them.
  • Real notation with playback: Exercises are rendered as sheet music (via abcjs) with audio playback at any tempo, instead of static PDF charts.
  • BPM tracking: Every exercise tracks your tempo over time, and Pocetude suggests the next small step up.
  • Runs anywhere: It’s a PWA that lives in the browser, designed to sit on a music stand next to your instrument. Nothing to install.



Motor Skills Aren’t Flashcards

The most interesting engineering problem in Pocetude is that existing SRS algorithms (SM-2, FSRS) model declarative memory: facts. Playing a scale is procedural memory, and it decays differently; research shows speed and accuracy fade at different rates (speed half-life roughly twice that of accuracy).

That led to some design decisions that invert flashcard-SRS orthodoxy:

  • Speed and spacing are inversely coupled. In a flashcard system, mastery earns longer intervals. But when you’re pushing BPM at the edge of your ability, motor patterns are less stable, so higher tempo demands more frequent review, not less.
  • The challenge zone drives tempo. Research on the “challenge point” suggests learning is fastest when you succeed most of the time, but not always. Pocetude nudges tempo in small steps to keep practice in that zone.
  • User override is a core feature, not an escape hatch. A flashcard algorithm can assume your cognitive state is roughly constant. A practice algorithm can’t assume your physical state is: fatigue, a sore lip, a new reed. So BPM locks and manual overrides are first-class.

The full write-up, with sources, is on the science page.




Stack & Choices

I’m the sole developer, so every choice optimizes for iteration speed and long-term maintainability.

Frontend

  • React 19 + Vite + TypeScript, state in Zustand, offline-first data in Dexie (IndexedDB).
  • abcjs for notation rendering and playback, tonal for the music theory (keys, scales, transposition).

Backend

  • Django 6 + DRF with JWT auth, Celery for background work, PostgreSQL and Redis. Boring, proven, and hard to break.

Marketing site

  • For the .com landing page, I chose Astro. The same framework this website runs on. For its easy static build and hosting process
  • Separate Astro 5 static site (English + German), zero client-side JS, self-hosted cookieless Umami for analytics.

Deployment

  • Docker images are built in Forgejo CI pipelines via kaniko und pushed into Forgejos own Docker registry. The Server pulls them from Forgejos Docker registry



Curious what spaced repetition does for your playing? Try Pocetude →