Quick Start (5 Steps)
Step 1: Get the App
You have two options:
- Use it online — Open quidam2k.github.io/conductor/ in your phone's browser.
- Download it — Save
conductor.htmlto your device. It works offline, straight from your files.
Either way, you get the same app. The download is nice because it works without internet forever.
Step 2: Try the Demo
When you open the app, you'll see a green Try the Demo button near the top. Tap it to load a pre-built sample called "The Stillness." It works immediately — no downloads needed. The beep countdowns keep sounding even with the phone locked in your pocket.
Step 3: Preview and Practice
After loading the demo, you'll see a preview screen showing:
- The event title and description
- A list of all the timed cues
- When the event is scheduled to start
Tap Start Practice to run through the event at your own pace. Use the speed slider to go faster (up to 5×). Your phone will speak each cue out loud at the right time.
Step 4: Import a Resource Pack (Optional)
In a real event, phones are locked and pocketed. Typed cues are read by the app's built-in robot voice, which is baked into the same pocket track as beeps and recordings. It's built to be understood, not to sound natural, so a pack of real recordings sounds much better.
A resource pack is a zip file with pre-recorded voice cues that replace the built-in robot voice with real recordings. See the Importing a Resource Pack section below.
Step 5: Share with Others
From the preview screen, tap Share QR Code. The share screen gives you several options:
- Copy Link — Copies a URL to your clipboard. Send it via text, email, whatever.
- QR Code — Shows a scannable code on your screen. Others point their camera at it.
- Share File — Sends a self-contained HTML file that has both the app and the event baked in.
- Beam to a phone — Plays an animated QR code the other phone scans with its Scan QR Code button. Works even for events too big to fit in a single QR, and needs no network.
The person who receives your link just taps it and they're in. No install, no signup.
Joining an Event (for Participants)
Someone shared an event with you? Here's how to get in — pick whichever matches how they sent it:
- They texted or messaged you a link — Just tap it. The app opens with the event already loaded. If you don't have the app cached yet, the link opens the online version; it works the same.
- They're showing a QR code on their screen — Open Conductor, tap Scan QR Code, and point your camera at their screen. You'll drop straight into the event preview.
- They're showing an animated QR code (a "beam") — Same thing: tap Scan QR Code and hold your camera on their screen. Keep it steady — the code cycles through frames and a progress bar fills as it receives. When it finishes you're in.
- They sent you a file (AirDrop / Quick Share / a
conductor.html) — Open it. If it's a bundled file, it is the app with the event baked in. (Not yet confirmed on iPhone. If a file doesn't open, ask for the link or QR code instead, and tell us.) - You have an event code (a
v1_…string) — Open Conductor and paste it into the "Got an event code?" box on the home screen.
Once you're in, tap Start Practice to rehearse, then tap Go Live when the real event is close — Live opens 20 minutes before the first cue (see Going Live). If the event is password-protected, you'll be asked for the password the organizer gave you.
The Desktop → Phone Workflow
The most comfortable way to build an event is on a desktop or laptop — a real keyboard and mouse make writing the timeline fast. But you'll run it from your phone. Here's the bridge, and it needs no cables, accounts, or even a network at the phone:
- Build it on the desktop. Open Conductor in a desktop browser and create your event with the built-in editor (or paste a text/JSON script).
- Open Share. From the preview, tap Share QR Code.
- Beam it. Tap Beam to a phone. The desktop screen shows an animated QR code — a rotating sequence of frames that carries the whole event, even one too large for a single static QR.
- Scan on the phone. On the phone, open Conductor and tap Scan QR Code. Hold the camera up to the desktop screen and keep it steady. A progress bar fills as frames arrive.
- You're in. When the transfer completes, the phone jumps straight to the event preview. Practice, then go live from the phone (Live opens 20 minutes before the first cue).
This is the same animated-QR "beam" used for resource packs — it now carries events too. Nothing leaves the two devices: no server, no upload, no link to intercept. It's ideal when you've drafted something big at a desk and just want it on the phone you'll actually carry.
Tip: For small events, the plain static QR Code or Copy Link is quicker. Reach for Beam when the event is large, when you want a purely device-to-device handoff, or when there's no network to paste a link into.
Making the Text Bigger
Small text on a phone in bright sun is hard for anyone. Conductor has a Text size control with four steps (from normal up to largest) that zooms the whole interface. It's on the home screen and on the Preview, Practice, and Live screens — so you can bump the size up mid-event without stopping, right when you need to read a cue at arm's length.
Your choice is remembered on that device and applies everywhere in the app until you change it. The principle: it shouldn't matter how old your eyes are — you can still use it.
Importing a Resource Pack
Resource packs are real voice recordings that keep playing when the phone is locked in your pocket. They're optional — everything works without them — but they sound much better. You can record cues in your own voice right in the editor and share them as a pack.
Record Your Own Voice Cues
While editing an event, pick My Voice as the pack and use the 🎤 Record button next to each action to capture your own voice cue — or record them all in one pass, starting with the "Get ready to…" prep lead. The editor stores your recordings locally, and on the Review & Share step, you can export them as a standard resource pack and share it with your participants.
What You Need
A resource pack is a .zip file containing audio files and a manifest.json that tells the app what's inside.
How to Import
- Open Conductor in your browser.
- On the main screen, tap Import Resource Pack (or Manage Packs → Import Pack).
- Pick your
.zipfile from your device. - The app reads the zip, checks its contents, and shows you what it found.
What to Expect
After a successful import, you'll see:
- The pack name and description
- How many audio cues it contains
- If it includes any bundled events (demo scripts)
- A validation report showing which cues are covered
From now on, whenever the app needs to speak a cue that matches one in your resource pack, it plays the recorded audio. Anything without a matching file is read by the built-in robot voice.
The Demo Packs
Each demo event has its own small voice pack — roughly 100–350 KB, so it downloads in seconds even on weak signal and is small enough to beam phone-to-phone via QR. Each pack bundles one event script plus every voice cue that event uses (and the shared "Get ready to…" prep lead). Grab the one for the event you're running:
- The Stillness — freeze mob: sudden collective stillness, no props
- The Bloom — umbrella performance: raise, open, sway, light, close
- Lights Out — phone flashlights in the dark, evening event
- The Signal — sign reveal: step forward, raise, flip, hold
- The Stand — stationary umbrella formation (pairs with The Walk)
- The Walk — movement with lights through the formation (pairs with The Stand)
- The Murmur — synchronized sound and movement, eerie and theatrical
- The Cascade — rapid-fire cue bursts in a one-minute run
Creating Events
There are three ways to create events. Pick whichever feels most natural.
Option 1: Use the Built-in Editor
The easiest way. No coding, no special formats.
- Tap Create New Event on the main screen.
- Step 1 — Fill in the title, description, start time, and timezone. Also here:
- Playback mode — Cue (a beep prompts a person, the default) or Clip (the phone plays a recorded clip). See Cues and Clips
- Repeat the sequence — loop it until a set time or a set number of times, with a rest between rounds. See Repeating an Event
- Step 2 — Build your timeline:
- Tap Add Action to add a cue
- Set the time offset (minutes and seconds from the start)
- Type what should be announced (e.g., "Freeze in place")
- Choose a style (normal, emphasis, or alert), and a per-step playback mode (Default, Cue, or Clip)
- Toggle countdown, notice, and haptic options
- Pick My Voice as the pack and tap 🎤 Record to record your own cues. Recordings sound much better than the robot voice, which also plays in a pocket
- Step 3 — Review everything, then share via link, QR code, or file.
Option 2: Write a Text File
For more control, write your event in any text editor. Save it as a .txt file and import it, or paste the text directly into the input field.
Here's a complete example:
# My event — lines starting with # are comments
Title: Flash Mob at Central Park
Description: Meet by the fountain, east side
Start: 2026-03-15 2:00 PM
Timezone: America/New_York
Countdown: true # event-level: all actions get a countdown by default
0:00 Get ready
0:15 [emphasis] Wave left
0:30 [emphasis, countdown] Wave right
1:00 [alert, countdown:3, haptic:triple] Jump!
1:30 Freeze in place
2:00 Walk away casually
The basics:
- Put your title, start time, and other settings at the top
- Leave a blank line, then list your actions
- Each action is a timestamp, a space, then the text to speak
- Timestamps count up from the event start:
0:00= start,1:30= one minute thirty seconds in
Countdown — two levels: The headerCountdown: trueturns on a countdown for every action in the event by default. The per-action tag[countdown](or[no-countdown]) overrides that default for a single action.
Notices, styles, and haptics:
Before each action, the app gives you a heads-up (e.g., "Get ready to wave left"). These advance warnings are called notices. You can control them with NotifyWindow (event-level) or [notify:N] / [no-notify] (per-action). With a resource pack installed, the heads-up is assembled from the pack's "Get ready to…" prep-lead clip plus the named cue clips — so it plays in the pack voice, even from a pocket.
The three styles change how an action looks on screen:
normal— blue (default)emphasis— gold highlightalert— red/urgent
Haptic (vibration) tags make the phone vibrate on cue. Note: haptic works on Android. iPhones do not support vibration from web apps.
Tags go in square brackets before the action text:
[emphasis]— highlighted gold style[alert]— urgent red style[countdown]— plays an audible countdown (ascending beeps) leading into the action[countdown:3]— a shorter countdown (fits up to 3 beeps before the cue)[haptic:triple]— vibration pattern
Combine them with commas: [alert, countdown:3, haptic:triple]
Timezone: Start is read as a clock time in the Timezone you give — 2:00 PM New York stays 2:00 PM New York on a phone in California. Leave Timezone out and it uses the phone's own zone.
For the full reference with all tags, briefing blocks, and advanced features, see the Text Format Reference.
Option 3: Write JSON
For programmers or anyone generating events from code, you can write raw JSON:
{
"title": "Flash Mob",
"startTime": "2026-03-15T14:00:00-04:00",
"timezone": "America/New_York",
"description": "Meet by the fountain",
"timeline": [
{ "time": 0, "text": "Get ready" },
{ "time": 15, "text": "Wave left", "style": "emphasis" },
{ "time": 30, "text": "Wave right", "style": "emphasis", "countdown": true },
{ "time": 60, "text": "Jump!", "style": "alert", "countdown": 3, "haptic": "triple" }
]
}
Paste the JSON into the input field or save it as a .json file and import it.
Cues and Clips
Every step in an event plays one of two ways:
- Cue (the default) — countdown beeps, then a beep on the moment, and a person acts or speaks. The app gives a "Get ready to…" heads-up first.
- Clip — the phone itself plays a recorded clip at that moment. No beeps, no heads-up — the clip is the moment. Clips can be any length and may overlap later steps: music beds, crowd murmur, a phone on a speaker playing its part.
Set the default for the whole event (editor Playback mode, or Mode: clip in a text file), then override any single step (the step's Default/Cue/Clip toggle, or a [clip] / [cue] tag). One event can mix both. A clip step needs recorded audio to play in a pocket — without it, the built-in robot voice reads the line, and that is baked into the pocket track too (recordings sound far better).
Repeating an Event
Turn on Repeat the sequence (or use the text headers) to loop the whole timeline:
- Until a set time (
RepeatUntil:) — everyone stops at the same moment, so latecomers still join a round in progress. - A set number of times (
Repeat: 3) — best for a rehearsed drill where everyone starts together. - Rest between repeats (
Coda:, default 4 seconds) — the pause between rounds.
Set both and whichever ends first wins. Details in the Text Format Reference.
Going Live
Practice works any time. Go Live opens 20 minutes before the first cue. Tap it earlier and the app tells you when Live opens and suggests practicing meanwhile.
Why: going live builds the event's whole audio track up front so it keeps playing with your phone locked in a pocket — and starts holding the screen and audio awake. Doing that hours early wastes battery and memory. If an event's times have all passed (an old draft), Go Live offers to restart it one minute from now.
Adapting a Demo Pack
Want to use a demo pack as a starting point for your own? Here's how.
What's Inside the Zip
demo-the-stillness.zip
├── manifest.json # Describes the pack contents
├── voices/
│ ├── freeze.mp3 # Action cues
│ ├── hold.mp3
│ ├── prep-lead.mp3 # The "Get ready to…" prep lead
│ └── ...
└── events/
└── the-stillness.json # The bundled event script
Swapping Audio Files
- Unzip the demo pack to a folder on your computer.
- Replace any audio file with your own recording, keeping the same filename (or update the manifest to match a new name).
- Audio format: WAV or MP3, any sample rate. Keep files under 500KB each for best performance.
- Re-zip the folder contents (not the folder itself — the files should be at the root of the zip).
- Import your modified zip into the app.
Editing the Manifest
The manifest.json tells the app what cues are in the pack. If you add or remove audio files, update the manifest to match.
Cues are listed as key-value pairs — the key is the cue ID and the value is the file path:
{
"cues": {
"hold": "voices/hold.wav",
"walk": "voices/walk.wav"
}
}
- Key (e.g.
"hold") — The cue identifier. This is what events reference. - Value (e.g.
"voices/hold.wav") — Path to the audio file inside the zip.
Adding Your Own Cues
- Record your audio file.
- Put it in the
voices/folder. - Add an entry to the
cuesobject inmanifest.json. - Reference the cue in your event text — the app matches cue IDs to action text automatically.
Creating Packs from Scratch
Minimum Viable Pack
You only need two things: a manifest.json and at least one audio file.
manifest.json:
{
"id": "my-pack",
"name": "My Custom Pack",
"version": "1.0.0",
"cues": {
"go": "voices/go.wav"
}
}
Folder structure:
my-pack/
├── manifest.json
└── voices/
└── go.wav
Zip it up, import it, and any event action containing "go" will play your audio file instead of the robot voice.
Folder Conventions
| Folder | What goes in it |
|---|---|
audio/ | Clips — music beds, sound effects, longer recordings |
voices/ | Action cues — the main spoken prompts — plus the prep-lead clip |
events/ | Bundled event scripts (JSON format) |
These are conventions, not requirements. The app finds files by the file path in each cue entry, so you could put everything in one folder if you wanted. But following the convention makes packs easier to understand and share.
Recording Tips
- Cues short, clips any length — a spoken cue ("Freeze") works best at 1–3 seconds so it lands on the beat. Clips (music, murmur, full spoken lines) can run as long as you like and may overlap the next step.
- Be clear — Speak at a normal pace, enunciate. This plays through phone speakers in noisy environments.
- Consistent volume — Normalize your recordings so they're all roughly the same loudness.
- WAV or MP3 — Both work. WAV is higher quality, MP3 is smaller. For voice cues, MP3 is fine.
- The prep lead — Record one clip that says just "Get ready to…" and store it under the reserved cue ID
prep-lead. The app glues it to your cue clips to build every advance warning ("Get ready to… freeze"), so one take covers the whole pack.
Bundling Events
- Create your events (using the editor or text format).
- Export them as JSON files.
- Put them in the
events/folder. - Add them to the manifest:
{
"id": "my-pack",
"name": "My Pack",
"version": "1.0.0",
"events": [
{ "file": "events/my-event.json", "name": "My Cool Event" }
],
"cues": {
"go": "voices/go.wav",
"freeze": "voices/freeze.wav"
}
}
When someone imports your pack, the app validates that your audio cues cover all the actions in your bundled events and shows a report.
Validation
When you import a pack, the app checks:
- Is the manifest valid JSON with required fields?
- Do all cue
filepaths point to actual files in the zip? - For bundled events: are all action cues covered by audio files?
If something's missing, you'll see a warning with details about what's not covered. The event will still work — uncovered cues are just read by the robot voice.
Phone in Your Pocket
The realistic live-event posture is phone locked, in a pocket — eyes on your surroundings, hands free. Conductor is built for that: when an event goes live, the app pre-renders every countdown beep, trigger beep, and resource-pack voice cue into one continuous audio track that keeps playing with the screen off.
Tested on iPhone (iOS 18) with the phone locked in a pocket; iOS 26 and longer events are being tested now — help us test.
What keeps playing from a pocket:
- Countdown beeps — the ascending beeps before each action.
- Trigger beeps — the "go" beep at the action moment.
- Resource-pack voice cues — spoken cues from an imported pack.
- Clips — recorded clips on clip-mode steps.
- "Get ready to…" heads-ups — stitched from the pack's
prep-leadclip plus the named cue clips.
Typed cue text is covered too: the app has a built-in robot voice (US English only) that reads the trigger word, "Get ready to…" heads-ups (even when the pack has no prep-lead clip), and clip-mode lines with no recording. Those lines are pre-rendered into the same track, so they are meant to keep playing with the screen locked. The locked-screen playback of that track is what has been tested on iOS 18; nobody has yet tested the robot-voice lines on a locked phone. The robot voice is about being understood, not sounding natural; recordings sound much better.
The one exception: if the robot voice fails to load, the app falls back to your phone's own speech, which only plays while the screen is on. The Sound check tells you if that happens.
For organizers:
- Want the best spoken cues in pockets? Use a resource pack. Recordings (a pack or My Voice) sound much better than the robot voice. Cover your event's cues with recordings and the pocketed experience is fully voiced by real voices.
- No pack? The robot voice and beeps carry the event. Every action still gets its countdown and trigger beeps, and the robot voice reads your cue text — brief participants beforehand on what the sequence means.
- Brief before pockets. Briefing blocks are read on screen before phones are put away — put roles, sequence, and signals there.
On the rare browser that can't pre-render audio, the app warns you when you go live — keep the screen on there.
If Something Changes During an Event
There is no remote stop. Conductor has no server and phones don't talk to each other, so once a phone is live nothing the organizer does can reach it. Only that phone's own Stop button stops it.
Plan for that before the event:
- Agree a stop signal in advance. Pick something everyone can see or hear without looking at a phone, and write it in the briefing's
abortline. - Tell participants what the signal means. For example: stop, and leave at walking pace.
Nobody can clear someone else's phone either. Each person can remove their own drafts, packs and recordings with Clear This Phone at the bottom of the home screen. It doesn't clear browser history or files that were downloaded, and a browser tab, a Home Screen icon and a downloaded copy each keep their own data, so clear each one that was used.
FAQ
How do I join an event someone sent me?
Tap their link, or open Conductor and use Scan QR Code / paste their v1_… code. Full details in Joining an Event.
How do I get an event I built on my computer onto my phone?
Use Beam to a phone from the Share screen and scan it with the phone. See The Desktop → Phone Workflow.
Can I beam an event, or only resource packs?
Both. The animated-QR beam now carries events as well as packs — handy for events too big for a single static QR.
How do I edit an event I already made?
Open it (from a link, code, or a saved draft), then start a new event from it in the editor, or reopen your draft. Conductor auto-saves editor drafts to your device, so a work-in-progress event is waiting under the editor when you come back. Note that an event someone shared with you comes in as finished data — to change it, load it and rebuild the parts you want in the editor.
Why won't Go Live start?
Live opens 20 minutes before the first cue. Earlier than that, the app shows when it opens — use Practice until then. See Going Live.
How do I password-protect an event?
In the editor's share step, turn on encryption and set a password. The event is encrypted with AES-256-GCM and its code gets a v1e_ prefix. Share the code as usual and give the password to participants separately — it never leaves anyone's device. When they open it, they're prompted for the password.
The text is too small — can I make it bigger?
Yes. Use the Text size control (home screen and every event screen). See Making the Text Bigger.
Why did the spoken cues go quiet when I locked my phone?
Beeps, recordings, and the built-in robot voice are all pre-rendered into one track that is meant to keep playing in your pocket. If the robot voice failed to load, your phone's own speech is used instead, and that only plays with the screen on (the Sound check says so). For the best-sounding pocket use, cover your cues with a resource pack. See Phone in Your Pocket.
My iPhone won't vibrate.
iPhones don't support vibration from web apps — haptics work on Android only. Everything else (audio, timing, visuals) works on both.
Do I need internet during the event?
No. Load the app and your event beforehand (over wifi or data). After that it runs offline, and you can still pass it to others phone-to-phone via beam, QR, or a shared file.
Nothing plays at all — what's wrong?
Make sure your ringer/media volume is up, tap the audio toggle so it's on, and (on the first cue) that you've interacted with the page so the browser allows audio. Run Practice first to confirm you hear cues before the real event.
Reference
- Text Format Reference — Complete reference for the text event format (all tags, briefing blocks, config headers).
- Resource Pack Format — Technical specification for resource pack structure and manifest schema.
Tips
- Practice first — Always run through your event in practice mode before the real thing. Use the speed slider to go fast. Go Live opens 20 minutes before the first cue.
- Pocket it — Once you're live, lock the phone and pocket it. Beeps, recordings, and the built-in robot voice are pre-rendered and meant to keep playing. Disable battery saver so the browser isn't killed mid-event.
- Encryption — For private events, enable password protection. Uses AES-256-GCM encryption. The password never leaves the device.
- Offline works — Once you've opened the app in your browser, it caches itself. Works without internet after that.
- Phone-to-phone — Show a QR code on your screen, others scan it with their camera. No internet needed for the transfer.
- Briefing blocks — Add rally points, exit routes, and role assignments that display before the event starts. See the Text Format Reference for details.