Silent Reflect

approvedunreviewed

by Xxchujiu233

Silently tracks what you write and change in your vault, then generates daily and weekly reflections. Strictly read-only.

★ 1 starsUpdated todayMIT

Silent Reflect

Passive writing trace & reflection for Obsidian

Silently records how you write, then hands you back what you couldn't see yourself. Read-only, non-intrusive, no note is ever modified.


Why Silent Reflect?

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.


What makes it different

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 pluginSilent Reflect
InputYou feed it materialYour writing behaviour
Your action requiredWrite a prompt, run a commandNone
Original notesRe-tagged, restructuredRead-only, guaranteed
OutputA summary of contentBehavioural insight, may be empty

An empty result is a valid result. If nothing is worth saying, the insight layer stays empty instead of padding.


Features

FeatureDetails
🤫 Fully passive captureFile events only. No popups, no notifications, no interruption to your writing flow.
🔒 Strictly read-onlyWrites are hard-blocked to _Reflection/. A runtime path assertion throws before any write outside it.
🧩 Section-level change trackingRecords which heading section changed, not just that the file changed. This is what makes real insight possible.
📅 Daily & weekly reflections4 dimensions daily, 6 weekly (adds thinking trajectory and open loops).
🧠 Self-vetoing insight layerEach candidate is judged; unsupported claims are dropped with a stated reason.
👁️ Sidebar panelThree tabs (Today / Week / Insights), clickable [[wikilinks]] back to the source note, one-click regenerate.
🤖 Optional AIWorks without a model for capture and screening. Model use is opt-in with your own API key.
🎨 Native themingUses Obsidian CSS variables only — follows light/dark and custom themes.

How it works

Silent Reflect is built around one rule: observe, don't interfere.

  1. Capture — records file events and section-level diffs into _Reflection/_events/YYYY-MM-DD.jsonl. Append-only, never rewrites.
  2. Screen — deterministic rules (no model) surface candidates: stalled notes, repeated restarts, churn without closure, contradictions across time.
  3. Reflect — a model judges each candidate against your own evidence and may reject it.
  4. Read — the sidebar panel renders the results; links jump back to the original note.

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.


Getting started

1. The engine

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/.

2. The plugin

Copy main.js, manifest.json and styles.css into:

<vault>/.obsidian/plugins/silent-reflect/

Then enable Silent Reflect in Settings → Community plugins.

3. Configure

Settings → Silent Reflect:

SettingNotes
Engine directoryWhere run.mjs lives
Node pathObsidian launched from the GUI usually has no node on PATH — use an absolute path
Regenerate scopeDaily or weekly

Privacy

  • The plugin makes no network requests. It does not upload anything.
  • The engine reads .md files only; the sole writable directory is _Reflection/ (asserted at runtime).
  • When a model is used, only the candidate entry and its source excerpt are sent — never the whole vault.
  • No telemetry, no analytics, no hidden collection.

Permissions and why they are needed

Obsidian's automated review flags two capabilities. Both are deliberate, and both are required by the design described above.

CapabilityWhyScope
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_processThe "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.


Platform support

ComponentWindowsmacOS / 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.


Known limitations

  • Chinese UI only at the moment; reflection text follows your notes' language.
  • "Regenerate" blocks until finished (up to 5 minutes) and disables the button meanwhile.
  • No automatic catch-up: if the machine is off at 22:00, that day is not regenerated later.
  • One vault per engine instance.

Contributing

License

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.