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.
13 KiB
13 KiB
Changelog
All notable changes to Graph Notes will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.0.0] — 2026-03-09
🎉 First Stable Release
Graph Notes reaches 1.0 — a local-first, graph-based note-taking app built with Tauri, React, and Rust.
Hardened
- Atomic writes — all file saves use write→fsync→rename→fsync-parent to prevent corruption on crash/power loss
- Path validation —
safe_vault_path()applied to all 20 file-access commands, preventing directory traversal - Filename sanitization —
safe_name()rejects path separators in workspace, canvas, and attachment names - Note-switch save race — debounced save now captures note path at call time, preventing old content from being written to wrong note
- Save pipeline consistency — slash command insert and image paste now route through the standard debounced save with
domToMarkdown() - Git error handling —
git_status,git_commit,git_initnow check exit codes and surface stderr on failure - Silent error swallowing — fixed 2
let _ = fs::write()sites to propagate errors - Panic prevention — replaced
unwrap()withunwrap_or_default()on falliblefile_name()calls - Export safety —
export_vault_zipskips in-progress~tmpatomic write files - Regex performance — all 10 per-call
Regex::new()migrated toLazyLockstatics
Fixed
- Rust compilation — resolved duplicate
dirs_config_path()definition and removed reference to unlinkeddirscrate - Content Security Policy — replaced
nullCSP with a proper baseline policy allowing local resources and Google Fonts - Canvas dependency — updated
@blinksgg/canvasto correct local file path
Removed
- Dead code — removed unused
cache.rsmodule (196 lines) that was never compiled (nomod cache;declaration, missingnotifycrate dependency)
Changed
- README — replaced Vite template boilerplate with comprehensive project documentation
- .gitignore — added
src-tauri/target/andvault/exclusions - Version — bumped from 0.9.0 → 1.0.0 across
package.json,Cargo.toml, andtauri.conf.json
[0.9.0] — 2026-03-09
Added
- Import/Export Hub — Export vault as ZIP, import .md folders from Obsidian/Notion
- Keyboard Shortcuts Editor — View, rebind, persist all keyboard shortcuts
- Graph Analytics — Stats dashboard with orphan detection, most-connected notes, link density
- Note Pinning — Pin notes to sidebar top, persisted to
.graph-notes/pinned.json
Changed
- Sidebar: added 📊 Analytics action
- Command Palette: added Graph Analytics, Import/Export, Keyboard Shortcuts commands
- Backend: added
export_vault_zip,import_folder,save_shortcuts,load_shortcuts,get_pinned,set_pinned
Dependencies
- Added
zipcrate (Rust)
[0.8.0] — 2026-03-09
Added
- Outline Sidebar — Collapsible heading tree (H1–H6) with click-to-scroll and active heading tracking
- Timeline View — Chronological note cards grouped by date with 7d/30d/1y filters
- Document Statistics — Status bar with word count, characters, lines, reading time, heading count
- Markdown Table Editor — Visual table grid with click-to-edit cells, add/remove rows/columns, Tab navigation
- Random Note — 🎲 Discover random notes from sidebar or command palette
- Link Suggestions — Backend
suggest_linksfor wikilink auto-completion
Changed
- Sidebar: added 📅 Timeline and 🎲 Random Note actions
- Command Palette: added Timeline, Random Note commands
- Backend: added
suggest_links,list_notes_by_date,random_notecommands
Dependencies
- Added
randcrate (Rust)
[0.7.0] — 2026-03-09
Added
- Canvas Whiteboard — Freeform visual thinking surface powered by
@blinksgg/canvaswith card/text nodes, drag, zoom, save/load - Database Views — Notion-style table/gallery/list views from frontmatter properties with sort/filter
- Backlink Context — Paragraph-level excerpts around wikilink mentions in backlinks panel
- Dataview Queries — Inline
```dataview TABLE ... SORT ... ```blocks rendering live query tables - Git Sync — commit/push/pull panel with status indicator, changed file list, repo initialization
Changed
- GraphView rewritten using
@blinksgg/canvas(replaces custom HTML5 Canvas force simulation) - Sidebar: added Database, Whiteboard quick actions
- Command Palette: added Database View, New Whiteboard, Git Sync commands
- Backlinks now use backend
get_backlink_contextfor paragraph excerpts
Dependencies
- Added
@blinksgg/canvas,jotai,graphology,d3-force
[0.6.0] — 2026-03-09
Added
- Tabbed Editor — Multi-note tab bar with drag-reorder, close buttons, active tab highlighting
- Note Refactoring — Extract selection to new note (replaces with wikilink), merge notes (appends + updates links)
- Encrypted Notes — AES-256-GCM password protection with Argon2 key derivation, lock/unlock button in editor
- Spaced Repetition Flashcards — Study mode from
?? question :: answer ??syntax, SM-2 scheduling, difficulty ratings - Heading Folding — Fold state persistence per note via
.graph-notes/folds.json - Custom CSS Snippets — Live-preview CSS editor, persisted in
~/.config/graph-notes/custom.css - Workspace Layouts — Save/restore window arrangements in
.graph-notes/workspaces/ - Embeddable Widgets —
{{progress:N}}progress bars,{{counter:N}}badges,{{toggle:on/off}}indicators
Changed
- Editor supports right-click context menu for refactoring operations
- Command Palette extended with Flashcards, Custom CSS, and Save Workspace
- Sidebar quick actions include Flashcards
- Custom CSS loaded on mount via
useCustomCssInithook
Dependencies
- Added
aes-gcm,argon2,rand,base64for encryption
[0.5.0] — 2026-03-08
Added
- Kanban Board — Visual task board from
- [ ]/- [/]/- [x]items across vault, with drag-and-drop between Todo/In Progress/Done columns - Focus / Zen Mode — Distraction-free writing (
⌘⇧F): hides sidebar, breadcrumbs, meta, centers content at max 720px - Note Version History — Auto-snapshots every 5 min, timeline sidebar with inline diff viewer (add/remove highlighting)
- PDF Export — Print-styled export via browser print dialog with clean typography
- Global Search & Replace — Find/replace text across vault with dry-run preview before applying (
⌘H) - Local Backlink Graph — Mini force-directed canvas in preview showing current note's 1-hop link connections
- Writing Goals — Per-note word count targets with gradient progress bar (red→yellow→green)
- Syntax-Highlighted Code Blocks — highlight.js with 8 languages, copy-to-clipboard button, dark theme
Changed
- Editor supports focus mode (hides chrome, centers content)
- Command Palette extended with Kanban, Focus Mode, Search & Replace, Export as PDF
- Sidebar quick actions include Kanban Board
- Auto-snapshot on save (throttled to 1 per 5 min)
Dependencies
- Added
highlight.jsfor syntax highlighting
[0.4.0] — 2026-03-08
Added
- Frontmatter & Properties Panel — YAML
---fenced metadata with inline key-value editor (collapsible panel below breadcrumbs) - Table of Contents — Auto-generated outline from headings, shown alongside preview mode with active heading highlight
- Mermaid Diagram Rendering — Fenced
mermaidcode blocks render as SVG diagrams in preview mode (lazy-loaded) - Image & Attachment Support — Paste images from clipboard, stored in
_attachments/directory withmarkdown - Slash Commands — Type
/at line start to open inline formatting menu (14 commands: headings, lists, code blocks, mermaid, tables) - Calendar View — Visual month grid for daily notes with dot indicators, "Today" button, and click-to-create
- Theme Picker — 5 built-in themes (Dark Purple, Dark Emerald, Dark Ocean, Dark Rose, Light) with live preview, persisted
- Export to HTML — Export current note as styled standalone HTML file
Changed
- Editor now includes PropertiesPanel, TableOfContents sidebar, and SlashMenu
- Command Palette extended with Calendar, Theme, and Export HTML commands
- Sidebar quick actions include Calendar View
- Added
⌘Tkeyboard shortcut for Theme Picker
Dependencies
- Added
mermaidfor diagram rendering
[0.3.0] — 2026-03-08
Added
- Split Editor — Open two notes side by side with a draggable divider (right-click → "Open in split")
- Wikilink Hover Preview — Hover over
[[wikilinks]]to see a floating preview card with note content and link count - Note Transclusion —
![[note-name]]embeds the content of another note inline, with recursive depth limiting (3 levels) - Vault Switcher — Click sidebar brand to switch between recent vaults or open a new folder
- Drag & Drop File Organization — Drag notes between folders in the sidebar file tree
- Breadcrumb Navigation — Path breadcrumbs shown above the editor for nested notes
- Note Templates — Create notes from templates in
_templates/directory via Command Palette (supports{{title}}and{{date}}variables) - Recent Notes — Last 5 recently opened notes shown in the sidebar
- Favorites — Pin notes as favorites (right-click → "Favorite"), persisted per vault in
.graph-notes/favorites.json - Open in Split Pane — Right-click context menu option to open a note in a side-by-side view
Changed
- Note view now uses
SplitViewcomponent, supporting both single-pane and dual-pane editing - Context menu expanded with "Favorite" and "Open in split" actions, plus visual divider
- Command Palette shows template commands when available
LinkPreviewcomponent renders as a global overlay for all hover previews
[0.2.0] — 2026-03-08
Added
- Full-Text Search — Vault-wide content search in the sidebar (debounced, with context snippets and result ranking)
- Command Palette —
⌘K/Ctrl+Kopens a fuzzy search palette for notes, commands, and content - Keyboard Shortcuts —
⌘Nnew note,⌘Ggraph view,⌘Ddaily note,⌘Etoggle edit/preview,⌘\toggle sidebar - Note Rename — Right-click context menu on notes in sidebar for inline rename with automatic wikilink updates across vault
- Note Delete — Right-click context menu with confirmation dialog; navigates away if active note deleted
- Tags System —
#tagextraction from notes, sidebar tags section with click-to-filter, emerald-colored tag pills in editor - Graph Filtering — Filter bar to highlight matching nodes, focus mode (1-hop neighborhood), orphan node toggle
- Inline Markdown Styling — Headings (
# ## ###) render at proper sizes in edit mode,**bold**,*italic*,`code`styled inline - List Continuation — Pressing Enter after
- itemauto-inserts bullet on next line - Tab Indent/Outdent — Tab and Shift+Tab for list item indentation
- Collapsible Sidebar — Toggle sidebar visibility with
⌘\
Changed
- Edit/Preview mode is now global (shared via context), toggled with
⌘Efrom anywhere - Search input shows
⌘Khint for command palette discovery
[0.1.0] — 2026-03-07
Added
- Tauri v2 Desktop App — Local-first note-taking with full filesystem access via
tauri-plugin-fs - Contenteditable Editor — Rich inline editing with
[[wikilink]]token chips (compact pills that unwrap on backspace/delete) - Wikilink Autocomplete — Type
[[to fuzzy-search and link notes; creates new notes if no match found - Force-Directed Graph View — Canvas-based visualization with semantic zoom (circles → rounded-rect cards with note previews)
- Graph Interactions — Single-click animates zoom to node, double-click opens note, drag to reposition nodes
- shadcn-Inspired Design System — Zinc-based neutrals, purple accent gradients, focus rings, spring transitions
- Sidebar — Recursive file tree with search, collapsible folders, active-state indicators, note count badge
- Backlinks Panel — Lists all notes linking to current page with highlighted context snippets
- Markdown Preview — Toggle between edit and rendered preview modes with inline wikilink rendering
- Daily Notes — Auto-generated daily journal entries accessible from sidebar shortcut
- Auto-Save — Debounced 500ms save on every keystroke
- Custom Scrollbars — Minimal 5px scrollbars matching the dark theme