Persistent project memory in a local Obsidian vault (.claudevault). Use PROACTIVELY — do not wait to be asked — whenever any of these happen: an architecture/design decision is made ("we decided", trade-offs weighed, alternatives chosen); a work session ends or is being wrapped up; project context/goals/stack change; reference knowledge worth keeping again surfaces (research, specs, findings hard to re-derive); the user wants to init the vault, read context at the start of a session, process ...
Scanned 8/30/2026
Install to Claude Code
npx -y skills add raghavaro/vault-skill --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of vault-skill?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/raghavaro-vault-skill)More formats (shields.io, HTML) on the badges page.
---
name: vault-skill
version: 0.1.0
description: >-
Persistent project memory in a local Obsidian vault (.claudevault). Use
PROACTIVELY — do not wait to be asked — whenever any of these happen: an
architecture/design decision is made ("we decided", trade-offs weighed,
alternatives chosen); a work session ends or is being wrapped up; project
context/goals/stack change; reference knowledge worth keeping again surfaces
(research, specs, findings hard to re-derive); the user wants to init the
vault, read context at the start of a session, process the raw/ intake folder,
or generate a report/briefing into outputs/. Creates interlinked markdown
notes (decisions, logs, knowledge) that reference each other with [[wikilinks]]
and all link back to context.md.
triggers:
- save this decision
- log this session
- update the vault
- read the vault
- process raw folder
- init the vault
- what have we decided
allowed-tools:
- Bash
- Read
- Write
- Edit
- Glob
- Grep
- AskUserQuestion
---
## When to invoke this skill
This is the **parallel skill twin** of the `vault` MCP server. It manages a
local Obsidian knowledge vault at `.claudevault/` in the project root, using
plain markdown files linked with `[[wikilinks]]`. The whole system is
file-based — no server required, just Read/Write/Edit/Glob/Grep.
Invoke it — **proactively, without being asked** — when:
- **A decision is made** → create an ADR in `decisions/NNN-title.md`
- **A session ends / is wrapped up** → create/append `logs/YYYY-MM-DD.md`
- **Project context changes** → update `context.md`
- **Reusable knowledge surfaces** → create a note under `knowledge/`
- **Session starts** → read `context.md` + the most recent log
- **User says** "process raw", "what's in raw?" → classify `raw/` intake
- **User asks for a report/briefing/gap-analysis** → write to `outputs/`
- **Vault doesn't exist yet** → run Init
## Core principle: maximum linkage
Every note links to everything relevant. The test: *if two notes are related
in any way, there should be a link between them.* When in doubt, link.
Always-apply rules:
- Every note links back to `[[context]]`
- Every decision links to the session log where it was made
- Every decision links to the knowledge notes that informed it
- Every session log links to the decisions/knowledge/context changes that session
- Every knowledge note links to the decisions and logs that reference it
- Related decisions link to each other; superseded decisions cross-link to replacements
Wikilink syntax: `[[context]]` · `[[decisions/001-use-postgres]]` ·
`[[decisions/001-use-postgres|ADR 001]]` · `[[context#Stack]]`
**Link-target convention (so links resolve deterministically):** always write
the target as the note's path **relative to `.claudevault/`, without the `.md`
extension** — e.g. `[[decisions/001-use-postgres]]`, `[[logs/2026-07-21]]`,
`[[knowledge/research/pgvector-benchmarks]]`. The two exceptions are the hub
note `[[context]]` and heading links like `[[context#Stack]]`. Never use a bare
filename (`[[001-use-postgres]]`) — the health check resolves every `[[...]]`
against an actual file at that path, and bare names are ambiguous.
## Reading the vault (session start)
```
Read: .claudevault/context.md ← always
Read: .claudevault/logs/ ← most recent log only
Read: .claudevault/decisions/ ← any relevant ADRs
Read: .claudevault/knowledge/ ← only if relevant to today's work
Do NOT read: .claudevault/raw/ ← only when user asks
Do NOT read: .claudevault/outputs/ ← only when user references
```
Follow wikilinks to pull in connected notes as needed.
## Init (only if `.claudevault/` is absent)
```bash
if [ -d ".claudevault" ]; then
echo "Vault already exists — skipping init"
else
mkdir -p .claudevault/{raw,outputs,decisions,logs,knowledge/{research,references,external,people-and-teams}}
echo "Vault scaffolded — now write seed files"
fi
```
Then write the seed files below with the Write tool.
### Seed: `.claudevault/context.md`
```markdown
# Project Context
parent:: (root)
## Overview
[Brief description of the project]
## Stack
[Languages, frameworks, tools]
## Goals
[What this project aims to achieve]
## Key People / Teams
See [[knowledge/people-and-teams/overview]]
---
## Decisions
_[[decisions/]] — links added as ADRs are created_
## Session Logs
_[[logs/]] — links added each session_
## Knowledge
_[[knowledge/]] — links added as reference material is saved_
## Raw Intake
_[[raw/]] — unprocessed material awaiting classification_
## Outputs
_[[outputs/]] — AI-generated reports and analyses_
```
On init, scan the project to pre-populate `context.md`: detect stack from
`package.json` / `pyproject.toml` / `Cargo.toml` / etc., read `README.md`, and
create ADRs for any already-documented decisions.
## Templates
### Decision — `decisions/NNN-title.md`
```markdown
# [NNN] — [Decision Title]
parent:: [[context]]
date:: YYYY-MM-DD
status:: proposed | accepted | superseded
superseded-by:: [[decisions/NNN-title]] ← remove if not applicable
## Context
[Why this decision was needed]
See [[context#Stack]] for project background.
## Research that informed this
- [[knowledge/research/topic]]
- [[knowledge/references/spec-name]]
## Decision
[What was decided]
## Consequences
[Trade-offs, implications]
## Related decisions
- [[decisions/NNN-related]]
## Session
- [[logs/YYYY-MM-DD]] ← when this was decided
```
Numbering: next zero-padded integer after the highest existing ADR (Glob
`decisions/*.md`). If you are creating **several ADRs in one pass**, allocate all
their numbers up front from that Glob result — don't re-Glob between writes, or
two new ADRs can claim the same number. After creating: (1) link it in
`context.md` under Decisions,
(2) link it in today's log, (3) link informing knowledge notes, (4) cross-link
related ADRs.
### Session log — `logs/YYYY-MM-DD.md`
```markdown
# Session — YYYY-MM-DD
parent:: [[context]]
## What we did
[Summary]
## Decisions made
- [[decisions/NNN-title]]
## Knowledge saved
- [[knowledge/research/topic]] ← why it was saved
## Context changes
[Updates made to [[context]]]
## Open questions
[Unresolved items]
## Next steps
[What to pick up next session]
```
One log per day. If today's log exists, **append** rather than overwrite: first
`Read` the existing file, then use `Edit` to add the new content under the right
heading (or `Write` back the full merged document). Never `Write` a fresh
template over a log that already has content — it destroys the earlier entry.
Then link it in `context.md` under Session Logs.
### Knowledge — `knowledge/research/NNN-topic.md` (or references/ external/ people-and-teams/)
```markdown
# [Topic]
parent:: [[context]]
source:: [URL or origin]
date:: YYYY-MM-DD
saved-because:: [one sentence: why this is worth keeping]
## Summary
[Key findings in Claude's own words — NOT raw copied content]
## Relevance to this project
[Why this matters here specifically]
## Used in
- [[decisions/NNN-title]]
- [[logs/YYYY-MM-DD]]
```
## What to save (the "worth keeping" test)
**Always save:** architecture decisions + reasoning, session summaries, context changes.
**Save knowledge only if** it answers yes to any: Will this be needed in a
future session? Did it change a decision/direction? Is it hard to re-derive? Is
it project-specific (not general docs)?
**Never save:** scaffolding tool results, web searches that changed nothing,
file contents already in the repo, general knowledge Claude already has.
## Subfolders
- `knowledge/research/` — articles, spikes, benchmarks, findings
- `knowledge/references/` — specs, schemas, API/DB contracts, fed-in files
- `knowledge/external/` — tool/API call results worth keeping (summarized, not dumped)
- `knowledge/people-and-teams/` — org context, stakeholders, constraints
## raw/ — intake junk drawer
Never modify files in `raw/`; never read it automatically. When the user asks to
"process raw": read each file, classify it (decision / reference / research /
people / context / skip) using the same rules as a doc migration, promote it
into the right vault location **summarized in your own words**, leave the raw
original in place, and log what was processed.
## outputs/ — derived artifacts
For generated reports/briefings/gap-analyses spanning multiple notes. Name
descriptively (`outputs/auth-architecture-briefing.md`). Include `date::` and a
`sources::` list of the wikilinks it drew from. Do NOT link outputs into
`context.md` — they're ephemeral. If an output reveals something worth keeping,
promote it into a `knowledge/` note.
## Health check (on request)
Audit for: broken wikilinks (targets that don't resolve to a file), orphaned
notes (nothing links to them), missing metadata fields, and stale content. Use
Glob + Grep to cross-check `[[...]]` targets against actual files.
## Date handling
Always use the real current date for `date::` fields and `logs/` filenames.
Convert relative references ("today", "last week") to absolute `YYYY-MM-DD`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!