From a22b40e7caee3e00aaf8fcb93eba3b0daf46080c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Nov 2025 05:23:45 +0000 Subject: [PATCH] perf(obsidian): add caching to vault file scanning The recursive directory scan was running every time the user opened the note browser, rescanning 13k+ files repeatedly. This was slow and wasteful. Changes: - Add vaultFilesCache object with files, timestamp, and TTL (5 min) - Check cache before scanning in getVaultFiles() - Cache results after successful scan - Add clearVaultCache() function for manual refresh - Add forceRefresh parameter to bypass cache - Log cache hits vs misses for debugging Performance: - First load: Scans vault (slow, but only once) - Subsequent loads: Instant (uses cache) - Cache expires after 5 minutes (auto-refresh) - User can manually clear cache if needed This makes opening the note browser instant on subsequent uses. --- modules/io/obsidian-bridge.js | 37 ++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/modules/io/obsidian-bridge.js b/modules/io/obsidian-bridge.js index 2a7278fe..0d2cbb7e 100644 --- a/modules/io/obsidian-bridge.js +++ b/modules/io/obsidian-bridge.js @@ -13,6 +13,13 @@ const ObsidianBridge = (() => { vaultName: "" }; + // Cache for vault file list + let vaultFilesCache = { + files: null, + timestamp: null, + ttl: 5 * 60 * 1000 // 5 minutes cache + }; + // Initialize from localStorage function init() { const stored = localStorage.getItem("obsidianConfig"); @@ -94,19 +101,42 @@ const ObsidianBridge = (() => { return mdFiles; } - // Get all markdown files from vault (recursively) - async function getVaultFiles() { + // Clear the vault files cache + function clearVaultCache() { + vaultFilesCache.files = null; + vaultFilesCache.timestamp = null; + INFO && console.log("Vault file cache cleared"); + } + + // Get all markdown files from vault (recursively, with caching) + async function getVaultFiles(forceRefresh = false) { if (!config.enabled) { throw new Error("Obsidian not connected"); } + // Check cache + const now = Date.now(); + const cacheValid = vaultFilesCache.files !== null && + vaultFilesCache.timestamp !== null && + (now - vaultFilesCache.timestamp) < vaultFilesCache.ttl; + + if (cacheValid && !forceRefresh) { + INFO && console.log(`getVaultFiles: Using cached list (${vaultFilesCache.files.length} files)`); + return vaultFilesCache.files; + } + try { TIME && console.time("getVaultFiles"); + INFO && console.log("getVaultFiles: Scanning vault (cache miss or expired)..."); // Recursively scan all directories const mdFiles = await scanDirectory(""); - INFO && console.log(`getVaultFiles: Found ${mdFiles.length} markdown files (recursive scan)`); + // Update cache + vaultFilesCache.files = mdFiles; + vaultFilesCache.timestamp = now; + + INFO && console.log(`getVaultFiles: Found ${mdFiles.length} markdown files (recursive scan, cached)`); DEBUG && console.log("Sample files:", mdFiles.slice(0, 10)); TIME && console.timeEnd("getVaultFiles"); @@ -520,6 +550,7 @@ Add your lore here... saveConfig, testConnection, getVaultFiles, + clearVaultCache, getNote, updateNote, createNote,