Features
- New
edit_notetool — append, prepend (after frontmatter), or replace exact text without rewriting the whole note - New
list_folderstool — lists all folders with note counts so the agent can discover folder names - New
list_tagstool — lists all tags with counts, sorted by frequency list_notesandsearch_vaultnow supporttagfilter parameterget_note_metadatanow returns backlinks (notes that link to this one) for knowledge graph navigationlist_notesnow includes modification timestamps,sort_by,modified_after, andlimitparameterssearch_vaultnow supportsmodified_afterfilter and optionalinclude_snippets- Agent can answer "read my latest note", "notes I changed today", "search only recent notes"
Security
- Search index no longer stores note content on disk — only paths + mtimes persisted
- Persisted search metadata encrypted at rest when
COUCHDB_PASSPHRASEis set (AES-256-GCM) - Content snippets fetched on demand from vault, not cached
- E2E encryption no longer undermined by plaintext index on disk
- CouchDB vault rejects
..and absolute paths (path traversal hardening) - Block
javascript:,data:,file:redirect URI schemes in OAuth registration - Verify
client_idat token exchange (defense-in-depth on top of PKCE) - HTML-escape
codeandcsrfvalues in OAuth form - CSRF token rotated on each failed password attempt
- Validate
COUCHDB_DATABASEname and LiveSync credentials in deploy entrypoint - Validate auth token structure when loading from disk
- File watcher reads through vault.readNote() (symlink protection)
- Warn when server has no authentication and listens on all interfaces
- Require
COUCHDB_PASSWORDin remote mode (no more default password) - Periodic cleanup of expired tokens and unused OAuth clients
- Suppress password/passphrase echo in setup script, quote secrets for spaces
MCP_REFRESH_DAYSfalls back to default (14) when set to a non-numeric value- Cap lockout backoff at ~85 minutes (prevents permanent lockout)
Changes
search_vaultreturns paths by default (not snippets) — setinclude_snippets=truefor content- Full search index (FlexSearch + metadata) persisted to disk and restored on cold start
- CouchDB mode uses
_changesfeed with persistedsincefor incremental startup (no full rebuild) - Local mode uses mtime diff for incremental startup
- Survives Fly.io suspend/resume (in-memory) and cold restarts (disk)
- Backlinks are case-insensitive (matches Obsidian behavior)
.obsidian/folder excluded from indexing and file watcher- File watcher debounced (100ms per path) to coalesce rapid Obsidian saves
list_notesdefault limit lowered from 500 to 100- Improved tool descriptions with concrete examples for agents
- Suppress livesync-commonlib logs that expose file paths (
LOG_LEVEL=debugto re-enable) - Updated livesync-commonlib to latest upstream
- E2E tests rewritten in TypeScript with cold restart test
Fixes
list_notesandsearch_vaultfolder filter matches correctly without trailing slash- CouchDB vault folder filter normalized to match local vault behavior
modified_afterreturns clear error on invalid date format instead of empty results- Guard against concurrent index saves
- Search snippets now work for multi-word queries where words aren't adjacent