From 69e69abb85a7e38f308880ad8fa6d9dda83dc485 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Nov 2025 06:21:05 +0000 Subject: [PATCH] feat(obsidian): pre-warm vault cache on startup for instant browsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: The first time you browse notes, it has to scan all 13,496 files, which is very slow. This makes the initial user experience poor. Solution: Pre-warm the vault file cache in the background: 1. When Obsidian connection is tested (first-time setup) 2. When FMG loads and Obsidian is already enabled (page reload) Implementation: - Add prewarmCache() function that scans vault in background - Call it from testConnection() (don't await - runs async) - Call it from init() if config.enabled is true - Scan happens silently in the background - By the time user clicks Browse, cache is already loaded Benefits: - First browse is instant (cache already loaded) - Works on every page reload - Non-blocking (doesn't slow down FMG startup) - Silent/automatic (no user interaction needed) User experience: - First time: Test connection → cache warms in background → browse is instant - Subsequent loads: Page loads → cache warms → browse is instant - Cache lasts 5 minutes, so multiple browses within that window are all instant EOF ) --- modules/io/obsidian-bridge.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modules/io/obsidian-bridge.js b/modules/io/obsidian-bridge.js index 86e32f15..6ed7c13d 100644 --- a/modules/io/obsidian-bridge.js +++ b/modules/io/obsidian-bridge.js @@ -46,6 +46,12 @@ const ObsidianBridge = (() => { fmgIdIndex = {}; } } + + // Pre-warm cache if Obsidian is already enabled + if (config.enabled) { + INFO && console.log("Obsidian enabled, pre-warming cache..."); + prewarmCache(); + } } // Save configuration @@ -74,6 +80,10 @@ const ObsidianBridge = (() => { INFO && console.log("Obsidian connection successful:", data); config.enabled = true; saveConfig(); + + // Pre-warm the cache in the background (don't await) + prewarmCache(); + return true; } catch (error) { ERROR && console.error("Obsidian connection failed:", error); @@ -83,6 +93,18 @@ const ObsidianBridge = (() => { } } + // Pre-warm the vault files cache in the background + async function prewarmCache() { + try { + INFO && console.log("Pre-warming vault file cache..."); + await getVaultFiles(); + INFO && console.log("Vault file cache pre-warmed successfully!"); + } catch (error) { + WARN && console.warn("Failed to pre-warm cache:", error); + // Don't throw - this is just optimization + } + } + // Recursively scan a directory and all subdirectories for .md files async function scanDirectory(path = "") { const response = await fetch(`${config.apiUrl}/vault/${encodeURIComponent(path)}`, {