
Vault Cleanup Auditor
- 117 installs
- 390 repo stars
- Updated March 19, 2026
- brianrwagner/ai-marketing-skills
vault-cleanup-auditor is a Claude Code skill that runs 4 bash checks on an Obsidian vault and saves a prioritized cleanup report of stale drafts, incomplete files, duplicates, and empty folders.
About
vault-cleanup-auditor runs 4 targeted checks against an Obsidian vault and saves a prioritized audit report. It finds stale unposted drafts over 30 days old, files with no headings, duplicate filenames, and empty folders. A developer runs it monthly to keep a notes vault tidy using only bash and standard Unix tools.
- Runs 4 checks on an Obsidian vault: stale drafts, incomplete files, duplicate filenames, empty folders
- Saves a dated, prioritized audit report to vault-audit/YYYY-MM-DD-audit.md
- Uses only bash and standard Unix tools; no APIs or paid services
Vault Cleanup Auditor by the numbers
- 117 all-time installs (skills.sh)
- Ranked #1,304 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
vault-cleanup-auditor capabilities & compatibility
Free; runs locally with bash, no API keys or paid services.
- Capabilities
- vault audit · file cleanup · duplicate detection
- Works with
- obsidian
- Use cases
- documentation · project management
- Pricing
- Free
What vault-cleanup-auditor says it does
Audit your Obsidian vault in Claude Code — finds stale drafts, empty folders, duplicate filenames, and incomplete files. Saves a dated report.
Runs 4 targeted checks against your Obsidian vault and saves a prioritized audit report to `vault-audit/YYYY-MM-DD-audit.md`. Takes under 30 seconds. No APIs, no paid services.
Run it monthly or whenever the vault starts feeling messy.
npx skills add https://github.com/brianrwagner/ai-marketing-skills --skill vault-cleanup-auditorAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 117 |
|---|---|
| repo stars | ★ 390 |
| Last updated | March 19, 2026 |
| Repository | brianrwagner/ai-marketing-skills ↗ |
What it does
Audit an Obsidian vault for stale drafts, incomplete files, duplicates, and empty folders, then save a report.
Who is it for?
Obsidian users who want a periodic, no-API audit of vault clutter.
Skip if: Users who need content editing or version-controlled note refactoring rather than a report.
When should I use this skill?
The user asks to audit or clean up their Obsidian vault or says the vault feels messy.
What you get
A dated, prioritized audit report listing stale drafts, incomplete files, duplicates, and empty folders with next-step guidance.
- A dated audit report at vault-audit/YYYY-MM-DD-audit.md
- A terminal summary of counts per check
By the numbers
- 4 vault checks
- 30-day stale-draft threshold
- 15-item cap per report section
Files
Vault Cleanup Auditor
Runs 4 targeted checks against your Obsidian vault and saves a prioritized audit report to vault-audit/YYYY-MM-DD-audit.md. Takes under 30 seconds. No APIs, no paid services.
Run it monthly or whenever the vault starts feeling messy.
---
How to Use
Open Claude Code and say:
Run the Vault Cleanup Auditor skill against my vault at /path/to/vault.---
Skill Instructions (for Claude Code)
When this skill is invoked, follow these phases exactly.
---
PHASE 1: INTAKE
Check whether the user has provided:
vault_path— absolute path to their Obsidian vault root
If missing, ask:
What's the absolute path to your Obsidian vault? (e.g. /root/obsidian-vault)Do not proceed until confirmed.
---
PHASE 2: ANALYZE
Run all 4 checks. Capture raw output from each before writing the report.
Check 1 — Stale drafts (30+ days, unposted):
VAULT="VAULT_PATH_HERE"
echo "=== CHECK 1: STALE DRAFTS ==="
find "$VAULT/content/ready-to-post" -name "*.md" -mtime +30 2>/dev/null | while read f; do
if grep -q '\*\*Posted:\*\* ❌' "$f" 2>/dev/null; then
days=$(( ($(date +%s) - $(stat -c %Y "$f")) / 86400 ))
echo "${days}d|${f##$VAULT/}"
fi
done
echo "=== END CHECK 1 ==="Check 2 — Incomplete files (no headings, 5+ lines):
VAULT="VAULT_PATH_HERE"
echo "=== CHECK 2: INCOMPLETE FILES ==="
find "$VAULT" -name "*.md" \
-not -path "*/.git/*" \
-not -path "*/.obsidian/*" \
-not -path "*/.openclaw/*" | while read f; do
if ! grep -qE '^#{1,6} ' "$f" 2>/dev/null; then
lines=$(wc -l < "$f")
if [ "$lines" -gt 5 ]; then
echo "${lines}lines|${f##$VAULT/}"
fi
fi
done
echo "=== END CHECK 2 ==="Check 3 — Duplicate filenames:
VAULT="VAULT_PATH_HERE"
echo "=== CHECK 3: DUPLICATE FILENAMES ==="
find "$VAULT" -name "*.md" \
-not -path "*/.git/*" \
-not -path "*/.obsidian/*" \
-not -path "*/.openclaw/*" \
-printf "%f\n" | sort | uniq -d | while read name; do
echo "DUPE:$name"
find "$VAULT" -name "$name" \
-not -path "*/.git/*" \
-not -path "*/.obsidian/*" | while read f; do
echo " PATH:${f##$VAULT/}"
done
done
echo "=== END CHECK 3 ==="Check 4 — Empty folders:
VAULT="VAULT_PATH_HERE"
echo "=== CHECK 4: EMPTY FOLDERS ==="
find "$VAULT" -type d -empty \
-not -path "*/.git/*" \
-not -path "*/.obsidian/*" \
-not -path "*/.openclaw/*" | while read d; do
echo "${d##$VAULT/}/"
done
echo "=== END CHECK 4 ==="---
PHASE 3: OUTPUT
3a. Create the report directory and file:
VAULT="VAULT_PATH_HERE"
DATE=$(date +%Y-%m-%d)
mkdir -p "$VAULT/vault-audit"
REPORT="$VAULT/vault-audit/${DATE}-audit.md"
echo "Report path: $REPORT"3b. Write the report using this exact structure:
# Vault Cleanup Audit — YYYY-MM-DD
Generated: YYYY-MM-DD HH:MM
**Summary:** 🔴 [N] stale | 🟡 [N] incomplete | 🟡 [N] dupes | 🟢 [N] empty
---
## 🔴 Stale Drafts (30+ days, unposted)
- [Nd old] path/to/file.md
[cap at 15 items — add "...and N more" if over]
## 🟡 Incomplete Files (no headings, 5+ lines)
- path/to/file.md (N lines)
[cap at 15]
## 🟡 Duplicate Filenames
- **filename.md**
- path/one/filename.md
- path/two/filename.md
[cap at 15 duplicate names]
## 🟢 Empty Folders
- path/to/folder/
[cap at 15]
---
**What to do:**
- 🔴 Stale drafts: post them, delete them, or archive to `content/posted/`
- 🟡 Incomplete files: finish or trash
- 🟡 Duplicates: merge or rename the less important one
- 🟢 Empty folders: safe to delete (or keep if you're about to use them)3c. Print the summary to terminal:
✅ Audit saved to: vault-audit/YYYY-MM-DD-audit.md
Summary:
🔴 [N] stale drafts
🟡 [N] incomplete files
🟡 [N] duplicate filenames
🟢 [N] empty folders---
PHASE 4: SELF-CRITIQUE
Before finalizing, check:
1. All 4 checks ran — Confirm output exists between each === CHECK N === / === END CHECK N === marker. If a check produced no output, note "0 issues found" in the report — do not skip the section. 2. Counts are accurate — The summary line counts must match the actual items listed in each section. Re-count if unsure. 3. Report saved correctly — Confirm the file exists at vault-audit/YYYY-MM-DD-audit.md. If the write failed, report the error and provide the report content inline. 4. No blank sections — Every section must either list items OR say "No issues found." Never leave a section header with nothing below it.
Fix any failures before delivering the final output.
---
Example Report
# Vault Cleanup Audit — 2026-03-01
Generated: 2026-03-01 08:14
**Summary:** 🔴 3 stale | 🟡 2 incomplete | 🟡 1 dupe | 🟢 2 empty
---
## 🔴 Stale Drafts (30+ days, unposted)
- [47d old] content/ready-to-post/linkedin/2026-01-12-ai-systems-post.md
- [38d old] content/ready-to-post/twitter/2026-01-21-founder-ops.md
- [31d old] content/ready-to-post/newsletter/2026-01-28-tools-roundup.md
## 🟡 Incomplete Files (no headings, 5+ lines)
- bambf/research/untitled-notes.md (23 lines)
- thinking/random-thoughts.md (11 lines)
## 🟡 Duplicate Filenames
- **README.md**
- bambf/brand/README.md
- bambf/tracking/README.md
## 🟢 Empty Folders
- content/queue/rejected/
- bambf/clients/archived/
---
**What to do:**
- 🔴 Stale drafts: post them, delete them, or archive to `content/posted/`
- 🟡 Incomplete files: finish or trash
- 🟡 Duplicates: merge or rename the less important one
- 🟢 Empty folders: safe to delete (or keep if you're about to use them)---
Requirements
- Claude Code with bash tool access
- Bash + standard Unix tools:
find,grep,wc,stat,date,awk - Read access to vault directory
- Write access to
vault-audit/inside the vault (auto-created) - No APIs, no paid services, no external dependencies
Platform: OpenClaw (token-optimized)
Required Input
vault_path— absolute path to Obsidian vault root
Ask if missing. Do not proceed without it.
4 Checks (run all, capture output before formatting)
Check 1 — Stale drafts (unposted, 30+ days old):
VAULT="VAULT_PATH_HERE"
find "$VAULT/content/ready-to-post" -name "*.md" -mtime +30 2>/dev/null | while read f; do
if grep -q '\*\*Posted:\*\* ❌' "$f" 2>/dev/null; then
days=$(( ($(date +%s) - $(stat -c %Y "$f")) / 86400 ))
echo "${days}d|${f##$VAULT/}"
fi
doneCheck 2 — Incomplete files (no headings, 5+ lines):
VAULT="VAULT_PATH_HERE"
find "$VAULT" -name "*.md" -not -path "*/.git/*" -not -path "*/.obsidian/*" -not -path "*/.openclaw/*" | while read f; do
if ! grep -qE '^#{1,6} ' "$f" 2>/dev/null; then
lines=$(wc -l < "$f")
[ "$lines" -gt 5 ] && echo "${lines}lines|${f##$VAULT/}"
fi
doneCheck 3 — Duplicate filenames:
VAULT="VAULT_PATH_HERE"
find "$VAULT" -name "*.md" -not -path "*/.git/*" -not -path "*/.obsidian/*" \
-printf "%f\n" | sort | uniq -d | while read name; do
echo "DUPE:$name"
find "$VAULT" -name "$name" -not -path "*/.git/*" | while read f; do
echo " PATH:${f##$VAULT/}"
done
doneCheck 4 — Empty folders:
VAULT="VAULT_PATH_HERE"
find "$VAULT" -type d -empty -not -path "*/.git/*" -not -path "*/.obsidian/*" | while read d; do
echo "EMPTY:${d##$VAULT/}"
doneOutput Format
Save to: vault-audit/YYYY-MM-DD-audit.md
# Vault Audit — [YYYY-MM-DD]
**Vault:** [path]
## Summary
| Check | Count | Priority |
|-------|-------|----------|
| Stale drafts | X | High |
| Incomplete files | X | Medium |
| Duplicate filenames | X | High |
| Empty folders | X | Low |
## Check 1: Stale Drafts ([count])
[List with days old + path]
**Action:** Review each — post, archive, or delete.
## Check 2: Incomplete Files ([count])
[List with line count + path]
**Action:** Finish or delete.
## Check 3: Duplicate Filenames ([count])
[Grouped by filename with all paths]
**Action:** Consolidate or rename.
## Check 4: Empty Folders ([count])
[List paths]
**Action:** Delete empty folders.
## Recommended Actions
1. [Highest priority, most impactful]
2. [Next]--- Skill by Brian Wagner | AI Marketing Architect
Related skills
FAQ
How many checks does it run?
Four: stale drafts over 30 days, incomplete files, duplicate filenames, and empty folders.
Does it need any paid services?
No. The SKILL.md states 'No APIs, no paid services'; it uses bash and standard Unix tools.