Obsidian Link Curator

A tiny Python helper that scans your Obsidian vault and auto-links PDF wrapper notes—perfect with Binary File Manager.

What it is (in one line)

A script that scans all Markdown notes in your Obsidian vault and auto-adds links to the matching PDF wrapper notes—so your PDFs show up cleanly in search, backlinks, and graph.

The Story

Recently, as so often, I was thinking about how I could improve my Obsidian setup and took another look at my graph view. Over time, a lot of clutter had accumulated from attachments — especially linked images.

I tried disabling attachments in the graph view, but quickly realized this also removed my linked PDFs, which I still wanted to see. That led me to explore ways to have PDFs represented in the graph view. One option was to create a wrapper note for each PDF. These wrappers link back to the original file, and with the Binary File Manager plugin I could even automate their creation.

Everything seemed perfect until I used it in practice. While writing university notes, I often needed to link to a PDF. With wrapper notes, my links pointed to the wrapper instead of the PDF itself, meaning one extra click every single time. In a daily workflow with dozens of PDF references, this became a major annoyance for the sake of a prettier graph.

So I went back to linking PDFs directly but started manually adding a second link to the corresponding wrapper note, just to keep the graph view clean. As you might guess, that quickly became tedious and felt inelegant.

Then it hit me: “Hey, I can automate this!”

That’s how Obsidian Link Curator was born — a small Python script that automatically adds wrapper-note links whenever a PDF is referenced in a Markdown file. Best of all, with the Shell Commands plugin I can trigger the script directly from inside Obsidian. Since building this tool, working with PDFs has become much smoother: I get direct access when I need it, and my graph view stays meaningful without the clutter.

Why I built it

  • I store lots of PDFs in my vault.
  • With Binary File Manager, each PDF gets a wrapper note (e.g., _Wrapper Notes/Filename_PDF.md) where I can tag and annotate it.
  • I still found plain [[file.pdf]] references scattered across my notes.
    → I wanted those notes to also link the wrapper automatically, so metadata, backlinks, and the graph stay useful.

What it detects

The curator scans Markdown for Obsidian-style PDF links, including:

  • With or without page numbers:
    [[paper.pdf#page=12]]
  • With or without aliases:
    [[paper.pdf|Great paper]]
  • Plain file links:
    [[paper.pdf]]

For each match, it adds (only once) a link to the corresponding wrapper note, like:

<!-- added automatically by Link Curator -->
See also: [[_Wrapper Notes/paper_PDF]]

No duplicates. No noise.

How it fits with my Obsidian setup

  • Binary File Manager creates/maintains the wrapper notes for PDFs and other binaries, so I can:
    • tag them (e.g., #wrapper)
    • write annotations/summaries
    • keep the graph clean via tag filters
  • Link Curator ensures any note that references a PDF also references its wrapper.
  • I trigger it from Obsidian via Shell Commands (or Templater), so it’s one keystroke after I add new sources.

Example flow

  1. I drop a new PDF into my vault and let Binary File Manager create _Wrapper Notes/My_Article_PDF.md.
  2. Somewhere I reference it: [[My_Article.pdf#page=5|Results]].
  3. I run Link Curator.
  4. The script updates that note to also include: [[_Wrapper Notes/My_Article_PDF.md]]
  5. Now the wrapper gets backlinks from all related notes, and I keep using the wrapper for tags, ratings, and highlights.

Nice touches

  • Idempotent: it won’t add a second link if the wrapper is already referenced.
  • Vault-wide: scans every Markdown file so you don’t have to.
  • Page-bundle friendly: works regardless of your folder structure, as long as your wrapper naming is consistent.

Usage (brief)

I run it from Obsidian via the Shell Commands Plugin with a simple command:

python3 /full/path/to/Obsidian_Link_curator.py \
  --vault "/path/to/vault" \
  --wrapper "_Wrapper Notes"

Full installation & options live in the README.

Source

GitHub: valentinweyer/iu-oop-fp-portfolio