---
name: obsidian
description: "Search and read Brent's personal Obsidian notes vault. 46 notes across Greek tutoring, Latin tutoring, Biblical translation, ChatGPT prompts, Cedar Ridge planning, and misc. Trigger: any reference to 'my notes', 'what did I write about', 'do I have notes on', 'from my Obsidian', or when context from personal notes would improve the answer. Auto-sync on first use."
user-invocable: true
metadata:
  { "openclaw": { "emoji": "📓" } }
---

# Obsidian Personal Notes

Brent's Obsidian vault is synced from GitHub (`rutgersguy/obsidian-notes`) and indexed in PostgreSQL for full-text search. **Always search before saying you don't have context.**

## Vault Contents (46 notes)

| Folder | Notes | Content |
|--------|-------|---------|
| `Greek Notes` | 16 | Weekly tutoring sessions Jan–Mar 2026 (optative, subjunctive, participles, etc.) |
| `Latin Notes` | 18 | Weekly tutoring sessions Jan–Mar 2026 + Wheelock's, derivatives, review notes |
| `Biblical Translation` | 2 | Book of Galatians, Book of Mark |
| `ChatGPT Organization` | 4 | Context compression prompts, core profile, persistent context templates |
| `Cedar Long Range Planning Meetings` | 2 | Club capital planning, talking points |
| Root | 4 | Critical Source Review Plan, Random Notes, Trust Attorney Notes |

## Client Usage

```python
import sys
sys.path.insert(0, '/home/node/.openclaw/workspace')
from modules.obsidian.client import ObsidianClient
client = ObsidianClient()
```

### Sync (pull latest from GitHub → DB)
```python
result = client.sync()
# {'synced': N, 'skipped': N, 'errors': 0, 'total': 46}
# Only re-indexes changed files (SHA comparison). Fast on subsequent runs.
```

### Search notes
```python
results = client.search("optative mood", limit=5)
# Returns: [{path, title, folder, tags, snippet}]
# snippet has **highlighted** matching terms
# Falls back to ILIKE if FTS finds nothing (good for proper nouns, Greek/Latin words)

# Folder-scoped search
results = client.search("indirect discourse", folder="Latin Notes")
```

### Get full note
```python
note = client.get_note("Greek Notes/Feb 09, 2026 - Optative Mood and Grammatical Analysis.md")
# Returns: {path, title, folder, content, tags, wikilinks, github_sha, indexed_at}
# content is the full markdown text
```

### List notes in a folder
```python
notes = client.list_notes("Greek Notes")  # or None for all
# Returns: [{path, title, folder, tags}]
```

### Get related notes
```python
related = client.get_related("Latin Notes/Wheelock's Latin Notes.md")
# Returns notes in same folder or sharing wikilinks/tags
```

### Create or update a note
```python
client.create_note(
    "Greek Notes/March 18, 2026 - Session Summary.md",
    "# March 18, 2026 - Session Summary\n\n...",
    message="conductor: add session note"
)
# Writes to GitHub and re-indexes immediately.
# Note appears in Obsidian on next obsidian-git pull (30 min interval).
```

### Stats
```python
client.stats()
# {'total_notes': 46, 'total_folders': 6, 'last_synced': '...'}
```

## Trigger Patterns

Invoke this skill when the user says things like:
- "do I have notes on X?"
- "what did I write about [grammar topic / meeting / topic]?"
- "check my Obsidian notes"
- "from my notes"
- "what's in my vault?"
- Any language/grammar question where tutoring session notes would help

For lector / Greek / Latin questions: **always search Greek Notes and Latin Notes first** — the tutoring session notes often have exactly the grammar point being asked about.

## Workflow

### "Do I have notes on the optative?"
```python
results = client.search("optative", limit=5)
# Present: title, folder, snippet. Offer to read full note.
```

### "What did I cover in Greek last week?"
```python
notes = client.list_notes("Greek Notes")
# Filter for recent dates. Get the most recent 2-3.
# Read full content with client.get_note(path).
```

### "Summarize my Latin notes on indirect discourse"
```python
results = client.search("indirect discourse", folder="Latin Notes", limit=5)
# For each result, get_note(path) for full content.
# Synthesize across multiple notes.
```

### "Add a note about today's session"
```python
client.create_note("Greek Notes/March 18, 2026 - ...", content, "conductor: session note")
```

## Sync Strategy

- Call `client.sync()` at the start of any obsidian skill invocation to ensure the index is current.
- `sync()` is fast — skips unchanged files by SHA comparison. Safe to call every session.
- obsidian-git auto-commits every 30 minutes from Brent's Obsidian app.

## Response Format

**Search results:** Title + folder + highlighted snippet. If 1 clear match, read the full note. If multiple, summarize each and ask which to expand.

**Full note read:** Render the markdown naturally. For long notes (>2000 chars), summarize by section.

**No results:** Say so plainly. Try alternate search terms before giving up.
