with one click
vault
// Read and write notes in the Obsidian vault. Use for task logs, knowledge capture, and building context.
// Read and write notes in the Obsidian vault. Use for task logs, knowledge capture, and building context.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | vault |
| description | Read and write notes in the Obsidian vault. Use for task logs, knowledge capture, and building context. |
Location: ~/Documents/Notes/ (vault name: Notes)
~/Documents/Notes; do not use the obsidian CLIopen stateTemplates are in the skill directory, not the notes directory:
.codex/skills/vault/templates/knowledge-note.md.codex/skills/vault/templates/task.md.codex/skills/vault/templates/recipe.md.codex/skills/vault/templates/weekly-summary.mdSet a vault variable when commands get long:
VAULT="$HOME/Documents/Notes"
Spaces in paths: quote the whole path:
sed -n '1,220p' "$HOME/Documents/Notes/Projects/2025-10 Patchwork/Note.md"
mkdir -p "$VAULT/<folder>"
printf '%s\n' "<text>" > "$VAULT/<folder/file.md>"
cp "$HOME/.codex/skills/vault/templates/<template>.md" "$VAULT/<folder/file.md>"
printf '%s\n' "<text>" >> "$VAULT/<folder/file.md>"
tmp="$(mktemp)" && { printf '%s\n' "<text>"; cat "$VAULT/<folder/file.md>"; } > "$tmp" && mv "$tmp" "$VAULT/<folder/file.md>"
sed -n '1,220p' "$VAULT/<folder/file.md>"
cat "$VAULT/<folder/file.md>"
stat "$VAULT/<folder/file.md>"
rg -n '^#{1,6} ' "$VAULT/<folder/file.md>"
rg -n "<text>" "$VAULT/<folder>"
find "$VAULT/<folder>" -type f -name '*.md' | sort
rg -n "(^|[[:space:]])#<tag>\\b" "$VAULT"
rg -oh "(^|[[:space:]])#[A-Za-z0-9/_-]+" "$VAULT" | sed 's/^[[:space:]]*//' | sort | uniq -c | sort -nr
awk '/^---$/ {block++; next} block == 1 && /^<prop>:/ {print}' "$VAULT/<folder/file.md>"
perl -0pi -e 's/(^---\n(?:.*\n)*?)^status:.*$/${1}status: done/m' "$VAULT/<folder/file.md>"
perl -0pi -e 's/^<prop>:.*\n//m' "$VAULT/<folder/file.md>"
awk '/^---$/ {block++; next} block == 1 {print} block == 2 {exit}' "$VAULT/<folder/file.md>"
note="$(basename "$VAULT/<folder/file.md>" .md)"; rg -n "\\[\\[$note(\\||\\])" "$VAULT"
rg -o "\\[\\[[^]|#]+(#[^]|]+)?(\\|[^]]+)?\\]\\]" "$VAULT/<folder/file.md>" | sort -u
for f in $(find "$VAULT" -type f -name '*.md'); do name="$(basename "$f" .md)"; rg -q "\\[\\[$name(\\||\\])" "$VAULT" || printf '%s\n' "$f"; done
rg -L "\\[\\[[^]]+\\]\\]" "$VAULT" -g '*.md'
rg -o "\\[\\[[^]|#]+(#[^]|]+)?(\\|[^]]+)?\\]\\]" "$VAULT" | sed -E 's/.*\\[\\[([^]|#]+).*/\\1/' | sort -u
rg -n '^\\s*- \\[ \\] ' "$VAULT"
rg -n '^\\s*- \\[x\\] ' "$VAULT"
rg -n '^\\s*- \\[[ x]\\] ' "$VAULT/<folder/file.md>"
perl -0pi -e 's/^(\s*- )\[ \]/$1[x]/m' "$VAULT/<folder/file.md>"
mkdir -p "$(dirname "$VAULT/<new-path>")"
mv "$VAULT/<old-path>" "$VAULT/<new-path>"
rm "$VAULT/<folder/file.md>"
find "$VAULT" -type f -name '*.md' -mtime -7 | sort
find "$VAULT/Projects" -path '*/Tasks/*.md' -type f -mtime -7 | sort
Always use real timestamps, never placeholders:
date +"%Y-%m-%d %H%M%S" # task filename
date +"%Y-%m-%d %H:%M" # log entry header
date -Iseconds # frontmatter (ISO-8601)
~/Documents/Notes/Projects/<YYYY[-MM] Project>/Tasks/<YYYY-MM-DD HHMMSS> <Title>.md
Link if it improves the note, not just because it matches a term.
rg -n "<concept>" "$VAULT"note="$(basename "$file" .md)"; rg -n "\\[\\[$note(\\||\\])" "$VAULT"rg -n "(^|[[:space:]])#<tag>\\b" "$VAULT"[[Parent]] | [[Related]]Worth capturing when: principle applies across contexts, caused debugging time, method that saves time later, non-obvious choice with reasoning worth preserving, link to documentation.
Where to capture:
| Destination | When |
|---|---|
| Existing note | Extends/refines an existing topic (search first) |
| New note | Substantial, standalone, referenceable |
| Task log only | One-off detail that won't generalise |
| Project recipe | Repeatable steps specific to this project |
| Folder | Purpose |
|---|---|
Development/ | Conceptual topics, paradigms, architectural patterns |
HowTo/ | Procedural guides, techniques, not project-specific |
Tools/ | Software tools and their usage |
Projects/<project>/ | Project-level knowledge |
Projects/<project>/Tasks/ | Task logs only — never knowledge notes |
Projects/<project>/Glossary/ | Glossary entries |
Projects/<project>/Recipes/ | Project-specific recipes and runbooks |
Projects/<project>/Meetings/ | Meetings with date prefix |
Journal/Weekly Notes/ | Weekly summaries (generated from task activity) |
Extraction signal: When a task log contains repeatable steps, extract into a recipe.
Every mention of a JIRA issue number must be a wiki-link to its task note. Never leave bare issue numbers.
find results: issue number → full filenamerg -n "RH-6949" "$VAULT/Projects"[[2026-02-13 141534 RH-6949 Performance issue|RH-6949]]Applies to all sections — summaries, blockers, carryover, etc.
Path: ~/Documents/Notes/Journal/Weekly Notes/<YYYY>-W<WW>.md
find "$VAULT/Projects" -path '*/Tasks/*.md' -type f -mtime -7 | sort
rg -l '^status: in-progress$|^status: "in-progress"$' "$VAULT/Projects"
find "$VAULT/Projects" -type f -name '*.md' -mtime -7 ! -path '*/Tasks/*' | sort
find "$VAULT/Projects" -path '*/Recipes/*.md' -type f -mtime -7 | sort
sed -n '1,220p' "$task"printf '%s\n' "<text>" > "$VAULT/Journal/Weekly Notes/<YYYY>-W<WW>.md"Path: ~/Documents/Notes/Journal/Daily Notes/<YYYY>/<YYYY-MM>/<YYYY-MM-DD>.md
find "$VAULT/Projects" -path '*/Tasks/*.md' -type f -mtime -1 | sort
find "$VAULT/Projects" -path "*/Meetings/$(date +%Y-%m-%d)*.md" -type f | sort
find "$VAULT/Projects" -type f -name '*.md' -mtime -1 ! -path '*/Tasks/*' ! -path '*/Meetings/*' | sort
Search Slack for important conversations the user is involved in today. Use slack_search_public_and_private with from:<@USER_ID> and date filters to find messages the user sent. Then read the threads of those messages to get full context. Only include conversations the user participated in. Exclude DMs.
For each noteworthy conversation, capture:
---
---
# [[YYYY-MM-DD]]
## Work
- [[Task link|Short name]] — one-line summary
## Meetings
- [[Meeting note]]
## Notes created
- [[Note name]] (type)
## Slack conversations
- One-line summary of discussion — [link](permalink)
sed -n '1,220p' "$task"from:<@USER_ID>, no DMs), then read threads for context