5 steps 1

Sequence Expert

I built a full-stack tool that lets teams hear audio sequences instantly.

Role: Technical Designer    Stack: Python/Flask, JavaScript, XML

"Playing audio files felt like going on an easter egg hunt."

In screenless play, audio is the interface. Every sequence in Kibeam Learning's interactive books, from a character's greeting to background music, is defined in XML files that reference audio assets.

To verify what a sequence would actually sound like, the team had to cross-reference the script, XML files, and filesystem. It was a frustratingly manual process, bouncing team members between five different applications.

The Old Way
📝 Script
📋 Sequences
🔗 Manifest
📁 Finder
🎧 DAW
🔄 Repeat

~5 min per sequence

Having performed comedy for over a decade, I knew that a 300ms pause can make or break a punchline. Writing for PBS taught me that kids need a moment of silence after new vocabulary to process it. The existing workflow made it painful to iterate on those micro-decisions because every timing tweak required a full rebuild.

Process friction meant:

  • QA had to wait for hardware builds to verify simple audio updates
  • Producers couldn't audition existing audio when planning retrofits
  • Technical Designers couldn't validate script edits without building to device

The Solution

One click to play.

No tracing. No DAW. No hardware builds.

I built Sequence Expert, a full-stack local application that parses our XML structure and plays back the audio as it would sound on the device. Select a sequence, hit play, and hear it immediately.

UNDER THE HOOD

How It Works

The problem was fragmentation. Sequence logic references lived in one file. Audio references in another. Asset mappings in a third. The tool needed to unify them automatically.

Sequence Expert

📋 Parse sequence skeleton
🔗 Resolve ID → filename
Hydrate attach paths
▶️ Play Web Audio

The browser never sees the fragmentation—just a unified timeline.

The tool works in three phases: parse the sequence structure to get the skeleton, resolve abstract IDs against the asset manifest to find filenames, and hydrate each node with a playable file path.

The Core Function: Hydration
async loadMediaAndWaits(sequenceId) {

  // 1. Get sequence structure (just IDs, no files yet)
  const sequence = this.sequences.find(
    (s) => s.id === sequenceId
  );

  // 2. Get the asset dictionary (ID → filename mapping)
  const assets = await this.loadAssetManifest(
    sequence.basePath
  );

  // 3. Hydrate: cross-reference to build playable paths
  sequence.children.forEach((node) => {
    if (node.type === "media") {
      const assetId = node.getAttribute("assetId");
      const file = assets.find(
        (a) => a.id === assetId
      )?.file;
      node.fullPath = `${sequence.assetPath}/${file}`;
    }
  });
}

Code sample is representative; proprietary details have been generalized.

The backend is a Python/Flask server that performs real-time audio transcoding—converting hardware-native formats to browser-playable audio on the fly. A teammate built the initial transcoding logic. I extended it with cross-platform deployment—automatic DNS configuration for Windows, Mac, and Linux—so anyone on the team could run the server locally without manual network setup.

Impact

5 → 1
Steps Eliminated
One click replaces manual cross-referencing
5-10×
Faster Reviews
Instant playback vs. 5-min builds
3
Teams Adopted
QA, Producers, & Technical Designers chose to use it
"Choksi identified a pain point and built a tool that let us listen to files on our workstation, rather than downloading test builds to the device—a process that could take five minutes per build."
Madeline Mechem
Software Developer, Kibeam

Reflections

In stand-up comedy, you polish jokes every night. Nothing's locked in stone. That's what creative teams need: fast iteration, tight feedback loops, the ability to hear changes before committing to them. That's what I built Sequence Expert to enable.