Apple Notes Import
Import notes from the "Claude Inbox" folder in iCloud Notes and dispatch content to appropriate agents based on @tags.
Manifest Tracking
The skill tracks imported notes in a manifest file to avoid re-processing:
Manifest location: ~/.claude/data/apple-notes-manifest.json
Manifest structure:
{
"imported": {
"Note Title": {
"importedAt": "2026-01-19T12:00:00Z",
"modificationDate": "2026-01-19T11:30:00Z",
"contentHash": "abc123..."
}
}
}
Status logic:
- •NEW: Note name not in manifest
- •MODIFIED: Note in manifest but modification date changed
- •IMPORTED: Note in manifest with same modification date (already processed)
Workflow
Step 1: Check Prerequisites
First, verify the Claude Inbox folder exists:
osascript -e 'tell application "Notes" to tell account "iCloud" to exists folder "Claude Inbox"'
If this returns false, inform the user:
The "Claude Inbox" folder doesn't exist in your iCloud Notes.
To set up:
- •Open the Notes app
- •In the iCloud account section, create a new folder called "Claude Inbox"
- •Add notes to this folder with @tags in the body (e.g., @thinking, @write)
- •Run this skill again
If you get a permission error, inform the user:
Terminal needs permission to control Notes.
Go to System Preferences > Privacy & Security > Automation and enable "Notes" for Terminal.
Step 2: Load Manifest
Read the manifest file if it exists:
cat ~/.claude/data/apple-notes-manifest.json 2>/dev/null || echo '{"imported":{}}'
Parse the JSON to get the list of previously imported notes.
Step 3: Count and Extract Notes
Count notes in the inbox:
osascript -e 'tell application "Notes" to tell account "iCloud" to tell folder "Claude Inbox" to count of notes'
If count is 0, inform the user:
Your Claude Inbox is empty. Add notes with @tags to import them:
- •@thinking - Start a thinking session
- •@write - Get writing feedback
Extract all notes with their names, modification dates, and content:
osascript -e '
tell application "Notes"
tell account "iCloud"
tell folder "Claude Inbox"
set output to ""
repeat with n in notes
set noteName to name of n
set noteBody to body of n
set noteMod to modification date of n
set output to output & "---NOTE_START---" & return & "NAME: " & noteName & return & "MODIFIED: " & noteMod & return & "BODY:" & return & noteBody & return & "---NOTE_END---" & return
end repeat
return output
end tell
end tell
end tell
'
Step 4: Compare Against Manifest
For each extracted note:
- •Check if note name exists in manifest
- •If exists, compare modification date
- •Determine status: NEW, MODIFIED, or IMPORTED
Step 5: Parse Content and Present Notes
The note body comes as HTML. To extract plain text and @tags:
- •Strip HTML tags:
sed 's/<[^>]*>//g' - •Decode common HTML entities:
sed 's/ / /g; s/&/\&/g; s/</</g; s/>/>/g; s/"/"/g' - •Find @tags:
grep -oE '@[a-zA-Z]+'
Present notes grouped by status:
Notes in Claude Inbox: NEW: 1. [Note Title] - @thinking MODIFIED (content changed since last import): 2. [Another Note] - @write ALREADY IMPORTED: 3. [Old Note] - @thinking (imported 2026-01-18) Which note would you like to process? (enter number, "new" for all new notes, or "all")
If there are no NEW or MODIFIED notes:
No new notes in your Claude Inbox. All notes have been imported previously.
You can still re-process an existing note if needed, or add new notes to the inbox.
Use AskUserQuestion to let the user select.
Step 6: Route to Agent
Based on detected @tags, route to the appropriate agent:
| Tag | Action |
|---|---|
| @thinking | Launch thinking-partner agent with note as context |
| @write | Launch writing_critic agent with note content |
| @research | Inform user: "Research routing not yet implemented - would you like to process this note differently?" |
| (no tag) | Ask user which agent to use |
| (multiple tags) | Ask user which tag/agent to use |
Step 7: Update Manifest
After successfully processing a note, update the manifest:
- •Ensure directory exists:
mkdir -p ~/.claude/data - •Add/update the note entry with current timestamp and modification date
- •Write updated manifest back to file
Use the Write tool to update ~/.claude/data/apple-notes-manifest.json.
Agent Dispatch
For @thinking
Present the note content, then transition to thinking-partner behavior:
Imported from Apple Notes: [Note Title]
[Note content here]
I'll help you think through this. Are we continuing an existing thread, or starting fresh?
Then use the Task tool with subagent_type: "thinking-partner" to begin the session, passing the note content as context.
For @write
Present the note content, then transition to writing_critic behavior:
Imported from Apple Notes: [Note Title]
[Note content here]
I'll help review this writing. What's the intended audience and purpose?
Then use the Task tool with subagent_type: "writing_critic" to begin the review, passing the note content as context.
Important Notes
- •Read-only on Notes: This skill never modifies or deletes notes from Apple Notes
- •Manifest tracking: Imported notes are tracked locally to avoid re-processing
- •macOS only: Uses AppleScript which is only available on macOS
- •iCloud account only: Only reads from the iCloud Notes account, not Gmail/Exchange
- •First run: The first time you run this, macOS will prompt to grant Terminal permission to control Notes - approve this to proceed
Example Session
User: /apple-notes-import Claude: Checking Claude Inbox in iCloud Notes... Found 3 notes: NEW: 1. "Product Strategy Ideas" - @thinking ALREADY IMPORTED: 2. "Draft Blog Post" - @write (imported 2026-01-18) 3. "Meeting Notes" - (no tags) (imported 2026-01-17) Which note would you like to process? User: 1 Claude: **Imported from Apple Notes:** Product Strategy Ideas We should consider three main approaches for the Q2 launch: 1. Focus on enterprise features 2. Double down on developer experience 3. Hybrid approach with modular pricing Each has tradeoffs I want to think through carefully. --- I'll help you think through this. Are we continuing an existing thread, or starting fresh? [After processing, manifest is updated to record this import]