apple-notes
Skill2 starsChanged 13 days agoMITView on GitHub
Use when asked to check, search or read Apple Notes, or to find a document, PDF, scan or image attached to a note. READ ONLY — no creating or modifying notes.
64 other projects use a version of this.
Adopted by
Most recently taken up by
- ashleysbrain/skillstheir own version, first seen Nov 8, 2026
- insight68/Skillstheir own version, first seen Nov 8, 2026
- delorenj/skillstheir own version, first seen Nov 7, 2026
- sweetrb/apple-notes-mcptheir own version, first seen Nov 6, 2026
- jaywedgeworth22/BotFleettheir own version, first seen Nov 3, 2026
- Simple-With-Us/BotFleettheir own version, first seen Nov 3, 2026
Used with
Projects with it also use taskflow-inbox-triage, openclaw-release-maintainer and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
AtomicBot-aiSkilltaskflow-inbox-triage
Also in 6 projects that use this
hkyutongSkillopenclaw-release-maintainer
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
Also in 4 projects that use this
AtomicBot-aiSkilltaskflow
Also in 6 projects that use this
math-incSkillfindmy
Track Apple devices and AirTags via FindMy.app on macOS using AppleScript and screen capture.
Also in 10 projects that use this
hkyutongSkillnode-connect
Diagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps. Use when QR/setup code/manual connect fails, local Wi-Fi works but VPS/tailnet does not, or errors mention pairing required, unauthorized, bootstrap token invalid or expired, gateway.bind, gateway.remote.url, Tailscale, or plugins.entries.device-pair.config.publicUrl.
Also in 8 projects that use this
math-incSkilljupyter-live-kernel
Use a live Jupyter kernel for stateful, iterative Python execution via hamelnb. Load this skill when the task involves exploration, iteration, or inspecting intermediate results — data science, ML experimentation, API exploration, or building up complex code step-by-step. Uses terminal to run CLI commands against a live Jupyter kernel. No new tools required.
Also in 5 projects that use this
- +1 more from math-inc
Other versions64 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 64
- moltbot/clawdbot★ 394ksame name
- steipete/warelay★ 394ksame name
- steipete/clawdis★ 394ksame name
- moltbot/moltbot★ 394ksame name
- clawdbot/clawdbot★ 394ksame name
- openclaw/openclaw★ 394ksame name
- molt-bot/clawdbot★ 391ksame name
- NousResearch/hermes-agent★ 262ksame name
- spinabot/brigade★ 11ksame name
- the-open-agent/openagent★ 5.7ksame name
54 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository17 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- skills/agent-workspace/templates/CLAUDE.mdCLAUDE.md
- agent-workspaceSkill
- ai-council-reviewSkill
- ai-reviewSkill
- apple-mailSkill
- ballotSkill
- chrome-browserSkill
- dossierSkill
- lab-notesSkill
- pandocSkill
- paprika-recipesSkill
- pdf-zineSkill
- private-podcast-feedSkill
- send-to-kindleSkill
- text-to-speechSkill
- tmux-controlSkill
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 2 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 62 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Read notes via Notes.app AppleScript, and list their attachments by reading the Notes database.
- Distinctive: line 20
If first access attempt times out, ask user to check for macOS permission dialog
“Common” is measured: kept by at least 6 in 10 of the 62 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Apple Notes (Read Only)
Read notes via Notes.app AppleScript, and list their attachments by reading the Notes database. No creating, updating, or deleting notes.
Prerequisites
- Notes.app running and synced
- Automation permissions granted (System Settings → Privacy & Security → Automation → Terminal/Claude Code → Notes)
- If first access attempt times out, ask user to check for macOS permission dialog
list-attachments.shdoes not use AppleScript — it reads the Notes database directly, so it needs Full Disk Access for the terminal instead of Automation. It keeps working when the AppleScript bridge is wedged.
Reliability: always wrap osascript with timeout + retry
Notes.app's AppleScript bridge hangs intermittently. AppleScript-internal with timeout of N seconds does NOT kill a wedged osascript process — wrap with shell-level timeout and retry.
notes_query() {
local script="$1" attempt
for attempt in 1 2 3; do
result=$(timeout 15 osascript -e "$script" 2>&1) && { echo "$result"; return 0; }
sleep 2
done
echo "ERROR: Notes query failed after 3 attempts" >&2
return 1
}Reasonable defaults: 15s timeout, 3 retries, 2s sleep. Bump to 30s for full-text search across many notes. If all retries fail, report and move on.
Scripts
List folders
${CLAUDE_SKILL_DIR}/scripts/list-folders.sh # All folders across all accounts
${CLAUDE_SKILL_DIR}/scripts/list-folders.sh iCloud # Only iCloud foldersList notes in a folder
${CLAUDE_SKILL_DIR}/scripts/list-notes.sh # iCloud/Notes (default)
${CLAUDE_SKILL_DIR}/scripts/list-notes.sh "Shopping" # iCloud/Shopping
${CLAUDE_SKILL_DIR}/scripts/list-notes.sh "Notes" "Gmail" # Gmail/NotesOutput: note name | modification date (one per line)
Read a note
${CLAUDE_SKILL_DIR}/scripts/read-note.sh "Shopping List" # Search all accounts
${CLAUDE_SKILL_DIR}/scripts/read-note.sh "Meeting Notes" "iCloud" # Specific accountReturns metadata header + HTML body.
List attachments on a note
${CLAUDE_SKILL_DIR}/scripts/list-attachments.sh "Recipe Ideas" # what is attached
${CLAUDE_SKILL_DIR}/scripts/list-attachments.sh "Recipe Ideas" --paths # + on-disk file pathsOutput: [note] type | title | identifying text, one per line.
Read this before concluding a note doesn't contain something. See below.
Search notes by name
${CLAUDE_SKILL_DIR}/scripts/search-notes.sh "recipe" # Search all accounts
${CLAUDE_SKILL_DIR}/scripts/search-notes.sh "recipe" "iCloud" # Specific accountOutput: note name | account/folder | modification date (one per line)
Direct Commands
For quick one-off access without scripts:
# List all iCloud folders
osascript -e 'tell application "Notes" to get name of every folder of account "iCloud"'
# List all note names in a folder
osascript -e 'tell application "Notes" to get name of every note in folder "Notes" of account "iCloud"'
# Read a note body (returns HTML)
osascript -e 'tell application "Notes" to get body of note "Note Name"'
# Count all notes
osascript -e 'tell application "Notes" to count every note'A note's body is not its contents
A note body does not include its attachments. PDFs, scans and images are separate rows in the Notes database, linked back to the note — so reading the body, by AppleScript or any other route, cannot see them. Every other script in this skill reads bodies. That means:
A body search returning nothing is evidence about the search, not about the note. If someone says a document is on a note and you can't find it, list the attachments before concluding it isn't there. Never substitute a similar file found somewhere else — a plausible substitute is worse than an empty result, because nothing downstream can tell it was the wrong one.
Two properties make this trap easy to fall into:
- Scanned documents are all titled literally
PDF. Anything scanned in the app (com.apple.paper.doc.pdf) has the titlePDFand no filename — measured at 17 of 17 in one real library. A note with four scanned recipes shows four identical rows. Filtering attachments by title finds nothing while looking thorough. - Ordinary attachments do carry real titles (
Trailer-Manual-EN.pdf), so partial success here is misleading: the file-picker attachments look fine and only the scanned ones are anonymous.
list-attachments.sh solves this by printing each attachment's OCR/summary
text, so the distinguishing first line is usually a column lookup rather than a
PDF extraction.
Which attachments carry that text is not uniform, and the two gaps cover for each other. Measured across one real library:
| Attachment | Has a real title? | Has OCR text? |
Scanned document (com.apple.paper.doc.*) | ✗ — always PDF | ✓ 31 of 32 |
PDF added from the file picker (com.adobe.pdf) | ✓ | ✗ 0 of 179 |
| Image (jpeg/png/heic/…) | usually ✗ | ✓ ~100% |
Notes recognises text in what it renders itself — scans and photos — and never in a PDF file you attached. So identify a scanned document by its OCR text and a file PDF by its name, and treat an empty text column as normal rather than as "nothing here". When it is empty and the name is unhelpful, fall back to extracting the file:
# 1. What is actually attached?
list-attachments.sh "Recipe Ideas"
# -> paper.doc.pdf | PDF | Tomato Soup / A simple weeknight soup with…
# 2. Get the file, then read it properly.
list-attachments.sh "Recipe Ideas" --paths
pdftotext -layout "<the path>" -Where attachments live on disk
Under ~/Library/Group Containers/group.com.apple.notes/Accounts/<account>/:
| Kind | Path |
| Scanned document | FallbackPDFs/<attachment-id>/<generation>/FallbackPDF.pdf |
| Everything else | Media/<media-row-id>/<filename> |
⚠️ The Media path is keyed by the linked media row's identifier, not the
attachment's, and the real filename lives on that row too — the attachment row's
own ZFILENAME is always null. Joining the wrong row silently yields no path.
A missing file is normal and does not mean the attachment is missing: iCloud downloads lazily, so the row can exist while the bytes have not arrived.
Notes
- Note bodies are returned as HTML — use for display or pipe through a converter for plain text
- Note names are case-sensitive in AppleScript queries
- Searching large numbers of notes can be slow — scope to a specific account when possible
- The
whose name containsfilter is case-insensitive - Notes.app must be running — scripts will launch it if needed, but sync may take a moment
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

