2Reply app icon

2Reply

The scene partner that plays every part but yours.

An Android rehearsal app for theatrical plays. Import a fully-voiced .m4b recording and its timed script — pick your characters, and their lines go silent for you to speak while the rest of the cast answers, right on cue.

v1.0 Play Store — coming soon Android 13+ Kotlin · Jetpack Compose 100% on-device · no internet permission
v1.0 · 25 Jul 2026

What's new

The first release — everything below is new.

💬

Your script as a conversation

The play renders like a chat: other characters on the left, your lines as "me" bubbles on the right, stage directions as system notes, scene titles as headers. The active line highlights and scrolls along with the audio.

🔇

Rehearsal mute

Playback volume drops to zero exactly during your characters' lines and comes back after — the play stays on schedule while you deliver the line. Works from the lock screen with the app in the background.

🎭

One role or several

Pick any number of characters from the cast list (sorted by line count). All of their lines mute and flip to your side of the chat — rehearse two parts, or practice as a duo on one device.

🙈

Text-hiding drills

Two toggles: hide your lines to test memorization, or hide everyone else's to train reacting to the spoken cue. Hidden bubbles keep the name and a duration-scaled gauge, like a voice message.

⏱️

Per-line timing gauges

Every line carries a small progress bar with its spoken duration — full for what's played, filling live on the current line. During your muted lines it doubles as a pacing guide.

⏭️

Scene-by-scene transport

Previous / next scene buttons in the app and on the media notification — the meaningful jump unit when rehearsing, not an arbitrary ±30 seconds. Tap any bubble to jump straight to that line.

See the full changelog for every detail.

Rehearsal modes

Two independent toggles on the training screen change what you're practicing. Hidden lines keep the speaker's name and their timing gauge — you always know who speaks and for how long.

Your linesOthers' linesYou're practicing
text showntext shown Reading along — the default. Follow the script, speak on cue over your muted lines.
text shownhidden Ear training — no reading ahead; catch your cue from the spoken audio alone.
hiddentext shown Memorization — can you recall the line with only its name tag and timing bar?
hiddenhidden Off-book run — a pure audio-and-timing pass, the closest thing to being on stage.

The mute engine ticks against the script's timing windows with deadline-aware precision — mute edges land inside the recording's natural inter-line pauses. Your device volume is never touched; only the player's own gain.

What 2Reply does

A focused, offline rehearsal player — no accounts, no network, no tracking.

📥

Import

  • A play = a fully-voiced .m4b recording + a timed play.json script.
  • Two-step picker from any SAF source; both files are copied into private storage.
  • The script is validated first, and a duration cross-check catches mismatched pairs.
📚

Library

  • Cover art (from the m4b), duration, and listening progress per play.
  • Shows which roles you're rehearsing; delete with confirmation.
  • Reopens your last play — paused, where you left it — on launch.
🗨️

Training screen

  • Chat-style script with speaker names, acting directions, staging notes, and scene headers.
  • Auto-follow keeps the active line in view; grab the list to pause it, tap the target button to snap back.
  • Tap any bubble to seek there. A "Your line — speak now" banner shows while muted.
▶️

Player

  • Foreground media session — background playback, lock-screen controls.
  • Mini-player on every screen: play/pause and previous / next scene.
  • Position auto-saves every 5 s and on pause; roles and drill settings are remembered.
  • The screen stays awake while playing — hands-free through a whole scene.

The play format

2Reply plays a pair of files produced by the LN toolchain (or anything that writes the same shape):

recording.m4b audio

A fully-voiced recording of the play — every character spoken, one chapter per scene. Title and cover art are read from the file's metadata; the embedded cover becomes the library artwork.

play.json timing

The script with timestamps: scenes, and per entry a start/end in seconds, a type (dialogue, staging, cue), the speaker, the text, an acting direction, and an emotion tag. The script's timings are the source of truth for muting, highlighting, and scene skips — they must match the recording (import rejects pairs that differ by more than 30 seconds of total duration).

Requirements & Limitations

2Reply is single-device, offline software. Here's exactly what that means.

📱

Requirements

  • Android 13 or newer (minSdk 33, targetSdk 36).
  • A file manager or cloud app exposing a DocumentsProvider for your .m4b and play.json files.

Build it yourself

Until the Play Store release, source is the way in. One command:

JDK 21 required. From the project root:

$ ./gradlew assembleDebug

The debug APK lands in app/build/outputs/apk/debug/. Install it with adb install.

2Reply shares its architecture and house style with ln-reader — same stack, same patterns, documented in the repo's NEW_APP_SPEC.md.

Browse the source →