Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ievertan00 avatar

Wiki Ingest

  • 1 installs
  • 2 repo stars
  • Updated July 19, 2026
  • ievertan00/nanowiki

Ingests a source document or URL into an Obsidian wiki, writing a literature note and fanning out updates to existing notes it touches.

About

Ingests a local file or URL into an Obsidian wiki, extracting a summary into a literature note and applying targeted additions to existing notes while preserving human-authored insight. A developer uses it to process a paper, article, or video into their vault and update related notes.

  • Ingests a file or URL (YouTube becomes a transcript) into a literature note
  • Fans out targeted additions to existing notes, preserving Human Insight

Wiki Ingest by the numbers

  • 1 all-time installs (skills.sh)
  • Ranked #1,361 of 1,879 Documentation skills by installs in the Skillselion catalog
  • Data as of Jul 20, 2026 (Skillselion catalog sync)
npx skills add https://github.com/ievertan00/nanowiki --skill wiki-ingest

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1
repo stars2
Last updatedJuly 19, 2026
Repositoryievertan00/nanowiki

What it does

Ingests a source document or URL into an Obsidian wiki, writing a literature note and fanning out updates to existing notes it touches.

Files

SKILL.mdMarkdownGitHub ↗

wiki-ingest

Process a source document: one literature note plus fan-out updates to existing notes. Two-pass shape (extract, then format + apply). You are the LLM.

Bundled files

This skill ships note-schema.md and wiki-maintain.mjs in its own directory. Determine that directory once — written <SKILL_DIR> below — and substitute its real absolute path into every Read and node call (never hardcode a username, .claude, or drive letter). <SKILL_DIR> is the folder this SKILL.md was loaded from; if you don't already know it, find it with Glob **/wiki-ingest/wiki-maintain.mjs (skills live under the host CLI's skills directory, e.g. ~/.claude/skills/ for Claude Code).

Then read <SKILL_DIR>\note-schema.md first — vault resolution, language rules, frontmatter, body skeleton, slug rule, and invariants. Everything below assumes it.

Steps

1. Resolve the vault path and output language. The vault is the directory where the CLI was started (the current working directory) unless --vault overrides it — see note-schema.md. Parse --lang, -p/--persona, -s/--structure, --vault; the remainder is the file argument. Normalize it: strip a leading @ (the file-reference marker CLIs like Claude Code prepend) and any surrounding quotes.

If the argument is an http(s) URL (matches ^https?://), fetch it instead of resolving a file:

  • Fetch the URL with your web-fetch tool and reduce it to clean markdown — the main

readable content only, dropping nav/ads/boilerplate. For a YouTube URL (youtube.com/youtu.be/m.youtube.com), capture the video transcript rather than the page chrome.

  • One fetch attempt only. If the fetch returns readable article prose, use it. If

it returns no usable readable content — a JS-rendered SPA, a login/paywall, raw serialized app state (React/JSON blobs), or near-empty text — stop and report that the URL could not be reduced to readable text, and tell the user to save the content to a local file and ingest that instead. Do not write scraper scripts, re-parse, or re-read fetched dumps in a loop — there is no second extraction path.

  • Compute a slug from the page title (the same slug rule used for notes) and write the

markdown to <vault>\sources\<slug>.md with this frontmatter, then a blank line, then the content:

     ---
     title: <page title>
     url: <the url>
     type: <web | video-transcript>
     fetched: <YYYY-MM-DD>
     ---
  • Set sourceTitle = the page title, sourceFile = <slug>.md (the file you just

wrote), and use the fetched markdown as the source content. Skip the file-resolution rules below and continue at step 2.

Otherwise resolve it to a real file:

  • Bare filename — no / or \ (e.g. paper.md) → <vault>\sources\<name>.
  • Otherwise — a path (e.g. from @C:\docs\paper.md, @sources/paper.md, or

./drafts/x.md) → treat as a literal path (relative to cwd or absolute); if it doesn't exist there, also try <vault>\sources\<name>.

Error if nothing resolves. Set sourceTitle = the resolved file's basename without extension.

Pin the source inside the vault. A note can only link to a source that lives in sources/. If the resolved file is not already inside <vault>\sources\, copy it there now — slugify its basename (same slug rule) and keep the original extension: Copy-Item "<resolved path>" "<vault>\sources\<slug><ext>". Set sourceFile = the basename with extension of the file in sources/ (e.g. paper.pdf, My-Notes.md).

2. Gather context. List notes/ basenames (existing-notes list) and read the domains taxonomy from wiki-config.json.

If -p/--persona <name> or -s/--structure <name> was given, read <vault>\templates\personas\<name>.md / <vault>\templates\structures\<name>.md. Error if a named file doesn't exist (Persona not found: <name> (looked in <vault>\templates\personas\<name>.md), same wording for structures). These are user-maintained, vault-local templates — empty templates/personas/ and templates/structures/ dirs already exist in every vault.

3. Pass 1 — Extract. Read the whole source with your Read tool:

  • PDF (.pdf): Read extracts the text directly. If the PDF has more than 20

pages, read it in page-range chunks (pages: "1-20", "21-40", ...) and concatenate the results before extracting.

  • Image (.png, .jpg, etc.): Read renders the image for you to view —

transcribe its visible content (text, diagrams, charts, labels) and use that transcription as the source content.

  • Everything else: Read returns the file's text content directly.

Then produce, conceptually:

   {
     "summary": "thorough summary of the source's key facts, arguments, insights",
     "updates": [
       { "note": "<exact existing-note title, copied VERBATIM>", "addition": "<one focused paragraph of genuinely new information for that note>" }
     ]
   }
  • Every note MUST be a title copied verbatim from the existing-notes list — never

translate it, never invent one. If no existing note needs updating, updates is empty.

  • Each addition is one focused paragraph of genuinely new information (in the

resolved language).

  • If a persona template was loaded, let its text shape the voice/framing of

summary. If a structure template was loaded, treat its text as a checklist of aspects the source may cover — extract information about them where the source addresses them, so they aren't neglected in summary. Both are pass-1 only: pass 2 below just reshapes whatever summary contains.

4. Pass 2 — Literature note. Format summary into the note schema as a literature note: type: literature. Set source: to a quoted wikilink to sourceFile (the source in sources/) — keep the extension for non-markdown files so Obsidian can resolve them, drop only a .md extension: source: "[[paper.pdf]]" for a PDF, source: "[[My-Notes]]" for My-Notes.md. Assign domain/topic against the taxonomy. Link only to existing notes. Compute the slug from the note title (fall back to sourceTitle) and write notes/<slug>.md.

5. Apply updates. For each { note, addition }:

  • Compute the target path with the slug rule: notes/<slug-of-note>.md.
  • If the file does not exist, skip it (report it as skipped — never create it).
  • Else read it, capture its ## Human Insight body, integrate the addition

naturally into the most appropriate existing section (Source Facts, Synthesis, or Connections), preserving all existing content, bump updated: to today, restore the Human Insight body verbatim, and write it back.

  • Append ^[<source-file-basename-without-extension>] to every bullet you add to

Source Facts — the citation marker tying the fact to the file in sources/ — and copy every existing ^[...] marker verbatim (see note-schema.md invariants).

6. Regenerate derived files:

   node "<SKILL_DIR>\wiki-maintain.mjs" "<vaultPath>" --op ingest --title "<sourceTitle>"

7. Report: the literature note path, the count of notes updated, and the list of any skipped (not-found) targets.

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.