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://docs.vnote.fun

Repository

  • LicenseLGPL-3.0
  • Created05 Oct 16
  • Primary languageC++
  • Size51,895 KB
  • Stars12,896
  • Forks1,296
  • Watchers12,896

Language Usage

Language Usage

Project Health

  • Last commit2 minutes ago
  • Open issues467
  • Latest releasev4.4.3

Recent Commits

  • Le Tan(16 Aug 26)

    [Release] VNote 4.5.0

  • Le Tan(16 Aug 26)

    chore(libs): bump vtextedit to 9284c43

  • Le Tan(16 Aug 26)

    feat(dashboard): direct-manipulation move/resize for stickers Unlocked stickers now carry an edit-mode overlay with eight resize handles and a centre move affordance, replacing the header Move menu and the resize dialog. Drag the centre to move, an edge or corner to resize; a ghost shows the candidate cell region and the geometry is committed once, on release. DashboardController gains previewStickerGeometry(), which normalizes a requested geometry exactly as setStickerGeometry() does and reports whether it is committable. setStickerGeometry() now calls it, so the board-bounds clamps and the reject-on-collision policy live in exactly one place and the ghost always shows what a commit would produce. Out-of-bounds drops clamp; drops onto an occupied region are rejected. StickerDragOverlay and StickerDropIndicator are leaf presentational widgets with no ServiceLocator: the board resolves the accent/invalid colors and the tinted move.svg icon from ThemeService and injects them, and re-injects on a theme change, so nothing here needs a stylesheet or a color literal. The overlay is also the keyboard route, since the removed menu and dialog were the only keyboard-operable affordances: it is focusable, arrow keys move and Shift+arrows resize, both committed through the same controller path as a drag. Locked mode is unchanged and creates no overlay at all. Coverage: test_stickerdraggeometry (pure hit-zone and drag-target math), test_stickerdragoverlay (gestures, keyboard, input swallowing, geometry syncing) and test_dashboardcontroller_preview (preview/commit parity across unknown id, self-exclusion, collision, and every clamp).

  • Le Tan(16 Aug 26)

    feat(views): scroll horizontally when tree labels overflow Node explorer, outline pane and tags explorer now show a horizontal scrollbar when an item label is wider than the panel, instead of only eliding it. Add TreeHorizontalScrollHelper, which disables the hidden header's stretchLastSection and keeps column 0 at max(viewport width, content width) so hit testing, drop targeting and full-row painting still cover the whole viewport. Recomputes are coalesced and rebound across model swaps. Also make NotebookNodeDelegate::sizeHint content-based (it returned a hardcoded 200) and anchor navigation-mode labels to the widget's right edge so they no longer drift off-widget once scrolled.

  • Le Tan(16 Aug 26)

    feat(theme): add LaTeX Light and LaTeX Dark paper themes Two new bundled themes that give the Markdown viewer, editor and export a typeset-article look: serif body text with a 46em measure, 1.618 leading, a weight-led heading scale with no colored headings or underline rules, booktabs-style tables (no vertical rules, no zebra) and a boxed blockquote. Both are forked from `pure` -- the fallback theme and the one with the best palette-token coverage -- so `interface.qss` is carried over unchanged and every other file is re-authored against a fresh palette. `web.css` and `text-editor.theme` are fully tokenized and share heading, link, inline-code, blockquote and search colors, which is what the concept-parity gate asserts. No fonts are bundled. The stacks ask for Latin Modern first and fall back through Times/Georgia and Consolas, so the themes are usable out of the box; each theme README documents that installing Latin Modern (and Noto Serif CJK) gives the intended look. The design is inspired by Keldos-Li/typora-latex-theme, but nothing is ported from it: that project is GPL-3.0 and VNote is LGPLv3, so no CSS, SCSS, selectors, comments, generated CSS or assets were copied or adapted. The attribution and no-reuse note lives in each theme README. Deliberately out of scope: CSS section numbering (VNote numbers the outline only, behind `outlineSectionNumberEnabled`, so viewer counters would be unconditional and out of step with the preference), print page geometry, and justified text (WebEngine does not hyphenate). Palette notes: both themes introduce a `fg_on_master` role so text over the accent is chosen rather than inherited from `bg3_6`, which would be dark-on-dark in a dark palette. For the same reason latex-dark overrides `base.content.selection.fg` and `base.danger.fg`, and both themes replace `pure`'s 50%-alpha external-node text and its light-tuned status-bar chip backgrounds, which fell well below the contrast floor once composited. Gating: * `test_extra_qrc_coverage` grows a two-way disk<->qrc slot for the two theme folders. A theme is ~33 hand-added <file> lines and a missed SVG fails silently -- the control just renders without its indicator. The expected set is derived from the directory listing, never a count. * `test_theme` gets both themes in the interface.qss row list plus full-resolution and editor/viewer parity cases. * `test_themeservice` discovers rows from disk already; only its sanity floor moves to 12. Existing installs pick the themes up at the next release version bump, since `ensureExtraData` skips a themes folder whose `.vnote-extra-version` stamp already matches `ConfigMgr2::c_version`.

  • Le Tan(16 Aug 26)

    feat(viewwindow): restore the caret on buffer reload Every path that re-pulls buffer content into an editor (explicit reload, external-change auto-reload, the File Changed dialog's Reload, an encoding change, and the focus-gain revision resync) went through setText(), which resets the caret to line 0. Only the scroll position was preserved. Capture the caret as (block number, positionInBlock) alongside the scroll state and restore it best-effort: the line is clamped to the new block count and the offset to the target block's text length. positionInBlock() rather than columnNumber(), which is relative to the current soft-wrapped visual line. Restore order is caret first, then scroll, so the explicit scrollbar value stays authoritative over setTextCursor()'s ensure-visible. ViewScrollState becomes ViewPositionState (captureScrollState / restoreScrollState renamed to match), and the five duplicated capture-sync-restore blocks collapse into syncEditorFromBufferPreservingPosition(). Markdown Read mode has no caret and is unchanged.

  • Le Tan(16 Aug 26)

    feat(newnote): seed an available default note name The New Note dialog always seeded note.<suffix>, so the user only learned about a collision after pressing OK. Resolve the auto-generated default through NotebookCoreService::getAvailableName (note_1.md, note_2.md, ...); a name the user typed is never rewritten, only its suffix follows the file type.

  • Le Tan(16 Aug 26)

    Do not build tests by default; enable VNOTE_BUILD_TESTS in CI

  • Le Tan(16 Aug 26)

    feat(newnote): default note template per file type Add a <file type, template> mapping so New Note starts from a sensible template instead of always "None". WidgetConfig gains newNoteDefaultTemplates, a {fileTypeName: templateName} object in vnotex.json, seeded with {"Markdown": "title.md"} only when the key is absent. A present object -- even an empty one, or a per-type empty value -- is the user's own choice and is never re-seeded, which is how a default is turned off. NewNoteDialog2 resolves its initial template as: session cache, else the configured default for the current file type, else "None". The session cache is now per file type (s_lastTemplateByFileType) rather than one global static, and is written only after a note is actually created, so a rejected name no longer redefines the next dialog's starting point. A present cache entry wins even when empty, so an explicit "None" sticks for the rest of the run. The default follows every file-type change, including the implicit one from typing a suffix in the Name field, until the user picks a template by hand. A default naming a template that no longer exists degrades to "None". Capture (LiteralContent) dialogs still have no selector and touch neither the cache nor the config; the quick-note path keeps its own per-scheme template.

  • Le Tan(16 Aug 26)

    feat(templates): ship a built-in title.md note template Install a bundled note template "templates/title.md" containing "# %no%" plus a trailing "@@" cursor mark, so a new note created from it opens with a level-1 heading equal to its base name and the caret on the blank line below. templates/ becomes the sixth extra-data folder installed by ConfigMgr2::ensureExtraData. It has NO preserve list: the shipped title.md is overwritten on every version bump, so a user who wants a variant must save it under a different name. User-created templates in that folder are untouched, because only bundled paths are written. Because templates/ is now a versioned folder, it also carries the .vnote-extra-version stamp. That name is not hidden on Windows, so TemplateService::getTemplates() filters it out explicitly; otherwise it would be offered as a selectable template.

  • Le Tan(16 Aug 26)

    refactor(settings): remove the unused Insert file name as title option

  • Le Tan(16 Aug 26)

    fix(snippet): make %MMM%/%MMMM%/%ddd%/%dddd% follow VNote's language Fixes #2099. The month and day names came from vxcore's strftime call, so they tracked the OS locale rather than VNote's language setting (a zh_CN host showed the Chinese name even with VNote set to English), and on Windows they arrived as ANSI code page bytes that SnippetCoreService then decoded as UTF-8. vxcore now owns locale-independent UTF-8 name tables behind a runtime-only context locale. Push VNote's effective locale into it right after loadTranslators, via a thin ConfigCoreService wrapper. Changing the language in Settings already requires a restart, so one push at startup is enough.

  • Le Tan(15 Aug 26)

    feat(markdown): zoom in-place previews with the editor Zooming the Markdown editor only changed font sizes: preview pixmaps were produced once and painted at their stored pixel size, so a zoomed editor showed big text next to unchanged formulas and diagrams. They now follow the text, re-rendered at the new scale rather than resampled. The zoom ratio is editorFontPointSize() / baseEditorFontPointSize(), clamped to [0.25, 4.0] and pulled at request time so a persisted zoomDelta is honoured on the first paint. Two quantities are kept strictly apart: the web side receives the bare ratio (it multiplies by devicePixelRatio itself), while the C++ rasterizer receives m_scaleFactor * ratio. Collapsing them would either double-scale on a high-DPI screen or drop DPI scaling entirely. Refresh is cache-driven. An entry whose recorded ratio is stale is either re-rasterized locally from its retained source payload (needScale=true: local PlantUml/Graphviz SVG, web Graphviz, web PlantUml PNG) or treated as a miss and re-requested at the new JS scale (needScale=false: math, Mermaid, FlowChart, WaveDrom, which JS rasterizes). Classification is by needScale, not by format, because processSvgAsPng()'s tainted-canvas fallback returns already-scaled SVG. Re-rasterization always works from the original bytes, so repeated zooming never accumulates resampling, and mints a new resource name, since PreviewMgr skips a name it has already registered. editorZoomChanged() bumps both generation timestamps synchronously before asking for a re-highlight, so a response already in flight cannot be recorded against the new ratio; each generation snapshots its ratio once, and the response handlers use that snapshot rather than re-reading the current zoom. The rasterization and the scale arithmetic are split into GraphPreviewData and PreviewScaleUtils, free of any editor dependency, so the parts that are easiest to get wrong are unit-testable without linking the editor stack. Cache capacity is now hinted before the early return in the preview-update paths: entries retain their source payload, and LruCache needs repeated low hints to shrink, which the early return used to withhold once a document stopped having previews. NOTE: the changed bundled scripts only reach an existing profile when ConfigMgr2::c_version is bumped, since installVersionedDir() no-ops while the per-folder stamp matches. This must land in a release that bumps the version; until then, verify with VX_DEBUG_REFRESH, not on a clean profile. Web PlantUml stays resampled from its cached PNG: it is a raster fetched from a remote server with no vector available, and re-requesting it on every zoom step is not worth the network traffic.

  • Le Tan(15 Aug 26)

    feat(explorer): add Open as Detached to the node context menu Widen NotebookNodeController::openNodes with a defaulted p_detached flag that sets FileOpenSettings::m_detachedView, reusing the existing detached-open path so one menu invocation groups the selection into a single DetachedWindow.

  • Le Tan(15 Aug 26)

    Hide pdf.js navigation pane by default on open Set sidebarViewOnLoad to SidebarView.NONE via PDFViewerApplicationOptions, plus disablePreferences so _initializeOptions() does not restore the -1 default. VNote shows the PDF outline in its own dock, so the built-in sidebar is redundant.

  • Le Tan(15 Aug 26)

    fix(settings): persist cleared quick access, and drop two stale widget pointers An audit of every settings page after the image-host persistence fix turned up four defects: - QuickAccessPage skipped setQuickAccessItems() when the text box was empty, so deleting every entry could not be persisted; loadInternal() had the symmetric guard, so a reload could not clear the box either. Both guards are gone: parseQuickAccessText() returns an empty vector for empty text and setQuickAccessItems() already filters empty paths. - AppearancePage only ever checked a dock checkbox, never unchecked it. reset() re-runs load() on the same widgets, so a stale check survived and the next save persisted it. - FileAssociationPage deleted the Add Program button in its clear loop while m_addProgramButton still pointed at it, and addExternalProgramRow() read that pointer before the button was re-created. - ImageHostPage kept a raw pointer to the Test button of an in-flight test, which loadInternal() destroys along with the provider group boxes; the late reply then dereferenced it. The member is now a QPointer and the pending state is invalidated before the rebuild. test_settings_persistence constructs the real QuickAccessPage and FileAssociationPage (test_settings_slug replaces their method bodies, so it cannot cover this). Both quick-access cases were confirmed to fail with the corresponding guard restored. The file-association case is a structural smoke test only, as noted in the code: QLayout::indexOf compares pointer identity, so the stale-pointer read is not observable from outside.

  • Le Tan(14 Aug 26)

    fix(imagehost): persist image hosts to the config on settings save A newly created image host lived only in ImageHostService's in-memory provider list. Nothing ever wrote it back to EditorConfig, so the host, its per-provider fields and the default-host selection were lost on restart: ImageHostService::saveToConfig(), EditorConfig::setImageHosts() and setDefaultImageHost() had no production caller. The load half was already wired in main.cpp. ImageHostController::persistToConfig() snapshots the service into EditorConfig; ImageHostPage::saveInternal() calls it after applying the field values and the default provider, since the snapshot reads both. The default host is derived from the service's default-provider pointer rather than from the combo's cached name, so a stale name can never be persisted. The write lives in the controller because ImageHostPage needs a GUI stack and test_settings_slug replaces its method bodies, which would leave a page-resident write untestable.

  • Le Tan(14 Aug 26)

    fix(imagehost): stop deleting remote images that are still referenced Three defects around image-host images, all in one path: - The obsolete-image scans requested only local links, so every image uploaded to a host during the session was absent from the current-image set and was deleted at the host on close while the note still used it. Both scans now include Remote links. - Remote URLs reached the local deleteAsset() loop: QDir::isAbsolutePath() does not recognize them on Windows, so a bogus '<notebookDir>/https:/...' path was handed to deleteAsset(). - The upload remote path used QFileInfo(m_contentPath).dir().dirName(), but m_contentPath is already the note's parent directory, so the GRANDPARENT folder name was used. The delete decision now lives in ImageHostPath::remoteUrlsToDelete(), which is widget-free and unit tested: it honors the 'Clear obsolete images' setting and keeps any candidate that is still referenced verbatim, by URL identity, or anywhere in the raw text after entity decoding.

  • Le Tan(14 Aug 26)

    feat(viewarea): close the Home tab when opening a file The Home dashboard is a placeholder for an empty view area. When it is the only open tab in the main area and a file is opened, retire it. The close happens after the new window exists, so the main area is never empty and maybeOpenHome() does not re-open it.

  • Le Tan(14 Aug 26)

    fix(export): clarify the Complete page option with a tooltip Rename it to 'Complete page (pack all resources)' and add a tooltip explaining that referenced resources are copied next to the exported file, or embedded when Embed images is checked.

  • Le Tan(14 Aug 26)

    update vtextedit

  • Le Tan(13 Aug 26)

    fix(export): disable wkhtmltopdf-only PDF options when it is not used The wkhtmltopdf fields were already gated by updatePdfWidgetsByWkhtmltopdf(), but their form labels stayed enabled and the gate never ran at construction time, so the dialog opened in an inconsistent state.

  • Le Tan(13 Aug 26)

    fix(export): rasterize Mermaid diagrams at the printed size and 384 dpi The rasters looked soft. Two measured causes, one of them structural: - The raster was produced at the size the diagram happens to occupy ON SCREEN (its natural width) and the injected size-fix script then shrank it with CSS to the printed box, so every diagram was resampled twice. The printed box is now passed down from the page layout wkhtmltopdf is handed, and the clamp is applied BEFORE rasterizing; the size-fix script becomes a no-op safety net. - 2x device pixels over that box is only ~246 dpi. It is now 384 dpi (4x). Measured on the same diagram: 2x is visibly soft, 4x is clean at print and under a 6x zoom, and 6x costs another 75% in file size for a difference that only shows under magnification. Ruled out along the way, so it does not get retried: wkhtmltopdf embeds the PNG losslessly (FlateDecode, full resolution - no JPEG re-encode and no downsampling), and sizing the intermediate SVG in CSS pixels versus device pixels produces a byte-identical raster, so Chromium is already rasterizing at the destination size. Keeping the diagrams vector was also tried and rejected: re-rendering with SVG labels and pinning Mermaid's fontFamily to the family the font override selects does make the labels fit, but wkhtmltopdf then silently DROPS some long paths (a whole edge went missing), which is worse than soft. Rasterizing remains the only correct option. The canvas is capped at 8192 px on the longest side and 40 Mpx of area (preserving the aspect ratio): Chromium fails large canvases silently, and a blank diagram would be far worse than a slightly softer one.

  • Le Tan(12 Aug 26)

    fix(export): render CJK text and Mermaid labels correctly in wkhtmltopdf PDFs wkhtmltopdf's QtWebKit does not fall back per glyph along the CSS font-family list: it renders everything with the first INSTALLED family. VNote's themes name Latin-only families first ("YaHei Consolas Hybrid", "Noto Sans", "Segoe UI", ...), so every CJK codepoint missed and was served by the Qt system fallback (MS UI Gothic, JIS coverage), turning simplified-only characters into blank squares. Naming "Microsoft YaHei" or "SimSun" first cannot help either: they are .ttc collections, which this QtWebKit cannot load at all. The same substitution re-shaped the text inside Mermaid diagrams, whose box geometry had been computed by Qt WebEngine with the real font, so labels overflowed their boxes and were clipped. Fix both in the wkhtmltopdf intermediate HTML only, leaving direct HTML, custom/docx and Qt printToPdf untouched: - Inject a font override naming a family that is installed, loadable by wkhtmltopdf (never a .ttc) and covers Simplified Chinese, resolved through the new ExportFontResolver. <pre>/<code> keep a monospace face when a CJK monospace font exists, and fall back to the text family rather than to a Latin-only face that would restore the tofu. - Rasterize Mermaid diagrams to PNG before the DOM is serialized. Each diagram is re-rendered from its source with htmlLabels off first, because an SVG loaded as an <img> does not render <foreignObject>. The size-fix script now clamps those images to the page as well. Also generalize the plumbing this needed: - vxcore.prepareForExport({rasterizeMath, rasterizeDiagrams}) is now the single page-side export entry point; workers opt in via an optional prepareForExport() hook and the core signals onPdfRenderReady() exactly once. The C++ side no longer names individual workers. - ExportOption grows m_rasterizeMathEnabled / m_rasterizeDiagramsEnabled, mapped to WebViewExporter::RasterFlags. m_transformSvgToPngEnabled goes back to being only the Graphviz/PlantUML web option; overloading it is what let the all-in-one route miss the diagram fix. - A timeout while rasterizing diagrams now fails the export instead of serializing a half-mutated live DOM.

  • Le Tan(12 Aug 26)

    fix(export): export a file opened from outside any notebook An externally-opened file is represented as NodeIdentifier{"", absolutePath}, whose isValid() is false. ExportController's CurrentBuffer branch required a valid node id, so exporting the active tab with nothing selected in the explorer aborted with "No current buffer available for export." and reported 0 file(s). With a node selected, MainWindow2 silently substituted that unrelated node, combining the live buffer's content with another note's resource base and attachments. Carry the buffer's own path in ExportContext and resolve from whichever identity exists: - NodeIdentifier::isVirtual() names the vx:// kind, replacing an inline literal. - ExportContext gains bufferPath + hasFileBuffer(). - MainWindow2 populates bufferPath at both dialog construction sites, only for non-virtual file-backed views; the explorer selection may stand in only when there is no file buffer, and the preset follows hasFileBuffer(). The dashboard-open + note-selected flow is preserved. - ExportController resolves CurrentBuffer via the node id or bufferPath, and isExportableNode accepts an empty notebookId only for an absolute path, so workspace export no longer drops external buffers. - ExportDialog2 gates CurrentBuffer on a resolvable file rather than non-empty content, so an empty external file is still exportable via the exporter's disk fallback. External files get no attachments folder: there is no notebook to own one.

  • Le Tan(12 Aug 26)

    fix(ci): unbreak the Qt 5.15 Windows build The Qt 5 job compiled vtextedit's table preview test against a scoped enum Qt 5 never registers as a metatype, so the build failed, pack failed after it and the ZIP was never produced. Bump vtextedit to the commit that declares the metatype. The cmd build step reported only the exit code of its last command (dir), so all three failures were reported as a green step and the run only died later in a packaging gate. Guard each fallible command.

  • Le Tan(11 Aug 26)

    fix(theme): drop the QSS frame and background on the table preview sheet The in-editor Markdown table preview asks for NoFrame and a transparent Base in code, but the application stylesheet's QAbstractScrollArea border and QTextEdit background rules both override that, drawing a stray rectangle around the table. Add a narrowing vte--TablePreviewSheet rule after those rules in the 9 non-native themes; the cell grid still comes from the table format.

  • Le Tan(11 Aug 26)

    feat(editor): enable the interactive table in-place preview by default vtextedit gates its editable table sheet behind InplacePreviewSource::Table, but VNote's mirrored enum stopped at Math, so the flag could never be set and the feature was unreachable from the app. Add Table to vnotex::MarkdownEditorConfig, map it to vte in both editor-config builders, persist it as the 'table' token, and expose a Settings checkbox (without which saving that page would silently strip the flag). fromJson rebuilds the flags purely from the persisted string, so the new C++ default would only ever reach a fresh install. A version-gated override adds it once for configs written before 4.4.4, keeping the user's other choices and leaving a blanket opt-out alone: this preview rewrites the Markdown source and must not become someone's only enabled source.

  • Le Tan(11 Aug 26)

    Default the text editor input mode to VSCode Unset or unrecognized inputMode values now resolve to VscodeMode; an explicit 'normal' is still honored.

  • Le Tan(11 Aug 26)

    docs: state where new agent documentation belongs The root AGENTS.md is a routing document after the module split, but nothing in it said so to the agent doing the next doc edit, so new prose would accrete back at root and undo the split. Record the placement rule in the index section: default to the child AGENTS.md that owns the code, promote to root only for genuinely repo-wide constraints, and keep root to a summary plus a link even then.

VNote Security

4.5/10

Repo Security Summary

Updated 27 Jul 26

  • Maintained10/10
  • Security-Policy10/10
  • PackagingN/A
  • Code-Review0/10
  • CII-Best-Practices0/10
  • Token-Permissions0/10
  • Dangerous-Workflow10/10
  • SAST0/10
  • Binary-Artifacts10/10
  • Pinned-Dependencies0/10
  • License10/10
  • Signed-Releases0/10
  • Branch-ProtectionN/A
  • Fuzzing0/10

Security Advisories (4)

  • highPatchedCVSS 7

    GHSA-6m2r-wm6v-c8qpArgument injection to arbitrary command execution via crafted note filename in external-program handling

  • highPatchedCVSS 8.2

    GHSA-vfhj-c636-h59xStored XSS via YAML Frontmatter Leading to Local File Read and Remote Exfiltration

  • highPatchedCVSS 8.6

    CVE-2024-41662Markdown XSS leads to RCE

  • highPatched

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

VNote Website

Website

Redirects

Does not redirect

Security Checks

4 security checks failed (61 passed)

  • Top-Level Domain Highly Abused
  • HTTP Status Error
  • HTTP Server Error
  • Empty Page Content

Server Details

  • IP Address
  • Location,,,
  • ISP
  • ASN

Associated Countries

    Safety Score

    Website marked as risky

    60%

    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 AuditNot 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

    Edit VNote Data

    You can edit VNote's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
    Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

    Origin Data

    Modify Data

    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!