Xxchujiu2331 downloadsSilently tracks what you write and change in your vault, then generates daily and weekly reflections. Strictly read-only.
Silently records how you write, then hands you back what you couldn't see yourself. Read-only, non-intrusive, no note is ever modified.
You write thousands of words in your vault, but you rarely look back at how your ideas actually evolved. You want a reflection habit, but it takes too much effort to keep up. You've tried AI note tools, but you're afraid they'll restructure your folders or rewrite your notes without asking.
Silent Reflect solves this by watching, not editing. It reads what you write, records how each note changes over time, and generates a structured daily or weekly reflection. Your original notes are never touched — the guarantee is enforced in code, not just in the docs.
Most AI note tools summarize what you wrote. That's an echo — you already knew it. Silent Reflect looks at behaviour: which section you kept rewriting, which task stayed unchecked for eleven days, which conclusion silently flipped.
| Typical AI note plugin | Silent Reflect | |
|---|---|---|
| Input | You feed it material | Your writing behaviour |
| Your action required | Write a prompt, run a command | None |
| Original notes | Re-tagged, restructured | Read-only, guaranteed |
| Output | A summary of content | Behavioural insight, may be empty |
An empty result is a valid result. If nothing is worth saying, the insight layer stays empty instead of padding.
| Feature | Details |
|---|---|
| 🤫 Fully passive capture | File events only. No popups, no notifications, no interruption to your writing flow. |
| 🔒 Strictly read-only | Writes are hard-blocked to _Reflection/. A runtime path assertion throws before any write outside it. |
| 🧩 Section-level change tracking | Records which heading section changed, not just that the file changed. This is what makes real insight possible. |
| 📅 Daily & weekly reflections | 4 dimensions daily, 6 weekly (adds thinking trajectory and open loops). |
| 🧠 Self-vetoing insight layer | Each candidate is judged; unsupported claims are dropped with a stated reason. |
| 👁️ Sidebar panel | Three tabs (Today / Week / Insights), clickable [[wikilinks]] back to the source note, one-click regenerate. |
| 🤖 Optional AI | Works without a model for capture and screening. Model use is opt-in with your own API key. |
| 🎨 Native theming | Uses Obsidian CSS variables only — follows light/dark and custom themes. |
Silent Reflect is built around one rule: observe, don't interfere.
_Reflection/_events/YYYY-MM-DD.jsonl. Append-only, never rewrites.The engine lives outside Obsidian (a Node CLI). The plugin is a thin shell that reads and displays.
Why the split: a plugin only exists while Obsidian is open. Passive capture has to keep working when you're away, so generation runs on a system scheduler.
The plugin displays results; it does not generate them. Point it at an engine directory containing run.mjs, then run once:
node C:\path\to\engine\run.mjs --vault "C:\path\to\your\vault"
Output goes to <vault>/_Reflection/.
Copy main.js, manifest.json and styles.css into:
<vault>/.obsidian/plugins/silent-reflect/
Then enable Silent Reflect in Settings → Community plugins.
Settings → Silent Reflect:
| Setting | Notes |
|---|---|
| Engine directory | Where run.mjs lives |
| Node path | Obsidian launched from the GUI usually has no node on PATH — use an absolute path |
| Regenerate scope | Daily or weekly |
.md files only; the sole writable directory is _Reflection/ (asserted at runtime).Obsidian's automated review flags two capabilities. Both are deliberate, and both are required by the design described above.
| Capability | Why | Scope |
|---|---|---|
fs (filesystem) |
The plugin has to locate run.mjs and read the generated Markdown from _Reflection/. The Obsidian vault API cannot see files outside the vault, and the engine lives outside it by default. |
Reads only inside your vault and the engine directory you configure; the plugin itself never writes notes. |
child_process |
The "Regenerate" button runs your local Node engine once, then reads its output. Generation must happen outside Obsidian so it can also run on a schedule while Obsidian is closed. | Spawns only the run.mjs path you configure, with a fixed argument list. No arbitrary command input. |
If you would rather not grant these, the plugin still works as a viewer: the engine can be run from a terminal or a scheduled task, and the panel only reads the results. You can also remove the ribbon entry point and use the panel read-only.
The plugin does not phone home, does not include an update checker, and does not bundle analytics.
| Component | Windows | macOS / Linux |
|---|---|---|
| Plugin | ✅ | ✅ (desktop only) |
| Engine (Node scripts) | ✅ | ✅ |
| Scheduled generation | ✅ (Task Scheduler) | ⚠️ not packaged yet — use cron/launchd manually |
Mobile is not supported: it has no adapter.basePath and cannot spawn a process.
MIT