{"id":"8ffd1ea2-3c30-414c-bdeb-8e0fa82fb0eb","slug":"noteriv","kind":"mcp","name":"Noteriv","summary":"A fast, open-source markdown editor. Graph view, plugin API, themes, Git/WebDAV sync, AI MCP — built on Tauri 2.","owner":"thejacedev","repoUrl":"https://github.com/thejacedev/Noteriv","license":"MIT","licenseTier":"permissive","trust":"community","stars":99,"match":null,"fewStars":false,"format":"mcp","createdAt":"2026-03-13T17:09:26.000Z","addedAt":"2026-10-14T05:42:31.070Z","logoUrl":"https://avatars.githubusercontent.com/u/46321222?u=2a91fb9b399244f8f826e2522b5f0175639dbaf3&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["files-documents","productivity","memory-knowledge"],"tags":["markdown-editor","note-taking","notes","daily-notes","knowledge-base","obsidian-alternative","react","vault"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-17T06:26:32.687Z","sample":false,"url":"https://conduits.dev/tools/noteriv","language":"TypeScript","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n  <img src=\"desktop/public/banner.png\" alt=\"Noteriv\" />\n  <h1>Noteriv</h1>\n  <p><strong>Fast markdown notes, everywhere.</strong></p>\n  <p>\n    The open-source markdown editor with a graph view, plugin API, themes, Git/WebDAV sync, and an AI MCP server &mdash; built on <strong>Tauri 2</strong>.<br />\n    ~15 MB. Linux, macOS, Windows. React Native mobile companion app.\n  </p>\n  <p>\n    <strong>Note:</strong> The mobile app is a work in progress. All features ship to desktop first.\n  </p>\n\n  <p>\n    <a href=\"https://www.noteriv.com\"><strong>Website</strong></a> &middot;\n    <a href=\"https://docs.noteriv.com\"><strong>Docs</strong></a> &middot;\n    <a href=\"https://play.google.com/store/apps/details?id=com.ironstacksoftware.noteriv\"><strong>Google Play</strong></a> &middot;\n    <a href=\"https://apps.apple.com/app/id6761115699\"><strong>App Store</strong></a> &middot;\n    <a href=\"#-features\"><strong>Features</strong></a> &middot;\n    <a href=\"#-getting-started\"><strong>Getting Started</strong></a> &middot;\n    <a href=\"#-desktop-app\"><strong>Desktop</strong></a> &middot;\n    <a href=\"#-mobile-app\"><strong>Mobile</strong></a> &middot;\n    <a href=\"#-community\"><strong>Community</strong></a> &middot;\n    <a href=\"#-project-structure\"><strong>Structure</strong></a> &middot;\n    <a href=\"#-contributing\"><strong>Contributing</strong></a>\n  </p>\n\n  <br />\n</div>\n\n---\n\n## Why Noteriv?\n\nMost note apps lock you into their cloud, their format, or their platform. Noteriv is different:\n\n- **Your notes are plain markdown files.** No proprietary format. Open them in any editor, anywhere.\n- **Your data stays yours.** Notes live on your device. Sync with GitHub if you want, or don't.\n- **Same app on every platform.** Desktop and mobile with full feature parity. Edit on your laptop, review on your phone.\n- **Extensible.** Plugins, themes, and CSS snippets let you make it your own.\n\n---\n\n## ✨ Features\n\n### Editor\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <h4>Writing</h4>\n      <ul>\n        <li><strong>Live markdown preview</strong> &mdash; See rendered output as you type</li>\n        <li><strong>Source mode</strong> &mdash; Raw markdown with syntax highlighting</li>\n        <li><strong>Read-only mode</strong> &mdash; Clean rendered view for reading</li>\n        <li><strong>Formatting toolbar</strong> &mdash; Bold, italic, headings, links, lists, code, tables, horizontal rules</li>\n        <li><strong>Auto-save</strong> &mdash; Configurable intervals (10s, 30s, 1m, 5m) or manual</li>\n        <li><strong>Spell check</strong> &mdash; Toggle on/off</li>\n        <li><strong>Vim mode</strong> &mdash; Optional vim keybindings (desktop)</li>\n        <li><strong>Focus mode</strong> &mdash; Dims all lines except the active one for distraction-free writing. <code>Ctrl+Shift+D</code></li>\n        <li><strong>Split editor</strong> &mdash; Open two notes side by side. Right-click tab → \"Open in Split\" or <code>Ctrl+\\</code></li>\n        <li><strong>Per-file view mode</strong> &mdash; Right-click in editor to set a default mode (Live/Source/View) per file, persisted across restarts</li>\n        <li><strong>Multi-select sidebar</strong> &mdash; <code>Ctrl+Click</code> to toggle, <code>Shift+Click</code> for range. Merge, delete, or move in bulk</li>\n      </ul>\n    </td>\n    <td width=\"50%\">\n      <h4>Markdown Support</h4>\n      <ul>\n        <li>Headings (H1&ndash;H6)</li>\n        <li>Bold, italic, strikethrough, highlight</li>\n        <li>Ordered &amp; unordered lists</li>\n        <li>Task lists with checkboxes</li>\n        <li>Tables with alignment + interactive checkboxes in cells</li>\n        <li>Fenced code blocks with syntax highlighting</li>\n        <li>Block &amp; inline math (LaTeX via KaTeX)</li>\n        <li><strong>Mermaid diagrams</strong> &mdash; Flowcharts, sequence diagrams, Gantt charts, pie charts, and more rendered inline from <code>```mermaid</code> code blocks</li>\n        <li>Callouts / admonitions (16+ types)</li>\n        <li>Footnotes &amp; definition lists</li>\n        <li>Superscript, subscript</li>\n        <li>HTML blocks</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### Knowledge Management\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <h4>Linking &amp; Discovery</h4>\n      <ul>\n        <li><strong>Wiki-links</strong> &mdash; Link notes with <code>[[note name]]</code>, supports aliases <code>[[note|display]]</code> and headings <code>[[note#heading]]</code></li>\n        <li><strong>Backlinks panel</strong> &mdash; See every note that links to the current file</li>\n        <li><strong>Tags</strong> &mdash; Hierarchical tags with <code>#tag</code> and <code>#parent/child</code> syntax</li>\n        <li><strong>Graph view</strong> &mdash; Interactive force-directed knowledge graph (desktop)</li>\n        <li><strong>Hover preview</strong> &mdash; Preview linked notes on hover (desktop)</li>\n      </ul>\n    </td>\n    <td width=\"50%\">\n      <h4>Organization</h4>\n      <ul>\n        <li><strong>Vaults</strong> &mdash; Multiple vaults for different projects or areas of life</li>\n        <li><strong>Folders</strong> &mdash; Nested folder structure with drag-and-drop reordering</li>\n        <li><strong>Bookmarks</strong> &mdash; Pin frequently accessed notes</li>\n        <li><strong>Outline panel</strong> &mdash; Table of contents from headings</li>\n        <li><strong>Quick open</strong> &mdash; Fuzzy file search across your vault</li>\n        <li><strong>Vault search</strong> &mdash; Full-text search across all notes</li>\n        <li><strong>Daily notes</strong> &mdash; Quick-access to today's note</li>\n        <li><strong>Random note</strong> &mdash; Rediscover forgotten ideas</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### Advanced Features\n\n<table>\n  <tr>\n    <td width=\"33%\">\n      <h4>Content Tools</h4>\n      <ul>\n        <li><strong>Templates</strong> &mdash; Create notes from templates with variables (<code>{{date}}</code>, <code>{{time}}</code>, <code>{{title}}</code>, and more)</li>\n        <li><strong>Frontmatter editor</strong> &mdash; YAML metadata editing with property suggestions</li>\n        <li><strong>Note composer</strong> &mdash; Merge multiple notes or split by heading level</li>\n        <li><strong>Note merge from sidebar</strong> &mdash; <code>Ctrl+Click</code> multiple files → right-click → \"Merge N Notes\" to combine with <code>---</code> separators</li>\n        <li><strong>File recovery</strong> &mdash; Automatic snapshots (up to 50 per file) with one-tap restore</li>\n        <li><strong>Slide presentations</strong> &mdash; Present markdown as slides (split by <code>---</code>), with speaker notes</li>\n        <li><strong>PDF export</strong> &mdash; Export notes to PDF (desktop)</li>\n        <li><strong>Table of contents</strong> &mdash; Type <code>[TOC]</code> to auto-generate a clickable table of contents from headings. Supports <code>&lt;!-- toc --&gt;</code> blocks that auto-update on save</li>\n        <li><strong>Dataview queries</strong> &mdash; Query your vault like a database with <code>TABLE</code>, <code>LIST</code>, and <code>TASK</code> queries inside <code>```dataview</code> code blocks. Filter by tags, folders, frontmatter fields, and more</li>\n        <li><strong>Publish as HTML</strong> &mdash; Export notes as standalone HTML pages using your current theme. Live preview, HTML editor, and multi-note publishing &mdash; combine multiple notes into a single page before saving</li>\n        <li><strong>Flashcard review</strong> &mdash; Spaced repetition system using SM-2 algorithm. Add <code>Q:</code>/<code>A:</code> pairs or <code>{{cloze}}</code> deletions to notes, then review with keyboard-driven grading (Again/Hard/OK/Good/Easy). Progress saved per vault</li>\n      </ul>\n    </td>\n    <td width=\"33%\">\n      <h4>Media &amp; Attachments</h4>\n      <ul>\n        <li><strong>Attachment manager</strong> &mdash; Browse, filter, and manage all vault attachments</li>\n        <li><strong>Image support</strong> &mdash; PNG, JPG, GIF, SVG, WebP, and more</li>\n        <li><strong>Audio files</strong> &mdash; MP3, WAV, OGG, FLAC, AAC</li>\n        <li><strong>Video files</strong> &mdash; MP4, MKV, AVI, MOV</li>\n        <li><strong>Audio recorder</strong> &mdash; Record voice notes directly in the app (desktop)</li>\n        <li><strong>Canvas / Whiteboard</strong> &mdash; Infinite canvas with text nodes, sticky notes (6 colors), image nodes, freehand drawing, file embeds, groups, and edge connections. Toolbar with select, text, sticky, image, draw tools + color picker</li>\n        <li><strong>PDF annotation</strong> &mdash; Open PDFs inline with highlight (4 colors), underline, and note tools. Annotation sidebar, auto-save to sidecar JSON, and one-click export to linked markdown with blockquotes and page references</li>\n        <li><strong>Drawing editor</strong> &mdash; Built-in drawing canvas with pencil, shapes, arrows, text, and eraser tools. Full color picker, stroke widths, pan &amp; zoom. Drawings saved as <code>.drawing</code> files and embeddable in notes with <code>![[file.drawing]]</code></li>\n      </ul>\n    </td>\n    <td width=\"33%\">\n      <h4>Sync</h4>\n      <ul>\n        <li><strong>GitHub sync</strong> &mdash; Push and pull notes to/from any GitHub repository</li>\n        <li><strong>Auto-sync every 5 seconds</strong> &mdash; Always-on background sync, pull first then push. No config needed</li>\n        <li><strong>Pull on open</strong> &mdash; Automatically pull latest changes when opening a vault</li>\n        <li><strong>Folder sync</strong> &mdash; Sync with Google Drive, Dropbox, OneDrive, iCloud (desktop)</li>\n        <li><strong>WebDAV sync</strong> &mdash; Sync with Nextcloud, ownCloud, or any WebDAV server (desktop)</li>\n        <li><strong>Vault file watcher</strong> &mdash; Monitors the vault directory for external changes (from the MCP server, git pulls, other editors). Sidebar refreshes automatically; open files with no unsaved changes reload instantly; open files with unsaved changes are saved first before reloading</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### Views\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <h4>Board View</h4>\n      <p>Turn any note into a drag-and-drop task board. Create <code>.board.md</code> files or add <code>board: true</code> to frontmatter. Columns are H2 headings, cards are checkbox items.</p>\n      <ul>\n        <li>Drag cards between columns</li>\n        <li>Inline card editing (double-click)</li>\n        <li>Tags shown as colored pills</li>\n        <li>Due date badges</li>\n        <li>Auto-saves every 5 seconds</li>\n        <li>Switch to Source mode to edit raw markdown</li>\n      </ul>\n    </td>\n    <td width=\"50%\">\n      <h4>Calendar View</h4>\n      <p>Visual month calendar that surfaces your daily notes and tasks with due dates.</p>\n      <ul>\n        <li>Blue dots on days with daily notes</li>\n        <li>Green dots on days with due tasks</li>\n        <li>Click a day to see its notes and tasks</li>\n        <li>Double-click to open or create a daily note</li>\n        <li>Month navigation and \"Today\" button</li>\n        <li>Accessible from the ribbon or command palette</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### AI Integration\n\n<table>\n  <tr>\n    <td colspan=\"2\">\n      <h4>MCP Server</h4>\n      <p>Connect any MCP-compatible AI assistant (Claude, Cursor, etc.) directly to your Noteriv vault with full read/write access.</p>\n      <ul>\n        <li><strong>22 tools</strong> &mdash; read, write, append, delete, rename notes; list/create/delete folders; full-text search; tags, backlinks, outgoing links; vault stats; daily notes</li>\n        <li><strong>Auto-discovers vaults</strong> &mdash; reads the same config file as the desktop app, no manual path setup needed</li>\n        <li><strong>Multi-vault support</strong> &mdash; switch between vaults or pass a path directly as a CLI argument</li>\n        <li><strong>Live sync</strong> &mdash; the desktop app watches the vault for external changes and automatically refreshes the sidebar and any open files when the MCP server (or anything else) modifies them</li>\n        <li><strong>Soft delete</strong> &mdash; deleted notes go to <code>.noteriv/trash/</code>, restorable from the app</li>\n        <li><strong>MCP resources</strong> &mdash; vault notes are exposed as <code>note:///</code> resources for direct access</li>\n      </ul>\n      <strong>Setup (Claude Code):</strong>\n      <pre><code>claude mcp add --scope user noteriv -- npx -y noteriv-mcp</code></pre>\n      <p>Or install from npm: <code>npx noteriv-mcp</code>. Auto-detects your active vault from the Noteriv config.</p>\n    </td>\n  </tr>\n</table>\n\n### Collaboration &amp; Sharing\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <h4>Live Collaboration</h4>\n      <p>Real-time co-editing using Yjs CRDT over WebRTC &mdash; peer-to-peer, no server required.</p>\n      <ul>\n        <li>Start a session and share the room ID</li>\n        <li>Others join from the command palette</li>\n        <li>Changes sync instantly between all peers</li>\n        <li>Custom display name and cursor color</li>\n        <li>Optional dependency: <code>npm install yjs y-webrtc</code></li>\n      </ul>\n    </td>\n    <td width=\"50%\">\n      <h4>Publish as HTML</h4>\n      <p>Export notes as beautiful standalone web pages using your current theme.</p>\n      <ul>\n        <li>Live preview before saving</li>\n        <li>Edit the raw HTML directly</li>\n        <li>Combine multiple notes into one page</li>\n        <li>Search and select notes from your vault</li>\n        <li>Copy HTML to clipboard or save as <code>.html</code></li>\n        <li>Opens in your default browser after saving</li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td colspan=\"2\">\n      <h4>Web Clipper</h4>\n      <p>Browser extension to save articles and selections as markdown notes directly into your vault.</p>\n      <ul>\n        <li>Clip full pages or selected text</li>\n        <li>Pure JS HTML-to-markdown conversion (headings, links, images, lists, code, tables)</li>\n        <li>Set title, tags, and target folder from the popup</li>\n        <li>Right-click context menu: \"Clip to Noteriv\" / \"Clip Selection to Noteriv\"</li>\n        <li>Auto-generates frontmatter with title, source URL, date, and tags</li>\n        <li>Sidebar refreshes instantly when a note is clipped</li>\n        <li>Localhost API server on port 27123 &mdash; auto-starts with the app</li>\n        <li>Install: load <code>extension/</code> as unpacked extension in Chrome/Brave/Edge or temporary add-on in Firefox</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### Customization\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <h4>Themes</h4>\n      <p>10 built-in themes with full dark and light mode support:</p>\n      <table>\n        <tr>\n          <td><strong>Dark</strong></td>\n          <td>Catppuccin Mocha, Nord, Dracula, Solarized Dark, One Dark, Gruvbox Dark, Tokyo Night, GitHub Dark</td>\n        </tr>\n        <tr>\n          <td><strong>Light</strong></td>\n          <td>Catppuccin Latte, Solarized Light</td>\n        </tr>\n      </table>\n      <br />\n      <ul>\n        <li>Community themes from <a href=\"https://github.com/thejacedev/NoterivThemes\">NoterivThemes</a></li>\n        <li>Custom theme creation and import/export (desktop)</li>\n        <li>8 accent colors: Blue, Lavender, Mauve, Pink, Peach, Yellow, Green, Teal</li>\n      </ul>\n    </td>\n    <td width=\"50%\">\n      <h4>Ecosystem</h4>\n      <p><strong>Plugins</strong></p>\n      <ul>\n        <li>Install community plugins from <a href=\"https://github.com/thejacedev/NoterivPlugins\">NoterivPlugins</a></li>\n        <li>Plugin API with vault access, UI commands, events, and editor integration</li>\n        <li>Enable/disable per vault</li>\n      </ul>\n      <p><strong>CSS Snippets</strong></p>\n      <ul>\n        <li>Create custom CSS to style the editor and preview</li>\n        <li>Install community snippets from <a href=\"https://github.com/thejacedev/NoterivSnippets\">NoterivSnippets</a></li>\n        <li>Toggle snippets on/off individually</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n### Editor Settings\n\n| Setting | Options |\n|---|---|\n| Auto-save interval | Off, 10s, 30s, 1 min, 5 min (sync auto every 5s) |\n| Font size | 12px &ndash; 24px |\n| Line height | 1.2 &ndash; 2.0 |\n| Tab size | 2, 4, 8 |\n| Editor font | JetBrains Mono, Fira Code, Cascadia Code, Source Code Pro, SF Mono, System Mono |\n| Theme | 10 built-in + community + custom |\n| Accent color | 8 options |\n| Spell check | On / Off |\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) 20.19+\n- [npm](https://www.npmjs.com/)\n- [Git](https://git-scm.com/) (for GitHub sync features)\n\n### Clone the repo\n\n```bash\ngit clone https://github.com/thejacedev/Noteriv.git\ncd Noteriv\n```\n\n---\n\n## 🖥 Desktop App\n\n> **Tauri 2 + Next.js** &mdash; Windows, macOS, Linux\n\nThe desktop app provides the full Noteriv experience with a CodeMirror-based editor, native file system access, and Git integration via the system's git binary.\n\n### Install\n\n**Fedora (COPR)**\n\n```bash\nsudo dnf copr enable jacedev/noteriv\nsudo dnf install noteriv\n```\n\n`dnf upgrade` keeps it current.\n\n**Flatpak (any Linux distro)**\n\n```bash\nflatpak remote-add --if-not-exists --no-gpg-verify noteriv https://flatpak.thejacedev.xyz/noteriv/repo\nflatpak install noteriv com.noteriv.Noteriv\n```\n\n`flatpak update` keeps it current.\n\nFor other platforms, grab a build from the [latest release](https://github.com/thejacedev/Noteriv/releases/latest):\n\n| Platform | Formats |\n|---|---|\n| Linux | `.rpm`, `.deb`, AppImage |\n| Windows | `.exe` installer, portable `.zip` |\n| macOS | `.dmg` |\n\n### Development\n\n```bash\ncd desktop\nnpm install\nnpm run dev\n```\n\nThis starts both the Next.js dev server (port 3456) and the Tauri window simultaneously.\n\n### Build\n\n```bash\ncd desktop\nnpm run build\n```\n\nBuilds distributable packages to `desktop/dist/`:\n\n| Platform | Format |\n|---|---|\n| Linux | AppImage, .deb, .rpm |\n| macOS | .dmg |\n| Windows | .exe (NSIS installer) |\n\n### Desktop Architecture\n\n```\ndesktop/\n├── src-tauri/             Rust backend (Tauri 2)\n│   ├── src/\n│   │   ├── lib.rs           App entry, plugin registration, startup\n│   │   ├── shim.rs          window.electronAPI shim + drag/resize polyfill\n│   │   ├── store.rs         Persistent config (vaults, settings)\n│   │   ├── auth.rs          GitHub token storage + API\n│   │   ├── updater_cmds.rs  Auto-update via tauri-plugin-updater\n│   │   ├── clipper.rs       Web clipper local HTTP server\n│   │   ├── watcher.rs       Vault file watcher (debounced)\n│   │   ├── menu.rs          Hidden menu for keyboard accelerators\n│   │   ├── commands_git.rs  Git operations via std::process::Command\n│   │   ├── commands_sync.rs Folder + WebDAV sync providers\n│   │   └── commands_*.rs    Other IPC commands\n│   ├── Cargo.toml\n│   ├── tauri.conf.json\n│   └── capabilities/\n├── package.json           # renderer deps + tauri scripts\n├── src/\n│   ├── app/\n│   │   ├── page.tsx      Main app (90+ state variables)\n│   │   ├── layout.tsx    Next.js root layout\n│   │   └── globals.css   Global styles + CSS variables\n│   ├── components/       41 React components\n│   │   ├── Editor.tsx           CodeMirror markdown editor\n│   │   ├── Sidebar.tsx          File tree with drag-drop\n│   │   ├── TitleBar.tsx         Tabs + window controls\n│   │   ├── SettingsModal.tsx    6-section settings\n│   │   ├── SetupWizard.tsx      First-run wizard\n│   │   ├── GraphView.tsx        Force-directed knowledge graph\n│   │   ├── Canvas.tsx           Visual whiteboard\n│   │   ├── SlidePresentation.tsx  Markdown presentations\n│   │   ├── CommandPalette.tsx   Searchable action palette\n│   │   ├── ThemePicker.tsx      Theme browser + installer\n│   │   ├── PluginManager.tsx    Plugin browser + installer\n│   │   ├── CSSSnippets.tsx      Snippet editor + community\n│   │   ├── DrawingEditor.tsx    Canvas drawing editor (pencil, shapes, arrows, text, eraser)\n│   │   ├── CalendarView.tsx     Month calendar with daily notes + tasks\n│   │   ├── BoardView.tsx        Drag-and-drop task board\n│   │   ├── DataviewBlock.tsx    Vault query result renderer\n│   │   ├── PublishPreview.tsx   HTML export preview + multi-note publish\n│   │   ├── FlashcardReview.tsx  Spaced repetition flashcard review\n│   │   ├── CollabPanel.tsx      Live collaboration session manager\n│   │   ├── PDFViewer.tsx        PDF viewer with annotation tools\n│   │   └── markdown/            Live rendering engine\n│   │       ├── plugin.ts        CodeMirror ViewPlugin\n│   │       ├── registry.ts      Renderer registration\n│   │       ├── renderers/       15 block + inline renderers\n│   │       ├── callouts.ts      Obsidian-style admonitions\n│   │       ├── embeds.ts        Note embedding (![[file]])\n│   │       ├── math.ts          KaTeX rendering\n│   │       ├── mermaid.ts       Diagram rendering\n│   │       ├── wikilinks.ts     Interactive wiki-links\n│   │       └── slash-commands.ts  / command menu\n│   ├── lib/              33 utility modules\n│   │   ├── settings.ts          App settings + defaults\n│   │   ├── theme-utils.ts       10 built-in themes + community\n│   │   ├── plugin-api.ts        Plugin sandbox + API\n│   │   ├── css-snippets.ts      CSS snippet system\n│   │   ├── hotkeys.ts           70+ rebindable shortcuts\n│   │   ├── editor-commands.ts   Formatting commands\n│   │   ├── wiki-link-utils.ts   Link parsing + resolution\n│   │   ├── tag-utils.ts         Tag extraction + aggregation\n│   │   ├── frontmatter-utils.ts YAML frontmatter\n│   │   ├── template-utils.ts    Template variables\n│   │   ├── file-recovery.ts     Snapshot system\n│   │   ├── note-composer-utils.ts  Merge + split\n│   │   ├── attachment-utils.ts  Media management\n│   │   ├── audio-utils.ts       Recording utilities\n│   │   ├── canvas-utils.ts      Canvas data model\n│   │   ├── slide-utils.ts       Presentation parser\n│   │   ├── pdf-export.ts        PDF export\n│   │   ├── sync-providers.ts    Folder + WebDAV config\n│   │   ├── vim-mode.ts          Vim keybindings\n│   │   ├── drawing-utils.ts     Drawing file create/parse/serialize/export\n│   │   ├── calendar-utils.ts    Calendar grid, daily note mapping, task extraction\n│   │   ├── board-utils.ts       Board parse/serialize, card/column CRUD\n│   │   ├── dataview.ts          Vault query engine (TABLE, LIST, TASK)\n│   │   ├── toc-utils.ts         Table of contents generation + auto-update\n│   │   ├── publish.ts           HTML export with theme colors\n│   │   ├── flashcard-utils.ts   SM-2 spaced repetition + card extraction\n│   │   ├── collab.ts            Yjs CRDT + WebRTC collaboration\n│   │   ├── focus-mode.ts        Focus/typewriter mode extension\n│   │   └── pdf-annotation.ts   PDF annotation types + sidecar I/O + markdown export\n│   └── types/\n│       └── electron.d.ts  IPC type definitions (50+ methods)\n└── public/               App icons (macOS, Windows, Linux)\n```\n\n---\n\n## 📱 Mobile App\n\n> **Expo + React Native** &mdash; Android, iOS\n>\n> **Work in progress.** All features come to desktop first, then mobile.\n\nThe mobile app aims for feature parity with the desktop, adapted for touch interfaces. Notes are stored in the app's document directory and synced via the GitHub REST API.\n\n**Get it:** [App Store](https://apps.apple.com/app/id6761115699) &middot; [Google Play](https://play.google.com/store/apps/details?id=com.ironstacksoftware.noteriv) &middot; [Android APK](app-apk/noteriv.apk) (direct sideload download)\n\n### Development\n\n```bash\ncd phone\nnpm install\nnpx expo start\n```\n\n| Command | Description |\n|---|---|\n| `npx expo start` | Start Expo dev server |\n| `npx expo start --android` | Open on Android device/emulator |\n| `npx expo start --ios` | Open on iOS simulator |\n\n### Mobile Architecture\n\n```\nphone/\n├── app/                  Screens (Expo Router, file-based routing)\n│   ├── _layout.tsx       Root layout + theme provider\n│   ├── index.tsx          Home (notes list, daily note, random note)\n│   ├── editor.tsx         Markdown editor + preview\n│   ├── settings.tsx       Settings (themes, GitHub, ecosystem)\n│   ├── setup.tsx          First-run wizard with GitHub auth\n│   ├── templates.tsx      Template picker\n│   ├── recovery.tsx       File recovery / snapshots\n│   ├── composer.tsx       Note merge + split\n│   ├── attachments.tsx    Attachment manager\n│   ├── backlinks.tsx      Backlinks viewer\n│   ├── frontmatter.tsx    YAML frontmatter editor\n│   ├── slides.tsx         Slide presentation viewer\n│   ├── snippets.tsx       CSS snippets (installed + community)\n│   ├── plugins.tsx        Plugin manager (installed + community)\n│   ├── calendar.tsx       Monthly calendar with daily note dots + due tasks\n│   ├── flashcards.tsx     SM-2 spaced repetition flashcard review\n│   ├── graph.tsx          Force-directed wiki-link graph (WebView canvas)\n│   ├── trash.tsx          Trash / soft delete with restore\n│   └── publish.tsx        Publish note as HTML + share sheet\n├── components/\n│   ├── MarkdownEditor.tsx   TextInput editor + formatting toolbar\n│   ├── MarkdownPreview.tsx  Custom markdown renderer\n│   ├── NotesList.tsx        File/folder browser\n│   ├── SearchModal.tsx      Quick open + vault search\n│   ├── CreateModal.tsx      Create file/folder\n│   ├── VaultSwitcher.tsx    Switch/create vaults\n│   ├── OutlinePanel.tsx     Document outline\n│   ├── BookmarksPanel.tsx   Bookmarked files\n│   ├── TagsPanel.tsx        Hierarchical tag browser\n│   └── BoardView.tsx        Board view with columns + cards\n├── context/\n│   ├── AppContext.tsx       Global state (vault, settings, files, auto-sync)\n│   └── ThemeContext.tsx     Dynamic theme provider\n├── lib/\n│   ├── file-system.ts       expo-file-system class API wrapper\n│   ├── vault.ts             Vault CRUD + workspace\n│   ├── settings.ts          Settings with defaults\n│   ├── storage.ts           AsyncStorage wrappers\n│   ├── github-sync.ts       GitHub REST API sync (push/pull)\n│   ├── templates.ts         Template listing + variables\n│   ├── frontmatter.ts       YAML parse/serialize\n│   ├── file-recovery.ts     Snapshot system\n│   ├── note-composer.ts     Merge + split\n│   ├── wiki-links.ts        Link parsing + backlinks\n│   ├── attachments.ts       Attachment management\n│   ├── slide-utils.ts       Slide parser\n│   ├── daily-note.ts        Daily note helper\n│   ├── random-note.ts       Random note picker\n│   ├── css-snippets.ts      CSS snippet system\n│   ├── plugins.ts           Plugin management\n│   ├── community.ts         Community theme support\n│   ├── calendar-utils.ts    Month grid, task extraction\n│   ├── flashcard-utils.ts   SM-2 algorithm, card extraction\n│   ├── markdown-lint.ts     Linting rules (wiki-links, headings, code blocks)\n│   ├── note-history.ts      Line-based diff (LCS algorithm)\n│   ├── publish.ts           Markdown-to-HTML converter\n│   ├── board-utils.ts       Board parse/serialize, card CRUD\n│   └── dataview.ts          Vault query engine\n├── constants/\n│   └── theme.ts             10 built-in themes + accent colors\n└── types/\n    └── index.ts             TypeScript interfaces\n```\n\n### Mobile vs Desktop\n\nBoth apps share the same feature set with platform-appropriate adaptations:\n\n| Feature | Desktop | Mobile |\n|---|---|---|\n| Editor | CodeMirror 6 | TextInput + toolbar |\n| Git sync | Native git binary | GitHub REST API + fresh clone |\n| File storage | Any filesystem path | App document directory |\n| Themes | 10 built-in + custom creator | 10 built-in + community install |\n| Plugins | Sandbox execution | Install + enable/disable |\n| Navigation | Sidebar + tabs + split editor | Stack navigation + swipe between notes |\n| Graph view | Force-directed canvas | Force-directed WebView canvas |\n| Board view | Drag-drop columns | Horizontal scroll columns with move actions |\n| Calendar | Monthly grid | Monthly grid with daily note dots |\n| Flashcards | SM-2 spaced repetition | SM-2 spaced repetition |\n| Canvas | SVG whiteboard | &mdash; |\n| Vim mode | CodeMirror vim extension | &mdash; |\n| Audio recorder | MediaRecorder API | &mdash; |\n| Drawing editor | Canvas with tools | &mdash; |\n| PDF viewer | Inline annotations | &mdash; |\n| Keyboard shortcuts | 70+ rebindable | System defaults |\n\n---\n\n## 🌐 Community\n\nNoteriv has a growing ecosystem of community-created extensions. Browse and install them directly from the app.\n\n<table>\n  <tr>\n    <td align=\"center\" width=\"33%\">\n      <h3>Plugins</h3>\n      <a href=\"https://github.com/thejacedev/NoterivPlugins\">\n        <strong>thejacedev/NoterivPlugins</strong>\n      </a>\n      <br /><br />\n      <p>Extend Noteriv with custom commands, sidebar panels, status bar items, and editor integrations. Plugins have access to the vault filesystem, editor state, and event system.</p>\n      <br />\n      <sub>\n        <strong>Plugin API:</strong> vault read/write, UI commands, event listeners (file-open, file-save, editor-change, etc.), editor manipulation (insert, replace, cursor)\n      </sub>\n    </td>\n    <td align=\"center\" width=\"33%\">\n      <h3>Themes</h3>\n      <a href=\"https://github.com/thejacedev/NoterivThemes\">\n        <strong>thejacedev/NoterivThemes</strong>\n      </a>\n      <br /><br />\n      <p>Community color themes beyond the 10 built-in options. Themes define 16 color properties covering backgrounds, text, accent, and syntax colors.</p>\n      <br />\n      <sub>\n        <strong>Theme format:</strong> JSON with id, name, type (dark/light), and colors object. Import/export supported on desktop.\n      </sub>\n    </td>\n    <td align=\"center\" width=\"33%\">\n      <h3>CSS Snippets</h3>\n      <a href=\"https://github.com/thejacedev/NoterivSnippets\">\n        <strong>thejacedev/NoterivSnippets</strong>\n      </a>\n      <br /><br />\n      <p>Fine-tune the editor and preview with custom CSS. Snippets are stored per-vault and can be toggled individually. Community snippets are organized by category.</p>\n      <br />\n      <sub>\n        <strong>Snippet storage:</strong> <code>.noteriv/snippets/</code> directory with per-snippet <code>.css</code> files and a config JSON for enable/disable state.\n      </sub>\n    </td>\n  </tr>\n</table>\n\n### Creating Plugins\n\nPlugins live in `.noteriv/plugins/{plugin-id}/` inside your vault. Each plugin needs:\n\n```\nmy-plugin/\n├── manifest.json    Plugin metadata\n└── main.js          Entry point\n```\n\n**manifest.json:**\n```json\n{\n  \"id\": \"my-plugin\",\n  \"name\": \"My Plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"What this plugin does\",\n  \"author\": \"Your Name\",\n  \"main\": \"main.js\"\n}\n```\n\n**main.js:**\n```javascript\nmodule.exports = {\n  onLoad(api) {\n    api.ui.addCommand({\n      id: \"hello\",\n      name: \"Say Hello\",\n      callback: () => api.ui.showNotice(\"Hello from my plugin!\")\n    });\n  },\n  onUnload() {\n    // cleanup\n  }\n};\n```\n\n### Creating Themes\n\nThemes are JSON files with 16 color properties:\n\n```json\n{\n  \"id\": \"my-theme\",\n  \"name\": \"My Theme\",\n  \"type\": \"dark\",\n  \"colors\": {\n    \"bgPrimary\": \"#1a1b26\",\n    \"bgSecondary\": \"#16161e\",\n    \"bgTertiary\": \"#24283b\",\n    \"border\": \"#3b4261\",\n    \"textPrimary\": \"#c0caf5\",\n    \"textSecondary\": \"#a9b1d6\",\n    \"textMuted\": \"#565f89\",\n    \"accent\": \"#7aa2f7\",\n    \"green\": \"#9ece6a\",\n    \"red\": \"#f7768e\",\n    \"yellow\": \"#e0af68\",\n    \"blue\": \"#7aa2f7\",\n    \"mauve\": \"#bb9af7\",\n    \"peach\": \"#ff9e64\",\n    \"teal\": \"#73daca\",\n    \"pink\": \"#bb9af7\"\n  }\n}\n```\n\nSave to `.noteriv/themes/my-theme.json` or submit a PR to [NoterivThemes](https://github.com/thejacedev/NoterivThemes).\n\n---\n\n## 📁 Project Structure\n\n```\nNoteriv/\n├── desktop/              Tauri 2 + Next.js desktop application\n│   ├── src-tauri/        Rust backend (IPC, file I/O, Git, sync, clipper server, vault watcher)\n│   ├── src/components/   41 React components + markdown rendering engine\n│   ├── src/lib/          33 utility modules\n│   └── public/           Platform icons + pdf.js worker\n├── mcp/                  MCP server for AI assistant integration (22 tools, auto-discovers vaults)\n├── extension/            Web Clipper browser extension (Manifest V3)\n├── phone/                Expo + React Native mobile application\n│   ├── app/              19 screens (Expo Router)\n│   ├── components/       11 UI components\n│   ├── lib/              24 utility modules\n│   └── context/          App state + theme contexts\n├── .github/workflows/    CI/CD (build + release)\n├── LICENSE               MIT License\n└── README.md\n```\n\n---\n\n## 🔧 Development\n\n### Commands\n\n| Command | Description |\n|---|---|\n| `cd desktop && npm run dev` | Desktop dev mode (Next.js + Tauri) |\n| `cd desktop && npm run build` | Build desktop distributables |\n| `cd desktop && npm run build:next` | Build Next.js only |\n| `cd mcp && npm install` | Install MCP server dependencies |\n| `node mcp/index.js` | Run MCP server (manual vault path optional) |\n| `cd phone && npx expo start` | Mobile dev server |\n| `cd phone && npx expo start --android` | Run on Android |\n| `cd phone && npx expo start --ios` | Run on iOS |\n| `cd phone && npx expo export` | Export mobile app bundle |\n\n### Tech Stack\n\n| Layer | Desktop | Mobile |\n|---|---|---|\n| Framework | Next.js 16 | Expo 54 |\n| UI | React 19 | React Native 0.81 |\n| Editor | CodeMirror 6 | TextInput + custom renderer |\n| Runtime | Tauri 2 (Rust) | Expo Router 6 |\n| File I/O | Rust std::fs | expo-file-system |\n| Sync | std::process git | GitHub REST API |\n| Storage | JSON files | AsyncStorage |\n| Styling | Tailwind CSS 4 | StyleSheet + dynamic themes |\n| Math | KaTeX | &mdash; |\n| Diagrams | Mermaid | &mdash; |\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Here's how you can help:\n\n1. **Report bugs** &mdash; Open an issue with steps to reproduce\n2. **Suggest features** &mdash; Open an issue describing what you'd like to see\n3. **Submit code** &mdash; Fork, create a branch, make your changes, and open a PR\n4. **Create plugins** &mdash; Build and share plugins via [NoterivPlugins](https://github.com/thejacedev/NoterivPlugins)\n5. **Create themes** &mdash; Design and share themes via [NoterivThemes](https://github.com/thejacedev/NoterivThemes)\n6. **Create snippets** &mdash; Write and share CSS snippets via [NoterivSnippets](https://github.com/thejacedev/NoterivSnippets)\n\n---\n\n## 📄 License\n\n[MIT](LICENSE) &copy; Jace Sleeman\n\n<div align=\"center\">\n  <br />\n  <sub>Built with care by <a href=\"https://github.com/thejacedev\">@thejacedev</a></sub>\n</div>\n"}