Obsidian Reminders Sync banner
jordanlyall jordanlyall

Obsidian Reminders Sync

Development community intermediate

Description

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

Installation

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

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