Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scaffold the PKM system onto an existing Obsidian vault. Scans your vault structure, maps folders interactively, and generates configuration — no template required.
.claude/skills/ballred-adopt/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 176% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 86% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 15% | 0% |
Bring Your Own Vault (BYOV) — install the Claude PKM system onto an existing Obsidian vault.
/adopt # Run from the root of your existing Obsidian vaultAnalyze the existing vault to understand its organization.
ls, excluding system dirs (.obsidian, .git, .claude, .trash, .claude-plugin).md files (using Glob)YYYY-MM-DD*.md) — indicates daily notesCLAUDE.md in subdirs — indicates projects00-09, 10-19 style folder names Vault scan complete!
Found 342 notes across 8 folders: Daily/ → 180 notes (date-named — likely daily notes) Projects/ → 45 notes (has CLAUDE.md files — likely projects) Goals/ → 12 notes (contains goal keywords) Templates/ → 8 notes (contains template keywords) Archive/ → 67 notes Inbox/ → 15 notes Resources/ → 10 notes Meeting Notes/ → 5 notes
Detected method: PARA-like structure
Use AskUserQuestion to confirm or correct the detected mappings.
Each role maps a PKM function to a folder in the user's vault:
| Role | Purpose | Detection Signal | |------|---------|-----------------| | Daily Notes | Daily journal entries | Date-named files (YYYY-MM-DD) | | Goals | Goal cascade (3-year → weekly) | Files with goal/review keywords | | Projects | Active projects | Subdirs with CLAUDE.md or project keywords | | Templates | Reusable note structures | Files with template keywords or in Templates/ | | Archives | Completed/inactive content | Folder named Archive(s) or with old dates | | Inbox | Uncategorized captures | Folder named Inbox, or files tagged #inbox |
For each role, ask the user to confirm or correct:
Question format (use AskUserQuestion):
Edge cases:
CLAUDE.md.backup or merge contentStore the folder mapping for use in later phases:
dailyNotes → "Daily"
goals → "Goals"
projects → "Projects"
templates → "Templates"
archives → "Archive"
inbox → "Inbox" (or null if skipped)Ask the same 4 questions as /onboard:
Question 1: Your name
Question 2: Preferred review day
/review auto-detection and session-init nudgesQuestion 3: Primary goal areas
Question 4: Work style
settings.jsonWrite .claude/settings.json with permissions scoped to the user's actual folders:
json{ "permissions": { "allow": [ "Read", "Write **/{mapped-daily}/**", "Write **/{mapped-goals}/**", "Write **/{mapped-projects}/**", "Write **/{mapped-templates}/**", "Edit **/{mapped-daily}/**", "Edit **/{mapped-goals}/**", "Edit **/{mapped-projects}/**", "Glob", "Grep" ] } }
Replace {mapped-*} with actual folder names from Phase 2.
CLAUDE.mdGenerate a root CLAUDE.md that describes the user's actual vault structure. Use the same format as the template's CLAUDE.md but with:
If the user had an existing CLAUDE.md, merge their content into the appropriate sections (preserve their mission statement, custom conventions, etc.).
vault-config.jsonWrite vault-config.json in the vault root:
json{ "name": "User's name", "reviewDay": "Sunday", "goalAreas": ["Career & Professional", "Health & Wellness"], "workStyle": "Direct and concise", "setupDate": "2026-02-17", "version": "3.1", "adoptedVault": true, "folderMapping": { "dailyNotes": "Daily", "goals": "Goals", "projects": "Projects", "templates": "Templates", "archives": "Archive", "inbox": "Inbox" } }
Write or update CLAUDE.local.md with env var exports for hooks:
markdown## Environment Overrides These env vars allow hooks and scripts to find your folders: <!-- Export these in your shell profile or they'll be set by session-init: --> DAILY_NOTES_DIR={mapped daily notes folder} GOALS_DIR={mapped goals folder} PROJECTS_DIR={mapped projects folder} TEMPLATES_DIR={mapped templates folder} INBOX_DIR={mapped inbox folder} ARCHIVES_DIR={mapped archives folder}
Also create .claude/hooks/adopt-env.sh that exports these variables:
bash#!/bin/bash # Environment variables for adopted vault folder mapping # Generated by /adopt — edit vault-config.json and re-run /adopt to update export DAILY_NOTES_DIR="{mapped daily notes}" export GOALS_DIR="{mapped goals}" export PROJECTS_DIR="{mapped projects}" export TEMPLATES_DIR="{mapped templates}" export INBOX_DIR="{mapped inbox}" export ARCHIVES_DIR="{mapped archives}"
Then add a source line to session-init.sh if not already present:
bash# Source adopted vault env vars if present ADOPT_ENV="$VAULT_PATH/.claude/hooks/adopt-env.sh" if [ -f "$ADOPT_ENV" ]; then source "$ADOPT_ENV" fi
Check what's missing and offer to create it. Always ask before creating.
If the goals folder is empty or newly created:
If the templates folder is empty or newly created:
If CLAUDE.local.md.template doesn't exist:
Ensure these directories exist (create silently):
.claude/skills/ (for future skill additions).claude/rules/.claude/hooks/.claude/agents/Copy standard rules files if .claude/rules/ is empty:
markdown-standards.mdproductivity-workflow.mdproject-management.mdtask-tracking.mdRun quick checks:
vault-config.json is valid JSON (read it back)CLAUDE.md is present and non-empty.claude/hooks/adopt-env.sh is present and executablePresent a summary:
Adoption complete!
Vault: /path/to/vault
Method: PARA-like (preserved your existing structure)
Mapped folders:
Daily Notes → Daily/
Goals → Goals/
Projects → Projects/
Templates → Templates/
Archives → Archive/
Inbox → Inbox/
Created:
✓ CLAUDE.md (vault context)
✓ vault-config.json (preferences)
✓ .claude/hooks/adopt-env.sh (folder mapping)
✓ Goal cascade files (4 files)
✓ Standard templates (3 files)
Your vault structure is unchanged — only configuration files were added.Suggest what to do next:
/daily to create today's note using your vault's structure"/review for a guided weekly review"/push to commit these changes to git"CLAUDE.local.md for private preferences (not committed to git)".obsidian directory found, warn: "This doesn't look like an Obsidian vault. Continue anyway?"vault-config.json exists with adoptedVault: true, ask: "This vault was already adopted. Re-run adoption? (This will regenerate config files.)".claude/ can't be written, suggest checking permissions.md files found, suggest using /onboard with the template insteadWorks with:
/onboard — adopt replaces onboard for existing vaults/daily — uses mapped daily notes folder/weekly — uses mapped goals folder/review — respects adopted vault structure/push — commits adoption changesadopt-env.sh| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | 6,537 | 2,146 | -67% | 1 | 1 | 0% | 1,320 | 3,139 | +138% | 0 | 0 | — |
case-03 | fail→fail | 4,246 | 1,703 | -60% | 1 | 1 | 0% | 846 | 3,132 | +270% | 0 | 0 | — |
case-04 | fail→fail | 4,057 | 3,539 | -13% | 1 | 1 | 0% | 695 | 3,014 | +334% | 0 | 0 | — |
case-01 | fail→fail | 9,189 | 2,132 | -77% | 1 | 1 | 0% | 1,619 | 3,207 | +98% | 0 | 0 | — |
case-05 | pass→fail | 6,153 | 3,164 | -49% | 1 | 1 | 0% | 1,135 | 2,989 | +163% | 0 | 0 | — |
case-06 | pass→fail | 4,987 | 1,843 | -63% | 1 | 1 | 0% | 809 | 3,013 | +272% | 0 | 0 | — |
case-07 | pass→pass | 10,811 | 6,088 | -44% | 1 | 1 | 0% | 2,020 | 3,843 | +90% | 0 | 0 | — |
case-08 | pass→pass | 2,489 | 1,269 | -49% | 1 | 1 | 0% | 480 | 3,021 | +529% | 0 | 0 | — |
case-09 | pass→pass | 5,117 | 2,039 | -60% | 1 | 1 | 0% | 1,000 | 3,192 | +219% | 0 | 0 | — |
case-10 | pass→pass | 4,358 | 2,110 | -52% | 1 | 1 | 0% | 825 | 3,140 | +281% | 0 | 0 | — |
case-11 | fail→pass | 7,227 | 3,032 | -58% | 1 | 1 | 0% | 1,217 | 3,361 | +176% | 0 | 0 | — |
case-12 | pass→pass | 7,337 | 1,588 | -78% | 1 | 1 | 0% | 1,244 | 3,086 | +148% | 0 | 0 | — |
case-13 | pass→pass | 8,524 | 1,225 | -86% | 1 | 1 | 0% | 1,530 | 3,006 | +96% | 0 | 0 | — |
case-14 | fail→pass | 12,100 | 1,943 | -84% | 1 | 1 | 0% | 2,072 | 3,186 | +54% | 0 | 0 | — |
case-15 | fail→pass | 12,089 | 1,690 | -86% | 1 | 1 | 0% | 1,968 | 3,048 | +55% | 0 | 0 | — |
case-16 | fail→pass | 11,469 | 4,949 | -57% | 1 | 1 | 0% | 2,022 | 3,766 | +86% | 0 | 0 | — |
case-17 | fail→pass | 14,642 | 1,440 | -90% | 1 | 1 | 0% | 2,652 | 3,058 | +15% | 0 | 0 | — |
case-18 | fail→pass | 10,348 | 2,926 | -72% | 1 | 1 | 0% | 1,777 | 3,307 | +86% | 0 | 0 | — |
case-19 | fail→pass | 12,483 | 4,791 | -62% | 1 | 1 | 0% | 2,342 | 3,682 | +57% | 0 | 0 | — |
case-20 | fail→fail | 6,749 | 1,387 | -79% | 1 | 1 | 0% | 1,197 | 3,019 | +152% | 0 | 0 | — |
case-21 | pass→pass | 9,375 | 2,255 | -76% | 1 | 1 | 0% | 1,468 | 3,166 | +116% | 0 | 0 | — |
case-22 | pass→fail | 10,291 | 1,808 | -82% | 1 | 1 | 0% | 1,854 | 3,117 | +68% | 0 | 0 | — |
case-23 | fail→pass | 10,453 | 5,772 | -45% | 1 | 1 | 0% | 1,786 | 3,766 | +111% | 0 | 0 | — |
case-24 | pass→pass | 6,989 | 2,091 | -70% | 1 | 1 | 0% | 1,227 | 3,094 | +152% | 0 | 0 | — |
case-25 | fail→pass | 9,000 | 2,739 | -70% | 1 | 1 | 0% | 1,565 | 3,205 | +105% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 23 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +24 percentage points is the difference between those two pass rates over the 23 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.