-
Notifications
You must be signed in to change notification settings - Fork 0
Bundled Plays
Understudy ships with ten complete plays built in. Open the Script Browser in Author mode and any line is one tap away.
All ten are public-domain texts from Project Gutenberg, restructured as JSON for runtime use. You don't need to type a single line of dialogue to author a working blocking — pick a play, pick a scene, drop the whole thing.
| Play | Author | Translation | Acts | Dialogue lines |
|---|---|---|---|---|
| Hamlet | William Shakespeare | (Folger / Project Gutenberg) | 5 | 1,108 |
| Macbeth | William Shakespeare | (Folger / PG) | 5 | 647 |
| A Midsummer Night's Dream | William Shakespeare | (Folger / PG) | 5 | 484 |
| The Seagull | Anton Chekhov | Constance Garnett | 4 | 627 |
| The Cherry Orchard | Anton Chekhov | Julius West | 4 | 643 |
| Three Sisters | Anton Chekhov | Julius West | 4 | 754 |
| Uncle Vanya | Anton Chekhov | Constance Garnett | 4 | 525 |
| The Importance of Being Earnest | Oscar Wilde | (PG) | 3 | 873 |
| Salomé | Oscar Wilde | Lord Alfred Douglas | 1 | 362 |
| Ghosts | Henrik Ibsen | William Archer | 3 | 1,123 |
That's 7,146 lines of dialogue across three centuries of theatrical canon, ready to attach to your blockings.
The selection isn't random. It's:
- Foundational — Shakespeare and Chekhov anchor most theatre training programs.
- Rangey — comedy (Wilde, Midsummer), tragedy (Macbeth, Ghosts), naturalism (Three Sisters), poetic-symbolic (Salomé). You can stress-test Understudy across very different rhythms.
- Public domain — all ten are out of copyright in every major jurisdiction. We can ship them with the app.
- Translated where needed — the Russian and Norwegian plays use translations that are themselves public domain (Garnett, West, Archer). We chose readable translations over scholarly ones.
In Author mode, tap any mark → Pick from script… → the Script Browser opens.
Top of the dialog:
- Play picker — switch between all ten
- Scene filter — drill down to a specific Act / Scene
- Search — find any character's line by typing part of their name or a phrase

Already-attached lines get a green ✓ on the right. Tap any other line to attach it.
Each scene header in the Script Browser has a Drop scene chip. Tap it, and Understudy:
- Walks every dialogue line in the scene
- Buckets lines by speaker (one mark per speaker turn, max 4 lines per beat)
- Auto-lays out a zig-zag path: 1.2 m forward spacing, 0.8 m alternating lateral offsets
- Yaws each mark towards the next beat
- Drops them all into your blocking with lines pre-populated
A 20-beat scene becomes a walkable 20-mark blocking in under a second.
This is how you go from "I want to rehearse Act I Scene I of Hamlet" to "we're rehearsing Act I Scene I of Hamlet" with no typing. Drop the scene, hit Perform, walk the path.
You can edit, drag, delete after the fact. The auto-layout is a starting point, not a final blocking.
If you're curious about the engineering layer:
- Shakespeare uses
scripts/parse_hamlet.py— handles SCENE-numbered format with line numbers, identifies speakers as ALL-CAPS lines on their own. - Wilde and Chekhov use
scripts/parse_modern.py— flexible ACT/SCENE detection, handles two speaker shapes (CHARACTER.\n dialoguelike Wilde andCHARACTER. dialogueinline like Chekhov). - Salomé uses
scripts/parse_salome_html.py— Wilde's HTML edition has a different structure (<p>CHARACTER</p><p>text</p>) and needs HTML parsing. - Ghosts uses the same modern parser, with stage directions tagged separately so they import as
.notecues instead of.linecues.
All parsed JSON files live in Understudy/Resources/ and ship as part of the app bundle. You can extend the library by:
- Finding a public-domain text on Project Gutenberg
- Running it through one of the parsers (or writing a new one)
- Dropping the resulting JSON into
Resources/and adding it toScripts.allinScript.swift
There's no in-app "import script" feature yet (planned for v0.31). For now:
- Get the text in a clean format (
.txtfrom PG works). - Use one of the parsers in
scripts/as a template. - Output to
Resources/yourplay.jsonmatching the existing JSON shape ({"title": "...", "acts": [{"sceneIndex": 1, "lines": [{"kind": "line", "character": "NAME", "text": "..."}]}]}). - Add
Script.PlayRef(id: "yourplay", title: "Your Play", asset: "yourplay")toScripts.all. - Rebuild — the new play appears in the picker.
We'd love to expand the library. If you parse something, send a PR.
- Beckett (Waiting for Godot, Endgame, Krapp's Last Tape) — still in copyright until 2059 in Europe.
- O'Neill (Long Day's Journey Into Night) — copyright is jurisdiction-specific; check before adding.
- Tennessee Williams, Arthur Miller, August Wilson, Sarah Kane — all in copyright.
- Greek tragedy — Sophocles, Euripides, Aeschylus would be public-domain, but the translations are not always. Most modern translations are still copyrighted.
- Restoration / Restoration comedy — Wycherley, Sheridan, Behn would all work; we just haven't parsed them yet.
If you want a play that's not in the public domain, you'll need to type or import the lines manually for now.
- Author's Guide § Script Browser — using the bundled plays in the editor.
- Quick Start — the 90-second workflow, which uses Hamlet as the demo.