From obs-vault
Integration with Obsidian vault for managing notes, tasks, and knowledge. Supports adding notes, creating tasks, and organizing project documentation. Includes 2025-2026 best practices including MOCs, properties, and practical organization patterns. Scoped for use within the obs-vault plugin context.
How this skill is triggered — by the user, by Claude, or both
Slash command
/obs-vault:obsidianThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Expert guidance for integrating Claude workflows with Obsidian vault, including note creation, task management, and knowledge organization using Obsidian's markdown-based system.
Expert guidance for integrating Claude workflows with Obsidian vault, including note creation, task management, and knowledge organization using Obsidian's markdown-based system.
$OBSIDIAN_VAULT_PATH environment variable for vault path[[note-name]] to connect related ideas#project/featureBased on current best practices from the Obsidian community:
Key Principle: Write first, organize later (or never)
Avoiding Productive Procrastination:
What is a MOC?
Why MOCs > Folders:
MOC Best Practices:
When to Create a MOC:
MOC vs README:
Why Properties > Folders:
type: planning notes across entire vaultRecommended Property Schema:
---
type: planning | reference | todo | moc | development | session | analysis
project: project-name
subproject: sub-project-name
status: active | in-progress | completed | archived | blocked
tags:
- topic1
- topic2
- topic3
priority: critical | high | medium | low
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
Property Usage:
type to categorize by note function, not topicproject to group across foldersstatus to track progresstags for topic categorizationdump tag to session/daily notes - Makes them easy to filter and archiveALWAYS include the dump tag in session/daily notes. This tag is essential for:
tag:#dumpNote: Session notes should be stored in session-saves/ directory.
When creating session notes:
Python template for new files (with frontmatter):
# Create new note with frontmatter
f.write("---\n")
f.write("type: session\n")
f.write(f"project: {PROJECT_NAME}\n")
f.write(f"date: {date_str}\n")
f.write("tags:\n")
f.write(" - session\n")
f.write(" - dump\n") # REQUIRED
f.write("status: completed\n")
f.write("---\n\n")
When appending to existing files:
Biggest Challenge: Taking notes and never reviewing them
Review Systems:
Active Note Management:
Make Notes Actionable:
Traditional (Topic-based):
vault/
├── Machine-Learning/
│ ├── session-notes.md
│ ├── research.md
│ └── todos.md
└── Web-Development/
├── session-notes.md
└── research.md
Better (Type-based + Properties):
vault/
├── Sessions/ (all session notes, tagged by project)
├── Planning/ (all planning docs, tagged by project)
├── TODOs/ (all task tracking)
└── Reference/ (all reference material)
Then use properties and tags to group by topic:
project: machine-learningtags: [ml, neural-networks]Benefits:
Central Navigation Hub:
Home MOC Structure:
# 🏠 Home
## 🎯 Active Projects
- [[Project-1-MOC]] - Description
- [[Project-2-MOC]] - Description
## 📋 Quick Access
- [[TODOs/Master-Index]]
- [[Sessions/Latest]]
## 📚 Knowledge by Topic
- [[Topic-1-MOC]]
- [[Topic-2-MOC]]
## 🗂️ By Note Type
- Planning notes
- Development sessions
- Reference docs
Linking Strategy:
Folder Strategy:
The Obsidian vault location should be stored in an environment variable. The recommended variable name is $OBSIDIAN_VAULT_PATH, though $OBSIDIAN_VAULT is also commonly used:
# Check vault location
echo $OBSIDIAN_VAULT_PATH
# Should return something like:
# /Users/username/Documents/Notes
If not set, configure it in your shell profile:
# Add to ~/.zshrc or ~/.bashrc
export OBSIDIAN_VAULT_PATH="/path/to/your/vault"
Throughout this skill, $VAULT is used as shorthand for the vault path variable. Adapt to whichever variable name is set in your environment.
When creating a new project's notes in Obsidian, ask the user where the project directory should be located within the vault:
Workflow:
Show current vault structure to help user decide
Offer two options:
Create directory if it doesn't exist
import os
from pathlib import Path
# Get vault path
vault_path = Path(os.environ.get('OBSIDIAN_VAULT_PATH'))
# Show vault structure to user
print("📁 Current vault structure:")
print(f" {vault_path}/")
# Show top-level directories (up to 2 levels)
for item in sorted(vault_path.iterdir()):
if item.is_dir() and not item.name.startswith('.'):
print(f" ├── {item.name}/")
# Show one level deeper
for subitem in sorted(item.iterdir())[:3]:
if subitem.is_dir() and not subitem.name.startswith('.'):
print(f" │ ├── {subitem.name}/")
# Indicate if there are more
remaining = len([x for x in item.iterdir() if x.is_dir()]) - 3
if remaining > 0:
print(f" │ └── ... ({remaining} more)")
print()
print("Where should this project's notes be stored?")
print()
print("Options:")
print(" 1. Root level (vault/project-name/)")
print(" 2. Custom path (e.g., vault/Work/project-name/ or vault/Projects/Active/project-name/)")
print()
choice = input("Enter choice [1-2]: ")
if choice == "1":
# Root level
project_dir = vault_path / project_name
else:
# Custom path
print()
print("Enter the parent directory path (relative to vault root).")
print("Examples:")
print(" - Work")
print(" - Projects/Active")
print(" - Personal/Research")
print()
parent_path = input("Parent directory: ").strip()
# Clean and validate path
parent_path = parent_path.strip('/')
project_dir = vault_path / parent_path / project_name
# Create directory if it doesn't exist
project_dir.mkdir(parents=True, exist_ok=True)
print(f"✅ Project directory: {project_dir.relative_to(vault_path)}")
Root Level:
Organized Subdirectories:
Recommended Structures:
vault/
├── Work/
│ ├── project-a/
│ ├── project-b/
│ └── project-c/
├── Personal/
│ ├── hobby-project/
│ └── research/
├── Archive/
│ └── old-project/
└── Templates/
Or by status:
vault/
├── Active/
│ ├── project-a/
│ └── project-b/
├── Planning/
│ └── project-c/
├── Completed/
│ └── old-project/
└── Archive/
Always check before creating:
if project_dir.exists():
print(f"⚠️ Directory already exists: {project_dir}")
overwrite = input("Continue using this directory? (y/n): ")
if overwrite.lower() != 'y':
# Ask for different name or path
return
else:
# Create with parents
project_dir.mkdir(parents=True, exist_ok=True)
print(f"✅ Created directory: {project_dir}")
Save the project directory path for future sessions:
# In .claude/project-config
config_content = f"""obsidian_project={project_name}
obsidian_path={project_dir.relative_to(vault_path)}
"""
with open('.claude/project-config', 'w') as f:
f.write(config_content)
This allows subsequent sessions to use the same directory without asking again.
CRITICAL PRINCIPLE: When creating ANY note in Obsidian, ALWAYS ask the user where they want it saved. Never decide the location yourself, even if it seems obvious.
Step 1: Show Current Structure
# Display vault structure to help user decide
vault_path = Path(os.environ.get('OBSIDIAN_VAULT_PATH'))
print("📁 Current vault structure:")
print(f" {vault_path.name}/")
for item in sorted(vault_path.iterdir())[:10]:
if item.is_dir() and not item.name.startswith('.'):
print(f" ├── {item.name}/")
Step 2: Suggest Options (Don't Decide)
print("\nWhere would you like to save this note?")
print()
print("Suggestions:")
print(" 1. Root level - Notes/note-name.md")
print(" 2. [Specific folder] - Notes/Folder/note-name.md")
print(" 3. Custom path - You specify")
print()
Step 3: Get User Input
choice = input("Enter choice or custom path: ").strip()
Step 4: Create in Chosen Location
# Use their choice, don't override it
if choice == "1":
note_path = vault_path / "note-name.md"
elif choice == "2":
note_path = vault_path / "Folder" / "note-name.md"
else:
# Custom path
note_path = vault_path / choice / "note-name.md"
# Create directory if needed
note_path.parent.mkdir(parents=True, exist_ok=True)
❌ WRONG - Assuming location:
# Creating documentation note
note_path = vault_path / "Guides" / "How-to.md" # DON'T DO THIS
✅ RIGHT - Asking user:
# Show structure and suggest
print("Where should this documentation note be saved?")
print("Suggestions:")
print(" 1. Root level (simple)")
print(" 2. New 'Guides' folder (for documentation)")
print(" 3. Existing 'Work' folder")
print(" 4. Custom path")
choice = input("Your choice: ")
# Then create based on their input
The ONLY exception is when a project configuration already exists:
.claude/project-configEven then, on FIRST use, always ask and save the choice.
Golden Rule: If you're about to write a file to the Obsidian vault, STOP and ask the user where it should go first.
Session: Creating a TODO note
Implementation:
# 1. Check vault location
echo $OBSIDIAN_VAULT_PATH
# 2. Show structure
ls -1 $OBSIDIAN_VAULT_PATH/
# 3. Ask user
"Where would you like me to save the TODO note?
**Options:**
1. project-name/ - With your other project notes (recommended)
2. project-name/sessions/ - With session history
3. Root level - Directly in vault root
4. Custom path - You specify
Which would you prefer?"
# 4. User response: "1"
# 5. Create in chosen location
cat > "$OBSIDIAN_VAULT_PATH/project-name/TODO.md" <<'EOF'
[content]
EOF
Result: Note created in user's preferred location without assumptions or reorganization needed later.
Key Principle: Even when one location seems "obvious", always ask. The user knows their organizational system better than you do.
When reorganizing a large Obsidian vault structure, follow this systematic approach:
Document target structure in a prompt file
session-saves/ vs sessions-history/)Create todo list to track progress
Execute in this order to minimize broken links:
Create new folder structure first
mkdir -p Work/Category-1 Work/Category-2 Work/Category-3
Move files and folders
mv source/ destination/rmdir (not rm -rf) to safely remove directories - fails if not emptyStandardize project folders
sessions-history/ → session-saves/ for consistencyarchived/daily/ and archived/monthly/ subdirectoriesTO-DOS.md files from centralized TODO locationUpdate HOME.md and MOC files
Clean up
tree or find commandsWhen updating internal links across many files:
Find all affected files first
grep -r "pattern" $VAULT --include="*.md"
Read each file before editing (Edit tool requirement)
Update systematically - one file at a time, completing each fully
Remove links to deleted files (like central Home.md)
Standard project structure:
project-name/
├── TO-DOS.md
├── session-saves/
├── archived/
│ ├── daily/
│ └── monthly/
└── [project-specific folders]
Hierarchical organization:
Work/
├── Category-1/
│ ├── HOME.md
│ ├── TO-DOS.md
│ └── project-a/
└── Category-2/
├── HOME.md
└── project-b/
After reorganization:
tree -L 3 -d to verify structureWhen updating many links after vault reorganization:
Find affected files:
grep -r "\[\[OldPath" $VAULT --include="*.md"
Update systematically:
Pattern for updating:
# Old
[[OldFolder/file|Display]]
# New
[[Work/Category/OldFolder/file|Display]]
Removing obsolete links:
[[ObsoleteFile|...]] or [[ObsoleteFile]]When reorganizing to hierarchical structure with section-level HOME.md files:
Pattern: Replace Central Home with Section Homes
Before (centralized):
vault/
├── Home.md (central hub linking to everything)
├── Project-1/
├── Project-2/
└── Project-3/
After (hierarchical):
vault/
├── Work/
│ ├── Category-1/
│ │ ├── HOME.md (section hub)
│ │ └── project-1/
│ └── Category-2/
│ ├── HOME.md (section hub)
│ └── project-2/
└── Personal/
├── HOME.md (section hub)
└── project-3/
Steps to transition:
Create section HOME.md files FIRST
Find all references to central Home:
grep -r "\[\[Home" $VAULT --include="*.md"
Update or remove links systematically:
Delete central Home.md LAST:
Section HOME.md template:
---
type: moc
section: section-name
tags:
- home
- moc
---
# Section Name
## Projects
- [[project-1/Project-1-MOC|Project 1]] - Description
- [[project-2/Project-2-MOC|Project 2]] - Description
## Quick Access
- [[TO-DOS|Section TODOs]]
- [[Archives|Archived Work]]
## Other Sections
- [[../Other-Section/HOME|Other Section]]
---
*Section home for [Category]*
Benefits of section HOME files:
Pattern: Use [section-name]_HOME.md instead of generic HOME.md
Benefits:
Renaming Process:
mv Work/Category-1/HOME.md Work/Category-1/Category-1_HOME.md
mv Work/Category-2/HOME.md Work/Category-2/Category-2_HOME.md
# Find all links to old names
grep -r "\[\[.*HOME\|" $VAULT --include="*.md"
# Update links systematically
# Old: [[Work/Category-1/HOME|Category 1]]
# New: [[Work/Category-1/Category-1_HOME|Category 1]]
When to use generic HOME.md:
When to use [name]_HOME.md:
When reorganizing vault with brain dump or temporary scratch folders:
Purpose: Brain dump folders contain unstructured working notes that need to be:
Workflow:
Review content first:
ls -lh Project/Archives/Brain-Dump/
# Check file sizes and dates
Categorize notes:
Move valuable content:
mv Work/Brain-dump/Useful-Notes.md Work/Category/
Archive or delete folder:
# If brain dump should be archived
mv Project/Brain-dump/ Project/Archives/Brain-Dump/
# If content all processed and obsolete
rmdir Project/Brain-dump/ # Safe - fails if not empty
Anti-pattern: Don't just move entire brain dump folder without review.
Best practice:
When consolidating daily session notes into thematic reference notes and project TODOs:
Convert chronological session history into organized knowledge by:
Triggers:
1. Create Thematic Reference Notes
Group content by topic, not chronology:
---
type: reference
project: project-name
tags:
- theme-tag
- topic-tag
created: YYYY-MM-DD
updated: YYYY-MM-DD
status: completed | in-progress
---
# Thematic Title
**Project:** Project Name
**Period:** Date Range
**Status:** Current status
---
## Overview
High-level summary of this work area
---
## Section 1: Sub-topic
Content from multiple sessions organized coherently
### Key Decisions
- Decision 1 (from session YYYY-MM-DD)
- Decision 2 (from session YYYY-MM-DD)
### Implementation
Details consolidated from sessions
---
## Related Notes
- [[Other-Thematic-Note|Related Topic]]
- [[Project-Planning|Planning Docs]]
---
*Consolidated from sessions: YYYY-MM-DD, YYYY-MM-DD, YYYY-MM-DD*
2. Extract TODOs to Project TO-DOS.md
---
type: todo
project: project-name
status: active | completed
tags:
- todo
- project-name
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
# Project Name - TODOs
**Last Updated:** YYYY-MM-DD
---
## Active Tasks
### Phase 1: [Phase Name]
- [ ] Task 1 extracted from session
- [ ] Task 2 from session
- [x] Task 3 (completed)
---
## Completed (Archive)
### [Milestone Name] (Completed YYYY-MM-DD)
- [x] Completed task 1
- [x] Completed task 2
---
## Related Notes
- [[Thematic-Note-1|Reference]]
- [[Project-Planning|Planning Docs]]
---
*Extracted from session notes consolidated on YYYY-MM-DD*
3. Archive Session Notes
Move processed sessions to archived/daily/:
# Move all processed session notes
mv project/session-saves/*.md project/archived/daily/
# Or move selectively
mv project/session-saves/2026-02-*.md project/archived/daily/
Organize by topic, NOT chronology:
❌ Wrong - Chronological:
## January Work
- Did X on 2026-01-15
- Did Y on 2026-01-20
✅ Right - Thematic:
# Data Collection and Enrichment
## Phase 1: Initial Setup (2026-01-24)
[All setup work grouped together]
## Phase 2: Additional Metrics (2026-01-27)
[All metrics work grouped together]
Thematic notes - descriptive, timeless:
Data-Collection-and-Enrichment.mdStatistical-Analysis-Results.mdFigure-Generation-Workflow.mdInfrastructure-and-Tools.mdNOT date-based:
2026-01-Session-Summary.mdJanuary-Work-Consolidated.mdWeek-3-Notes.mdAfter consolidation:
After major vault reorganization, verify and fix all internal wikilinks systematically.
Use Python script to scan entire vault for broken wikilinks:
import re
from pathlib import Path
vault_root = Path(os.environ.get('OBSIDIAN_VAULT_PATH'))
broken_links = []
wikilink_pattern = r'\[\[([^\]|]+)(?:\|[^\]]+)?\]\]'
for md_file in vault_root.glob("**/*.md"):
with open(md_file, 'r', encoding='utf-8') as f:
content = f.read()
matches = re.findall(wikilink_pattern, content)
for link in matches:
link = link.strip()
# Skip heading-only references
if '#' in link:
link = link.split('#')[0].strip()
if not link:
continue
# Check if linked file exists (Obsidian searches by filename)
found = list(vault_root.glob(f"**/{link}.md"))
if not found:
broken_links.append({
'source': md_file,
'broken_link': link
})
# Report
for item in broken_links:
print(f"BROKEN: {item['source'].name} -> [[{item['broken_link']}]]")
---
type: moc
tags: [home, moc, navigation]
created: YYYY-MM-DD
---
# 🏠 Vault Home
## 🎯 Active Projects
| Project | Status | Priority |
|---------|--------|----------|
| [[Project-A/Project-A-MOC\|Project A]] | In Progress | High |
| [[Project-B/Project-B-MOC\|Project B]] | Planning | Medium |
## 📋 Quick Actions
- [[TODOs/Master-TODO-Index\|Master TODOs]]
- [[Sessions/Latest\|Latest Session]]
## 📚 Knowledge Areas
- [[Domain-1-MOC\|Domain 1]]
- [[Domain-2-MOC\|Domain 2]]
---
type: moc
project: project-name
status: active
tags: [project-name, moc]
created: YYYY-MM-DD
---
# Project Name MOC
## 📋 Planning
- [[Planning/Main-Plan\|Main Plan]]
- [[Planning/Requirements\|Requirements]]
## 🔧 Development
- [[Development/Architecture\|Architecture]]
- [[Development/Implementation\|Implementation]]
## 📊 Analysis
- [[Analysis/Results\|Results]]
## 🗂️ Sessions
- [[session-saves/latest\|Latest Session]]
---
**Related:** [[../Other-Project/Other-Project-MOC\|Related Project]]
Full frontmatter with all recommended fields:
---
type: reference
project: project-name
subproject: optional-subproject
status: active | in-progress | completed | archived
tags:
- relevant-tag-1
- relevant-tag-2
- dump # Add to ALL session/daily notes for easy filtering
priority: critical | high | medium | low
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
Practical Obsidian Search:
# Find all high-priority planning notes
priority: high type: planning
# Find all active TODOs
type: todo status: active
# Find all notes for a project
project: project-name
# Find all session/daily notes (for archiving)
tag:#dump
# Find all session notes for a specific project
tag:#dump project: project-name
Create Central TODO Directory:
TODOs/
├── Master-TODO-Index.md # Central index
├── Project-1-TODOs.md # Project-specific
├── Project-2-TODOs.md
└── Archive/ # Completed TODOs
Project-Specific TODO:
---
type: todo
project: project-1
status: in-progress
tags: [project-1, todo]
priority: high
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
# Project 1 - TODOs
## Active TODOs
### Category 1
- [ ] Task 1 #priority/high #due/YYYY-MM-DD
- [ ] Task 2 #priority/medium
## Completed
- [x] Task 3 - Completed YYYY-MM-DD
## Related Notes
- [[Project-1/Planning/Main-Plan|Planning]]
---
**Link back to:** [[TODOs/Master-TODO-Index|Master Index]]
Per-Project Archives:
Project/
├── Planning/
├── Development/
├── Sessions/ # Active sessions
└── Archives/
├── daily/ # Old session notes
└── monthly/ # Monthly summaries
Archive Rules:
# In Project A notes:
## Related Work in Project B
- [[Project-B/Planning/Shared-Analysis|Shared Analysis]] - Detailed work
- [[Project-B/Project-B-MOC|Project B MOC]] - Full context
# In Project B notes:
## Related Requirements from Project A
- [[Project-A/Planning/Requirements|Requirements]] - What needs to be done
- [[Project-A/Data/Dataset|Dataset]] - Source data
Project/
├── Tools/ # Topic: Tool development
│ └── Tool-1.md
├── Planning/ # Topic: Planning docs
│ └── Main-Plan.md
├── Analysis/ # Topic: Analysis work
│ └── Analysis-Plan.md
└── Archives/ # Historical
└── old-sessions/
When setting up a new vault or reorganizing:
Immediate (High Impact):
Home.md central navigation hubShort-term (This Week):
Long-term (As Needed):
Recommended folder structure within Obsidian vault:
$VAULT/
├── Daily/ # Daily notes
│ └── YYYY-MM-DD.md
├── Sessions/ # Claude session notes
│ └── YYYY-MM-DD-topic.md
├── Tasks/ # Task tracking
│ ├── active/
│ └── completed/
├── Projects/ # Project documentation
│ └── project-name/
│ ├── index.md
│ ├── architecture.md
│ └── decisions.md
├── Solutions/ # Code solutions and fixes
│ └── solution-name.md
├── Research/ # Research notes
│ └── topic.md
├── Knowledge/ # Permanent notes
│ └── concept.md
└── Templates/ # Note templates
├── session.md
├── task.md
└── solution.md
Add these to your shell profile for easy integration:
# Create new session note in Obsidian
obs-session() {
local topic="${1:-general}"
local date=$(date +%Y-%m-%d)
local file="$OBSIDIAN_VAULT_PATH/Sessions/${date}-${topic}.md"
cat > "$file" <<EOF
---
date: $date
type: session-note
tags:
- claude-session
- dump
- project/$topic
---
# Session: $topic - $date
## Context
## Summary
## Action Items
- [ ]
## Links
EOF
echo "Created session note: $file"
}
# Create task in Obsidian
obs-task() {
local task_name="$1"
local date=$(date +%Y-%m-%d)
local file="$OBSIDIAN_VAULT_PATH/Tasks/${task_name}.md"
cat > "$file" <<EOF
---
date: $date
type: task
tags:
- task
- status/pending
---
# Task: $task_name
## Description
## Checklist
- [ ]
## Created
$date via Claude session
EOF
echo "Created task: $file"
}
# Append to daily note
obs-note() {
local date=$(date +%Y-%m-%d)
local time=$(date +%H:%M)
local daily_note="$OBSIDIAN_VAULT_PATH/Daily/${date}.md"
# Create daily note if doesn't exist
if [ ! -f "$daily_note" ]; then
cat > "$daily_note" <<EOF
---
date: $date
type: daily-note
tags:
- dump
---
# $date
EOF
fi
# Append note
cat >> "$daily_note" <<EOF
## $time
EOF
echo "Added entry to daily note: $daily_note"
}
# Quick search in Obsidian vault
obs-search() {
grep -r "$1" "$OBSIDIAN_VAULT_PATH" --include="*.md"
}
Verify vault location
echo $OBSIDIAN_VAULT_PATH
Create session note (optional)
obs-session "feature-implementation"
Add notes as you go
file.py:line referencesCreate tasks for follow-ups
obs-task "refactor-authentication"
Link to existing notes
Review and organize
Update task status
Archive session notes
DO:
DON'T:
DO:
- [ ] for tasksDON'T:
DO:
[[note]] liberally#project/area/topicDON'T:
# Recent Claude sessions
TABLE date, summary
FROM #claude-session
SORT date DESC
LIMIT 10
# Pending tasks from sessions
TASK
FROM #claude-session
WHERE !completed
Problem: Environment variable not defined
Solution:
# Add to shell profile
echo 'export OBSIDIAN_VAULT_PATH="/path/to/vault"' >> ~/.zshrc
source ~/.zshrc
Problem: File created but not visible
Solution:
.md extensionProblem: Wikilinks don't navigate correctly
Solution:
.md)Problem: YAML frontmatter shows as text
Solution:
Symptom: TypeError: expected str, bytes or os.PathLike object, not NoneType
Cause: Wrong variable name used
Diagnosis Steps:
# Check which variable is actually set
echo $OBSIDIAN_VAULT_PATH
echo $OBSIDIAN_VAULT
echo $OBSIDIAN_PATH
# List all Obsidian-related variables
env | grep -i obsidian
Common Variable Names:
$OBSIDIAN_VAULT_PATH (recommended)$OBSIDIAN_VAULT (also common)$OBSIDIAN_PATH (alternative)Resolution:
# Session note
cat > "$OBSIDIAN_VAULT_PATH/Sessions/$(date +%Y-%m-%d)-topic.md" <<'EOF'
---
date: 2026-01-23
type: session-note
tags:
- claude-session
- dump
---
# Content here
EOF
# Task note
cat > "$OBSIDIAN_VAULT_PATH/Tasks/task-name.md" <<'EOF'
---
date: 2026-01-23
type: task
tags: [task, status/pending]
---
# Task: task-name
- [ ] Step 1
EOF
# Quick append to daily
echo "## Note
Content" >> "$OBSIDIAN_VAULT_PATH/Daily/$(date +%Y-%m-%d).md"
# Wikilinks
[[Note Name]]
[[Note#Heading]]
[[Note|Display Text]]
# Tags
#tag
#hierarchical/tag
# Tasks
- [ ] Pending
- [x] Done
# Callouts
> [!note]
> Content
> [!warning]
> Warning content
> [!tip]
> Tip content
# Block references
^block-id
[[Note#^block-id]]
# Properties (frontmatter)
---
key: value
tags: [tag1, tag2]
---
This skill works well with:
Remember: The goal is to build a searchable, linked knowledge base that grows with each session. Start simple, add structure as needed.
npx claudepluginhub beargleindustries/beargle-plugins --plugin obs-vaultManages Obsidian vault as developer knowledge base: create/search/update notes with standard frontmatter, organize by projects/technologies/Claude Code, auto-capture commits/tasks/components.
Provides foundational Obsidian vault context including path, CLI commands, and PARA rules. Loads automatically when the user references their vault, notes, or personal knowledge system.
Organizes an Obsidian vault: adds documents with auto-categorization, restructures misplaced files, processes meeting notes, and runs health checks.