Skip to content

Releases: antoncl/local-writing-app

v1.1.0 — read aloud, the style builder, and steadier reviews

Choose a tag to compare

@github-actions github-actions released this 29 Oct 14:13
8f415ce

40 issues closed, 40 PRs merged since v1.0.1. The headline additions are read aloud in the prose editor and a style builder, which turns pasted sample prose into a Style note the prose prompts follow. Line edits, review diffs and the chat are also more reliable.

After you upgrade

  • Expand, Describe and Rephrase (#2565). If you cloned Expand, Describe or Rephrase from the Library before this release, your copy keeps the old template. It won't see the surrounding prose, and your Expand copy has no length choice. To get the new behaviour:

    • if you never changed your copy, delete it and clone the prompt again from the Library;
    • if you did change it, clone the new version and copy your changes across.

    Prompts used straight from the Library need nothing.

New

  • Read aloud (#2570, #2572, #2574). The prose editor can read your scene aloud, so you can proof it by ear. While it reads, you can flag a sentence as a TODO. Editing the text pauses the reading, and resuming reads on from the cursor.
  • The style builder (#2627, #2636, #2639). Build a style note turns sample prose you paste in into a Style note. The note describes how that prose reads, including its paragraph structure, without borrowing its story. A new prose guide explains how to use it.
  • A voice in two parts (#2625). A character's voice now has two parts, how they narrate and how they speak, and the prose prompts use each in the right place.
  • Prose craft in every prose built-in (#2619, #2629). The built-in prose prompts share one set of craft rules, and the stock phrases those rules ban come from reading real drafts.
  • Expand, Describe and Rephrase see the passage in place (#2565). They now read the surrounding prose, and Expand lets you choose a length.
  • Line edits (#2561, #2563). Alt+A, Alt+S and Alt+B show the current text, the proposed text, or both. When a reply suggests alternative routes, they become one note instead of edits for the first route only.
  • Chat names what changed (#2586). A chat turn names the entries that changed since the previous turn, both to the model and on the turn itself.

Fixes

  • Search & replace reaches metadata (#2641). Matches in a scene's summary, beats and follow-ups can now be replaced, not only found.
  • Pending edits are saved before any AI call (#2587, #2596, #2598). Sending a chat message, or starting any other model call, saves the editor's pending edits first, so the model never reads the previous saved version.
  • A chat sees the scene as last saved (#2584). It used to freeze the scene text at the first send.
  • Prompt pins and tag scopes apply everywhere (#2593). A prompt's preferred assistant and assistant tags now apply wherever you launch it, not only from the in-chat prompt picker.
  • Review diffs (#2591, #2599, #2600). Removing one paragraph no longer misaligns every paragraph after it. Punctuation is diffed as its own token. A beat list is reviewed as rows, with the old beat above its rewrite.
  • Prompts:
    • A blank optional input arrives empty instead of crashing the render (#2578).
    • Scene brief reads the current scene, and the preview no longer reports a bare undefined name as a missing input (#2634).
    • Draft scene keeps to one moment and one point of view (#2604), and uses a character's signature tics sparingly (#2580).
  • Editor:
    • A prompt run on a long selection shows its progress where you are looking (#2582).
    • Text pasted from inside a code block in Chrome or Vivaldi no longer lands as a code block (#2568).
    • A lore name or alias made only of dashes no longer freezes the editor or matches everywhere (#2567).
  • Layout: opening a pane whose home group is closed no longer adds an extra column (#2588).
  • Windows: a harmless connection-reset traceback no longer fills the backend log (#2576).

Security

  • The frontend's build and test tools are updated to clear seven GitHub security alerts in vite and vitest. happy-dom is updated for a newer advisory (#2643). These tools are not part of the app you install.

For contributors

  • Measuring prose quality. ADR-0101 decides who sets how the prose reads. A measurement harness under scripts/benchmark/prose/ tests the prompts with a runner, a model judge, a calibration sheet, blind pairs and a builder test (#2611, #2613, #2615, #2617, #2621, #2623).
  • CI skips the gate jobs for areas a PR doesn't touch (#2606). git push and gh pr create are gated on a recorded code review (#2610).
  • Backend dependencies are relocked for this release.

Nightly (bleeding edge)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 30 Oct 02:19
bd6cc67

The latest build from master. Unsigned; macOS is experimental.

v1.0.1 — guides on the web, and a valid template never 500s the preview

Choose a tag to compare

@github-actions github-actions released this 19 Oct 09:28
c163803

7 issues closed, 9 PRs merged since v1.0.0. A small release: one bug fix in the prompt preview, and the guides are now easier to find, both before you install and before you open a project.

After you upgrade

  • Prompt summaries (#2546). Prompts you cloned from the Library before this release keep their own copy, which has no summary, so they show no description line. To get one, open your copy and fill in its Summary field. If you never changed your copy, you can instead delete it and clone the prompt again from the Library.

Fixes

  • A valid template no longer breaks the preview (#2552, #2554). A template like {{ previous_scene(e) | json }} used to make the preview fail with a server error. Two changes fix this:

    • | json can now print an entry: you get everything a prompt can read from it (id, title, entry_type, metadata, body). An entry referenced inside another shows as just its id and title.
    • Any error that happens while a template renders now shows in the preview pane with the line it came from, instead of failing the request.

    Tip: {{ scene | json }} in the preview is a quick way to see what a scene offers.

  • Guides open before any project is open (#2558, #2559). Help → Guides used to be disabled until a project was open. It now works straight away, and the no-project screen has a Read the Getting started guide button.

Prompts

  • Every prompt carries a one-line summary of its purpose (#2546, #2547). It shows as the detail line in the Prompts pane and as a tooltip in the prompt menus. The built-in Library prompts all have one; see After you upgrade for prompts you cloned earlier.
  • The prompt guides are rewritten (#2548, #2549).
    • The Prompt reference was partly broken: 20 helpers rendered as raw text. It is now a one-screen at a glance layer grouped by what you're trying to do, plus one entry per item with an example and things to watch out for.
    • Writing prompts now builds up from a one-line prompt to a complete one.
    • Three new diagrams: how a template becomes messages, the three kinds of call, and what "as of this scene" means.
    • Several wrong examples are corrected; for example, entry() takes a picker input or an id, not a title.

Guides and website

  • The guides are on the website (#2556, #2557). All 12 guides and the prompt reference are at antoncl.github.io/local-writing-app/guides, the same pages the app shows. They describe the latest release, and each new release republishes them.

  • The README and website are up to date for 1.0 (#2553, #2555). Fixed:

    • the project-folder listing;
    • how schema inheritance works;
    • the headless Linux port setting. export LWA_PORT doesn't survive sudo; use LWA_PORT=9000 sudo -E ./install-server.sh.

    The site now also covers revising (lore checks and line edits), roleplay and in-app updates.

For contributors

  • The developer pages under docs/prompts/ are checked against the code. The hand-copied API field tables are replaced by a pointer to the backend's generated OpenAPI schema (#2550, #2551).
  • CLAUDE.md, the code standards and the release runbook are refreshed after 1.0 (#2545).

v1.0.0 — the stable release

Choose a tag to compare

@github-actions github-actions released this 16 Oct 17:17
8bd5dec

285 issues closed, 278 PRs merged since v0.9.6. The project format has migrated forward since 0.9.5, and 1.0 makes that a commitment: your projects survive upgrades.

After you upgrade

  • Cloned built-in prompts (#2414). If you cloned "Summarize scene", "Relevant manuscript and plot" or "Impersonate" from the Library, your copy's scene picker shows "No pickable items". The Library originals are fixed, but your copy is yours and keeps the old setting. Two ways to fix it:

    • Open your copy, edit the affected input (Scene / Scenes & cards / Read as of scene), and tick Scenes under its sources.
    • If you never changed your copy, delete it and clone the prompt again from the Library.

    Prompts used straight from the Library need nothing.

Writing & editor

  • Draft scene and Continue prompts:
    • Draft scene writes a first draft from the scene's brief, which includes every field your schema gives a scene (#2421, #2511).
    • Continue carries on from the cursor, with optional direction (#2422).
    • Mutation sets placed in the scene are part of the brief, and their pills move to the draft on accept (#2424, #2456, #2457).
  • Lore check and flags from any reply:
    • Notes sit at the exact words of your prose that contradict a Lore entry, read as of that point in the story.
    • One review holds both line edits and notes. Line edits look like diffs, with the older text first.
    • Flags can become TODOs.
    • A built-in Revising layout ships. (#2488–#2492, #2502–#2534)
  • Quote links jump from a chat's quotes to the prose, side by side (#2498).
  • Details rail:
    • Fields read at rest and edit on demand.
    • Empty fields fold into one line.
    • Peek cards on references; collapse state persists. (#2006, #2007, #2011, #2060, #2438)
  • Long text fields render as headed sections of the document, with an item spine for repeating sections and keyboard-reachable list items (#2009, #2047, #2051, #2052, #2054).
  • Tabs:
    • Tab-strip overflow is reachable by wheel, arrows, or an open-tabs menu.
    • The active body tab and scroll position restore on reopen. (#2313, #2326, #2013)
  • New writing setting: a blank line between paragraphs, independent of first-line indent (#2526).
  • Fixes:
    • Copy-paste keeps mutation pills and character mentions (#2235).
    • Discarding a suggestion leaves no blank lines (#2431).
    • Inline inserts no longer glue onto the previous word (#2459).
    • Finalizing a roleplay keeps mutation pills (#2435).

AI & assistants

  • Change propagation:
    • After you change an entry, Propagate finds what depends on it and makes review items.
    • Propose opens a conversation on a dependent, with the change as the first message. (#2115–#2125)
  • Lore summation and snapshots:
    • use(node, snapshot=id) reads a node as it was at a snapshot.
    • Snapshots now cover Lore base files and prompts. (#2151, #2162, #1983, #1990)
  • The Context door shows which auto-added Lore chips the budget left out and which were kept out by "Named only" reach, and tells the two apart at a glance (#2206, #2212, #2341).
  • Prompts can read a node's open TODOs with todos(x) (#2506).
  • Context picker: pick or unpick every entry in a Lore group at once, and a saved view's members follow the view's own grouping (#2305, #2329).
  • Ollama:
    • Commit replies are constrained to the patch schema.
    • Silently truncated prompts are flagged.
    • No reload thrash, and local models show as free. (#2199, #2207, #2203, #2343)
  • Provider API keys live in the OS secret store, not plaintext config (#2287).
  • Fixes:
    • Prompts no longer see app markers in scene bodies (#2427).
    • Impersonate sends the scene's character fields (#2298).
    • Long replies no longer freeze the transcript (#2294).
    • The Context door shows the text locked at first send (#2300).

Lore & tags

  • Entry types can nominate summary fields, which feed list rows, peek cards and AI reference expansion (#2008).
  • Relationship items in reference lists:
    • Edit their text and members, and scrub to a stop.
    • Deleting one warns about orphans. (#2070–#2075, #2221, #2222)
  • Remove a field from just one entry type (#2280).

Mutation sets & plotting

  • Mutation sets:
    • A mutation set is a node, and the scene holds an anchor to it.
    • Entry deletes and schema changes reach mutation sets.
    • Each state has a home pane. (#2229–#2233)
  • Plot decks: one card per scene, written cards show their scene, planned cards, and realizing a deck.
  • Plot board fixes: new cards no longer drift (#2348), and the picker reaches cards without a plotline (#2439).

Views

  • The view designer's compact filter summary shows labels, not raw ids (#2321).

Packaging & updates

  • In-app updates:
    • Apply an update in-app on Windows, Linux AppImage and macOS (macOS is experimental and verified from code only) (#2083, #2093–#2095).
    • Headless installs get a CLI updater (#2088, #2092).
  • A frozen-build chat-send 500 is fixed (#2096).
  • Builds are still unsigned. The LAN bind has no authentication, so use it only on a trusted network.

Fixes (selection)

  • Saving an override on an inherited entry no longer silently drops a body or title change (#2132, #2185, #2189).
  • Accept-all on a review no longer loops on a conflict (#2285).
  • Review no longer marks italics, NBSP or identical values as changed (#2250, #2265, #2267).
  • Deleting or renaming a field leaves no dangling schema membership (#2276).

Internals

  • Format: level lists name, type and number manuscript containers (#2176).
  • Code health:
    • Oversized source files split to stay under the line cap (#2126, #2129, #2528).
    • Dependencies refreshed for the release, clearing every open security advisory (#2543).

v0.9.6

Choose a tag to compare

@github-actions github-actions released this 15 Sep 18:58
0c56f34

v0.9.6

An interim hardening-plus-features release on the road to 1.0 — a mid-development checkpoint that turns the app into a real installable desktop product, gives the AI a spending conscience, and closes a long list of save-conflict, cost-accounting, and provider bugs that could bite a working writer.

≈331 PRs merged since v0.9.5 (144 features, 99 fixes; the remainder docs, refactors, and CI).

Highlights

  • The app is now something you install, not something you run from a terminal. Real installers land for Windows (#1359), Linux AppImage (#1360), and an experimental macOS .dmg (#1361); launching opens your browser for you (#1366), the server quits when the last tab closes (#1379), and there's an in-app auto-update check with a release channel (#1363, #1364).
  • The AI now stays inside a lore budget and tells you what it left out. Inferred Lore selection fits a per-turn token budget, and the send reports what didn't make it — drillable, per Entry, down to the exact XML the model saw (ADR-0086, #1886, #1889). Declared picks are never silently dropped.
  • Fixed: on OpenRouter's auto-cache routes, your Lore was never actually reaching the model. A severe context bug where every system block but the base was dropped (#1547) — if your AI felt like it had amnesia about your world, this was why.
  • Character arcs are now first-class plotting. An arc is a plot subtype with its own board, arc bands, and event/change beats, and it feeds the AI's plot context (ADR-0080, #1760, #1776, #1780, #1786).
  • Narration and POV cascade down your Manuscript Structure. Set point-of-view, tense, and narration mode once and let acts and chapters inherit it per field, with a clear inherited/overridden marker and a freeze onto each Scene at first prose (ADR-0079, #1715, #1723, #1739).
  • Search got fast and gained find-and-replace. Search-as-you-type with match-case and whole-word, served from a corpus the node index keeps warm, plus a conflict-checked replace that writes through each node's own save (ADR-0085, #1848, #1849, #1851).
  • Changed-on-disk conflicts are now recoverable instead of a lost edit. A three-way prose merge, a structured field merge, and a diff preview when a file changed underneath you (ADR-0077, #1631, #1636, #1639), including silent recovery of a lost-response save (#1624, #1968).
  • Tags are real nodes you can rename, merge, and colour — merging redirects old references instead of orphaning them (ADR-0082, #1789, #1803, #1804).

New features

AI, context & cost

  • Inferred Lore fits a per-turn budget; the Context door lists what was trimmed, drillable to each Entry's XML (ADR-0086, #1886, #1889); a direct mention re-journals an Entry known only through a hop (#1891).
  • Opt-in conversation-history window (ai_history_budget_tokens), with the fit reported on the transcript meta line (#1963, #1964).
  • Ollama gets a native /api/chat transport with a sized context window discovered from the model, and saner default reply length (#1960, #1961, #1962).
  • Model pricing from OpenRouter's public feed, an author-set price fill for unlisted models, a refresh button, and no-price warnings (ADR-0083, #1825, #1826, #1829, #1830).
  • Per-model cache strategy replaces the old caching_style, with the plan surfaced in preview (ADR-0084, #1835, #1837).
  • Project-wide AI spend rollup with a dedicated AI Spend pane, node-keyed rows, and server-side turn recording (#1707, #1800, #1880).
  • Implicit-context detection scans the Scene body, all long-text fields, and the first-turn rendered prompt (#1496, #1504).
  • Default max_tokens raised to 32768, clamped to each model's real max output (#1598).
  • The model picker is now a scoped View over the live catalogue, honouring project policy and credentials (ADR-0073, #1392, #1395, #1399).

Chat experience

  • A quiet, single metadata line with per-turn provenance and one cost truth; Context is the one drillable door to what the AI sees (ADR-0076, #1565, #1567).
  • Safer controls: Clear confirms, Send becomes Stop mid-turn, and a locked chip offers a fresh chat (#1571, #1576).
  • Stick-to-bottom transcript scrolling (#1613), and a warning when picked Lore was edited since the AI last saw it (#1648).

Plotting & character arcs

  • Character arc as a plot subtype under a shared plot:thread base, with its own templates, board projection, arc routes and colour, and segmented event/change beats on cards (ADR-0080, #1760, #1763, #1768, #1780).
  • Arc reasoning prompts add a transformation-and-causation lens, and arcs render in the AI plot context (#1786, #1787).
  • Plotlines gained an author-set genre sent to the AI (#1730, #1747).

Narration & POV

  • cascade_fields plumbing so narration resolves down the manuscript tree; POV character exposed on the project; tense inherits like POV mode (ADR-0079, #1715, #1720, #1731, #1739).
  • Resolved narration and an inherited marker surface in the details rail, with persistent override provenance and reset-to-inherited (#1723, #1736).

Tags, details rail & metadata

  • Tags are a tag node kind referenced by id, with create_missing in the picker and merge-as-redirect (ADR-0082, #1789, #1798, #1804).
  • The details rail was rebuilt: scalars read at rest and edit on click one row at a time, long-text reads as prose, list fields fold to a first line plus a +N chip, entity_ref fields render as inline pills, and empty rows recede (#1884: #1888, #1890, #1892, #1897, #1733).
  • Entry-type icons, glyphs, and colour overrides on built-in node types, with co-located metadata marks (#1572, #1645, #1647).

Search & replace

  • /api/search served from a node-index-maintained corpus; search-as-you-type with match-case and whole-word; conflict-checked replace routed through each node's own save (ADR-0085, #1848, #1849, #1851). The Search pane moved onto the shared NodeRow substrate (#1608).

Layered projects: schema, types & promotion

  • Promote a Lore Entry, a prompt or style guide, or a staged mutation set up to an ancestor project (#1660, #1666, #1673).
  • Move a metadata field to another inheritance layer, with a warning before moving it nearer (#1670, #1678).
  • Create a type from an inline card with an always-visible "+ New type" (#1661, #1664); filter and group nodes by inheritance layer (#1929).

Prompts

  • Completion for deep reference-chain fields such as scene.pov.<field> (#1615); override an inherited prompt's routing metadata in place (#1740); a Runnable view with a Run affordance (#1434).

Packaging, desktop & onboarding

  • PyInstaller freeze into a runnable binary with a GitHub CD matrix and nightly builds (#1341, #1345, #1347); console-free Windows build (#1755); rotating file logs with an "Open logs folder" button (#1748, #1756).
  • A create-project wizard launches on a fresh install, seeding fields from your browser locale and unifying the provider chooser so Ollama is just another provider (#1401, #1416, #1418).

Bug fixes

Context reaching the model

  • OpenRouter auto-cache routes dropped every system block but the base, so Lore never reached the model (#1547).
  • Commit turns sent unrelated picks as Lore; now only the chat's own picks go (#1875). The preview popover shows the attached Lore, not just the system prompt (#1550).

Save-conflict recovery (data-loss-adjacent)

  • Silent adoption of a lost-response 409, three-way prose and field merges, and a diff preview for changed-on-disk edits (#1624, #1631, #1636, #1639).
  • Recover the review commit from a changed-on-disk 409, stop an unbounded plotline review-commit PUT loop, and close the review overlay when Overwrite resolves the conflict (#1966, #1968, #1971).

Cost accounting

  • Stop double-recording a turn's cost when two persists overlap (#1600); record a chat turn's actual model, not the assistant's static config (#1795); fold deleted-node ledger rows into one aggregated line (#1973).

Provider breakage

  • Anthropic temperature dropped by the SDK 1.x typed param, now sent via extra_body (#1552); OpenAI reasoning models omit temperature (#1610); OpenRouter reasoning-only turns no longer come back blank, and in-band stream errors surface (#1582, #1592); free OpenRouter models are kept instead of dropped (#1387); extended thinking uses adaptive mode on 4.7+/5 models (#1561).

Crashes & freezes

  • A short query could freeze the Search tab (#1869); a duplicate-key crash dropped search results (#1614).

Editor & other

  • Chat Stop now cancels the backend provider call, not just the client fetch (#1599); paste a whole-document markdown code block as prose rather than a fence (#1630); lists serialize clean (#1629); table editing and dark-mode syntax highlighting fixes (#1894, #1713); the assistant roster re-reads on project open (#1879).

Under the hood

Search now rides a warm corpus maintained by the node-index lifecycle (ADR-0085), front matter parses via libyaml's CSafeLoader (#1852), the invocations ledger moved to an append-only CSV (#1802), the implicit-context matcher compiles once per pass (#1512), and backend tests run in parallel by default (#1518). Several monoliths were split — lib/types.ts (#1860), references.py (#1812), helpers.py (#1500), the HTTP client (#1679), plot.py (#1773) — and popover positioning and manuscript traversal were each unified onto one mechanism (#1838, #1710). Dependencies were bumped and pinned: TipTap 2→3 (#1953), FastAPI/Starlette (#1593), vitest 3→4, vulnerable npm transitives (#1867, #1914), and a committed backend lockfile (#1457). CI gained a gate that blocks PRs which don't close their issues (#1420), a Playwright product smoke (#1358), and the removal of the last GRANDFATHERED exemption escape hatch (#1686).

v0.9.5 — the public-release gateway

Choose a tag to compare

@github-actions github-actions released this 23 Aug 15:23
096b2d6

v0.9.5 — the public-release gateway

61 issues closed and 47 PRs merged since v0.9.0. This is the release that makes the app installable and distributable: it can now be packaged, shipped, and kept up to date, alongside a complete in-app guide set and a content-migration framework — the groundwork for real, durable projects.

Packaging & distribution (new — ADR-0072)

The app is now one self-contained server binary that serves its own UI — a desktop shell is optional, and a headless Raspberry Pi is a first-class target.

  • Native installers for every platform: a Windows installer (per-user, no admin), a Linux AppImage, a macOS .dmg (experimental, unsigned), and a Linux server tarball + systemd unit for the headless Pi. (#1354)
  • One process, one origin: the backend serves the built frontend from its own address; a real product entrypoint with a configurable bind. (#1340)
  • GitHub-based distribution & updates: a release build matrix across Windows / macOS / Linux-x64 / Linux-arm64, plus a rolling nightly prerelease. (#1346)
  • Subscribe to updates in-app: a Settings → Updates pane shows your version, lets you pick a Stable or Bleeding edge channel, and checks GitHub for a newer release with a link to it. (#1362)
  • "Where is the app?" solved: launching the installed app opens it in your browser automatically. (#1365)
  • App icon and favicon. (#1357, #1355)

In-app guides (new)

A complete, in-app guide set — no need to leave the app to learn it: Getting started, Lore, Custom fields, Mutations, Views, Plotting, Turning on AI, Writing prompts, Context picker, Roleplay, and a Prompt reference. Guides are deep-linkable, and Getting started is the default landing guide. (#172, #1296, #1295)

Content migrations (new — ADR-0071)

A per-document migration framework: content-format changes migrate a document at a time (not only per-project), including project-owned nodes and overrides, and a behind-version snapshot migrates on restore. This is what lets project data survive format changes past the 0.9.5 gateway. (#366)

Editor & writing surface

  • Prose prompts now honor a scene → project POV/tense inheritance chain. (#1321)
  • A curated built-in field set for a sensible out-of-the-box default (Character / Location / Scene). (#1316)
  • Undo-trail fixes: a TODO toggle and external value pushes are proper undo boundaries. (#694, #691)
  • Keyboard roving-focus for menu popovers; the full-width input rule no longer swallows checkboxes/radios. (#838, #463)
  • KaTeX lazy-loads, off the first-load path. (#542)

AI & chat

  • manual_only lore no longer leaks into context via structural/entity expansion, and a manual pick can't attach a "never" entry. (#1024, #1025)
  • Cache-write billing corrected to the 1-hour 2× premium. (#814)
  • Chat commit write-backs no longer fire when the chat switched mid-flight; dead TTL/roster code removed. (#986, #815)

Internals & performance

  • Faster purge (front-matter-only decisions), lighter plot seed-from-manuscript, and a self-enforcing schema/axis refactor. (#823, #747, #734)
  • A thin Playwright E2E smoke boots the assembled product and proves the frontend↔backend wiring; a --self-check frozen smoke catches freeze-only breaks. (#1352, #1350)

Unsigned builds; macOS is experimental (Gatekeeper will warn — right-click → Open). The LAN/Pi bind has no authentication: use it only on a trusted private network.

v0.9.0 — Hardening & debt paydown

Choose a tag to compare

@antoncl antoncl released this 22 Aug 09:43
986f0f5

51 issues closed, 197 PRs since v0.8.0.

This release pairs a substantial reliability and internal-quality paydown with two
headline features: private interiority for roleplay, and a top-to-bottom overhaul of
the prompt-authoring surface.

Roleplay: private interiority (ADR-0070)

Characters can now carry an inner life that stays hidden until you choose to reveal it.

  • A private interiority channel — a marker keeps a character's inner turns out of
    other characters' context, delivered as a separate part of the turn (#1289).
  • Reveal affordance — a per-beat glyph plus a shell toggle to surface interiority on
    demand (#1297).
  • Finalize/cleanup POV pass — a destructive pass that resolves interiority into the
    finished scene (#1302).
  • Refreshed roleplay how-to and ADR-0070 docs; fixed three /roleplay defects — picker
    click, toolbar occlusion, name resolution.

Prompt authoring overhaul

Writing and editing prompts is dramatically more discoverable and better guarded.

  • In-app guide viewer — a dedicated pane for task-oriented prompt guides, with safe
    link handling (#1271, #1285); a new "Writing prompts" guide (#1272).
  • Jinja code-completion — vocabulary, inputs, and schema field-name completion, live
    inside if/for/set tags; the "?" now points to completion and the guide rather
    than a static cheatsheet (#30, #1273).
  • Drift gates — reference.md is generated from the registered vocabulary and CI
    fails if they diverge, now including render-context variables (#1270, #1280).
  • Field contracts (ADR-0067) — a committing prompt declares its fields inline; the
    contract is read back at commit, empty contracts fail loudly, and node-writing
    built-ins were made exemplary.
  • Snippets carry their fields (ADR-0061/0062) — effective-inputs resolver, dependency
    alerts ("used by N prompts / M chats"), and detachable Edit / Preview / Setup sub-panes.
  • Prompt language redesign (ADR-0060/0065) — use(node) selection, uniform
    node.<field> access, provider-neutral volatility ordering, and output handlers
    replacing the output.kind branch.

Editor & writing experience

  • Scene-break affordance with quiet centered styling (#1239).
  • Reading-measure prose column — capped and centered for comfortable line length
    (#1254); quiet live word-count chip for scenes (#1237).
  • Detachable Details rail — bottom-dockable with per-project persistence; the mutation
    scrubber travels with it (#1246, #1249, #1258).
  • Unified selection + table toolbars into one context menu, opening toward the room
    (#1223, #1227); built-in revise prompts in the selection menu (#1231).
  • long_text editor now reads like the body editor (#546).
  • Drafts tree — aligned names, decoupled collapse from open, larger caret (#484);
    fixed prose-editor undo bleeding across document switches (#368).

Autosave & durability

  • fsync on atomic writes so an acknowledged save survives a power cut (#480).
  • Autosave ceiling lowered to 10s as the crash-durability guarantee; prose-only scene
    saves skip the structure rewrite (#455).
  • Flush dirty panes on tab/window close — no more losing the last few seconds of
    typing (#369).
  • Failed autosave now classifies into bounded retry / sticky badge / overwrite prompt
    instead of silently going dead (#457); a pane releases its document claim when a load
    fails, so reopening works (#347).

AI & chat quality

  • Health Check tests and names the assistant a send will actually use (#336).
  • Honest costs — unknown AI cost is represented as null, not a fabricated $0.00
    (#697); cache-aware cost estimates distinguish first-send vs. settled (#1052).
  • AI-proposed colours snap onto the template palette instead of raw hex (#696).
  • Brainstorm/patch chats bind to any schema-typed node, and create-from-draft works for
    any flat node kind (#711, #1120).
  • The transcript names the answering assistant rather than a generic "Claude" (#989).
  • Body as an intrinsic field with an ai_proposable authorship gate (ADR-0059); a
    conversation's lore is one gated, id-dedupped function (ADR-0057).

Plot templates & boards

  • Plot templates as a first-class, browsable Library tenant — read-only browse +
    clone pane (#716, #720); restored recognized craft names and wired structure guidance
    into the diagnostic (#948).
  • Plot board rails: pane teardown on delete + de-duplicated Arc/Plotline rails (#868).

Schema & metadata

  • Plain-language guidance for defining custom fields, clearer type labels
    (Select / Multiple / List), and a fix for cost computed fields being coerced to
    word_count (#702, #1209, #353).
  • Built-in schema fields gained descriptions used as tooltips and AI guidance (#1035);
    delete_metadata_group no longer strands sibling projects (#701).

Internal (architecture, tests, CI)

  • Self-enforcing layering (ADR-0056) — fitness gates + verified choke points; the AI
    service-orchestration layer was restored so routes stitch primitives (#977, #178).
  • A provider is a class, registered once (ADR-0058) — the if/elif dispatch is gone
    (#1047).
  • Complexity burndown (#76) — decomposed the backend/AI complexity tail and promoted
    the complexity rules to blocking; emptied the last GRANDFATHERED entry.
  • Renamed the scene kind → manuscript (#86).
  • Frontend runes cleanup (#49) — converted ~30 components off createEventDispatcher
    to callback props.
  • Svelte component-mount test harness + coverage for the Search and StructureTree panes
    (#642, #979); citation-rot checker honouring pinned Verified against <tag> headers
    (#397, #412); junction-safe stale-worktree cleanup (#359).
  • Release-process structure — a docs/development/releasing.md runbook and
    single-sourced app version (#1298, #1299).

v0.8.0 — The plot board

Choose a tag to compare

@antoncl antoncl released this 14 Aug 21:05
9e5740f

The plot board. 0.8.0's headline is a multi-dimensional plot-reasoning surface — cards, plotlines, and beats as first-class nodes on a free-flow board — that serves both the plotter (construct the structure before writing) and the pantser (seed the board from an existing manuscript and see what's missing). And the AI now reads and edits your world: brainstorm a character or a plotline into existence, revise one in place, and let a board-wide diagnostic name the soft spots. 198 issues closed, 195 PRs since v0.7.0.

The plot board (ADR-0048)

  • Cards, plotlines, beats — all nodes. A plotline is a plot-template instance carrying an ordered beat roster; a card is a unit of story that maps to 0..1 scenes; both live on a SvelteFlow board in the central editor area (#714, #738, #737, #757).
  • Three structural layers, visible at once. Reveal order (a card's on-page sequence), beat sequence (the plotline's ordered roster + links), and authored causality ("leads to" edges) each render as their own toggleable edge layer (#809, #813, #802).
  • Construct or reflect. Realize a scene from a card, or seed the whole board from an existing manuscript — the pantser's reflection surface — then reflow the layout (#744, #765, #790).
  • Templates via the Library. Plot templates are the Library's second tenant: browse, read-only inherit, clone-to-adapt (#716, #720). Book-local plotlines carry a specialized beat roster and their own colour (#776, #737).
  • Layout editing with scoped undo. Free-flow layout with structure containers, cards drag-locked to their manuscript container, arc-tinted beat badges, an on/off-page marker, and layout-only (Tier-1) undo (#760, #790, #873, #871, #787).
  • Cross-dimension diagnostics. A deterministic structural detector flags causal inversions, beat inversions, and beat gaps (#959); an AI board review reads the whole board and names the semantic soft spots a structural check can't see, with a plotline-level revise prompt to fix them (#966).

AI that reads and edits your world

  • Brainstorm an entry from scratch. Generate a whole new character (or any schema-typed node) in a chat, then commit it — create-then-PUT through one kind-neutral patch loop (#650, #703, #708).
  • The reconciliation paradigm. Brainstorm review is now a live-vs-candidate reconciliation: a judge toggle, accept/reject-all, a hand-off cue, and a backstop (#710); a brainstorm's timeline branch stages a pinned mutation set the chat owns, and a placed set drops from the card's pending list (ADR-0055 #943, #947).
  • The built-in Library. Curated prompts (and now plot templates) ship inherited and read-only, with clone-to-edit — a fail-closed read-only lock on the backend's editable flag (ADR-0049).

Projects & Settings, de-crammed (ADR-0047)

  • A ≡ app menu re-homes the top-bar controls (#604), and Settings became a tabbed shell — AI / Appearance / Storage — with a consistent window size and unified tab headers (#608, #610, #613).
  • The AI tab adopts the wizard's provider-subscription model, and the create wizard, providers, and colour-palette editor now share one chip + inline-form primitive (#611, #616, #618, #619).
  • The Project pane is de-crammed — actions relocated, Validate unbundled so loose-scene import has its own home — and the project editors (projects-folder picker, Contains, Inherits-from) are de-duplicated into shared components (#626, #629, #635, #643, #645, #647, #651).

Scope on the wire + hierarchy hardening

  • A request carries its own resolution scope (X-Project-Root) — ADR-0045's open half, so a request's project comes from the request, not shared mutable state (#413).
  • A project outside the machine root is no longer reachable, and "not a project" is enforced (#441); current_project() stops walking the layer chain twice (#466); node-index diagnostics gained provenance so they can be retracted (#382).
  • The Project pane can't vanish irretrievably — a targeted way to bring it back (#417).

Editing, Views & content

  • Import existing Markdown as scenes (#4), with a fixed partial-import selection bug (#639).
  • Paragraph formatting — alignment + first-line indent for prose presentation (#575).
  • User-definable type size — a master scaler plus per-role font-size settings (#127).
  • A dedicated Views management surface — list, open-to-edit, delete, rename/duplicate (#90) — plus view-designer undo/redo (#187) and an evaluator cleanup pass (#232).
  • App-wide tags UX — common tag operations in fewer steps (#247), and bidirectional reference display (#15).

Foundations

  • The curated Tabler icon subset ships instead of all 5,147 glyphs — 447 KB reclaimed (#315).
  • Error tracking, slice 1. The app now keeps a durable, timestamped, restart-surviving error log (per-project and machine scope), where before the total record of every error was zero bytes (#386, #741). The structure/retention/surface design questions move to Post-1.0 (#970).

🤖 Release notes generated with Claude Code

v0.7.0 — Project hierarchies

Choose a tag to compare

@antoncl antoncl released this 27 Jul 16:32
6283d0e

The last major feature: project hierarchies. A project is now a folder that can inherit from ancestor projects — model a universe → series → book shelf purely by folder depth, with schema, lore, assistants, tags, and AI policy layering down the chain. 141 issues closed, 143 PRs since v0.6.5.

Project hierarchies (epic #7)

  • Declared inheritance — a project selects its ancestor chain (inherits:); nearer folders override farther ones. The bound is one per-machine root; a project outside it stands alone (#309, #337, #340).
  • Open a non-leaf level — a universe or series opens to its merged canon and child roster, not a manuscript (#310), with a breadcrumb / level switcher that walks the chain (#311).
  • Layered everything — schema, AI policy, and settings resolve over the chain (#312); tags joined the walk (#339); assistant priority is one merged sequence across layers, topmost = default (#332, #333).
  • Provenance & overrides — level pills and rail treatment show where a value comes from, with fork-to-here (#313), and overrides/ deltas let a descendant layer amend an inherited node without touching the ancestor (#314).
  • Layer-qualified identity — an id resolves to candidates by layer with explicit rank, and deleting a shadowing node no longer destroys references that still resolve to the ancestor (#334, #379).

Create-project wizard (#318)

Guided project creation — location, inheritance declaration, per-provider AI setup, and a review step that previews every field's inherited-vs-local value before the project exists.

Project fields reach the AI (#317)

Project-level metadata (genre, measurement system, …) now flows into prompt templates, so a world can say "this is metric" and have it stick.

Views & the view designer

A large redesign and hardening pass: Editorial-Card visual redesign (#240, ADR-0038), palette split into sources vs operations (#221), multi-level sort (#230), Nest orphans as a routable structural output (#260), tag chip pickers (#244), and convergence of every node-list surface — Chats, Mutations, Prompts, Backlinks, ReferencePicker, Todo, Search — onto one ViewNodeList (#253, #256, #258). The ViewExpr grammar is now single-sourced from one IDL feeding both runtimes (#281 / ADR-0041).

Node index & performance

Single-pass index build (#305), persisted as a rebuildable JSON snapshot with a staleness manifest (#306), incremental patching behind a change-gate (#307), and one unified layer walk every consumer visits (#329).

0.7.0 cleanup sweep

Final polish: scene rows are deletable (#465), create_project self-excludes .cache/ (#378), the view A–Z toggle preserves show_empty (#374), Recents entries can be removed with a burst-safe serialized write (#423), the directory picker hides a project's internal folders when browsing inside one (#559), and color leads the project fields so it clears the wizard review fold (#560). Closed as won't-do with reasoning: #557, #376, #464.

Deferred (for the 1.0 checklist)

Six items demoted to 0.8.0 (#441, #413, #417, #382, #466, #315) and one to Post-1.0 (#375 — the sparse .order.yaml storage; the pre-1.0 behavior is documented in code).


🤖 Release notes generated with Claude Code

v0.6.0 — UI overhaul

Choose a tag to compare

@antoncl antoncl released this 06 Jul 16:19
2cd57fb

0.6.0 — UI overhaul

A ground-up modernization of the app shell and its visual language. No new
story features — this milestone makes the writing desk feel like one.

Tiled workspace shell (#32)

  • Replaced the 90s-era floating MDI panes with a tiled, arrangeable split-tree
    workspace
    — drag a pane's tab onto an edge to split; open documents are tabs
    in the editor region (#154).
  • Saved & named layouts: per-project persistence, built-in presets
    (Writing / Schema / Research), and global user presets you can save/recall/delete.
    Full responsive collapse-to-tabs and keyboard nav (Ctrl/Cmd+1–9, F6) (#155).
  • Collapsed the legacy paneLayout shim into the new layout model (#157).

A quiet writing desk — design language (#124, #125)

  • A consolidated, normative design language (docs/design/design-language.md
    • ADR-0030): serif = the work, sans = the tool; a full design-token layer
      as the visual contract; a surface taxonomy (region / tab / rail / popover / dialog).
  • Restyle sweep across shell + panes: every color, type-size, and font-family
    now resolves through tokens — enforced by a style-token lint gate (#129, #130).

System-font strategy (#143, #144)

  • Three resident system faces — Segoe UI / Georgia / Consolas — no webfonts,
    no glyph-atlas budget. Consolidated onto --sans / --serif / --mono, enforced
    by the style guard.

Glyph-first affordances (#159, #163)

  • A closed glyph lexicon replaces worded affordance compounds (density-first;
    the tool recedes). Every glyph carries an aria-label + tooltip.
  • The metadata rail's reference fields now use a bare + to add and a new ⇄
    swap glyph
    to replace a single bound value (#163).

Fixes & tooling

  • Windows: node-file rename no longer 500s on a transient file lock, and only
    renames on a real title change (#164).
  • Dev-gate hardening: worktree-aware venv/gates, dev extra completeness
    (#133, #135, #137, #147).

Full milestone: all 17 issues closed. Previous release: v0.5.4.