No description
Backend (lib.rs): - Add atomic_write/atomic_write_bytes helpers (write→fsync→rename→fsync parent) - Apply safe_vault_path() to all 20 file-access commands (was 3) - Apply safe_name() to workspace/canvas/attachment filename params - Fix 2 silent error swallowing sites (let _ = fs::write) - Fix git_status/git_commit/git_init error handling (check exit codes) - Migrate all Regex::new() to LazyLock statics (10 total) - Use ~tmp suffix for atomic writes (not extension replacement) - Replace 2 unwrap() panic sites with unwrap_or_default() - Skip ~tmp files in export_vault_zip Frontend (Editor.tsx): - Fix critical note-switch race: capture note path at call time, not when debounced timer fires (prevented old content → new note) - Clear pending save timeout on note switch (defense-in-depth) - Fix handleSlashSelect: route through debounced saveContent pipeline with domToMarkdown() instead of direct writeNote() with innerText - Fix handlePaste stale closure (add saveContent to deps) Changelog updated with Hardened section under v1.0.0. |
||
|---|---|---|
| .changeset | ||
| .vscode | ||
| public | ||
| src | ||
| src-tauri | ||
| vault | ||
| .gitignore | ||
| CHANGELOG.md | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
Graph Notes
A local-first, graph-based note-taking app built with Tauri, React, and Rust. Think Obsidian meets Roam — your notes live as plain Markdown files on disk, connected by [[wikilinks]] and visualized as an interactive knowledge graph.
Features
Core Editing
- Rich contenteditable editor with inline Markdown styling
[[Wikilink]]autocomplete with note creation on the fly- Slash commands, heading folding, split-pane editing
- Tabbed editor with drag-reorder
Knowledge Graph
- Force-directed graph visualization with semantic zoom
- Graph filtering, focus mode, orphan detection
- Local backlink graph and analytics dashboard
Organization
- Sidebar file tree with drag-and-drop, folders, favorites, pinning
- Full-text search, command palette (
⌘K), tags - Calendar view, timeline view, kanban board
Advanced
- Frontmatter properties panel and database views (table/gallery/list)
- Dataview queries — inline
TABLE ... SORT ...blocks - Canvas whiteboard for freeform visual thinking
- Spaced repetition flashcards (SM-2 scheduling)
- Note encryption (AES-256-GCM with Argon2 key derivation)
- Git sync (commit/push/pull panel)
- Version history with inline diff viewer
Customization
- 5 built-in themes with live preview
- Custom CSS snippets editor
- Configurable keyboard shortcuts
- Workspace layouts (save/restore window arrangements)
Import / Export
- Export vault as ZIP, individual notes as HTML or PDF
- Import Markdown folders from Obsidian, Notion, etc.
Tech Stack
| Layer | Technology |
|---|---|
| Desktop shell | Tauri v2 |
| Frontend | React 19, TypeScript, Vite |
| Backend | Rust (filesystem, search, encryption, graph) |
| Styling | Tailwind CSS 4 + custom design tokens |
| Graph engine | @blinksgg/canvas, d3-force, graphology |
Development
# Install dependencies
npm install
# Run in development mode (starts both Vite dev server and Tauri)
npm run tauri dev
# Build for production
npm run tauri build
Prerequisites
- Node.js ≥ 18
- Rust toolchain
- Tauri v2 prerequisites
Project Structure
├── src/ # React frontend
│ ├── components/ # 33 UI components
│ ├── lib/ # Commands, frontmatter, wikilinks, note cache
│ └── index.css # Design system (tokens, component styles)
├── src-tauri/ # Rust backend
│ └── src/lib.rs # Tauri commands (notes, graph, search, encryption, git)
├── vault/ # Default vault directory (gitignored)
└── package.json
License
MIT