✨ Highlights
🔒 Filesystem access hardening
The webview no longer holds read/write/delete permissions for the whole disk.
- Access is granted per action: picking a file or folder in the native
dialog, opening a file via the OS ("Open With", double-click), or dropping a
file into the window grants access to that document and its folder — nothing
else. Grants persist across restarts. - Dialogs now run on the Rust side, so a compromised page script cannot
mint grants for arbitrary paths. - Secrets are always off-limits:
~/.ssh,~/.aws,~/.gnupgand the
macOS Keychain are denied even inside granted folders. - If a file is out of scope, Texodus offers the file dialog pre-navigated to
it — one pick re-grants access (this is also the 3.x migration path).
💾 Auto-save & external change tracking
- Optional auto-save (Settings): edits are written ~1.5 s after you stop
typing, and flushed before tab switches, closes and opens. - Open files are watched for external changes: clean documents reload
automatically; if you have unsaved edits, a three-way prompt lets you keep
your version, reload, or overwrite. - The workspace tree refreshes itself when files appear, move or vanish on
disk.
⚡ Quick Open
- Cmd/Ctrl + P (or File → Quick Open…) opens a fuzzy-search palette over
every Markdown/text file in the workspace — including folders the
sidebar hasn't expanded yet.
🗂 Tabs: session restore & polish
- In tabs mode the window restores your open tabs from the previous
session. - Drag to reorder, duplicate tab, dirty indicators, middle-click close,
and a context menu with Close Others / Close Tabs to the Right. - Re-opening an already-open file now focuses its existing tab instead of
creating a duplicate buffer.
🔗 Local links in the preview
- Clicking a relative or absolute link to a local Markdown file opens it
in-app (tab or window, following your document mode); other local files
open with their default application.
🎨 Improvements
- Smarter preview rendering — edits now patch only the changed blocks
instead of rebuilding the whole document: no flicker on large files, and
Mermaid diagrams keep their zoom/pan state while you type around them. - Real syntax highlighting in the preview for Python, Rust, Go, SQL, YAML,
TypeScript and ~30 more languages (loaded on demand), matching the editor
pane. - PDF export embeds local images; HTML export is fully self-contained and
no longer does the heavy rendering before you've even picked a save path. - Word count & reading time are now computed on the visible prose —
Markdown syntax, URLs, code blocks and frontmatter no longer inflate them. - Whole-word search works with Cyrillic and other non-Latin scripts in the
preview pane. - Multi-select "Open With" on Windows/Linux opens every selected file, not
just the first. - Dropping files onto the sidebar copies them into the workspace — now
with an overwrite confirmation instead of silently replacing same-named
files. - Native menus rebuild only when their content actually changes — snappier
window switching. - Changed shortcuts (to stop them colliding with menu accelerators):
Insert Table is now ⌥⌘T / Ctrl+Alt+T, Horizontal Rule is
⌥⌘R / Ctrl+Alt+R.
🐛 Fixes
- File → Quick Open… did nothing when clicked with the mouse.
<u>underline</u>from the Underline command was stripped from the preview
and HTML export.- Task-list checkboxes could toggle the wrong item when the document contained
raw HTML<input>elements. - Overlapping preview renders could race and drop the scroll-sync anchors.
- Session restore could leave a stray blank tab when the first saved file had
been deleted, and relative images in restored tabs didn't render. - Cmd/Ctrl+T inserted a table and opened a new tab, depending on mode.
- The "Copied N files" toast counted files that failed to copy.
🧰 Under the hood
- New
tauri-plugin-persisted-scopekeeps runtime file-access grants across
restarts; all"**"filesystem scopes removed from the capability file. - Preview language highlighting ships as ~37 tiny lazy-loaded chunks.
- Test suite grew to 330+ tests (Vitest + Rust);
eslint .runs clean
again from the repo root. - Dead code removed; duplicated path/scope helpers consolidated into the
stores.