VNote
app.vnote.fun/en_us Windows, MacOS, LinuxA 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.
- Homepage: app.vnote.fun/en_us
- GitHub: github.com/vnotex/vnote
- Web info: web-check.xyz/check/app.vnote.fun
VNote Source Code
Author
Description
A pleasant note-taking platform in native C++.
Homepage
https://app.vnote.funLicense
LGPL-3.0
Created
05 Oct 16
Last Updated
12 Jul 26
Latest version
Primary Language
C++
Size
71,540 KB
Stars
12,853
Forks
1,300
Watchers
12,853
Language Usage
Star History
Top Contributors
-
@tamlok (2873)
-
@feloxx (28)
-
@miurahr (16)
-
@dbkuaizi (7)
-
@Schips-Wong (5)
-
@xianzhon (5)
-
@henices (5)
-
@BeyondXinXin (4)
-
@tanle (3)
-
@tootal (3)
-
@fengwenhua (3)
-
@ygcaicn (2)
-
@LuoshuiTianyi (2)
-
@faveoled (2)
-
@akkuman (2)
-
@SugarWong97 (2)
-
@Integral-Tech (2)
-
@Erk- (2)
-
@SilverBut (1)
-
@Hijack-Everything (1)
-
@thomaskoppelaar (1)
-
@itviewer (1)
-
@YiChuJun (1)
-
@rothleer (1)
-
@MrHate (1)
-
@haipengno1 (1)
-
@plopop (1)
-
@hlyang1992 (1)
-
@llccde (1)
-
@zeroleo12345 (1)
-
@sclaire-1 (1)
-
@uRickLee (1)
-
@syhily (1)
-
@HelloWorld886 (1)
-
@Limosine (1)
-
@Nriver (1)
-
@kinka (1)
-
@jonmseaman (1)
-
@KenTsuRinn (1)
-
@shakna-israel (1)
-
@Igetin (1)
-
@hzhu212 (1)
-
@zirnc (1)
-
@nekoctl (1)
-
@geoffreycheungr (1)
-
@tani (1)
-
@Cedric-M (1)
-
@AlbinZhang (1)
-
@0xflotus (1)
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
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
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
VNote Reviews
More Digital Notes
-
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.
Not Open Source -
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.
-
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
-
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.
-
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
Not Open Source -
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.
-
A secure, collaborative notebook. Self-host it yourself, or use their hosted plan (free edition or $3/ month for premium).
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!