Skip to main content

A daemon that detects @ mentions in Obsidian notes, dispatches instructions to AI agents, and writes results back inline.

Project description

Note Watcher

A tool that detects @ mentions in Obsidian markdown notes stored in Git and dispatches instructions to configured agents — like Claude Code — that can read, modify, and reorganize your notes directly.

Write @agent_name do something in any note, and Note Watcher dispatches the instruction to the named agent. The agent can edit files, create new notes, restructure content, or make any other changes to your vault. The original instruction is then replaced with a completion marker (an HTML comment, invisible in rendered markdown) so it is never reprocessed:

<!-- @done agent_name: do something
Agent response summary goes here.
/@done -->

The real work happens in the commit: the agent's changes to your vault are committed back to Git. The completion comment is just a record that the instruction was processed.

Modes of Operation

Mode Use case
Daemon Real-time file watching on macOS via a LaunchAgent
GitHub Action One-shot batch processing on every push that changes .md files

Requirements

  • Python 3.10+

Installation

pip install notes-watcher

For development:

pip install -e ".[dev]"

Configuration

Copy the example config and edit it:

mkdir -p ~/.config/note-watcher
cp config.example.yml ~/.config/note-watcher/config.yml

The default config location is ~/.config/note-watcher/config.yml. You can override it with --config:

note-watcher watch --config /path/to/config.yml

Config reference

# Path to your Obsidian vault
vault: ~/Obsidian/MyVault

# Seconds to wait before processing after a file change
debounce_seconds: 1.0

# File patterns to ignore (glob syntax)
ignore_patterns:
  - "*.excalidraw.md"
  - ".trash/**"

# Agent definitions
agents:
  summarizer:
    type: echo        # Returns instruction text unchanged
  uppercase:
    type: uppercase   # Returns instruction text in uppercase
  word_count:
    type: command
    command: "wc -w"  # Runs a shell command, passes instruction via stdin

Agent types

Type Behavior
echo Returns the instruction text unchanged
uppercase Returns the instruction text in uppercase
command Runs a shell command with instruction text on stdin, returns stdout

Example: Using Claude Code as an agent

Configure a command agent that dispatches instructions to Claude Code:

agents:
  claude:
    type: command
    command: "claude -p"   # Dispatches instruction to Claude Code CLI

Claude Code runs with full access to your vault, so it can edit notes, create new files, and reorganize content — not just respond in a comment. Write @claude instructions in your notes:

@claude Summarize the key points of this meeting and add action items to my Tasks note

Daemon Mode

Daemon mode continuously watches your Obsidian vault for changes and processes @ mentions in real time.

Running manually

# Watch the vault specified in your config
note-watcher watch

# Override the vault path
note-watcher watch --vault ~/Obsidian/MyVault

# Enable verbose logging
note-watcher -v watch --vault ~/Obsidian/MyVault

Stop the daemon with Ctrl+C (SIGINT) or SIGTERM.

Installing as a macOS LaunchAgent

The included install script sets up Note Watcher as a LaunchAgent that starts on login and restarts on crash:

./scripts/install.sh

The script is idempotent and safe to run multiple times. It will:

  1. Detect the note-watcher executable on your system
  2. Generate a LaunchAgent plist from the included template
  3. Install it to ~/Library/LaunchAgents/
  4. Start the daemon

Logs are written to ~/Library/Logs/note-watcher/.

Uninstalling the LaunchAgent

./scripts/uninstall.sh

To also remove the log directory:

./scripts/uninstall.sh --clean

GitHub Action Mode

GitHub Action mode processes all pending @ instructions across the entire vault in a single batch run. This is useful for vaults stored in a Git repository.

CLI usage

note-watcher process --all --vault /path/to/vault

Setting up the GitHub Actions workflow

See examples/github-action/ for a complete, ready-to-copy example that uses Claude Code as the AI agent.

To set it up:

  1. Copy examples/github-action/.github/ into your notes repository
  2. Add a config.yml to your notes repo (see examples/github-action/config.example.yml)
  3. Add your ANTHROPIC_API_KEY as a repository secret

The example workflow already includes permissions: contents: write, which is required for the action to push processed results back to your repository. If you write your own workflow, make sure to include this permission block.

The workflow triggers on any push that modifies .md files, processes all unprocessed @ instructions, and commits the agent's changes back to your repository. It uses [skip ci] to prevent infinite loops.

See the Claude Code GitHub Actions documentation for more on setting up Claude Code in CI.

Running Tests

pytest

With coverage:

pytest --cov=note_watcher

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

notes_watcher-0.2.0.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

notes_watcher-0.2.0-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

File details

Details for the file notes_watcher-0.2.0.tar.gz.

File metadata

  • Download URL: notes_watcher-0.2.0.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for notes_watcher-0.2.0.tar.gz
Algorithm Hash digest
SHA256 aca2725d923cbab10a6bee562d79bcefd76b1b15f10d72aea645c1de7b7e84f8
MD5 770f0b8e04c94c3748358fe3214db9d4
BLAKE2b-256 2bf7556ed53a193aa29ed1654bd9ab7fc64800b4ba765b3efae594d04cf9e068

See more details on using hashes here.

Provenance

The following attestation bundles were made for notes_watcher-0.2.0.tar.gz:

Publisher: publish.yml on britt/obsidian-notes-watcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file notes_watcher-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: notes_watcher-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 14.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for notes_watcher-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 57e5f1388c653ccf82b6a844fc6e214a04cc161905b731ff1578f63ea5259772
MD5 6118c923adae161ac01fb762cfa297e9
BLAKE2b-256 35ef47010f6a6a2c5ac7e41bda623f8b7adcd2c0b53dd1db46dedbecc1c5217e

See more details on using hashes here.

Provenance

The following attestation bundles were made for notes_watcher-0.2.0-py3-none-any.whl:

Publisher: publish.yml on britt/obsidian-notes-watcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page