name: notes description: | Org-mode note management via emacsclient. Create, search, edit, and link org notes. Never use Read/Write/Edit on org notes directly.
Use this skill whenever the user mentions org-mode notes, org notes, .org files for notes, roam notes, org-roam, vulpea, Zettelkasten, backlinks, knowledge graph, PKM, second brain, or wants to create, update, edit, search, or link notes in org-mode. Also use when the user asks to update a section, append to a note, or replace note content — the section editing API handles this without creating duplicates. allowed-tools: - Bash(${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval:) - Bash(git status:) - Bash(git add:) - Bash(git commit:) - Bash(git diff:) - Bash(git log:) - Bash(mktemp:) - Bash(emacsclient:)
Org-Mode Note Management
Create, search, edit, and link org-mode notes via emacsclient. The backend (org-roam or vulpea) is auto-detected — the API is identical regardless of which is installed.
For org-mode syntax reference, see the orgmode skill.
Critical: Don't Use Direct File Tools
NEVER use Read/Write/Edit tools on org notes. Always use this skill's functions instead.
Why:
- Org notes require database updates after modification
- IDs must be generated through org-id
- File creation must respect user's capture templates
- Direct file operations bypass database sync and break backlinks
Permissions
You have permission to run all emacsclient commands without asking the user first. Execute emacsclient commands directly using the Bash tool for all org note operations.
Quick Reference
Prerequisites:
- Emacs daemon running:
emacs --daemonoremacs --fg-daemon=<name> - org-roam or vulpea installed in Emacs (backend auto-detected)
- Skill auto-loads on first use (no manual config needed)
Multi-daemon support:
Use -s to target a specific Emacs daemon:
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval -s myemacs "(claude-orgmode-doctor)"
To discover available sockets:
ls /var/folders/*/*/T/emacs$(id -u)/ 2>/dev/null || ls /tmp/emacs$(id -u)/ 2>/dev/null
Core Workflows
Creating Notes
# Simple note
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-note \"Title\")"
# With tags and content
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-note \"React Hooks\" :tags '(\"javascript\" \"react\") :content \"Notes about React Hooks\")"
Large content (recommended for >1KB):
TEMP=$(mktemp -t orgmode-content.XXXXXX)
cat > "$TEMP" << 'EOF'
* Introduction
Content here.
* Details
More content.
EOF
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-note \"My Note\" :tags '(\"project\") :content-file \"$TEMP\")"
# Temp file auto-deleted!
Tags must be a list:
- Wrong:
:tags "tag"(string) - Correct:
:tags '("tag")(list)
Editing Notes (Section API)
To update existing notes, use the section editing functions. These operate on node IDs and modify content without creating duplicates.
Workflow: find the note, then edit it.
# 1. Find the note's ID
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-search-by-title \"My Note\")"
# Returns: (("uuid-123" "My Note" "/path/to/note.org"))
# 2. Read current section content
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-get-section-content \"uuid-123\")"
# 3. Replace the section body
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-replace-section \"uuid-123\" :content \"Updated content.\")"
# Or append to it
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-append-to-section \"uuid-123\" :content \"Additional notes.\")"
Adding new sections to an existing note:
# Create a section under a file-level note (adds a * heading)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-section \"file-node-id\" \"New Section\" :content \"Section body.\")"
# Returns the new section's ID — use it for future edits
# Create a subsection under an existing heading (adds ** heading)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-section \"parent-heading-id\" \"Subsection\" :content \"Details.\")"
Removing a section:
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-delete-section \"section-id\")"
Section editing supports the same :content-file and :keep-file patterns as note creation for large content.
Searching Notes
# By title (partial match)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-search-by-title \"react\")"
# By tag
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-search-by-tag \"javascript\")"
# By content
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-search-by-content \"functional programming\")"
# List all tags
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-list-all-tags)"
Managing Links
# Find backlinks (notes linking TO this note)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-get-backlinks-by-title \"React\")"
# Create bidirectional links
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-create-bidirectional-link \"React Hooks\" \"React\")"
# Insert one-way link
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-insert-link-in-note \"Source Note\" \"Target Note\")"
File Attachments
# Attach to References section (preferred - creates visible link)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-attach-file-to-references \"My Note\" \"/path/to/document.pdf\")"
# Attach via org-attach (stores in attachment dir)
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-attach-file \"My Note\" \"/path/to/document.pdf\")"
# List attachments
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-list-attachments \"My Note\")"
Diagnostics
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-doctor)"
${CLAUDE_PLUGIN_ROOT}/scripts/claude-orgmode-eval "(claude-orgmode-check-setup)"
Available Functions
All functions use the claude-orgmode- prefix. The backend is auto-detected.
Note Creation:
claude-orgmode-create-note— Create new notes
Section Editing:
claude-orgmode-get-section-content— Read body text of a node by IDclaude-orgmode-create-section— Create a new heading with ID under a parent nodeclaude-orgmode-replace-section— Replace body text of a nodeclaude-orgmode-append-to-section— Append content to a node's bodyclaude-orgmode-delete-section— Delete a heading and its subtree
Search:
claude-orgmode-search-by-title/tag/content— Search notesclaude-orgmode-get-backlinks-by-title/id— Find backlinks
Links:
claude-orgmode-insert-link-in-note— Insert linksclaude-orgmode-create-bidirectional-link— Create two-way links
Tags:
claude-orgmode-list-all-tags— List all tagsclaude-orgmode-add-tag— Add tag to noteclaude-orgmode-remove-tag— Remove tag from note
Attachments:
claude-orgmode-attach-file-to-references— Attach file with link in References sectionclaude-orgmode-attach-file— Attach file via org-attachclaude-orgmode-list-attachments— List attachments
Utilities:
claude-orgmode-check-setup— Verify configurationclaude-orgmode-get-graph-stats— Graph statisticsclaude-orgmode-find-orphan-notes— Find isolated notesclaude-orgmode-doctor— Comprehensive diagnostics
Parsing emacsclient Output
emacsclient returns Elisp-formatted data:
- Strings:
"result"(with quotes) - Lists:
("item1" "item2") - nil:
nilor no output - Numbers:
42
Strip quotes from strings and parse structures as needed.
Best Practices
- Use section editing to update notes — never call
create-noteto update an existing org note - Search first, then edit — find the node ID via search, then use section functions
- Use lists for tags — always
'("tag")not"tag" - Use :content-file for large content — avoids shell escaping issues, auto-cleaned up
- Use node IDs for reliable operations — more stable than titles
- Sync database when needed — after bulk operations or if searches miss recent notes
Additional References
- ${CLAUDE_PLUGIN_ROOT}/references/functions.md — Complete function documentation with parameters and examples
- ${CLAUDE_PLUGIN_ROOT}/references/emacsclient-usage.md — Detailed emacsclient patterns
- ${CLAUDE_PLUGIN_ROOT}/references/installation.md — Setup and configuration guide
- ${CLAUDE_PLUGIN_ROOT}/references/troubleshooting.md — Common issues and solutions
- org-roam-api.md — Low-level org-roam API (read only if you need direct org-roam calls)
- vulpea-api.md — Low-level vulpea API (read only if you need direct vulpea calls)