An original two-scene mini-musical, 「달빛 세탁소 · The Moonlight Laundromat」, built through the same reader so every feature can be shown publicly without exposing a production script or needing a PIN
The practice preview now samples each script's own lines (a fixed Season 2 exchange appeared in every reader), and Word export / review-copy titles use the script's own name instead of always 유월
The demo opens in English with an English interface and a welcome screen explaining what the tool is and what to try; the real readers stay Korean-first
Public at /demo.html — it's original text, so it opens without a PIN
Reader polish: songs in the contents, guided practice, consistent controls
Contents now lists every song under its scene (♪ number and title), so you can jump straight to your number
Practice: filters and highlights stay locked with a hint until you pick a part, and the line/song counts are labelled
One selected style across every control, one overlay open at a time, bilingual Export labels with proper icons, and no ⌘P hint on phones
Season 2 settings no longer show the natural/literal switch, which does nothing for its single translation
With 한국어 selected the interface is Korean too: scene numbers (1장), dates, menu headings, search boxes and cast names no longer mix in English; turning English on brings the English labels back
Bigger, higher-contrast text for older readers: nothing in the menus under 13px, and no more tiny uppercase letter-spaced labels
On phones the five toolbar buttons are now equal in size and spacing, each with a Korean label under its icon
The new company mark is now the favicon, home-screen icon, site nav logo and the Season 2 reader's icon; the 유월 readers keep their butterfly
First-run setup in three short steps — text size, your part (every speaking part, ensemble and small roles included), and a hands-on preview of spotlight, line test and line drill. Starts in Korean; rerun it from the 글자 menu
Part picker as large cards for the leads (colour, name, 'lines 237 · songs 50'); smaller parts fold under 그 외 배역
Settings reordered: text size first with 보통/크게/아주 크게 presets, then language and brightness; typeface, line numbers and export sit under 더 보기
The 저장 (export) button is hidden from the toolbar for now; export stays reachable from 글자 › 더 보기
No more coloured stripes down the left edge: spotlight, song boxes, the contents and review marks use a rounded tint instead
The setup preview of line drill now works like the real drill (cue → 확인 → ⭕/❌) instead of repeating line test
The second 10장 is marked 2막, so the two scene 10s are no longer identical
The 24 September PDF draft, parsed into the same reader as Season 1: 13 scenes, ~670 lines of dialogue, 20 songs, every stage direction
Every line, lyric and direction has a first-pass English translation for rehearsal — flag anything wrong with review marks
Songs show their section and singer labels (Verse, Danbi Chorus…) so you can find your part
Line practice, search, surtitle export and review marks all work with the new cast
Opens from /scripts behind the same team PIN
Fixed: a part chosen in 유월 (e.g. "only 유근's lines") carried over to Season 2, where nobody has that name, so the page looked empty. Each show now remembers its own part
Season 2 opens in Korean only by default, instead of inheriting the language toggles from 유월
Fixed the toolbar breaking into three lines under the long title: the title now truncates to one line and button labels never wrap
Phone-first intro: keyboard shortcuts are hidden on touch screens and replaced by a tip to open it on a computer for PDF/surtitle export and the wide two-column view; buttons are described by their icons, which is all a phone shows
Mobile polish, and a PIN field phones can actually type into
The PIN field opened a number pad on phones, but the team PIN has letters and symbols. It now opens the full keyboard, with no auto-capitalising or autocorrect
Show/hide toggle on the PIN; a wrong attempt now keeps and selects what you typed instead of wiping it, so a one-character typo is a one-character fix
Pinch-zoom was disabled site-wide (an accessibility failure on Android); it works again, and inputs are 16px so iOS doesn't jump-zoom into them
The unlock page's browser tab said “Musical 2026 — Schedule” even when unlocking the script
Headlines break evenly (no lone “the” on its own line), the Reader link shows in the phone nav, and each script card is tappable as a whole
On phones each changelog entry puts version, date and area on one line; the changelog's Reader link now goes to the version chooser like everywhere else
Tapping a cell used to insert a banner above the table, shoving every row down so the next tap landed on the wrong person. Unsaved state now lives in the save bar, with a Discard button
The role picker was clipped by its cell and effectively invisible; it now opens fully, and the 8px dot has a thumb-sized target
After 8pm Toronto time the “today” column jumped to next week (a UTC date bug)
The next rehearsal scrolls into view clear of the name column; date headers lead with a large day number and mark the month
A failed save keeps your name and reason; system alert/prompt dialogs are replaced by in-app toasts and an inline name field for reverts
Switching department tabs with unsaved edits now asks before discarding them
Every dialog is one bottom-sheet component: Escape/backdrop to close, home-indicator padding, 44px controls; emoji icons replaced with one icon set
Light-theme and large-text users no longer see a flash of the dark default on every load
A review sheet for the revision, and a changelog that can't drift
The revision finally has its own review sheet. Until now only the frozen full script had one, so the version actually being worked on was the one you could not review offline
Both sheets are keyed by the permanent line ids, so a note like “3-2/017 is wrong” lands on the same line for everyone
Filled a release that was never logged and corrected four release dates that were 11 days off from the commits that shipped them
Shipping user-facing code without a changelog entry now fails the build — the log of record is enforced rather than merely intended
168 tests, written around the bugs this project has actually had rather than around the code
Four lines of Korean stage direction were being projected onto the surtitle wall; they are gone, along with staging notes inside song blocks
Any lyric whose English ended in a colon was mistaken for a singer label, dropped from the cue sheet, and corrupted the speaker for every cue after it
One stray period on a song's end marker silently deleted the entire song and everything after it; markers now tolerate it, and a genuinely unclosed song stops the build
A speaker written with an ASCII hyphen was being merged into the previous speaker's line, misattributed with no warning
A refused build no longer leaves its output file half-updated
Added tests that execute the PIN check itself: an auth bypass granting every gated zone to anyone with a cookie previously passed all 148 tests, lint and typecheck
The system layer: one manifest, one build command, one control plane
The 276-page PDF of the complete script was downloadable with no PIN — now gated. It was registered in none of the three places artifacts had to be listed
One manifest now decides what we serve: add a file to public/ without declaring it and the build fails, so the leak that happened twice cannot happen again
npm run script:build runs all six pipeline steps in dependency order; the review CSV had gone two rows stale because one step was never re-run
Revision line ids are now permanent: inserting a line used to shift every id below it, silently re-pointing review marks and surtitle cues
An untranslated line now stops the build instead of quietly rendering Korean in the English column
Filled in English names for 12 characters that were still rendering in Korean
New owner-only /backstage: which zones are currently open, translation coverage, artifact registration and build freshness — every figure computed, never typed
Two handover runbooks — translation & script edits, schedule & attendance — written for someone who has not read the codebase
A documentation set for new contributors, including a change-impact map of what breaks what, checked so its file paths cannot rot
A projection-ready cue sheet: a blank line is a slide break, so pasting into PowerPoint, Keynote, ProPresenter or OpenLP arrives already grouped — no more chunking by hand
The speaker is named whenever it changes, so attribution survives the grouping — the problem that started this
Every cue carries its permanent line id, so anyone can say “cue 0143 / 3-2/017” and the whole team lands on the same line
Long speeches split at sentence boundaries, with a choice of cue length (standard ~150 chars, or short ~90 for smaller screens)
Acting notes and stage directions are excluded — instructions to the actor never reach the audience's screen
Optionally carries the Korean under each cue so the operator can follow along
The revision was rebuilt from the latest pasted draft rather than the earlier document
Note: this version no longer contains the final reunion scene — it ends at 10-1. That was in the draft we were given, not an error. The earlier version is still recoverable from git if it should come back
Yuwol is male: the English now says he/him throughout. Korean marks no gender, so two of Yuhwa's lines had been translated as 'save her'
영아 and 아그네스 are the same person under two names in the script; they now map to one role
Parenthetical acting notes left in the English dialogue have been removed