Capo
Change the pitch, speed, and volume of audio playing on any page, without leaving the tab.
The problem
Musicians practice along to songs that live in a browser tab. The song is rarely in a comfortable key, and it is almost always too fast to learn from. The usual answer is to download the audio and open a desktop editor — which is where practice stops.
My role
Frontend engineer on the Capo team at Elyra Lab. I own the practice interface and take it through testing and release.
What I built
- Designed and built the practice controls — a ±12 semitone pitch dial with cents-level fine tuning, speed, volume, an A/B loop, and transport.
- Worked on the audio path that inserts an AudioWorklet processor into pages we don’t control, so pitch changes apply to media that is already playing.
- Built interfaces that span three JavaScript contexts — popup, background service worker, and two content scripts in separate worlds — under Manifest V3’s constraints.
- Took the work through testing and release, and kept it current through Chrome Web Store updates, with releases automated in CI.
Built with
- TypeScript
- React 19
- WXT (Manifest V3)
- Tailwind CSS
- Zustand
- Radix UI
- Web Audio · AudioWorklet
- Vitest
- Lingui
- GitHub Actions
Status — Shipped on the Chrome Web Store and actively maintained.
