Jiangnan Ye30 downloadsReplace pasted paper URLs (arXiv, OpenReview, ACL Anthology, …) with [Title (Venue Year)](url) links.
An Obsidian plugin that automatically replaces pasted academic paper URLs with readable, titled markdown links, just when you press ctrl+v/command+v!
Paste https://arxiv.org/abs/1706.03762 into a note and it becomes:
The paste itself is never delayed — the URL lands instantly, and the titled link is swapped in as soon as the metadata arrives (usually well under a second).
| Source | How | Venue shown |
|---|---|---|
| arXiv | official arXiv API | arXiv + year |
| ACL Anthology | page citation metadata | short venue from the anthology ID (ACL, NAACL, EMNLP, Findings of ACL, …) + year |
| OpenReview | OpenReview API | see limitation below |
| Anything else | Google Scholar citation_* meta tags (works for NeurIPS proceedings, PMLR, IEEE, ACM, Semantic Scholar, …) |
venue + year when present |
Non-paper URLs are never touched: if a page has no citation metadata, the URL is simply left as you pasted it.
On paste — copy a paper URL and paste it into a note. It converts automatically. Only fires when the clipboard is exactly one URL; pasting prose containing URLs does nothing.
Existing notes — run the command "Paper Link: Convert paper URLs in current note" from the command palette. It converts every bare paper URL in the active note, skipping URLs that are already links, in frontmatter, or inside code blocks, and reports a summary when done.
[Title (Venue Year)](url), degrading gracefully when metadata is missing: [Title (Venue)], [Title (Year)], or just [Title]. If the venue already contains the year (e.g. ICLR 2024), the year isn't repeated.
OpenReview fronts its API with a Cloudflare Turnstile challenge that blocks all non-interactive clients, including Obsidian's request layer. OpenReview URLs therefore currently stay as raw URLs, with a notice explaining why. The resolver is implemented and will start working automatically if OpenReview relaxes the block.
[text]( link are left alone.arXiv's API asks clients to leave ~3 seconds between requests. The plugin serializes its arXiv calls to respect this, retries a throttled request a few times with exponential backoff, and — if it's still throttled — leaves the URL raw and tells you to try again rather than failing silently. Converting a note with many arXiv links is therefore paced deliberately (a few seconds per link).
From the community directory (once accepted): Settings → Community plugins → Browse → "Paper Link".
Manual: copy main.js and manifest.json from the latest release into <vault>/.obsidian/plugins/paper-link/, then enable the plugin in Settings → Community plugins.
npm install
npm test # unit + live network tests (node)
npm run build # typecheck + bundle to main.js
npm run dev # watch mode
All metadata resolution lives in src/resolvers.ts as pure logic with the HTTP function injected, so it runs under plain node for tests. src/main.ts is the thin Obsidian layer. Adding a new source is a small resolver object plus a test.