Unread Changes

approved

by Hayden / Atlas-AI

Unread-message awareness for human+AI co-edited vaults: unread badges, synced read-state, changelog links, attribution, and diffs. - This plugin has not been manually reviewed by Obsidian staff.

โ˜… 1 starsโ†“ 35 downloadsUpdated 26d agoMIT

Unread Changes โ€” Obsidian plugin

Unread-message awareness for a vault co-edited by humans and AI agents. When anyone (or anything) other than you changes a note, it behaves like an unread message:

  • ๐Ÿ”ต Unread dot on the note in the file explorer, with rollup counts on folders
  • ๐Ÿ“ฅ Unread inbox side pane: every unread note with who changed it and a plain-English summary
  • ๐Ÿ“„ Banner above changed notes (virtual โ€” your files are never modified): "Changed by claude (session xyz) ยท 2 h ago โ€” reprioritised the fix wave" with [Changelog] [Diff] [Mark read] actions
  • ๐Ÿ” Diff of the note vs the version you last read (per-device snapshots), plus exact per-write diffs from the changelog
  • ๐Ÿ‘ค Attribution: AI writes are stamped by the writer; your own edits never light up; unattributed external changes are labelled as such
  • โœ… Auto mark-as-read after a configurable dwell (or instant / manual-only), with read-state synced across your devices conflict-free
  • ๐Ÿ—‚ Audit trail: every stamped change appends to _changelog/<note path> โ€” plain markdown notes you can browse, search, and link like anything else

Design doc: docs/DESIGN.md (architecture, validated sync model, built-vs-designed cut-line).

Why

As vaults become shared context layers โ€” synced across devices, edited by collaborators and increasingly by AI agents โ€” sync alone gives you the latest version of every file but no confidence you've actually seen it. Important edits get silently missed, and there's no record of who changed what or why. This plugin makes awareness sync along with the files: what changed, who changed it, why, and whether you've reviewed it.

How it works (short version)

  • Change detection is content-hash based, never mtime > (sync tools rewrite mtimes): a persisted per-device baseline catches changes made while Obsidian was closed; vault events catch live ones; both feed one unread set.

  • Read-state lives in _unread/state/<deviceId>.json โ€” one file per device, each written only by its own device, merged newest-wins on read. No sync conflicts by construction (validated against remotely-save and Nextcloud desktop client semantics โ€” see DESIGN.md ยง3.1).

  • Attribution comes from _changelog/<note path> entries with the format:

    ## 2026-07-09T14:30:00+08:00 โ€” claude (session xyz) ยท agent
    **Summary:** Closed milestone 2 and scoped milestone 4.
    
    <details><summary>Diff</summary>
    
    ```diff
    โ€ฆ
    
    ```

    Agents, scripts, or automations writing to the vault stamp these via scripts/vault_write.py. The format contract lives in src/core/changelog.ts + vault_write.py โ€” keep them in sync.

Install (per device)

  1. Copy main.js, manifest.json, styles.css into <vault>/.obsidian/plugins/unread-changes/
  2. Enable Unread Changes in Settings โ†’ Community plugins
  3. First run seeds every note as read โ€” badges appear only for changes after install.

Mobile (iOS/Android) is supported (isDesktopOnly: false, no Node APIs, no git). If you sync with remotely-save, enable scheduled sync or sync-on-save โ€” badge propagation across devices is bounded by sync cadence.

Development

npm install
npm run dev      # watch build (set OUTDIR=<vault>/.obsidian/plugins/unread-changes to build into a test vault)
npm test         # vitest unit tests (obsidian module stubbed)
npm run build    # typecheck + production bundle
python3 scripts/vault_write.py --self-test

Develop against a disposable test vault (there's a gitignored dev-vault/), never a live one. End-to-end verification runs a real Obsidian with --remote-debugging-port=9222 and drives/inspects it over CDP.

Status

v1 core (badges, read-state sync, inbox, banner, diffs, attribution, AI-side stamping) is built and verified end-to-end in Obsidian 1.12.7. Phase-2 items (plugin-side changelog entries for human edits, watcher-generated summaries for unattributed changes, digest notes, store packaging) are designed in DESIGN.md ยง5.

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.