Penova 1.2.0
4 May 2026 · macOS 14+
Penova 1.2.0 is the biggest feature release since launch. Six new headline
surfaces — the Command Palette, a one-click
Save Revision sheet over the full WGA colour
sequence, the Beat Board with slidable structure
overlays (Field 3-Act / Save the Cat / Hero's Journey), the
Voiced Table Read on AVSpeech, an inspector
Style Check that flags adverbs / clichés /
passive voice, and a Sprint timer in the toolbar.
Plus first-class project rename / archive / trash
on Mac, which the app shipped without.
Headline features
⌘K Command Palette
- Hit ⌘K anywhere in the app to summon a Linear /
Raycast-style modal. Type three letters to find any command —
rename a character, save a revision, switch view modes, lock
the script, jump to search, generate sides for a character.
- Sub-sequence fuzzy matching with start, word-boundary, and
consecutive-character bonuses (the same flavour Sublime Text
and VS Code use). The result you want is usually the first one.
- Eleven starter commands wired up at launch — the same actions
your menu bar already exposes, now reachable by typing.
One-click Save Revision (⌥⌘R)
- An explicit Save Revision sheet replaces the
silent save-on-shortcut path. Shows the next colour with the WGA
paper-stock swatch, today's date, the round number, and an optional
note field.
- Auto-advances through the full WGA sequence — White → Blue →
Pink → Yellow → Green → Goldenrod → Buff → Salmon → Cherry → Tan
→ Ivory → Double White, then wraps. Override the colour pick if
you want to jump.
- Round number tracks independently of colour, so "Round #14" is
always meaningful even after the colour wraps.
- Each revision snapshots the project as a Fountain string —
diff-able, restorable, archive-friendly.
Beat Board with structure overlays
- The Index Cards view (⌘2 / View → Index Cards) now renders
scenes grouped by beat under a section rail across the top.
- Toggle the structure: Penova (the 6-beat
default) / Field 3-Act / Save the Cat
(15 beats) / Hero's Journey (12 beats). Same
scenes, different scaffolding — best-fit translation of your
beat assignments under each model.
- Empty beats render a dashed-border placeholder telling the
writer what's missing — instant feedback that your "Refusal of
the Call" needs a scene.
- Coverage pill shows what percentage of the active overlay's
beats have at least one scene mapped to them.
Voiced Table Read (⌥⌘P)
- Hit ⌥⌘P on any scene. The cream paper page renders
the scene with a NOW-line halo on the line being read; auto-
scrolls as it advances.
- Per-character voice assignment from a curated catalogue —
Vihaan, Aanya, Saraswati, Kabir, Meera, Kai, Rohan, Narrator.
Auto-assigned by name + gender heuristic on first open;
overridable in the cast panel.
- Audio plays via Apple's on-device speech engine — no network,
no API key, free. Pace, listen-options (action lines / parens /
auto-scroll) configurable.
- Premium voices (much more natural neural-trained voices) are
a one-time download from System Settings →
Accessibility → Spoken Content. Penova picks the best installed
quality automatically — no setting to flip.
- Curated voice mapping per preset means the same speaker gets
the same timbre across sessions; pitch jitter and breath pauses
on em-dash / ellipsis / question-mark make the delivery less
metronome-flat.
Style check in the inspector
- The right-hand inspector now surfaces a Style
panel for each scene with the marks the writer might want to fix:
— adverbs (
quickly, quietly),
clichés (we see, begins to, a beat),
passive voice (is being, was watched).
- Quiet, never blocking. Renders as small cards with a quoted
excerpt + a 2px coloured strip on the leading edge so a clean
scene shows a clean inspector.
- Curated stop-list keeps "ugly" / "family" / "fly" off the
adverb list. Cliché matcher uses word-boundary anchoring so
"begins" mid-sentence isn't flagged.
Sprint timer in the toolbar
- Toolbar pill — click to start a focused-writing sprint.
Shows live elapsed time and word count vs goal
(
17:42 · 487 / 1000).
- Default 25 minutes / 1000 words. Click the chip again to end
the session.
Project management on Mac
The Mac app shipped without a way to rename, archive, or delete
projects. 1.2.0 closes that gap, mirroring the iOS Scripts tab pattern.
- Right-click any project in the sidebar →
context menu with Rename… · Archive · Move to Trash.
- Archived projects render dimmed at 0.55 opacity; trashed
projects soft-delete with a confirm alert and disappear from the
sidebar.
- A "Show archived & trash" toggle at the sidebar footer reveals
them when needed; Restore brings them back.
- "Delete forever…" on a trashed project is a second confirm step
before the row is permanently removed from the store.
- If you trash the project owning the selected scene, the editor
auto-snaps to a sibling project's scene so you don't see a stale
selection.
Under the hood
- StyleCheckService — pure-logic scanner in
PenovaKit. 30 unit tests pinning adverb / cliché / passive
detection contracts.
- CommandRegistry + FuzzyMatcher — the palette's
foundation. 25 tests for the matcher and registry.
- SaveRevisionService — orchestrates the
snapshot → row → colour-advance flow. 20 tests including a
five-save round-trip with distinct content edits between saves.
- StructureOverlay + StructureMapper — pure data.
21 tests covering beat counts, midpoint anchors, page-anchor
clamping, and best-fit Penova→other-overlay translation.
- Voice catalogue + assignment + table-read engine
— 26 tests for the catalogue lookup, assignment service CRUD,
queue construction, and settings respected.
- End-to-end XCUITest walks every new surface in
one deterministic run — Sprint chip, Command Palette, Save
Revision, Beat Board, Search, Title Page, Export. Green on every
integration commit.
Two real bugs caught + fixed before ship
- ⌘K didn't open the palette in some launches.
The hidden Button lived in its own
.background()
modifier that a later one was masking. Fixed by consolidating
all the keyboard shortcuts into one responder block.
- ESC didn't always dismiss the palette.
.onKeyPress(.escape) was on the TextField only — if
the field hadn't won focus, ESC was a no-op. Fixed with a window-
level cancelAction button.
Numbers
- 13 PRs shipped (12 features + 1 fixup)
- ~150 new unit tests, plus a comprehensive XCUITest
- 540 tests total (526 iOS + 14 Mac UI), all green
- Zero regressions in the existing suites
- One additive SwiftData migration (new
VoiceAssignment table) — automatic, no MigrationPlan
Feedback or bug reports — rudra.ptp.singh@gmail.com
· +91 99563 40651
· WhatsApp.