A feature release that adds a built-in updater, a reworked PDF viewer, detachable view windows, and a Gitee release mirror on top of VNote 4.3.0:
- In-app updates (new, Windows x64, Qt 6 build): VNote can now update itself
- Downloads only what changed — a release publishes a signed file manifest plus an optional delta package, and the client resolves a delta chain before falling back to the full package
- Every manifest is verified against a compiled-in Ed25519 key; an unsigned or unverifiable release is refused (fail-closed), and hosts are allow-listed per release source
- Files are staged inside the install directory and swapped in under a durable write-ahead journal at exit, with automatic rollback and crash recovery on the next launch
- A machine-wide lease serializes updates across sessions; Microsoft Store and Program Files installs are detected and directed to their own update channel
- Surfaces as an Update dialog (Update / Skip This Version / Later / Restart Now) and a startup notification with inline progress
- Update source setting (Settings › General) to fetch updates from either GitHub or Gitee
- The Windows 7 (Qt 5.15) build publishes no update packages; there the check simply points at the release page
- PDF viewer
- Upgraded the bundled pdf.js from 3.1.81 to 3.11.174 (the last v3 release; v4+ requires Chrome 125+, which the Qt 5.15 / Windows 7 build cannot provide), and vendored the previously-missing
web/standard_fonts/so PDFs relying on non-embedded Helvetica/Times/Courier render correctly - The PDF's embedded outline (bookmarks) now populates the Outline dock and a new per-window Outline toolbar popup, with click-to-jump
- Fix the external file path not resolving for drag-and-dropped PDFs
- Upgraded the bundled pdf.js from 3.1.81 to 3.11.174 (the last v3 release; v4+ requires Chrome 125+, which the Qt 5.15 / Windows 7 build cannot provide), and vendored the previously-missing
- Views & windows
- Detach a view window into a separate top-level window from the tab context menu
- New
--detached-viewCLI option to open files directly in a detached split Ctrl+G, Xcloses the focused dock or, when the editor has focus, the current tab- The Console dock activation shortcut is now configurable
- Notifications: attention routing, incident de-duplication, and a toast surface, so repeated failures (image upload, auto-save, sync) collapse into one actionable entry with a Details view
- Editor & Markdown
- Offer to migrate a note's legacy
vx_imagespictures into its assets folder, with an inline banner and a Don't Ask Again choice - Edit-mode Copy Link action for headings
- Offer to migrate a note's legacy
- United Entry: new
taskentry to find and run tasks, a popup sized from the UI font and clamped to the screen, and a readable selected task row - Settings: a Quick Note scheme can now use a note template
- macOS: capture selected text from any app as a note through a system Service
- Tags:
Escclears the selection in the Tags explorer - Fixes
- Recover from a partially-installed bundled resource set instead of leaving stale data behind
- Keep the frameless title bar out of Qt's menu-bar slot eviction
- Fix the export dialog not remembering the last-used theme (#2389)
- Fix enable-sync failing on macOS when opening a remote notebook (#2718)
- Stop duplicating legacy attachments during VNote3 migration
- UTF-8-safe
.vswpbackup path (#2721) - Bundle the MSVC CRT for toolsets newer than CMake's redistributable list
- Use Git Bash explicitly in
init.cmdinstead of relying on WSL bash - Remove the version-specific config override logic
- Internals
core_servicesno longer links VTextEdit or Qt Widgets- Inline chrome is themed through the stylesheet instead of hardcoded colors, with a test gate that fails the build on literal colors in
setStyleSheet()
- Infrastructure: code and releases are mirrored to Gitee, keeping the two most recent releases
- Packaging (Windows): the release ZIP is now flat —
VNote-<ver>-win64/vnote.exeinstead ofVNote-<ver>-win64/bin/vnote.exe. Thebin/level was unintended (src/CMakeLists.txtasked for a flat install, but a submodule'sinclude(GNUInstallDirs)seeded the CMake cache first) and it is incompatible with the incremental updater, which strips exactly one level from a full package - Translations: updated Simplified Chinese and Japanese translations