VNote

app.vnote.fun/en_us
VNote

A free, open-source note-taking application built with Qt, focused on providing a pleasant Markdown editing experience. It manages notes directly as plain text files on your local system.

Open Source

VNote Source Code

Author

vnotex

Description

A pleasant note-taking platform in native C++.

#editor#markdown#mathjax#note#note-taking#uml#vim#vnote

Homepage

https://app.vnote.fun

License

LGPL-3.0

Created

05 Oct 16

Last Updated

12 Jul 26

Latest version

v4.1.1

Primary Language

C++

Size

71,540 KB

Stars

12,853

Forks

1,300

Watchers

12,853

Language Usage

Language Usage

Star History

Star History

Recent Commits

  • Le Tan (09 Jul 26)

    feat(activity): track focus time and note activity via vxcore Add ActivityService that computes app-focus duration (batched, ~60s cadence plus focus-lost/close flush) and forwards note reads on FileAfterOpen into vxcore's activity.db. Recording is in-memory and cheap; the periodic flush is the only disk write, keeping I/O off the UI hot path. Bump the vxcore submodule pointer. - core/services/activityservice: focus tracking + FileAfterOpen -> vxcore_activity_record_read + periodic/close vxcore_activity_flush - main.cpp: construct/register ActivityService before MainWindow2 so it catches MainWindowAfterStart; flush on aboutToQuit - libs/vxcore: activity tracking storage and API

  • Le Tan (09 Jul 26)

    Remove markdown editor OverrideFont option and its settings UI

  • Le Tan (09 Jul 26)

    feat(unitedentry): add "windows" entry for open view windows Add a two-level "windows" united entry listing known workspaces (visible and hidden) with their open view windows; activating a window focuses it, surfacing a hidden workspace if needed. Enumeration and focus go through an injected IViewWindowNavigator implemented by ViewAreaController and set on UnitedEntryMgr by MainWindow2.

  • Le Tan (09 Jul 26)

    Show ImageHost toolbar button only in edit mode

  • Le Tan (08 Jul 26)

    feat(settings): add Sync page and move auto-sync interval to it Introduce a dedicated Sync settings page (slug "sync") placed above the File Associations page, and relocate the Auto-sync interval spin box from the General page onto it. Update the settings slug test (index + unique count) and CMake wiring accordingly.

  • Le Tan (08 Jul 26)

    feat(sync): default auto-sync interval to 120s Raise the default autoSyncDebounceSeconds from 60 to 120. Update the ConfigCoreService getter fallback to match the vxcore ctor default and bump the vxcore submodule pointer to the corresponding change.

  • Le Tan (08 Jul 26)

    feat(editor): re-add In-Place Preview toggle to Markdown toolbar Re-add the runtime In-Place Preview toggle button (default on, edit-mode only) to MarkdownViewWindow2's toolbar, migrated from the legacy MarkdownViewWindow. The toggle drives MarkdownEditor::setInplacePreviewEnabled and stays in sync via a runtime member re-applied on lazy editor creation. Refs #2709

  • Le Tan (08 Jul 26)

    fix(unitedentry): reshow popup when app regains focus The popup is a parentless Qt::Tool window that Windows hides natively on app deactivation while United Entry stays activated, so clicking back into the input left it hidden until focus cycled through another widget. Restore the existing popup on QGuiApplication::applicationStateChanged and on an input click via hide()+show()+raise() without calling processInput(), so an in-flight async entry (e.g. find) is not cancelled. Gate the re-map on a real deactivation (m_popupNeedsRestore) so repeated clicks while the app stays active do not flash the already-visible popup.

  • Le Tan (08 Jul 26)

    feat(unitedentry): resolve completed entry name by unique prefix Once an entry name is completed with a space, resolve it by unique prefix: exact match wins, an unambiguous prefix dispatches its entry, and an ambiguous prefix or no match keeps the existing Unknown entry popup. Resolution is internal only; the visible input is never rewritten and the alias real-target lookup stays exact.

  • Le Tan (08 Jul 26)

    feat(mainwindow): show current note name in system title bar When the system title bar is in use, MainWindow2 sets the OS window title to "<current note name> - VNote", tracking tab switches, live renames, and tab close (falling back to "VNote" when no note is open). Frameless custom-title-bar mode keeps the static title. Restores the v3-style window title behavior. Refs #2708

  • Le Tan (09 Jul 26)

    update translations

  • Le Tan (08 Jul 26)

    fix(startup): lazy-start search/imagehost worker threads to avoid pre-QApplication QEventLoop warning SearchService and ImageHostService started their worker QThread in their constructors, which run before the QApplication is created in main(). The default QThread::run() calls exec(), constructing a QEventLoop while QCoreApplication::instance() is still null, emitting "QEventLoop: Cannot be used without QCoreApplication". Defer moveToThread + start() to a lazy ensureWorkerThreadStarted() invoked on first async use (always after the app is running). Parent the worker to the service so a session that never searches/uploads still reclaims it via QObject child deletion; unparent before moveToThread on first start so the existing finished->deleteLater cleanup owns it thereafter.

  • Le Tan (08 Jul 26)

    fix(unitedentry): select first history result by default like Find

  • Le Tan (08 Jul 26)

    fix(editor): bump vtextedit for block quote inline highlight offset fix Pulls in vtextedit fix correcting inline code/strong highlight positions on block quote continuation lines (cmark block_offset over/under-reporting).

  • Le Tan (07 Jul 26)

    chore(release): bump version to 4.1.1

  • Le Tan (07 Jul 26)

    docs: add v4.1.1 changelog entry

  • Le Tan (07 Jul 26)

    fix(editor): bump vtextedit to fix cmark emoji surrogate split Pulls in vtextedit cd01941: the cmark AST walker was converting cmark's inclusive byte-based end_column with a blind +1, splitting a trailing/adjacent emoji's surrogate pair in styled spans (e.g. headings) into tofu boxes in the markdown editor. Adds a width-aware conversion and regression tests; no golden-master output changes.

  • Le Tan (07 Jul 26)

    fix(export): size wkhtmltopdf MathJax via scale, not the no-op minScale Follow-up to c3e72cfd. That commit plumbed a MathJax `minScale` option to floor the auto font-match at 1.0 for the wkhtmltopdf export, based on a wrong premise: MathJax v3's SVG output has no matchFontHeight, so `minScale` never takes effect there. Measuring rendered equation height across scale/minScale combinations in Chromium (the same engine VNote's WebEngine uses to render the math that is then handed to wkhtmltopdf) confirmed it: minScale 0.5, 1.0 and 1.25 render identically, while the math size tracks `scale` exactly (ratio == scale). So the only real effect of the previous change was dropping scale 2.5 -> 1.0, which shrank math to Latin-text size -- too small next to CJK glyphs in CJK-heavy notes. - Revert the no-op mathJaxMinScale plumbing (struct fields in MarkdownWebGlobalOptions and MarkdownParas, the toJavascriptObject() emit, both generateMarkdownViewerTemplate builders, and the mathjax.js svg block). - Set mathJaxScale = 1.5 for the wkhtmltopdf path only, so math renders at 1.5x body text: readable in print without the old 2.5x excess. Preview and Qt WebEngine printToPdf stay at the MathJax default (-1). - Document in-code that scale is the only effective lever for SVG output so minScale is not reintroduced.

  • Le Tan (07 Jul 26)

    fix(export): correct wkhtmltopdf MathJax sizing with minScale floor wkhtmltopdf's old headless Qt-4 WebKit mis-measures the surrounding text's ex-height, so MathJax shrinks each equation to its minScale floor (0.5). The previous fix blindly multiplied by a magic scale of 2.5, which combined with that floor over-enlarged math to ~1.25x the surrounding text. Replace the magic 2.5 with a root-cause fix: raise MathJax's SVG minScale floor to 1.0 so math cannot be shrunk below text size, and drop scale back to its default. Scoped to the wkhtmltopdf export path only; on-screen preview and the Qt WebEngine printToPdf path are behaviorally unchanged (they emit the -1 sentinel and fall back to MathJax's default 0.5). - Plumb a new mathJaxMinScale global option exactly like mathJaxScale (MarkdownWebGlobalOptions + MarkdownParas, both generateMarkdownViewer Template copies, and toJavascriptObject()). - mathjax.js: honor window.vxOptions.mathJaxMinScale, defaulting to MathJax's documented 0.5 when absent (sentinel -1). - webviewexporter: set mathJaxMinScale = 1.0 for wkhtmltopdf and -1 otherwise; set mathJaxScale = -1 (removing the 2.5).

  • Le Tan (06 Jul 26)

    chore: gitignore .kilo/ and .superpowers/ agent tooling dirs

  • Le Tan (06 Jul 26)

    test(sync): de-flake SyncWorkQueueManager cap/coalesce tests capEnforcement, coalesceWithSameKey and coalescePrecedenceOverCap raced the pool worker: each enqueued a first item then synchronously enqueued more, assuming the first stayed pending. Under CI load the worker dequeued it first, so a later same-key enqueue saw an empty queue and returned Accepted instead of Coalesced (intermittent CI-Linux failure at test_sync_workqueue_cap_coalesce.cpp:130; the immediate re-run passed). Force an in-flight item via testForceInFlight(id, true) before enqueuing. enqueue() only launches a worker when !running, so no worker is dispatched, the pending queue is never drained, and the coalesce/cap return values are computed against a stable queue. The real enqueue() coalesce and cap branches are still exercised; only worker dispatch is suppressed. Also make coalescePrecedenceOverCap set maxDepth=1 so the single pending item is actually AT cap, and assert a distinct key returns QueueFull, so the test genuinely proves coalescing short-circuits the cap only for a matching key. Drop the now-unused QThread include / msleep.

  • Le Tan (06 Jul 26)

    fix(export): pin MathJax SVG viewport to stop squeezed PDF equations Follow-up to #2701 and 48e77d36. Display equations whose MathJax root <svg> is sized in page-relative units (width="100%", height in ex) and wrap a nested <svg data-table> (matrices/aligned equations) rendered squeezed in exported PDFs: loaded as a standalone image the relative units have no containing block and collapse to a default size. - Narrow convertAllSvgToPng's selector to 'mjx-container > svg' so only each equation's root svg is rasterized; the nested inner svg is captured within the root and scales to fill its pinned viewport. - Measure getBoundingClientRect() first, then serialize a detached clone with width/height pinned to the measured CSS pixels (the export body is sized to the print page), recreating the exact on-page viewport. The live DOM is left untouched until replaceChild.

  • Le Tan (07 Jul 26)

    fix(export): scope MathJax PNG rasterization and harden PDF export (#2707) Follow-up to #2701. - Scope convertAllSvgToPng to 'mjx-container svg' so only MathJax output is rasterized. Other inline SVGs (Mermaid/Graphviz/Flowchart/WaveDrom) stay vector and avoid the Mermaid foreignObject canvas taint that made toDataURL() throw and hang the export. - Harden the per-equation onload path with try/catch/finally so a single failure always decrements the pending counter and can never strand the pdfRenderReady signal. - Preserve on-screen color by inlining computed currentColor; scale the raster by devicePixelRatio (min 2x) for crisper output. - Add a bounded 30s wait around pdfRenderReady so a missing callback falls through to printToPdf instead of freezing the export; bind the connection to a context object. - Strip accidental UTF-8 BOM from webviewexporter.cpp and exportdialog2.cpp.

  • llccde (07 Jul 26)

    fix: PDF export MathJax SVG-to-PNG conversion and render-ready signaling (#2701) Closes #2681 Co-authored-by: meNmae <me>

  • Le Tan (06 Jul 26)

    fix(startup): merge QTWEBENGINE_CHROMIUM_FLAGS instead of overwriting (#2705) Two qputenv() calls each overwrote QTWEBENGINE_CHROMIUM_FLAGS: --disable-logging was lost on Linux, and both erased any user-set value, removing the only env-var way to pass Chromium workaround flags (e.g. --single-process / --disable-gpu) that mitigate distro-specific QtWebEngine crashes like the extension-manifest abort on Ubuntu 26.04. Replace disableSandboxIfNeeded() and the early qputenv with buildChromiumFlags(), which merges VNote defaults (--disable-logging everywhere, --no-sandbox on Linux) into the user value, appending each flag only if absent (whole-token match incl. --flag=value); --enable-logging opts out of --disable-logging. Docs updated.

  • Le Tan (05 Jul 26)

    feat(vxcore): bump submodule to read raw node timestamps from the filesystem

  • Le Tan (05 Jul 26)

    fix(vxcore): bump submodule to preserve raw node metadata across rename Pulls in vxcore b133376: RawFolderManager rename no longer wipes a raw node's per-node metadata (Mark textColor/backgroundColor) to "{}".

  • Le Tan (05 Jul 26)

    chore(vxcore): bump submodule to fix stale buffer-provider comment Doc-only submodule change: CreateBufferProvider header comment now reflects that raw notebooks receive a StandardBufferProvider. vxcore 01dab55..3ca39ec.

  • Le Tan (05 Jul 26)

    fix(vxcore): bump submodule to enable image paste in raw notebooks Attach StandardBufferProvider to raw-notebook buffers so asset writes (image paste, drag-drop) succeed; attachments stay unsupported for raw. vxcore 0342b5e..01dab55. Refs vnotex/vnote#2703

  • Le Tan (02 Jul 26)

    chore(vxcore): bump submodule to add search-validate diagnostic tool

VNote Security

4.5/10

Repo Security Summary

Updated 29 Jun 26

  • Maintained 10/10
  • Security-Policy 10/10
  • Code-Review 0/10
  • Packaging N/A
  • CII-Best-Practices 0/10
  • Dangerous-Workflow 10/10
  • Token-Permissions 0/10
  • SAST 0/10
  • License 10/10
  • Binary-Artifacts 10/10
  • Pinned-Dependencies 0/10
  • Branch-Protection N/A
  • Signed-Releases 0/10
  • Fuzzing 0/10

Security Advisories (2)

  • high Patched CVSS 8.6

    CVE-2024-41662 Markdown XSS leads to RCE

  • high Patched

    CVE-2024-39904 Code Execution Vulnerability via Local File Path Traversal in Vnote

VNote Website

Website

Viki - A simple Wiki page in Markdown from notebook of VNote

Redirects

Does not redirect

Security Checks

1 security checks failed (64 passed)

  • Top-Level Domain Highly Abused

Server Details

  • IP Address 185.199.108.153
  • Hostname cdn-185-199-108-153.github.com
  • Location California, Pennsylvania, United States of America, NA
  • ISP GitHub Inc.
  • ASN AS54113

Associated Countries

  • US US

Safety Score

Website marked as risky

70%

Blacklist Check

app.vnote.fun was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

VNote Reviews

More Digital Notes

  • Cryptee

    Cryptee

    crypt.ee

    Private & encrypted rich-text documents. Cryptee has encryption and anonymity at its core, it also has a beautiful and minimalistic UI. You can use Cryptee from the browser, or download native apps. Comes with many additional features, such as support for photo albums and file storage. The disadvantage is that only the frontend is open source. Pricing is free for starter plan, $3/ month for 10GB, additional plans go up-to 2TB.

    No Security Audit Not Open Source cryptee/web-client
  • Joplin

    Joplin

    joplinapp.org

    Cross-platform desktop and mobile note-taking and todo app. Easy organisation into notebooks and sections, revision history and a simple UI. Allows for easy import and export of notes to or from other services. Supports synchronisation with cloud services, implemented with E2EE.

    Security Audited Open Source laurent22/joplin
  • Logseq

    Logseq

    logseq.com

    Privacy-first, open-source knowledge base that works on top of local plain-text Markdown and Org-mode files. Supports lots of different note modes, including task management, PDF annotation, flashcards, whiteboards strong markdown support and more. Includes themes and extensions, backed by a strong community

    No Security Audit Open Source logseq/logseq
  • Notable

    Notable

    notable.md

    An offline markdown-based note editor for desktop, with a simple, yet feature-rich UI. All notes are saved individually as .md files, making them easy to manage. No mobile app, built-in cloud-sync, encryption or web UI. But due to the structure of the files, it is easy to use your own cloud sync provider, and additional features are provided through extensions.

    No Security Audit Open Source notable/notable
  • Obsidian

    Obsidian

    obsidian.md

    A powerful knowledge base that works on top of local plain-text Markdown files. It has a strong community, and a lot of plugins and themes. Generally privacy-respecting, but no encryption out of the box, and some of the code is obfuscated or not fully open source

  • Standard Notes

    Standard Notes

    standardnotes.com

    S.Notes is a free, open-source, and completely encrypted private notes app. It has a simple UI, yet packs in a lot of features, thanks to the Extensions Store, allowing for: To-Do lists, Spreadsheets, Rich Text, Markdown, Math Editor, Code Editor and many more. You can choose between a number of themes (yay, dark mode!), and it features built-in secure file store, tags/ folders, fast search and more. Standard Notes is actively developed, and fully open-source.

  • Turtle

    Turtle

    turtlapp.com

    A secure, collaborative notebook. Self-host it yourself, or use their hosted plan (free edition or $3/ month for premium).

    Security Audited Open Source turtl/desktop

About the Data: VNote

Change History

API

You can access VNote's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/vnote

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share VNote

Help your friends compare Digital Notes, and pick privacy-respecting software and services.
Share VNote and Awesome Privacy with your network!

View Digital Notes (8)