The previous implementation used @blinksgg/canvas which is a
Supabase-backed whiteboard component — nodes were computed but
never passed to the Canvas (no such prop exists). Replaced with
a self-contained force-directed graph using HTML5 Canvas API:
drag nodes, pan, zoom, click to navigate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lazy-load WhiteboardView to prevent module-scope side effect
(registerBuiltinCommands) from crashing the entire JS module tree
- Fix Rules of Hooks violation in Editor: hooks after early return
caused React to crash when currentNote transitioned from null
- Fix async race condition in Editor content initialization where
noteContent arrived after renderToDOM had already run with empty content
- Add error handling to DailyView's getOrCreateDaily call
- Add inline fallback styles to index.html for pre-JS loading state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Security:
- Add path traversal protection (safe_vault_path) for all file operations
- Sanitize markdown preview with DOMPurify to prevent XSS
- Fix encryption: decrypted content no longer written back to disk
- Harden CSP for Tauri v2 production mode
Code quality:
- Remove dead code (cache.rs, NoteView, unused tabs/activeTab state)
- Fix stale closure in debounced save using refs
- Fix image paste to use domToMarkdown instead of innerText
- Single-pass widget rendering (was 3 sequential innerHTML clobbers)
- Move snapshot logic into save callback
- Remove no-op updateWikilinks in drag-and-drop
- Wire CSS editor to Cmd+U shortcut
- Replace hardcoded vault path with portable fallback
Performance:
- LazyLock static regexes for WIKILINK_RE and TAG_RE
- Fix duplicate dirs_config_path, update CSS commands
Release:
- Bump version to 1.0.0
- Rewrite README with project documentation
- Update CHANGELOG with 1.0.0 entry
- Update .gitignore for build artifacts and vault data
- Update canvas dependency path
- Fix canvas API compatibility (onSelectionChange, removed props)