jordanlyall

Obsidian Reminders Sync — Development skill for Claude Code

Development community intermediate

Bidirectional sync between Obsidian daily notes and macOS Reminders via Claude Code hooks.

How to install Obsidian Reminders Sync

This entry records only its repository, not the path inside it, so there is no exact command to give. Open jordanlyall/obsidian-reminders-sync and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Obsidian Reminders Sync does

Bidirectional sync between Obsidian daily notes and macOS Reminders via Claude Code hooks.

Alternatives in Development

  • Obsidian MCP Server — Read, write, search, and surgically edit Obsidian vault notes, tags, and frontmatter via MCP 686 ★
  • Agent Bridge — A local bridge for bidirectional collaboration between Claude Code and Codex 312 ★
  • Obsidian Decide — Extract decisions from this conversation and log them to the right project notes 277 ★

README

obsidian-reminders-sync

Bidirectional sync between Obsidian daily notes and macOS Reminders.app — built as a Claude Code hook system.

Write a task in Obsidian and it appears in Reminders within seconds. Complete it on your iPhone or Apple Watch and it syncs back to your vault on the next session. Add a task via Siri and it lands in today's daily note automatically.

How It Works

Direction Trigger File
Obsidian → Reminders Every Write/Edit in Claude Code hooks/reminders-task-detector.py
Reminders → Obsidian Every Claude Code session start hooks/reminders-session-sync.py
Reminders → Obsidian (live) Every 60s (optional daemon) scripts/reminders-sync-daemon.py

All three share a single state file (`.claude/state/reminders-state.json`) for dedup and race condition protection.

Task Priority Convention

Tasks must use emoji priority markers in your daily note:

- [ ] 🔴 Urgent thing that must happen today
- [ ] 🟡 Should happen today
- [ ] 🟢 Nice to have
- [ ] 🔵 Blocked — Waiting for: someone to respond

These map to Reminders.app priority: 🔴 = High, 🟡 = Medium, 🟢 = Low.

Blocked tasks (🔵) appear in Reminders with a `BLOCKED:` prefix and include the blocker reason in the notes field.

Tasks with no priority emoji are ignored by the sync (useful for habits/rituals).

Setup

1. Install

Clone or copy these files into your vault's `.claude/` directory:

your-vault/
└── .claude/
    ├── hooks/
    │   ├── reminders-async-wrapper.sh
    │   ├── reminders-task-detector.py
    │   ├── reminders-session-sync.py
    │   └── task_parser.py
    └── scripts/
        ├── reminders_manager.py
        └── reminders-sync-daemon.py  (optional)

2. Configure

Edit the `# --- CONFIGURE THIS ---` sections in each file:

**`scripts/reminders_manager.py`**

REMINDER_LISTS = ["Work", "Personal"]  # Your Reminders list names

**`hooks/reminders-task-detector.py`**

CONTEXT_TO_LIST = {
    "Work": "Work",       # ### Work section → Work list
    "Personal": "Personal",
    "Family": "Personal",
    "Health": "Personal",
}

**`hooks/reminders-session-sync.py`**

DAILY_DIR = os.path.join(VAULT_ROOT, "4-Daily")  # Your daily notes folder

LIST_TO_SECTION = {
    "Work": "Work",       # Work list → ### Work section
    "Personal": "Personal",
}

**`hooks/task_parser.py`**

DAILY_DIR = os.path.join(VAULT_ROOT, "4-Daily")      # Your daily notes folder
PROJECTS_DIR = os.path.join(VAULT_ROOT, "1-Projects", "Current")

3. Create Reminders lists

python3 .claude/scripts/reminders_manager.py setup-lists

4. Wire up Claude Code hooks

Add to your `.claude/settings.json`:

{
  "hooks": {
    "SessionStart": [
      {
        "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/reminders-async-wrapper.sh\" reminders-session-sync.py"
      }
    ],
    "PostToolUse": [
      {
        "matcher