Skip to content

QUILL 0.8.0 Beta 1

Pre-release
Pre-release

Choose a tag to compare

@accesswatch accesswatch released this 28 Jun 00:38
· 6 commits to main since this release

QUILL for All 0.8.0 Beta 1

Screen-reader-first writing studio for Windows. This is the public 0.8.0 Beta 1.

First public 0.8.0 beta. Rolls up the 0.7.0 line plus the changes below. This section doubles as the in-app release notes: the same text appears when you Check for Updates and any time from Help > What's New.

What's New in this beta

  • First run no longer shows a second setup wizard. A leftover legacy onboarding path could re-open a "Startup Wizard" overview (a read-only intro plus a privacy step list) and a "Start guided setup now?" prompt on every launch after the first run. That entire path has been removed: first run shows the single unified setup wizard and QUILL never re-prompts; each feature it covered remains set up from its own menu.
  • Release notes now show when you check for updates. When an update is found, QUILL presents an abbreviated, screen-reader-friendly summary of what changed in a read-only multi-line edit (the same control help text and wizards use), alongside Download, Skip this version, and Later. The notes are sourced from this changelog, so every release carries a short "what's new" list.
  • New: Help > What's New. See the current build's release notes on demand, between updates, in the same accessible control — so the format is familiar when an update lands.
  • Faster, simpler update prompt. The update dialog no longer waits on a one-time WebView2 warm-up before it can appear.

Runtime and packaging

  • Bundled Python runtime moved to 3.13. The Windows installer's embedded interpreter is now CPython 3.13.14 (was 3.12.6). Minimum supported Python stays 3.12. Every bundled dependency ships a 3.13 Windows wheel.
  • Native Windows OCR migrated off winsdk to the winrt-* packages. winsdk (the legacy monolith) shipped no wheel past CPython 3.12, which blocked the 3.13 move; it is replaced by Microsoft's pywinrt namespace packages (winrt-runtime, winrt-Windows.Media.Ocr, and the Graphics.Imaging/Globalization/Storage namespaces), which ship 3.13 wheels. The projected API is identical, so zero-install Windows OCR (OCR-1) is unchanged for users. Internal: quill/platform/windows/windows_ocr.py imports from winrt.windows.*; the availability flag is now _WINRT_AVAILABLE.
  • Kokoro neural voices are now bundled in the installer. The Kokoro ONNX model and voices ship under {app}/kokoro-models, so the engine works offline at first launch without the ~114 MB download. The build stages them from a local directory (--kokoro-dir) or downloads and SHA-256-verifies them from the pinned kokoro-onnx release.

Documentation accuracy and locked-feature hygiene

  • Documentation reconciled against the code. All user-facing docs (user guide, release notes, control reference, PRD, keybinding standard) were verified against quill/ui/main_frame_menu.py, quill/core/keymap.py, and quill/core/feature_catalog.py. Locked-off features (BITS Whisperer, GLOW) were removed from the user-facing docs and preserved in docs/planning/deferred-locked-features.md; offline-speech menu paths were corrected to the flat Tools > Speech (the gated "Whisperer" submenu no longer appears in docs); and stale keybindings/menu names were fixed to match the code — AI Grammar and Style (Ctrl+Alt+Shift+G), Translate Selection (Ctrl+Alt+Shift+T), AI Thesaurus (Ctrl+Alt+Shift+H), Compare navigation (Ctrl+Alt+Shift+. / , / D), Verbosity Quiet/Meeting/Undo (no default key), Replace (Ctrl+H), Browser Preview (QUILL Key + V), List submenu under Insert (not Format), the Advanced Tools submenu (was documented as "Power Tools"), and Keymap Editor (was "Keyboard Manager").
  • No deferred-feature brand shows in a default build. The offline watch-folder action was renamed "Transcribe audio (Whisperer)" → "Transcribe audio (offline)" (quill/core/watch_transcribe.py); and the About-dialog overview paragraph, the Transcription settings-group description, and the trust-consent disclosure were de-branded so they no longer name the deferred BITS Whisperer suite or GLOW. The full BITS Whisperer suite (menu, dialogs, provider/rollout surfaces) remains in the code but gated off behind the locked core.bw_whisperer flag for QUILL 2.0, so none of it renders today.
  • Dead keybinding fixed. New Sticky Note (tools.sticky_note_capture) defaulted to the QUILL-key chord N, which the prefix handler intercepts for browse mode (so the chord never fired). It is now QUILL Key + Shift+N in DEFAULT_KEYMAP and the default/screen-reader keymap profiles.

One dialog for batch speech and audiobooks

  • Build Audiobook from Folder is folded into Batch Export to Speech Audio. The two near-identical dialogs are now one. In Tools > Speech > Batch Export to Speech Audio..., tick Assemble the results into one audiobook to reveal the book tags (title/author/narrator/genre/year), a cover-image picker, the book format (M4B/MP3), an ACX-loudness option, and a save-as path. After your documents are synthesized — one chapter each — the produced (and any pre-recorded) audio in the folder is combined into a single chaptered book. The standalone Build Audiobook dialog and its menu item were removed; the build logic (quill/core/speech/audiobook.py) is unchanged.
  • The "Kokoro speed" control now announces its name. The speed spinner is a SpinCtrlDouble, whose embedded edit field did not inherit its adjacent label, so screen readers read it unnamed on Tab; it (and the Rate spinner) now carry explicit accessible names.
  • Choose where temporary files live, and keep a log. A new Temporary files folder field puts each run's scratch dir under a folder you pick (blank = system temp). A timestamped diagnostic log is created in the output folder before conversion starts and records discovery, per-document progress and timings, skips, errors, and the audiobook build. An optional Save the text sent to speech checkbox writes a <doc>.spoken.txt sidecar of the exact text each document speaks.
  • A real progress dialog with a percentage. Conversion now shows a focused, screen-reader-announced progress dialog whose percentage is words processed divided by total words, and which can be minimized to the status bar like other long operations. It opens after the configuration dialog closes so screen-reader focus reliably lands on it, and it advances per audio chunk — so even a single long document (or one with no headings) shows real movement instead of sitting on "Preparing...".
  • Fixed a heading-less document appearing to hang. A Word document with no headings is one large section; it was handed to Kokoro in one oversized call (far past Kokoro's small context window), which stalled. Neural engines now synthesize in much smaller chunks (Kokoro especially), so these documents complete and report steady progress.
  • Review chapters before building. Tick Review chapters (rename/reorder/merge) before building to open a chapter editor after synthesis; assembling a folder of pre-recorded audio always opens it. Rename, reorder, and merge chapters, then build. (This is the editor from the old standalone Build Audiobook dialog, brought back into the consolidated flow.)
  • Accessibility: spinner and list labels. The "Kokoro speed" control is a composite whose inner edit field is what a screen reader focuses; its accessible name now reaches that inner field. The round-robin voice list and translated-languages list got adjacent labels so they are announced by name on Tab.

Post to Mastodon, straight from the editor

  • Publish to Mastodon without leaving QUILL. Press QUILL Key + Shift+P (or Tools > Share > Post to Mastodon...): QUILL takes your selection — or the whole document if nothing is selected — and opens a compose dialog where you edit the text, pick which account to post from, choose visibility (Public / Unlisted / Followers-only / Direct), and see a live character count. Posts appear "via QUILL". This is a lean poster, not a full client (no timelines or media in this first version).
  • Multiple accounts, with friendly names. Tools > Share > Mastodon Accounts... lets you add accounts (each with a nickname shown in the picker), set a default, and remove one. Adding an account registers QUILL on your server and uses a one-time browser authorization (you paste a short code back). Sign-in secrets are stored in the Windows Credential Manager / DPAPI, never in a plain file. New wx-free quill/core/mastodon/ package (single audited urllib egress site in client.py); dialogs in quill/ui/mastodon_dialogs.py.

Voice previews you can actually hear

  • Preview any voice with the Preview button — even before downloading it. In Manage Voices, selecting a voice and pressing Preview now: synthesises the preview phrase with the voice's real model when it is downloaded, or plays a bundled pre-recorded sample (quill/data/voice-previews/) when it is not — so a Kokoro voice (or any not-yet-downloaded voice) can be auditioned before you commit to the ~114 MB download. The rate/volume/pitch/speed controls now dim until the voice is downloaded (they only affect real synthesis), and the wording points at the Preview button instead of an unreliable double-click/Enter. The eSpeak "Voice character" variant stays hidden for engines that don't use it.

Suggest a filename from the first line

  • A new option pre-fills the Save dialog with a name taken from your document's first line. Turn on Suggest a filename from the first line (Settings, General) and when you save an untitled document, QUILL proposes a name derived from the first line — across formats, stripping leading markup (a Markdown # heading, a > quote, a - list bullet, or inline HTML tags) and sanitizing it into a valid filename. Off by default; applies to Save As, Export, plain-text save, and DAISY. New wx-free quill/core/titles.py.

Sound packs you can actually pick

  • The first-run Sound-pack control is now a dropdown of the packs that ship with QUILL, replacing a *.qsp file picker that could never select them — the bundled packs are folders, not files, so the old picker was effectively broken. The dropdown defaults to QUILL's own pack (Ink), so turning sound on always gives you working earcons. Bundled choices are stored as a stable bundled:<id> reference (or "" for the default) and resolved against the install, so a chosen pack survives a move or reinstall instead of going silent. New available_sound_packs() / resolve_sound_pack_path() in quill/core/sound_pack.py.

Upgrade hardening (durability for beta upgraders)

  • A corrupt config no longer crashes startup or silently vanishes. If settings.json or keymap.json is present but unparseable, QUILL now quarantines the original to migration-backups/<name>-corrupt-* and falls back to defaults, instead of raising on load (migration_backup.backup_corrupt_file).
  • Changed settings defaults can be pushed to existing users, like shortcuts. The recommended force-once mechanism now covers settings too (RecommendedSettingsUpdate), so an important changed default isn't permanently pinned in an upgraded full-snapshot file. Same opt-out (Apply recommended keyboard-shortcut updates).
  • The persistence contract is now enforced by a gate. quill/tools/persistence_audit.py classifies every JSON-write site; a test fails if a new persisted store appears without deciding whether it needs the versioned-delta migration.
  • Every config store now carries a schema version. The backlog the gate surfaced is cleared: each previously-unversioned config file (remote/SSH sites, AI engine/model/provider config, publishing connections, quillin settings, read-only guards, profile-startup, deepgram, and more) now stores a schema_version (bare lists/maps wrap in a versioned envelope, with old files still loading), so a future shape change is migratable. And read_json is now corruption-tolerant globally — a malformed config file degrades to its default instead of raising, so one bad file can never crash a load path.

Upgrade hygiene: default hotkeys now reach existing users, and prior-install data can be imported

  • Changed and new default hotkeys now reach existing users automatically. keymap.json previously stored a full snapshot of every binding, so once you had used QUILL, a later change to a default shortcut never reached you — your file pinned the old value for every command. It is now stored as a delta of only your customizations plus a _defaults_epoch stamp, so any command you have not personally rebound always tracks the current default. This removes the fragile "add an old→new migration entry for every default change" tax: changing DEFAULT_KEYMAP is now enough. Legacy full-snapshot files are converted to the delta format once, on first load, and stamped — preserving your genuine customizations. (quill/core/keymap.py.)
  • Find is forced back to Ctrl+F on upgrade. As part of that legacy conversion, several pre-release builds that defaulted Find (edit.find) to a QUILL-key leader chord (e.g. QUILL Key + Z) are corrected: any leader-chord Find binding in a legacy keymap is reset to Ctrl+F, in place, with no data migration required. A non-leader Find you set deliberately (e.g. Ctrl+Alt+F), and any leader-chord Find you choose after upgrading, are left alone.
  • Settings now carry forward across upgrades, with a recoverable backup. settings.json was a full snapshot, so a changed default never reached you and a new setting only arrived through code. It is now a delta of just your changes plus a schema_version stamp, so new settings arrive at their defaults automatically, changed defaults reach you unless you overrode them, and your customizations are preserved. The first launch after upgrade converts an old file once; the original is copied to migration-backups/ first so the conversion is always reversible. Shared, reusable plumbing lives in the new wx-free quill/core/versioned_store.py and quill/core/migration_backup.py; settings serialization is in quill/core/settings_migration.py (schema_version 2). The contract is documented in docs/design/persistence-and-migration.md.
  • Recommended updates: important default changes can be pushed once, and you can opt out. When a default change matters enough to apply even to people who already customized it — restoring Find to Ctrl+F is the first — a recommended update sets it once, then never touches it again, so you remain free to rebind. Turn the whole mechanism off with Apply recommended keyboard-shortcut updates in Settings if you would rather keep your own choices untouched. (quill/core/recommended_updates.py.)
  • You choose how upgrades are surfaced, and can undo a shortcut change. A new rich Upgrade notice setting (migration_notice, Administration group: Silent / Brief announcement (default) / Summary with Undo) controls what QUILL says when it migrates your settings or applies a recommended shortcut fix on update. The Summary with Undo dialog and the Undo Recent Shortcut Change command (tools.undo_recommended_updates) revert a correction like Find→Ctrl+F while leaving it from re-applying. The migrate-and-surface plumbing is shared (migration_backup.pop_recent_migrations, MainFrame._surface_migration_notice).
  • The installer no longer leaves a half-upgraded app. Inno Setup only overlays new files; modules renamed or removed between releases could linger next to new ones and crash on launch with ImportError/AttributeError. The installer now cleanly replaces the first-party quill package (and stray __pycache__) on every install, while leaving the embedded Python runtime and your %APPDATA%\Quill data untouched. (scripts/build_windows_distribution.py, [InstallDelete].)
  • Import data from a previous QUILL install. When QUILL starts in a fresh data location but finds a populated data directory from an earlier install elsewhere (typically after switching between the portable and installed builds, or when the storage-mode marker was lost on reinstall), the first-run flow now offers to import your settings, keyboard shortcuts, and documents and restart to apply them. Detection and the move live in the wx-free quill/core/data_location.py (detect_importable_legacy_dir, apply_pending_legacy_import); the import is applied very early in quill.__main__.main() — before settings are read — and the location-control file (storage-mode.json) is intentionally left behind so the active data directory does not bounce back to the emptied source. Declining is remembered so you are not asked again.

Download

  • Windows installer: Quill-for-All-Setup-0.8.0.Beta.1.exe — installs to Program Files, adds QUILL to your Start menu.
  • Windows portable ZIP: Quill-Portable-v0.8.0-beta.1.zip — extract to any folder and run, no installation required.

Full release notes: https://quillforall.org/docs/release0.8.0-beta1.html