Odisei Play is the companion app for the Travel Sax, an electronic saxophone. Video courses, play-along songs, and practice tools that react live to what you play, streamed from the instrument over Bluetooth MIDI. One React Native codebase, three platforms: iOS, Android, and web.
I joined as Lead React Native Engineer in 2024, pairing with the CTO in a two-engineer team. Since then, close to half of the commits in the repo are mine.
Most apps render data. This one listens to a physical instrument.
The app pairs with the Travel Sax over Bluetooth and receives a live MIDI stream while you play. That means pairing flows, reconnection edge cases, and three transport layers to arbitrate: Bluetooth, USB, and audio input. And it has to work identically on iOS, Android, and the web, where the connection runs on the web Bluetooth API instead of the native stack.
On top of the hardware layer sits a full learning product: structured courses, play-along songs, practice tools, progression, purchases. Over 120 screens, shipped by a team of two engineers on a release every two weeks.
The real challenge is that pace. Two people cannot ship a product this size every two weeks unless the codebase itself is doing part of the work.
I own the device connectivity system: scanning, pairing, MIDI-over-Bluetooth message parsing, reconnection, and device settings, with a manager that arbitrates between Bluetooth, USB, and audio input. I also built the web implementation on the web Bluetooth API, so the browser version connects to the saxophone exactly like the native apps do.
I own most of what happens around playing: the courses section and its interactive video player, where checkpoints pause the lesson and wait for you to actually play something on the instrument before moving on. The post-session flow is driven by a small state machine I built to sequence awards, streak celebrations, and goals without the spaghetti that usually grows in that part of an app.
I led the monorepo migration: the app plus six shared packages, a design-token pipeline, and a component library documented in Storybook. That structure is why our designer now ships production components herself, directly in the repo.
I initiated the agentic infrastructure: per-package CLAUDE.md files, a single-source-of-truth rules system, custom skills and hooks. Today the whole team works with Claude Code on top of it, and AI agents commit to the repo under their own names.
Honesty beats an inflated case study: the audio engine, the pitch detection, and the core playing screen are the CTO's work. I built most of what surrounds them.
The app runs in production on iOS, Android, and the web from a single React Native codebase: over 120 screens, 21 feature modules, a 146-component design system, and a test suite that goes from unit level to Playwright end-to-end.
We ship a release every two weeks, with over-the-air patches in between. Close to half of the roughly 9,000 commits in the repository are mine, in a codebase that was already a year old when I joined.
The part I am most proud of is not a feature. It is that the structure lets two engineers, one designer, and a few AI agents ship like a much bigger team.
How I set up my repos, manage context, and run agents in production. Written down so you can do the same.