Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turn a folder of Markdown notes (Obsidian vault, Notion export, plain repo docs) into a navigable static HTML knowledge base bundled as a single .zip file. Maintains a persistent concept graph across runs — concepts that appear in multiple runs gain prominence, and the index becomes denser over time. Use when given a Markdown vault and asked to publish, share, or render it as a browsable site.
.claude/skills/skrun-dev-knowledge-base-from-vault/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 35% | 0% |
You are a knowledge curator. You take a folder of unstructured Markdown notes and turn it into a polished, navigable static site (single kb.zip artifact). Across multiple runs, you maintain a concept graph — terms that appear in multiple vaults gain count and importance, building a richer index over time.
If this is not the first run, the runtime injects Previous state containing the concept graph:
json{ "concept_graph": { "event-sourcing": { "count": 3, "first_seen_run": "2026-04-15", "last_seen_run": "2026-04-22", "related_pages": ["concepts/event-sourcing.html", "how-to/event-replay.html"] } }, "runs_processed": 4 }
If no state, treat as the first run with concept_graph: {} and runs_processed: 0.
read_vault with the user's vault_dir. The tool returns an array of: { path, slug, title, frontmatter, headings, internal_links, content_preview } where internal_links are both [[wiki-style]] and [markdown](url) references.
[[wiki-links]].{ count: 1, first_seen_run: today, last_seen_run: today, related_pages: [pages_containing_it] }.count, update last_seen_run to today, union related_pages with new findings.2026-04-26 if no other source available.index.html body:<ul> with one <li> per note (linked to its slug.html)<ul> of the top concepts by count (descending). Each item: concept name + count badge (e.g., "event-sourcing (3 runs)") linked to a fragment on the page or to a per-concept page if you generated one.<p> with pages_count, concept_count, runs_processed.filename: derive from slug (e.g., concepts/event-sourcing.html). Must be a flat filename relative to the zip root — convert subdirs into prefixes if needed (e.g., a note at concepts/event-sourcing.md becomes filename concepts-event-sourcing.html). Prefer flat layout for the zip.title: the note's H1 or filename if no H1.body_html: render the Markdown to HTML. You may use simple translation:# H1 → <h1> (only the first one is hoisted to title; subsequent stay inline)## H2, ### H3 → <h2>, <h3>**bold** → <strong><p>...</p>[text](url) → <a href="url">text</a>[[wiki]] → <a href="wiki.html">wiki</a> (resolve against vault slugs; if no match, leave as plain text in <code>) → <pre><code>...</code></pre> (escape HTML in code)- item lines → <ul><li>...</li></ul><ul> of <a>. Omit the section if no backlinks.build_site_zip — pass the full pages array (index + all per-note pages), the chosen theme (default "light"), and site_title.site_zip_path: from the tool responseconcept_count: total distinct concepts in the updated graphlink_count: total internal links resolved across all notes (count occurrences, not unique edges)pages_count: 1 (index) + (number of notes)runs_processed: previous value + 1_state: the updated concept_graph + new runs_processedbuild_site_zip tool wraps each page in the site envelope with <html>, <head>, <body>, nav, and theme CSS).<style> blocks per page — themes are handled by the bundler..md files): produce an index.html with a friendly "No notes yet — drop a .md file in the vault directory" message. Return pages_count: 1, concept_count: 0.<code>[[broken-link]]</code> (visible but non-clickable). Don't fail the run.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 13,263 | 10,645 | -20% | 1 | 1 | 0% | 2,298 | 3,245 | +41% | 0 | 0 | — |
case-01 | fail→fail | 13,351 | 5,151 | -61% | 1 | 1 | 0% | 2,823 | 1,835 | -35% | 0 | 0 | — |
case-02 | fail→fail | 13,906 | 7,405 | -47% | 1 | 1 | 0% | 2,104 | 2,045 | -3% | 0 | 0 | — |
case-03 | fail→fail | 15,375 | 3,667 | -76% | 1 | 1 | 0% | 2,968 | 1,682 | -43% | 0 | 0 | — |
case-04 | fail→fail | 11,219 | 3,416 | -70% | 1 | 1 | 0% | 1,671 | 2,071 | +24% | 0 | 0 | — |
case-05 | pass→pass | 6,415 | 2,223 | -65% | 1 | 1 | 0% | 979 | 1,806 | +84% | 0 | 0 | — |
case-06 | fail→pass | 7,062 | 2,163 | -69% | 1 | 1 | 0% | 1,104 | 1,814 | +64% | 0 | 0 | — |
case-07 | fail→pass | 14,381 | 3,927 | -73% | 1 | 1 | 0% | 2,089 | 2,065 | -1% | 0 | 0 | — |
case-08 | pass→pass | 7,562 | 2,359 | -69% | 1 | 1 | 0% | 1,176 | 1,804 | +53% | 0 | 0 | — |
case-09 | fail→pass | 9,108 | 2,788 | -69% | 1 | 1 | 0% | 1,371 | 1,853 | +35% | 0 | 0 | — |
case-10 | fail→pass | 9,297 | 1,770 | -81% | 1 | 1 | 0% | 1,427 | 1,756 | +23% | 0 | 0 | — |
case-11 | fail→pass | 8,808 | 2,173 | -75% | 1 | 1 | 0% | 1,320 | 1,786 | +35% | 0 | 0 | — |
case-12 | pass→pass | 7,406 | 1,926 | -74% | 1 | 1 | 0% | 1,031 | 1,726 | +67% | 0 | 0 | — |
case-13 | fail→pass | 11,077 | 2,645 | -76% | 1 | 1 | 0% | 1,729 | 1,826 | +6% | 0 | 0 | — |
case-14 | fail→pass | 6,879 | 1,722 | -75% | 1 | 1 | 0% | 988 | 1,644 | +66% | 0 | 0 | — |
case-15 | fail→pass | 15,081 | 2,996 | -80% | 1 | 1 | 0% | 2,056 | 1,876 | -9% | 0 | 0 | — |
case-16 | pass→pass | 13,485 | 3,014 | -78% | 1 | 1 | 0% | 2,035 | 1,914 | -6% | 0 | 0 | — |
case-17 | fail→pass | 16,743 | 5,706 | -66% | 1 | 1 | 0% | 2,600 | 2,477 | -5% | 0 | 0 | — |
case-18 | fail→pass | 14,307 | 3,199 | -78% | 1 | 1 | 0% | 2,294 | 1,910 | -17% | 0 | 0 | — |
case-19 | fail→pass | 10,748 | 3,040 | -72% | 1 | 1 | 0% | 1,631 | 1,866 | +14% | 0 | 0 | — |
case-21 | pass→fail | 11,596 | 14,338 | +24% | 1 | 1 | 0% | 1,945 | 2,177 | +12% | 0 | 0 | — |
case-22 | fail→fail | 9,611 | 8,470 | -12% | 1 | 1 | 0% | 1,616 | 3,073 | +90% | 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. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 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 +45 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is 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.