Repository navigation
Releases: leavesofgrass/textweaver
Release list
textweaver 0.1.0-beta.3
Changed
textweavernow opens the app;twis the terminal. textweaver is one program instead of three, so the download is simpler.textweaver, alone or with a file, opens the textweaver app. The terminal reader and the commands are the same program: usetw, ortextweaver --tw(--climeans the same). A command given totextweaver, such astextweaver convert, still runs the command line, so scripts keep working, buttextweaver FILEnow opens the file in the app rather than the terminal reader.textweaver-guiis gone; the old launcher,textweaver.exe, that startedtw.exeis gone too, sincetextweaver.exeis now the program. On Windows,tw.exeis a small console program that runstextweaver.exe --twwith the same arguments and waits for it, so terminals, screen readers, and Braille displays work with the terminal reader as before; in terminals there, usetw. On Linux and macOStwis a link totextweaver(on macOS, to the program insidetextweaver.app). Settings, data folders, and the JSON-RPC interface are unchanged (The command line).- Fewer programs in the package, the same engines. An antivirus program flagged two of textweaver's small engine host programs with a heuristic detection. The separate host for each engine is gone:
textweavernow runs Eloquence, SAPI 5 voices, DECtalk, and eSpeak NG in a copy of itself, started in a hidden host mode (--engine-host), and on Windows one 32-bit host,textweaver-host-x86.exe, runs every 32-bit engine and voice. The Windows package holds three programs instead of eleven (textweaver.exe,tw.exe, and the 32-bit host), and the Linux package no host programs. Engines still run in their own process, so a crash cannot close textweaver, and word timing is as exact as before. TEXTWEAVER_ECI_HOST,TEXTWEAVER_SAPI_HOST,TEXTWEAVER_SAPI_HOST_X86,TEXTWEAVER_DECTALK_HOST, andTEXTWEAVER_ESPEAK_HOSTstill work. They may name a separate host from an earlier release, which is used as before, or any other program, which is started in host mode. The old host programs (textweaver-eci-host.exeand the like) are no longer needed; an update may leave them in the folder, and they can be deleted.cargo xtask hostsbuilds only the 32-bit host (Windows); elsewhere there is no host to build. The Linux install script no longer runs it.- Ctrl+Shift+V now pastes as plain text in edit mode, and Choose a voice moved to Ctrl+Alt+V. In the textweaver app, Ctrl+Shift+V (Cmd+Shift+V on macOS) pastes the clipboard's plain text, as in most programs; Ctrl+Shift+M still works. Choose a voice is Ctrl+Alt+V in the app (Cmd+Option+V on macOS) and also in the terminal reader, where Alt+V keeps working. In the terminal reader, Ctrl+Shift+V stays the terminal's own paste, which is always plain text. If you moved either command in
keymap.toml, your keys are unchanged. - F11 is now full screen in the textweaver app, and the rate keys match the terminal reader. F11 switches full screen, as in most Windows and Linux programs; Alt+Enter still does (Option+Enter on macOS, where macOS keeps F11 for the desktop). F11 and Shift+F11 no longer change the rate in the app, and Shift+F11 is unbound. While reading, + (or =) and - change the rate in the app as in the terminal reader, from the main keys or the number pad; on macOS Cmd+Option+] and Cmd+Option+[ stay. In the terminal reader F11 is still the next chapter. If you moved these commands in
keymap.toml, your keys are unchanged. - Escape leaves edit mode. In the terminal reader and the textweaver app, Escape in edit mode first closes whatever is open on top (a menu, list, panel, prompt, find bar or dialog), then stops reading if it is under way, then clears a search's marked matches; with none of these, it leaves edit mode exactly as Ctrl+E does: the edits are kept (with the same question about unsaved changes), the cursor stays where it was, a dictation under way is finished first, and the announcement is "Edit mode off." The hint "Still editing. Ctrl+E finishes." is gone. The JSON-RPC
stopmethod still only stops reading (Editing). - The app's Edit button moved to the toolbar. It was on the header as "Start editing" and "Finish editing"; it is now one toolbar button, after Next paragraph, named "Edit" (Ctrl+E) in reading mode and "Done editing" (Ctrl+E, Escape) in edit mode, where it stands directly before Start dictation. Pressing it moves the focus to the document, as Ctrl+E leaves it. The header's defaults are Open, Font, Settings and Commands. A header or toolbar you customized keeps your choice; if the bar holding the button is hidden, Done editing appears on the other bar while you edit. The terminal reader's key hints are unchanged (What is in the app).
- Leaving edit mode keeps the cursor's place. In a Markdown file, finishing with Ctrl+E (or Escape, or Done editing) without changing the text put the reading cursor back where it was when editing began, often the top heading. It now lands on the block and word the editor's cursor was on, as it already did after a change (Editing).
Dictation
- New: pause and resume dictation. Pause dictation (Alt+Shift+F9, in the Edit menu and the command palette) pauses the microphone during a dictation and resumes it. The phrase being spoken is finished and typed first, so no words are lost; what the microphone hears while paused is discarded, and the session, the loaded model and the text stay. "Dictation paused." and "Dictation resumed." are said, and the terminal reader's status line begins "Dictation paused." while it lasts.
- New: dictation buttons in the textweaver app. While a dictation is under way, the toolbar shows Pause dictation (Resume dictation while paused) and Stop dictation beside the other buttons, before Slower and Faster, or on the header when the toolbar is hidden. They leave when the dictation ends, and the focus moves to the document if it was on one of them.
- New: a Start dictation button in edit mode. In edit mode the textweaver app's toolbar shows Start dictation, before Slower and Faster, which runs Dictate (Ctrl+Shift+F9) and names that key to a screen reader. When no dictation model is installed, it says so and offers the download, as the key does. During a dictation it gives way to Pause dictation and Stop dictation; leaving edit mode removes it, and the focus moves to the document if it was on it.
Study
- New: study cards go to Anki and back. Export cards to Anki writes a document's cards as an Anki package (
.apkg) beside it, in a deck named after the document, each note tagged with the document and the card's kind; graded cards keep their interval, ease, due day, and grades. Import Anki cards adds a package's Basic and Basic-and-reversed notes to the open document's cards as plain text, with their grades, and says what it skipped: "Imported 120 cards. Skipped 4 cloze notes." Importing the same package twice adds nothing. From the command line:tw study export --anki FILEandtw study import FILE(Take cards to Anki and back). AnkiConnect sync stays dropped.
Library
- New: the reading queue. A list of documents to read next, kept with the bookshelf, so it is there the next time textweaver starts. Ctrl+Enter in the library list adds the focused document or takes it out; Add to reading queue in the File menu does the same for the open document; Reading queue in the File menu lists it, where Enter opens a document and Delete takes one out. A document leaves the queue when it is read to the end. The setting After a document ends (
[reading] after_end) decides what follows the end of a document: nothing ("stop", the default), the next document named, "Next: Week 4. Enter to read." ("ask"), or the next document read at once ("next"). A document is never started unless you ask. From the command line:tw library queue, withadd,removeandnext. - New: the review list, beside Continue reading: the documents you have read aloud, the one read longest ago first, such as "Pharmacology 2, 21 days, 80 percent, 3 notes". It is a convenience for finding older readings, not a study method. From the command line:
tw library review. - The reading queue syncs between computers, with the places switch in sync. A document added on one computer joins the queue on the others, in the order documents were added; one taken out, or read to the end, leaves it everywhere and does not come back from a computer that had not heard, unless it is added again later. A document queued on another computer and not found on this one keeps its place, listed as "Week 4, not on this computer"; Enter on it says so, and it becomes an ordinary entry once you open it here. The queue goes to the sync folder as a file of its own,
queue.json, which earlier versions never read. Syncing between computers has the rules.
The app
- Each highlight name has its own color and shape in the textweaver app, as in the terminal reader: the name's color as the band, with black or white text, whichever reads better, and its shape drawn (a line, a double line, bold text, a dotted line, brackets, or a small square at the start), so no two names differ by color alone. A screen reader is given the name in words ("Highlight, important") on the text it covers, with the band and the line as text attributes (Highlight colors).
- The self-test's answer is said once. After Enter revealed an answer, the app said it, and a screen reader then said the prompt's new text, with the answer, a second time. The prompt now keeps the text the screen reader knows until the focus moves; comin...
textweaver 0.1.0-beta.2
In short: beta 2 fixes the speech rate, and brings every document up to date.
Reading and speech
- The speech rate changes again with Eloquence and DECtalk. A voice saved while another engine spoke (a Windows SAPI 5 voice during a fallback) made both engines refuse every change of voice, rate, pitch, and volume, so the rate stayed fixed while the number on screen moved, and DECtalk could fail to start. Another engine's voice is now set aside quietly, and rate, pitch, and volume always apply; the "unknown voice" error no longer appears. Both engines now speed up past 430 words per minute.
- Choosing a speech engine in Settings switches to it at once, instead of waiting for Restart speech.
- Speech no longer goes silent with RSVP. With RSVP shown, Play/Pause started RSVP's silent word display instead of speech, so turning RSVP on while paused and then resuming gave silence. Play/Pause now always reads aloud, and RSVP follows the speech; Alt+Shift+P still starts RSVP on its own.
- An environment variable that names a helper program (
TEXTWEAVER_FFMPEG,TEXTWEAVER_PANDOC) now wins over a copy in the components folder.
The app
- New: focus mode and full screen. With View, Focus mode on (
[gui] focus_mode, off by default), the header, the toolbar, the status bar and the panel fade once the mouse rests for three seconds, and the text takes the window; moving the mouse brings them back, and keys never do. Full screen (Alt+Enter, or View, Full screen) does the same. The hiding is visual only: screen readers, the Tab order and the focus are unchanged, and nothing is announced.
Settings and data
- Settings shows the highlight palette as a count of entries, not raw data running over the Highlight section, and a SAPI voice by its name rather than its registry path.
Help and documentation
- Every guide, the README, and the developer documentation were checked against beta 1 and brought up to date: one download per system,
twas the one terminal program, the beta stage, privacy (updates, fetched helpers, the credential store), and the settings that were missing from the settings guide.
Package sizes
textweaver-0.1.0-beta.2-linux-aarch64.AppImage: 66.4 MB (69,638,664 bytes)textweaver-0.1.0-beta.2-linux-aarch64.tar.gz: 70.7 MB (74,160,981 bytes)textweaver-0.1.0-beta.2-linux-x86_64.AppImage: 71.7 MB (75,176,440 bytes)textweaver-0.1.0-beta.2-linux-x86_64.tar.gz: 76.3 MB (80,014,927 bytes)textweaver-0.1.0-beta.2-macos-universal.zip: 126.1 MB (132,202,558 bytes)textweaver-0.1.0-beta.2-windows-x86_64.zip: 78.3 MB (82,128,223 bytes)
textweaver 0.1.0-beta.1
In short: beta 1 adds study tools (study cards with SM-2 scheduling and sync, a self-test, recall prompts), links between notes with seven export formats, tracked changes and comments written back to Word files, a named highlight palette, regular-expression find and replace, Markdown paste, a preview pane, polished HTML, DAISY 2.02 books and recorded DAISY narration, braille (BRF) files such as NLS BARD downloads, five more formats through carta, offline searchable help, optional components fetched for you (including from your own repository), update checks, and one download per system holding both programs.
Reading and speech
- Stop at the end of a section or after a set time, and repeat the current sentence slower (Shift+X).
- Recorded narration in DAISY 3 and 2.02 books plays as you read, the highlight following each phrase; speech reads any text without audio (
[reading] book_audio). - An eSpeak NG helper program runs eSpeak NG out of process on Windows, so any installed eSpeak NG works with any build and a crash cannot take the reader down.
- Speech never stays silent while an engine works: engines fall back in order, each source is named ("Eloquence (OpenEVV, direct)"), and engines that cannot exist on the system are hidden. OpenEVV's root dictionary now loads in the background after speech starts.
Study and notes
- Study cards from highlights, notes and headings; a study session graded Again, Hard, Good or Easy; SM-2 scheduling ("Due today: 7 cards"); cards and grades sync between computers.
tw study due. - Self-test from the study sheet, and optional recall prompts at section ends.
- Links between notes with the ten star relation types, "What links here", and
tw notes links; knowledge-graph export as JSON, DOT, Markdown, GraphML, Mermaid, PlantUML and a CSV edge list. - A named highlight palette (important, define, question, example, review): Alt+1 to Alt+5, a distinct shape and braille typeform for each name, filtering and collecting by name.
Documents and conversion
- Tracked changes and comments: a list with author and date in words; accept or reject one, by author, or all; reply, resolve and add comments; write the decisions back into the Word file in place, with a backup; optional tracked edits from edit mode under
[authoring] author. - DAISY 2.02 books open from
ncc.html, their folder, or a zip. - Braille files (BRF and BRL), such as NLS BARD's braille downloads, are read as print through liblouis, with "Show original Braille".
- carta reads Org, reStructuredText, MediaWiki, DokuWiki and Jira, and writes AsciiDoc, Typst, LaTeX, MediaWiki and Org, in pure Rust.
- Polished HTML pages: typography from your reading settings, highlighted code that never relies on color alone, figures, print and forced-colors styles.
Writing and editing
- Find and replace with regular expressions, captures, spoken previews ("Match 2 of 5, line 12: teh becomes the"), and a panel in the app.
- Formatted text pastes as Markdown (in the terminal reader, and in the app on Windows); paste as plain text with Ctrl+Shift+M in the app and Alt+Q in the terminal reader.
- A context menu (Applications key, Shift+F10, right-click), native on Windows.
- A preview pane beside the editor (Alt+F5), and one setting for the browser preview, "Browser preview follows".
The app
- The keyboard list and the command palette filter as you type, with short names and the key on each row; F1 explains the row.
- Customizable buttons; the toolbar's navigation pair is now previous and next paragraph.
- The Colors dialog measures every row and each highlight name, and respects Windows high contrast.
- The menu bar is hidden by default on Windows (Alt or F10 shows it), menus have no duplicate commands, the window is opaque on every graphics card, and the loom logo is the icon.
- "Updated to" is said once after an update.
The terminal reader and the command line
twis the one terminal program:twortw FILEopens the reader,tw COMMANDruns headless, andtextweaveris a second name for it.tw changes accept|reject FILEreplace--accept-alland--reject-all, which still work through beta 1.
Settings and data
- A developer profile example (
docs/examples/developer-profile.toml), and[export] audio_formatfor the format offered first. - Code blocks are read by default (
[speech] skip_codeis off). - Export asks where to save and under what name.
Help and documentation
- Help, Documentation opens the bundled guides in textweaver; Search help finds commands, keys, settings and guide sections.
- The guides were revised for university-level readers; the GUI is "the textweaver app", not "the window".
- Every error message gives a next step.
Components and updates
- Optional components from your own repository or folder (
components.toml), with a GitHub token kept only in the system credential store. - ffmpeg, liblouis and Pandoc fetched for you when a feature needs them, from their official releases.
- Update checks: asked on first run, at most once a day, never downloading without asking; packages verified against the release checksums.
tw update.
Packages and the build
- One download per system and processor, holding the app,
tw, every engine helper and the complete documentation; the separate-guipackages are gone. The Linux AppImage starts the app by default. - Every package carries the complete user documentation, and a missing guide is a warning, never a failure.
- Copyright (C) 2026 Jon Pielaet, in
NOTICE, the README,--versionand About.
Package sizes
textweaver-0.1.0-beta.1-linux-aarch64.AppImage: 66.4 MB (69,634,568 bytes)textweaver-0.1.0-beta.1-linux-aarch64.tar.gz: 70.7 MB (74,170,533 bytes)textweaver-0.1.0-beta.1-linux-x86_64.AppImage: 71.7 MB (75,135,480 bytes)textweaver-0.1.0-beta.1-linux-x86_64.tar.gz: 76.3 MB (79,988,217 bytes)textweaver-0.1.0-beta.1-macos-universal.zip: 126.0 MB (132,158,701 bytes)textweaver-0.1.0-beta.1-windows-x86_64.zip: 78.3 MB (82,108,049 bytes)
textweaver 0.1.0-alpha.9
In short: this is the last alpha before beta 1, so it finishes and tidies what is there. The window gains a reading settings dialog, a narrow layout, drawn list markers, and a first run of at most three skippable steps. Documents can be exported as a read-along web page, as Ogg Vorbis audio, and as an MP4 video with the spoken word marked. Captions gain karaoke tags and chapters. The command line follows one set of rules. Themes are checked for contrast, and the result is said in words. Written pauses are honored in every speech engine. The documentation has start pages for students and staff, a known-limits page, and an accessibility statement.
Reading and speech
- Written pauses.
<break time>and<break strength>in a document are read as pauses of that length in every speech engine. The markup is removed before speech and screen. New setting:[speech] markup_pauses. - Reading passes. Shift+F reads the full text, the first sentences only, or the headings only.
- Document overview. A short spoken summary of what the document holds.
- Pictures without a description are read as "graphic, no description" instead of being skipped.
- Print page numbers are read back from EPUB and HTML files that carry them.
- Where am I ends with the time left at the current rate. The window's status bar shows the same time left, changing once a minute.
- Say Status on a Places row answers Alt+End, like every other list.
Documents and conversion
- HTML pages ask which theme to use. Export, preview, and batch to HTML ask "Theme for the HTML page?", starting from your reading theme or your last answer; Escape cancels.
tw convert --theme NAMEpicks one without asking. The page uses the theme's own colors. - Add a folder to the library is a command in the window and in the terminal reader.
- Clear the reading statistics from the reader, not only from the command line.
Audio, video and captions
- The read-along page. Export audio can write one HTML file that holds the text, the audio, and word-by-word highlighting. It works offline, has named buttons, and uses no live region.
- Ogg Vorbis. Export audio writes
.oggas Vorbis (libvorbis, built in)..opusstays Ogg Opus. - Karaoke video. With ffmpeg on the PATH, Export audio writes an MP4 with the spoken word in bold and underlined, a caption track, and chapters. The format is hidden when ffmpeg is missing.
- Richer captions. WebVTT gains karaoke tags, word lines, and a NOTE block that names the voice and rate. ASS gains karaoke by outline. Chapter files and localized chapter names are written.
tw export-audio --karaoke --chaptersand the Export settings choose them. - Captions from dictation.
tw dictate --captionswrites caption files from Whisper's segments, marked as machine captions.
The window
- The Reading settings dialog gathers the 17 reading rows, with Voices and the WCAG and Generous spacing presets. It fits a 420 by 320 window.
- A narrow layout. Below 800 pixels the bars wrap and fold, key labels are hidden but kept, panels stack, and the status bar never overlaps. The View menu has Header and Toolbar commands.
- The measure. New setting
[display] measuresets the line length (66 characters by default, 25 to 90, 0 fills the window). - Drawn structure. List bullets, numbers, and nesting are drawn, as are the empty-window hint, an Editing badge with a dashed border, and a play-shaped mark for "reading from here". Text for screen readers is unchanged.
- Marks and focus. Every mark shape follows the design system's order, and the five mark colors come from the theme. Control borders reach 3 to 1, and buttons and the document get a double focus ring. Highlight granularity, lead words, and the on-off setting apply in the window.
- Interface text follows the Windows and GNOME text scale. The RSVP panel follows the font size and the reading font.
- First run has at most three skippable steps and infers hybrid mode when a screen reader is running. "Ask again about first-run choices" is in the Help menu.
- Two modes, named. "textweaver reads aloud" and "my screen reader reads", in the View menu and Settings, with a "Speak textweaver's messages" choice.
- Keys. Alt+Shift+A, F3 and Shift+F3 for Find next and previous, and Alt+Shift+S for Speech Cursor.
- Dialogs share one style with a Close button in every kind. Settings filters as you type, F1 gives the long help, and a recent block comes first. Themes show "meets AA" or "below AA" in words, and Lamplight is listed as a soft dark theme.
- Trouble is kept. The window writes a log file, saves your place after a failure, and says in words when graphics cannot start. It uses a low-power graphics adapter, remembers its place and size on this computer, and follows the system's caret blink.
- A lettermark icon, and the logo in the documents and the site.
The terminal reader
- Quiet screen is on by default in hybrid mode (
QuietScreenauto, on, or off). - Sticky status context. An edge message keeps the item it belongs to, and say-all keeps the sentence first.
- Quieter and leaner. List hints, a terminal title that is the document's name, one terminal probe at start, and a leaner redraw. The ruler mask is a blended color.
- The title line keeps "modified" inside 40 cells at line numbers of three digits.
- The reading ruler shows its edges in High Contrast.
The command line
- One rule set. Errors take one line and end with a next step. Exit codes are 0 for success, 1 for a failure, and 2 for wrong use.
--out,--to,--lang,--json,--home, and-ymean the same everywhere, and old spellings still work as hidden aliases. Questions go to standard error. - Verbs as subcommands in
library,stats, anddictate.tw sync stopstops syncing.tw speak -reads standard input.tw cite checkexits 1 when a citation is bad.tw settings pathlists every folder.tw openand the read-onlyoutline,notes,highlights, andinfoare in JSON-RPC. - One standard output writer that ends quietly when a pipe closes. One components status line, and the doctor reports the window, components, and OCR.
- Messages for window users no longer name
tw; they name the place in the app.
Languages
- Fewer, clearer messages. Eleven duplicate message groups are merged, Settings help is one short sentence with F1 for the rest, and the guides say "cursor", "speech engine", and "the window" throughout.
- US spelling in messages ("Canceled"). The new English text waits for a native-speaker review of the five translations.
Settings and data
- Settings written by another program are kept when textweaver saves. Saves happen at most once a second, and identical writes are skipped.
- Library folders are typed with semicolons, so a name such as "Readings, Fall 2026" keeps its comma.
- A declined font download is not asked again in the same session.
- Settings from alpha.1 to alpha.8 still load, checked against kept sample files.
Documentation
- Start pages for students and staff, a known-limits page, a privacy page, an accessibility statement, and a what's new page. The quick start and install start with the window.
- The command line page states the rules, and a test checks each one against
tw --help. - Honest statuses in the roadmap and the star comparison. The roadmap's "Planned" is now "Not in the 0.1 series".
- The Help menu reaches the quick start, the documentation, and Report a problem (which asks before a browser opens). About lists the facts a report needs.
Packages and the build
- Packages: the window's zip is unchanged. Ogg Vorbis adds libvorbis (BSD-3-Clause), built from source.
- Tests never reach a real speech engine. They choose from test doubles, and the development check runs eSpeak NG silent.
- The release tool refuses a changelog that has the same heading twice.
For contributors
- Checklist tests cover every list and dialog (named, modal, labeled) and prompts and the position line in 40 Braille cells.
docs/dev/checklist-tests.mdmaps each checklist row to its test. - Comments in the message catalogs no longer name waves or agents.
Package sizes
textweaver-0.1.0-alpha.9-linux-aarch64-gui.AppImage: 37.0 MB (38,816,264 bytes)textweaver-0.1.0-alpha.9-linux-aarch64-gui.tar.gz: 38.8 MB (40,664,840 bytes)textweaver-0.1.0-alpha.9-linux-aarch64.AppImage: 56.3 MB (59,054,600 bytes)textweaver-0.1.0-alpha.9-linux-aarch64.tar.gz: 59.6 MB (62,492,875 bytes)textweaver-0.1.0-alpha.9-linux-x86_64-gui.AppImage: 39.7 MB (41,589,240 bytes)textweaver-0.1.0-alpha.9-linux-x86_64-gui.tar.gz: 41.6 MB (43,570,381 bytes)textweaver-0.1.0-alpha.9-linux-x86_64.AppImage: 60.6 MB (63,531,512 bytes)textweaver-0.1.0-alpha.9-linux-x86_64.tar.gz: 64.2 MB (67,290,407 bytes)textweaver-0.1.0-alpha.9-macos-universal-gui.zip: 63.7 MB (66,806,013 bytes)textweaver-0.1.0-alpha.9-macos-universal.tar.gz: 109.9 MB (115,282,022 bytes)textweaver-0.1.0-alpha.9-windows-x86_64-gui.zip: 42.4 MB (44,471,409 bytes)textweaver-0.1.0-alpha.9-windows-x86_64.zip: 67.7 MB (70,986,837 bytes)
textweaver 0.1.0-alpha.8
This release is about speed you can measure, hearing where things end, and text from health sciences read the way a clinician would say it. Reading pauses after headings, paragraphs, and list items. Medical and scientific text, identifiers, and units are said correctly. The window gains Contents and Notes panels, F6 between its regions, and system file and folder choosers. Dictation and other models are offered as downloads. Conversions leave a report for an accommodation file. Piper answers a Stop and restart much sooner, and large documents open and edit faster. The translations of the new messages wait for a native speaker's review.
Security
- Links open without a shell. On Windows a link's address was opened through
cmd /C start, so an address with&in it could run a command after one "y". Links and files now open throughShellExecuteWon Windows, andopenorxdg-openwith the address as one argument on macOS and Linux. Onlyhttp,https, andmailtoaddresses and files that exist are opened; anything else (ms-msdt:,javascript:) is refused, and you hear why: "Not opened: ms-msdt link blocked."
The terminal reader and Braille
- Status text is never cut. The status area grows to as many rows as its text needs, counted the way it is word-wrapped. Before, it stopped at three rows, so a long line or paragraph put there in screen-reader mode lost its end before NVDA, JAWS or the Braille display saw it, and a message near a multiple of the width could lose its last word. A long line put there by a caret move is cut at 600 characters, as text read in place already was.
- A still screen in hybrid and screen-reader modes. The status area keeps a fixed height there, enough for 600 characters and at most half the screen, so the document no longer moves up and down with each message.
- Title parts in a Braille order. In edit and Speech Cursor modes the mode and "modified" come right after the position: "Line 12 of 400, 3%, Edit, modified, Ready", so they are inside 40 cells. Say Status and the window's position label follow. In hybrid and screen-reader modes the title line ends with the document's title alone, without "textweaver:".
- The keyboard shortcuts list leads with the command. Each line reads "Play or pause: Alt+P or Space. Play or pause reading from the current word. Reading": the name, its keys, what it does, then its category. The keys are inside 40 cells, and a first-letter jump goes to a command, not a category. Both readers show the list.
- Cell 1 holds text in hybrid and screen-reader modes. Line numbers start at the left edge ("12 Text"), the reading ruler marks its line with underline and bold without a mark column, and the hints and the empty screen start at the edge.
- New setting: the key hints line (
[display] hints,"auto"by default; stays on this computer). Automatic shows it when textweaver speaks for itself and hides it in hybrid and screen-reader modes;"on"and"off"choose. See Braille-first layout.
The GUI
- Contents and Notes panels. Ctrl+1 shows the document's headings, and Ctrl+2 its notes, in a panel beside the document, from the same lists as the outline (Alt+O) and the notes list. Enter goes to a heading or note and stays in the panel, Shift+Enter goes and returns to the document, and Escape returns. The row at the caret is marked with a bar and ", current". The panel is a navigation landmark, never takes the focus unless its key is pressed, and costs nothing while closed. The window remembers it (
[gui] sidebar). - F6 moves between the window's regions. F6 and Shift+F6 move between the header, the panel, the document, and the toolbar, as in other Windows programs. F6 used to turn line numbers on or off, which the window does not draw; it still does in the terminal reader.
- The title bar and menus follow the theme. A dark theme such as Galaxy now gets a dark title bar, and on Windows a dark menu bar and dark drop-down menus, even when Windows itself is light; a light theme gets light ones. With Windows High Contrast on, Windows draws them in your contrast colors. See Colors and high contrast.
- New setting: Hide the menu bar (
[gui] auto_hide_menu, off by default, Windows only). The menu bar takes no room until Alt, F10, or Alt with a menu's letter shows it, and hides again when the menu closes. NVDA and JAWS still say "menu bar" on Alt and F10. See Menus. - Enter in the command palette runs the command you heard. After Up or Down moved through the matches, Enter ran the first match instead of the one announced. It now runs the selected one.
- Shift+F1 describes the window's own commands. "What does this key do?" followed by Ctrl+D, Ctrl+Plus, or Ctrl+, opened the font list, changed the size, or opened the settings. Now, as for every other key, you hear its name, what it does, its keys, and where it is in the menus.
- Shift+Y obeys single-key shortcuts. With single-key shortcuts off (F9), Shift+Y no longer lists the highlights in the window, as in the terminal reader.
- A clearer message when the document on the command line cannot be opened, the same as Ctrl+O gives, with a next step: "Could not open notes.md: there is no file named notes.md in Documents. Check the name."
- Typed text in a prompt follows the theme. The command palette's filter and every typed prompt drew their text in a near-white whatever the theme, so it was faint in Galaxy Light; it now uses the theme's text color, and selected text sits on a band that keeps it readable.
- Play's focus ring shows. On Play's colored fill the focus ring is now drawn in the page color, at least 3 to 1 against the fill in the four main themes.
- Faster menus. A setting no menu shows, such as the rate, no longer rebuilds the menu bar, and a rebuild no longer works out the settings and the menus' reserved letters again.
- Closing the window no longer loses unsaved edits. The close button and Alt+F4 closed at once, so edits made since the last save were lost. With unsaved edits the window now asks save, discard, or cancel, as Ctrl+Q does; Cancel keeps it open. See Closing the window.
- Questions that delete, remove, or replace start on No. Enter in "Replace it?", "Remove the voice?", or "Delete this note?" now keeps things, and the first button says Delete, Remove, or Replace instead of Yes. Y and N answer as before.
- The caret reaches your screen reader before the screen is drawn. The window sent the accessibility update only after the graphics card had drawn and shown the frame, so NVDA, JAWS and the Braille display waited for it. The update now goes first.
- Faster start. The system's light or dark setting is read while the rest of the window starts, and not at all when
--themeis given or you picked a theme, as in the terminal reader. - The command palette lists only commands the window runs. Scroll down, Scroll up, and Line numbers, which only the terminal reader has, are no longer listed in the window, and their keys (
j, Shift+J) say "This command works in the terminal reader." instead of doing nothing. - The window behind a dialog stays readable. Buttons and text behind an open dialog took Masonry's fixed light gray, about 2 to 1 on Galaxy Light's buttons; they now take the theme's disabled color, at least 3 to 1 on buttons and panels (Windows' own disabled color in high contrast). Play no longer keeps its accent fill there.
- The reading ruler's band shows by its shape. The rows around the reading line get a thin bar at their start, half the reading line's, as the terminal draws them, and a blank line's row no longer reaches over the heading after it.
- Settings: switches say on or off, and the arrows work. A switch shows its value in words beside it, so it never rests on the switch's color. A click on the left arrow beside a number or a choice steps it back, and on the right arrow forward; before, either arrow stepped a choice forward or opened a number for typing.
--screenshotin a build without screenshots ends with an error.--screenshot,--review-screenshots, and--measure-framesopened an ordinary window in a build without thescreenshotfeature; they now say the option is not in the build and open nothing.- The spoken sentence is underlined and the spoken word bold. The window drew both as color bands only, though every theme asks for an underlined sentence and a bold word, as the terminal draws them. Now the sentence has a line under it in every theme, and under a Windows contrast theme, where it had no mark at all, the line is drawn in your text color. The word is bold without moving anything on the line. Notes, highlights, and search matches inside the sentence being read no longer disappear under its band.
- Two new theme checks. The spoken word's band must reach 3 to 1 against the page and against the sentence's band. Every built-in theme passes; a theme of your own that falls short still loads, and you are told what to fix.
- The keyboard preset applies from the start.
preset = "classic"under[keyboard]now takes effect when the window opens, as in the terminal reader; before, the GUI used the default keys until a settings import or sync. - The voice manager's buttons and keys. Enter or Space presses the focused button, and the Help and Say Status keys (Alt+End) work with the focus on a button, as in the list. Remove is unavailable on a voice that cannot be removed: it says "Remove, unavailable", your screen reader says "unavailable", and its description gives the reason.
- The document's name on focus. The document is named with its title first, such as "Reading check, document", so NVDA and JAWS say which document it is when the window or the document takes the focus.
The lib...
textweaver 0.1.0-alpha.7
Keys: what changed
- New key: Shift+F5 says how sync stands, and names this computer and the others. It is the same in the terminal and the GUI, on every system, Mac included.
- F2 in the library list edits the focused document's details, as F2 renames in the bookmarks list.
- Tab and Shift+Tab move between the fields of the details form, in the terminal and the GUI, and say each field's label and value. JSON-RPC's
prompt_keytakesshift_tabfor it. - The Say Status key previews a voice in the voice manager: Alt+End (Option+End in the Mac GUI), as it previews the focused row in the file browser. If you changed the key in
keymap.toml, the voice manager names yours. - The voice manager lists every engine: Alt+V in the terminal, Ctrl+Shift+V in the GUI, Cmd+Shift+V in the Mac GUI.
- The grammar keys work in every build: Ctrl+F7 and Ctrl+Shift+F7 (Cmd+F7 and Cmd+Shift+F7 in the Mac GUI; Option+F7 and Option+Shift+F7 in the terminal on a Mac), and Alt+J for the fixes (Cmd+Option+J in the Mac GUI).
- New commands without a key, in the menus and the command palette: Continue reading and Edit details in the File menu; Set up sync, Sync now, Go to another computer's place, Replaced notes, and Stop syncing on this computer in Tools, Sync. Give any of them a key in
keymap.toml.
Sync between computers
- Sync through a folder you choose (ADR-0049): a folder kept in step by Syncthing, OneDrive, Dropbox, or iCloud, or a USB stick you carry. There is no account, no server, and no network code in textweaver; it only reads and writes files there. Documents are recognized on each computer by their contents, wherever they are on disk and whatever their names. The guide is Syncing between computers.
- What syncs, each group with its own switch: reading places (one per computer), notes, highlights, bookmarks, reading statistics, settings, profiles, key overrides, the word list, the glossary and pronunciations, and favorite voices. Recent files, machine settings, caches, logs, and the documents themselves never sync.
- Set it up from Tools, Sync or the command palette: choose the folder in the file browser, name this computer (never its real name; at most 40 characters, so it fits a Braille line), and choose the groups. Sync status (Shift+F5), Sync now, Go to another computer's place, Replaced notes, and Stop syncing on this computer are beside it.
- A place from another computer is chosen at open by
[sync] position_policy:newest(the default),furthest, orask("lab at 42 percent. Go there? Y or N"). You hear which computer it came from. Your place never moves on its own after that; a place that arrives while you read is only offered, once. - A note edited on two computers: the newest edit wins, and you are told which note was replaced. The text that lost is kept on this computer, the last 20 per document, and Replaced notes puts one back.
- Deletions are remembered. Deleting a note, a highlight, or a bookmark leaves a small record, so a copy from another computer cannot bring it back. An edit made after the deletion still wins, and you hear so.
- Settings and word lists: the portable settings (rate, punctuation, verbosity, the reading aids, the theme and colors, the Braille and math codes, the interface language, and more) sync, the newest change to each winning. The engine, the voice, the volume, the access mode, the key preset, every path, and the sync settings stay on each computer. The settings reference says for every setting whether it syncs.
- Profiles keep their voice on each computer. A profile syncs its portable settings only; the voice, the speech engine, and the access mode it was saved with stay on the computer that saved them, and an arriving profile keeps this computer's own. Which profile is in use never syncs.
- Key overrides are labeled with the system they were made on. Windows and Linux share theirs; a Mac's are kept but not used on Windows or Linux, and the reverse, and Sync status counts them.
- Favorite voices travel too. One not installed here is listed last in the voice manager as "not on this computer"; Enter only says so, and Space takes it off your favorites.
- Nothing changes mid-sentence. Sync messages, and settings taken in from another computer, wait while textweaver reads aloud, then come as one short summary at the pause: "Settings: 3 changes from laptop." They follow your interface announcement level.
- A document that may be the same book: two computers' copies with the same contents are joined at once. One that only shares a DOI or an ISBN is never matched on its own; textweaver asks first, and a no is remembered.
- One document, one id. When two computers opened the same book before they ever synced, the next time it opens the two ids are joined into one, with both computers' notes, highlights, bookmarks, and places.
- Safe across a crash. Changes taken in from another computer and not yet saved here are kept on this computer, so a crash or power cut in between never lets this computer's older version win.
- Problems are said meaning first, on a status line that starts with "Sync": the folder missing (a USB stick that is out; everything is saved here meanwhile), a folder written by a newer textweaver (read only), another computer's clock more than a day ahead, a damaged file skipped, or a folder that cannot be written. The troubleshooting guide covers the missing folder and the newer format.
- Before the first merge, this computer's reading state is copied once to
state-before-sync, so turning sync on can be undone. - Privacy: no name, path, or computer name is written to the sync folder. Documents and computers are known by random ids and the names you chose; a title travels only when the document states one, never one made from its file name, and an author only when it is not this computer's user or computer name. The folder is not encrypted.
- On the command line:
tw sync setup,tw sync status, andtw sync now, each with--json. - The older setting moves on its own.
[reading] sync_conflict_policyis now[sync] position_policy;highest_progressbecomesfurthestandmanualbecomesask. - The old progress file is still read. With sync on, places go to the sync folder, and a library folder's
.textweaver/progress.json(from an older textweaver, or converted from Star) is only read, so its places are still honored. - Values from a newer textweaver pass through exactly. A number in a sync file that this version does not know about, however large, is written back as it was read; a very large one could change in its last digit.
- An older group file reads as this format, as a document's record does, so merging it never changes the format number it is written with.
- New messages for sync, in all six languages; the translations need a native speaker's review.
State files
- State files are now format 2. Every older file, and every Star import, loads unchanged.
- Bookmarks have ids. Every bookmark gets a stable id, so bookmarks from two computers are matched by id, not by name. Existing bookmarks get one when their file is read, and keep their names and places. Two bookmarks that arrive with the same name are renamed apart.
- Longer ids. New notes and highlights get 64-bit ids; older ids stay as they are.
The library
- Continue reading. A new command, in the File menu under Library and in the command palette, lists the documents on this computer with a reading place from any computer, newest first: "Cells, 42 percent, laptop, 2 hours ago". Enter opens one. Only documents found on this computer are listed.
tw library --continueprints the same list, with--jsontoo. - Search by what your other computers know. With sync on, a document's title, author, DOI, ISBN, and kind of file travel with it, so the library's filter and
tw library --searchfind a document here by a DOI only another computer knew. The newest detail wins; the date it was first added keeps the earliest. - Edit a document's details by hand. Type a document's title, author, DOI, and ISBN yourself: Edit details in the File menu and the command palette (no key of its own) for the open document, or F2 on a document in the library list. The form has one labeled line per field ("Author, 2 of 4"); Tab and Shift+Tab move between them and say each field's label and value, Enter saves, and Escape cancels and says so. A DOI or ISBN that is not one is said, and the form opens again on it. In the GUI each field is its own labeled dialog. What you type wins over the document's own details in the library, its filter, and
tw library --search, and with sync on it reaches your other computers, newest edit winning per field; clearing a field brings back the document's own value.tw library edit FILE --title ... --author ... --doi ... --isbn ...does the same, with--json. - Statistics from every computer. The statistics list and
tw statsadd every computer's reading of a document together, and show each computer's share on request (tw stats --by-computer). If the sync folder is slow, the list does not wait, and says "Other computers skipped: folder slow."
Speech
- Speech follows the sound device. When a headset or another device goes away, speech moves to the current default device at once and the reading goes on; before, it waited a second and only noticed while audio was waiting. Sound errors no longer print over the terminal reader's screen.
- Choose the sound device.
[speech] output_device(Output device in the settings screen) keeps speech on one device by its id, andtw backends --deviceslists the devices with their ids. A device that is not connected falls back to the default. It applies to Eloquence, the Windows ...
textweaver 0.1.0-alpha.6
Keys: what changed
- F10 opens the menus in the terminal, in every preset, as F10 does in Windows programs. Previous chapter, which had F10, keeps
Alt+PageUpandShift+D(browse). - New keys:
Ctrl+F9cycles the interface announcements,Ctrl+Shift+F9starts and stops dictation, andShift+F1says what the next key does and where it is in the menus, without running it. On a Mac they areCmd+F9,Cmd+Shift+F9, andShift+F1. - New commands without a key, in the menus and the command palette: Browse files, Batch convert, Export audio, Colors, and About.
- On macOS the GUI uses Mac keys, not Ctrl renamed: Option with the arrows moves by word and paragraph, Command with the arrows goes to the ends,
Cmd+[andCmd+]go back and forward, Command runs commands, and chords with Alt and a letter are Command+Option. Nothing takes VoiceOver's Ctrl+Option. The keyboard reference has a GUI on macOS column. - Some terminals keep F10 for themselves; then run
menufrom the command palette (F2).
Menus and the palette
- Menus: F10. File, Edit, View, Reading, Speech, Tools, and Help, with every command and its keys, in six languages. In the terminal they are a list: "Menus, 1 of 7, File"; Enter or Right opens, a letter moves to its item, Left goes back, Escape closes. Switches say "checked", choices their value. File, Recent documents lists what you opened last with your place in it.
- The command palette says each command name first with its menu: "Export PDF, File: ...".
epfinds Export PDF; the best matches come first. With nothing typed, your recent commands come first, said as recent. Ctrl+L (or Tab in the GUI) moves to the list of matches. - What does this key do (Shift+F1) and About in the Help menu.
- Menus and the palette are built from one list of commands, so both always offer the same things under the same names (ADR-0043).
The file browser
- File, Browse files (ADR-0045) walks through folders and archives as one list, from the File menu or the command palette. It starts on Places: the open document's folder, the start folder, the library's folders, and the drives on Windows.
- Rows say the name first, then the kind and size ("notes.md, Markdown, 12 KB"), and the position last ("3 of 40"), so a Braille display shows the name in its first cells.
- Archives open like folders: zip, tar, tar.gz, and 7z, and archives inside them, four deep. Nothing is unpacked; a document inside opens as
course.zip!week1/notes.md, and its position, bookmarks, and notes stay with that path.__MACOSXand.DS_Storeare left out. A damaged, too large, or too deeply nested archive is refused with a sentence. - Backspace goes up and lands on the row you left, out of an archive too. Typing filters by name.
- Alt+End previews the focused row: a document's title and first sentence, read in the background.
- Readable files only, with Ctrl+A for every file; Ctrl+R sorts by name, date, or size.
- Choosing a folder for another command: Ctrl+Enter, or the "Choose this folder" row where a terminal cannot send Ctrl+Enter. In the Mac GUI the browser's keys use Cmd.
- The browser only opens and chooses; it never copies, moves, renames, or deletes a file.
Announcements, colors, and settings
- Say less about the interface:
[accessibility] interface_announcements(off, minimal, normal, full; Ctrl+F9) decides how much textweaver says about itself: lists opening and closing, progress, hints, and routine confirmations. Errors, questions, and answers to what you asked are always said. Automatic is minimal with a screen reader and normal when self-voicing. - Colors (View, Colors): a color for the reading ruler, difficult words, syllable marks, misspellings, lint marks, search matches, the selection, the focus, links, headings, the status bar, notes, and bookmarks, from named colors (blue and orange first) or
#rrggbb, each with its contrast said ("contrast 6.2 to 1, good"). Every mark keeps its underline or bold whatever its color. - The settings screen lists the five settings you changed last at the top, says the default that Delete puts back, and says a setting's help on F1.
- Import settings names the first changes before asking. A renamed setting keeps its value. Importing settings in the GUI keeps the GUI's own keys.
- Numbers are grouped as your language writes them ("12.345" in German).
Documents and conversion
- Obsidian notes read the way Obsidian shows them. A callout of any type says its type first, in words ("Warning: Hot surface"), and a foldable one says once whether it starts collapsed;
[!type]is never read. The reader andtw convertshare one set of callout rules. Embedded notes (![[note]],![[note#Heading]],![[note#^id]]) are read in place between "Embedded from Note" and "End of embed", from the note's own folder only, two levels deep, cycles refused; embedded pictures are graphics named by their file; tags read "tag physics slash waves";==highlights==are marked;%%comments%%are not read; block ids are kept as link targets. - JSON files read with a heading per key, so
hmoves by key, and no brackets, braces, or quotes; invalid JSON is read as plain text with a warning that says where it broke. JSON Lines give a heading per line. - Jupyter notebooks open natively, cell by cell: text cells as Markdown, code cells named by their language ("Python code"), and outputs as quotes and graphics.
- SVG drawings read their title, description, titled parts, and text, or "Drawing with no description"; a drawing inside a web page is read the same way instead of being dropped.
- Content MathML is read as math, and
.mmlfiles open as one formula. - LaTeX: macros with up to nine arguments and
\newenvironmentexpand;\bibliographyand\printbibliographylist the cited works under "References";\multicolumnand\multirowcells say what they span;\includegraphics[alt=...]is described by its alt text. - The design for the new formats is in ADR-0044.
- Text sent to Pandoc in an older encoding is converted to UTF-8 first.
- Batch convert from the File menu. Choose a folder in the file browser, then a format (Markdown first, then PDF, HTML, plain text, EPUB, Word, braille), then where the files go (a
convertedfolder, beside each file, or another folder), and answer "Convert 48 files to PDF into ...? y or n". It runs in the background while you read, says its progress in tens of percent at most every ten seconds, and Escape asks before stopping, leaving no half-written file. At the end the counts are said, the failures are listed name first with Enter opening one, and the list is saved asconversion-report.txt. tw convertsaves a report.conversion-report.txtin the output folder (or the folder converted in place) has the summary sentence, then each failure and warning, the file's name first. Each run replaces it;--no-reportleaves it out, and a report is never converted as a document.- New messages, in all six languages: "it is not a readable JSON file", "... Jupyter notebook", "... SVG drawing", and "... MathML formula", said after "Could not open"; and the batch conversion's questions and progress.
PDF and OCR
- PDF comments are notes. Sticky notes, highlights, underlines, and strike-outs from a PDF viewer become notes on the text they mark, with replies and whether they are resolved, as Word comments do: "Note: Comment by Ada Example: Cite a source for this. Reply by Bo Example: Added a citation. Resolved." A highlight with nothing typed in it says "Highlighted". Hidden notes are not read.
- PDF links work. Web and email addresses are said and offered to open; a link to another part of the PDF goes to the heading there, or to the page, said as "Page 3" and its first line. Links that would run a program or a script are left out.
- Filled-in PDF forms are read, label first and then the answer: "Name: Ada Example", "Student ID, required: empty", "I agree to the terms: checked", "Signature: not signed". The printed label and the line to write on are not read twice; buttons are left out; an XFA form is named in a warning.
- Sideways and upside-down scans read in order. Each scanned page is turned upright before it is recognized, judged from the page itself with nothing downloaded.
- Scanned tables are tables when their rows and columns line up, with the first row of words as the header.
- Captions by pattern. "Figure 3." and "Table 2:" are found in PDFs; a table's caption names the table, a figure's caption is read as a graphic, and a caption set large or bold is no longer a heading.
- New message, in all six languages: "Page 3", said first when a link goes to a page.
- The design is in ADR-0048.
Braille
- Tables in braille files, three ways.
[braille] table_formatandtw convert --table-formatchoose how BRF files lay out tables:linear(the default, one row per line with semicolons between entries),listed(each row starts in cell 5 with the first column's heading and entry, and each other entry follows on its own line after its column heading and a colon), orstairstep(each entry two cells to the right of the one before, the column headings in a transcriber's note at the same steps). Listed and stairstep follow BANA's Braille Formats (2016), 11.16 and 11.18; a transcriber's note says how the table is laid out, a blank entry is three guide dots, and a row stays on one braille page when it fits. A table of more than four columns is listed instead of stairstep, with a warning. Every table now has a blank line before and after it (11.2.5d). - Bold, italic, and underline in braille. B...
textweaver 0.1.0-alpha.5
The fifth alpha. Braille comes first: every status line, list, and prompt puts the meaning in the first 40 cells, and math can be written in Nemeth or UEB braille. LaTeX, email, and web archives open without Pandoc; documents can be summarized with no model; publishing templates make APA and AMA papers with real Word footnotes; and the GUI ships in the release on every system, with syllables, the voice manager, a question dialog, and its labels in six languages.
Testing
- Listening check (Tuesday, September 29, 2026): the owner listened to the
cargo xtask listensamples from this build. ETI-Eloquence and SAPI 5 (Microsoft David) were clear at the normal, fast, and low settings; the low samples were pitched down as intended. The owner used the GUI and the terminal reader with NVDA and JAWS earlier in the week. DECtalk is not installed on the test machine. The Braille display session, the third GUI session, and the check of documents and summaries are still to come.
Reading and Braille
- Meaning first on a 40-cell Braille display. The title line starts with the position and the reading state ("Line 12 of 400, 3%, Reading"); in screen-reader and hybrid modes it starts at the first cell, and lists cover the window with no border. List items say their place first ("3 of 12, Chapter two, level 2"), in all six languages. A prompt's line keeps its label short, so what you type starts within 40 cells. "Open it?" questions come before the folder or the address.
- Pages in a PDF. Go To takes a page (a plain number is a page in a PDF;
line 12is still a line;p ivgoes by the printed label). Say Position starts with the page, the title line shows it, and a PDF with no headings lists its pages in the outline. yandnanswer "Open it?" while a list is shown, in the window and over JSON-RPC as in the terminal.- Library search by author, DOI, and ISBN. The library list (Alt+L, GUI Ctrl+Shift+B) now filters as you type, and it and
tw library --searchmatch the title, path, author, DOI, ISBN, and text. A DOI or ISBN matches however it is written. The author, DOI, and ISBN come from the document (front matter, Word and EPUB authors, web page meta tags, a DOI or ISBN near the start of the text) and fromtw cite's record of the same work. - Star's settings profiles are imported by
tw migrate-star, one report line each. - Define word opens the dictionary file on a helper thread the first time, saying "Dictionary still loading." once; the list opens when it is ready.
- The statistics list stays open on its row when Enter turns statistics on or off.
- RSVP and flashing. A test checks RSVP at 1,500 words a minute against WCAG 2.3.1's three-flashes limit: the terminal box and the window's panel stay under the threshold, and a cap is ready for any frontend that draws much larger words.
- The screen reader guide's Braille section is written for the HumanWare Mantis Q40, with NVDA and JAWS braille settings to try and a checklist.
Documents and conversion
- LaTeX opens without Pandoc, in the reader and in
tw: numbered sections as headings, lists, tables with header rows, captions ("Table 1: ..."), math as math,\refnumbers and links to sections,\citeas citations, footnotes, code, your own\newcommandshortcuts, and\inputfiles from the document's own folder only. A command textweaver does not know is left out and its text read, and the document's warnings name it (ADR-0035). - Email (EML): the subject, then From, To, Cc, and the date with its weekday, then the message, with quoted lines read as a quote; attachments are listed with their sizes, not opened.
- Web pages saved as one file (MHTML, MHT) read as the page, with links leading to the pages they named on the web and pictures described by the descriptions saved with them.
- Math written in MathML in a web page is read as math, as it already was in EPUB books.
- A picture's description in a web page no longer runs into the next word.
- New messages, in all six languages: "it is not a readable LaTeX file", "... email message", and "... web archive", said after "Could not open".
- Summaries without a model.
tw summarize FILEprints a document's most central sentences, one per line, in document order (--sentences N,--json). In the reader, Summarize in the command palette lists them for the selection, the chapter at the cursor, or the whole document; Enter goes to a sentence and says it.[summary] sentencessets how many, 5 by default. The method is LexRank, written in-house, with no download (ADR-0037).
Math
- Math in braille files. In a build with MathCAT,
tw convert --to brfand the reader'sexport brfwrite math in the Nemeth Code (the default), between the Nemeth switch indicators inside UEB text, or in UEB mathematics with--math-code uebor[braille] math_code = "ueb". Lines stay 40 cells, and an indicator never ends up on a different line from what it belongs to. A formula MathCAT cannot write is written as its spoken words, and the summary says so once. See docs/math.md. - Explore math with MathCAT. With
math_engine = "mathcat", Alt+Shift+X moves through a formula with MathCAT's navigation; each step is said once, and the status line shows the braille of the part you reached, for a Braille display."builtin"stays the default and is unchanged. - MathCAT 0.7.6-rc.3 is vendored with the fix for its issue #827, which made math braille while exploring impossible in textweaver's builds. The fix is written up for upstream.
Writing and publishing
- Publishing templates for EPUB, Word, and PDF:
tw convert --template apa(an APA 7 student paper: title page, double spacing, APA headings, page numbers, hanging references),ama(an AMA 11 manuscript with a word count),large-print,dyslexia-friendly,high-contrast, andmanuscript. Headings, lists, tables, and descriptions stay exactly as a screen reader expects; the layout options still apply on top (ADR-0041). - Real Word footnotes. Footnotes in Word documents are Word's own: numbered by Word, at the foot of the page, and announced as footnotes by JAWS and NVDA. textweaver reads them back.
- An EPUB cover with every template: the title and author, described as "Cover: Title, by Author." and listed as the cover.
- Print page numbers in PDF. A PDF made from a document with print pages (a DAISY book, an EPUB page list, a scanned PDF) labels each page with its print page, so "go to page 42" in a PDF reader finds print page 42.
- Difficult-word definitions. With
[reading_aids] difficult_definitionson (off by default), difficult words marked, and high verbosity, a word move onto a difficult word also says its first definition from the define-word dictionary.
The GUI
- Parley 0.11.1, the text layout library, with no loss of speed or memory.
--graphics(or[gui] graphics) picks one graphics interface; Vulkan alone saves about 26 MB. - Syllables are drawn in the window (Alt+Shift+Z); the text a screen reader gets is unchanged.
- The voice manager works in the window (Ctrl+Shift+V).
- Yes-or-no questions are a dialog with Yes and No, answered with Y, N, or Escape for no.
- Every drawn label comes from the catalog, in all six interface languages, and changes live with the interface language. The settings dialog starts on a plain setting.
- Edit mode: caret and selection moves are spoken in self-voicing mode, Tab types a tab (Ctrl+Tab leaves the document), and misspellings are marked on screen.
- The GUI ships in the release:
textweaver-VERSION-windows-x86_64-gui.zip,textweaver-VERSION-macos-aarch64-gui.zip(textweaver.app, Apple silicon), and for Linux x86_64 and aarch64 an AppImage and a tarball whose names end in-gui. Supported on Windows; on macOS and Linux built and checked automatically, not yet heard with a screen reader. Each is attested and inSHA256SUMS.txt. See docs/install.md. - The GUI package now speaks with every engine the terminal package does: it carries the Eloquence, SAPI 5, and DECtalk engine hosts and the pronunciation dictionaries (Windows and Linux), the define-word dictionary, and every licence file, and on Windows it needs no Visual C++ runtime.
Speech and dictation
- Settings:
[speech.dectalk],[speech.piper],[speech.voice_params], and[editing] authorare typed settings, listed in the settings reference and the settings screen.[reading_aids.font] fetch_missing, which never did anything, was removed; an oldsettings.tomlline is dropped. The "every setting is used" test now checks the reading aids' own tables too. - Speed presets (F8) are said preset first: "Study, rate 200."
- Streaming dictation was measured on the in-process Whisper: for long speech, the first words can be committed about 3 seconds after speaking begins instead of at the end. It is planned for the next alpha.
Speed
- Large Markdown files open faster: 10 MB loads in about 275 ms instead of 420, with a sixth of the allocations, because the file is parsed once instead of twice.
- Reading a whole document from the top plans its speech faster: 10 MB in about 610 ms instead of 770.
Packages, CI, and checks
- The release workflow checks each GUI package before upload: the files,
--version, and a screenshot drawn without a display; on macOS also a silent reading in a background window. cargo xtask release VERSION --dry-runreports an empty changelog section with the other problems instead of stopping.- The nightly checks can pass again: the fuzz targets are built for glibc (the prebuilt cargo-fuzz defaulted to musl, where the sanitizer cannot link), the release-mode tests have time to finish, ...
textweaver 0.1.0-alpha.4
The fourth alpha. The keys follow NVDA's and JAWS's browse mode; textweaver speaks and shows its words in six languages; RTF and OpenDocument files open without Pandoc; Word comments and tracked changes are read; the Xilem GUI passed the owner's two screen reader sessions and draws the reading aids; and Linux gets AppImages for x86_64 and aarch64 (arm64), the first Linux packages. Changes from Wave 4 come first, by area; the additions since 0.1.0-alpha.3 from the earlier waves follow under Added, Changed, and Fixed.
Testing
- Listening check (Monday, September 28, 2026): the owner used the release build with NVDA and JAWS in two sessions. ETI-Eloquence read with the words highlighted correctly in the GUI; the owner's findings from the second session (a console window, the Open dialog, font and text size, button shortcuts) were fixed before this release. SAPI 5 and Eloquence wrote clean samples with
cargo xtask listen; DECtalk is not installed on the test machine. The owner's Braille display session comes in the next wave.
Keys: what changed
The default keys are now the quick navigation keys of NVDA's and JAWS's browse mode (the owner's decision). preset = "classic" under [keyboard] keeps the earlier keys; preset = "screen-reader" now means the default. Old key, then where its command went (terminal):
.next sentence:Alt+DownorAlt+...now says the sentence.,previous sentence:Alt+UporAlt+,.,now says the paragraph.ssay the sentence:.orAlt+Shift+S.sis the next separator.Shift+Ssay the paragraph:,.Shift+Sis the previous separator.lsay the line:Alt+Shift+L(GUICtrl+L).lis the next list.o,Shift+Olists:l,Shift+L.Shift+Hhistory back:BackspaceorAlt+Left.Shift+His the previous heading.Shift+Lhistory forward:\orAlt+Right.Shift+Lis the previous list.kscroll up:Shift+J.kis the next link.Shift+Klink address:Alt+Shift+K.Shift+Kis the previous link.q,Shift+Qquit:Ctrl+Q, which still asks.qis the next block quote.Alt+Down,Alt+Upnotes:F12,Shift+F12, ore,Shift+E.Alt+DownandAlt+Upmove by sentence.'and"notes: removed ("is Shift+2 on most non-US layouts).Alt+Shift+Dadd a reference (terminal):Alt+B, because Windows Terminal splits panes with it. The GUI keepsAlt+Shift+D.- RSVP faster and slower:
Alt+Shift+PageUpandAlt+Shift+PageDownas well, because Windows Terminal resizes panes withAlt+Shift+UpandAlt+Shift+Down. - New:
ggraphics,dsections or chapters,Ctrl+DownandCtrl+Upparagraphs,Alt+Shift+Qcitations,Alt+Shift+Xexplore math,Alt+Shift+Zsyllables,Alt+Shift+Jdifficult words.pstill moves by paragraph;Shift+Wstill says the position. 1to6and Shift with them follow the physical digit key on any layout: read from the console on Windows; the shifted digits of the US, UK, German, Spanish, Nordic, and Italian layouts elsewhere, and French with[keyboard] digit_row = "azerty".
See docs/keyboard.md.
The terminal reader and tw
- A yes-or-no question ("Quit textweaver? y or n", "Delete this note? y or n", "Reload it? y or n", the Piper download and every other one) is now spoken even while textweaver is reading aloud. It went to the status line only, so a self-voicing user heard the reading go on and the next key press vanished into the question.
- The first run says a one-line welcome after the document opens: the keys that read, stop, move by heading, open the help, and quit, named from the keymap in effect.
- Startup warnings (an unreadable settings file, a bad keymap line) follow the "Opened" message instead of cutting it off, and share the status line with it.
- "Could not open" is one plain sentence: a missing file names the file and its folder, a folder says it is a folder, and no operating system error code is read aloud.
tw text,tw info, andtw searchsay the same thing, andtw openrefuses a folder before the reader starts. - The F1 help names how to open a document and the library, the quick navigation keys (h, 1 to 6, l, i, t, k, q, s, g, d), the accessibility mode (Alt+Shift+A), single-key shortcuts (F9), the settings screen, choosing a voice, and restarting speech. Each line names at most two keys (the single key and a chord that works with single keys off), and a key bound in two layers is no longer read twice ("Tab or Tab").
- "No document is open. Press Control O ..." takes the key from the keymap.
textweaver --helpdescribes the reader and its first keys instead of "self-voicing ratatui frontend".tw text big.pdf | headno longer panics when the pipe closes;tw defineno longer prints its failure twice;tw markstakes--homelike the other commands.- Docs: lists no longer close on
q(a letter jumps to the next item), and Delete in the notes and highlights lists asks first. The findings and what is left are in docs/research/usability-terminal.md. - The title line says "Ready" until something is read, then "Stopped". A screen reader reading it at startup heard "Stopped".
- Keys named in messages are spoken by name by textweaver's own voice ("Control S", "Alt period"), so they are heard at every punctuation level; the status line and the screen reader keep the written form ("Ctrl+S"). Every key named in a message comes from the keymap.
- New: Repeat message (
', orAlt+'anywhere) says the last message again. Say status (z, orAlt+Endanywhere) says the last message, then the mode, the reading state, the position, the rate, and the speech engine. Both are in the command palette and heard over the reading. - In a list, F1 or Alt+End says the list's introduction again (its name, how many items, the keys it takes), then the item you are on.
- Escape in edit mode with nothing being read says "Still editing. Ctrl+E finishes."
- The command palette says "Command. Type part of a name; Tab completes, Up and Down list matches." when it opens.
- Messages said while the speech engine starts ("Opened", a settings warning, the welcome) are said once it is ready, in order, instead of being lost.
twwith no arguments prints a two-line hint and exits 0;tw --helpkeeps the full list.tw search --jsonandtw infono longer panic when a pipe closes.
Documents
- RTF and OpenDocument text (ODT, OTT, and flat FODT) open in the reader and in
twwithout Pandoc: headings, lists with their numbers, tables with header rows, footnotes, links, and pictures' descriptions. RTF in older code pages, such as Cyrillic and Japanese, reads correctly. Tryfixtures/c2/handout.rtfandfixtures/c2/notes.odt(ADR-0031). - Comments in Word and ODT files, with their replies and whether they are resolved, become notes on the text they are about when the document opens, so reading tells you when you reach one: "Note: Comment by Ada Example: say how salty." Try
fixtures/c2/comments.docx. - Tracked changes in Word, ODT, and RTF files:
[reading] revisions = "marked"says each change where it is, "(deleted by Ada Example: three) (inserted by Ada Example: five)";"final"reads the text with every change accepted, as before;"auto", the default, says them at high verbosity. - Word, OpenDocument, EPUB, and PowerPoint files with more than 50,000 files inside, overlapping files, or a file that claims to unpack to more than 1,000 times its size are refused, and no package unpacks past 1 gigabyte.
- A damaged RTF or ODT file is named plainly: "Could not open notes.odt: it is not a readable OpenDocument text file; it may be damaged."
- Zip archives, and the EPUB and Word files built on zip, open whatever compression their members use: deflate, bzip2, LZMA, XZ, and PPMd, all in pure Rust. A member that says it is larger than 256 MB is refused before it is unpacked.
- EPUB 3 books: MathML is read as math, using the book's TeX when a formula carries it; a formula with only
alttextis read as that text, and anepub:switchis read once.
Math
- Math can be spoken by MathCAT, the engine NVDA and JAWS use, in ClearSpeak or SimpleSpeak, at the math verbosity, in the document's language:
[reading] math_engine = "mathcat"or"mathcat_simplespeak"("Math speech" in the settings screen). It needs a build with the newmathcatfeature, which is off by default; textweaver's own math speech stays the default and the fallback. The highlight covers the whole formula while MathCAT reads it (ADR-0029). - New crate
textweaver-mathcaton MathCAT 0.7.6-rc.3, pinned exactly. Braille (Nemeth and UEB) waits for MathCAT issue #827 to be fixed in a release. - Math as Unicode in the reading view (
x²,√2,1⁄2), as Star showed it:[reading] math_display = "unicode", or "Math on screen" in the settings list. Speech, edit mode, and math exploration use the source. Tryfixtures/g/math.md.
Writing and notes
- Markdown lint in edit mode: Ctrl+F8 and Ctrl+Shift+F8 select the next or previous problem and say it, "Lint: heading level 3 after level 1; use level 2." Five rules: heading levels, list markers, trailing spaces, link references without a definition, and bare web addresses.
tw lint FILE...checks files and exits 1 when there are problems. textweaver's own rules, not rumdl (ADR-0032). - Copying works in terminals without OSC 52 (the old Windows console, macOS Terminal, GNOME Terminal and other VTE terminals): textweaver puts the text on the system clipboard itself and says so the first time. Over SSH and in tmux it still uses the terminal.
- Notes and highlights export as BibTeX, BibLaTeX, RIS, or CSL-JSON records for Zotero or Pandoc:
tw marks FILE --export ris --output notes.ris. - Moving the caret onto a code block's first line names its language: "code, Python".
- Code blocks are highlighted in the terminal ...
textweaver 0.1.0-alpha.3
The first release with downloadable packages: Windows (x86_64) and macOS (universal, not notarized). Start with the quick start (QUICKSTART.md in each package); docs/install.md has the details.
Added
- Edit mode in the terminal reader. It has typing echo, Markdown formatting commands, undo and redo, and find and replace. Autosave snapshots are offered back after a crash.
- Notes and highlights. Add, list, step through, and delete notes. Highlight the selection or sentence. Notes and highlights move with your edits.
- Quitting asks first. It says "Quit textweaver? y or n". Press y to quit; n, a, or Escape cancels. Deleting a note asks the same way.
- Single-key shortcuts can be turned off (F9), so dictation and typing never trigger commands. Every command stays reachable with a modifier key or the command palette.
- Library support: library folders, recent files, and a bookshelf.
tw libraryandtw markslist them.tw migrate-starimports settings, positions, bookmarks, notes, highlights, and the bookshelf from Star. - Audio export.
tw export-audiowrites WAV, or MP3 and M4B with chapters when ffmpeg is installed. It also writes SRT or WebVTT subtitles with sentence or word cues. - speech-dispatcher backend (Linux), with an index mark before every word for exact highlighting.
- One engine host for all out-of-process engines. It runs Eloquence and SAPI5 in both 64-bit and 32-bit builds.
cargo xtask hostsbuilds them all. - Obsidian vault export and import (
tw vault) and dictation through a Whisper subprocess (tw dictate). - JSON-RPC server (
tw serve --stdio) and the in-process reader (tw open). - Community pronunciation lexicon from the IBMTTS dictionaries. It is off by default and used only with engines that do not normalize text themselves.
- Release packaging:
cargo xtask dist, and a workflow that builds the macOS package.
Changed
- Speech statuses carry a reading generation, so a status from an earlier reading can never move the highlight.
- Code Factory's Eloquence (installed with some screen readers) is used only when you opt in with
TEXTWEAVER_ECI_CODE_FACTORY=1. Its SAPI voices are hidden unless you opt in the same way.