How to collect inline links into clean reference-style footnotes
- Step 1Open the Footnote Linker — Go to /markdown-tools/md-footnote-linker. The tool runs entirely in your browser — your manuscript is never uploaded.
- Step 2Paste or drop your Markdown — Paste the draft, or drop a single
.mdfile. The tool accepts one document at a time (acceptsMultiple is false). - Step 3Run the transform — Click Run. There are no options to set — the conversion is a single deterministic pass over the document.
- Step 4Read the rewritten body — Every inline
[text](https://url)in prose becomes[text][n]; duplicate URLs share a number; fenced code is left as-is. - Step 5Check the reference block — Scroll to the bottom: a
[1]: url/[2]: urlblock is appended after a blank line, one entry per unique URL in first-seen order. - Step 6Copy or download the Markdown — Copy the output or download the
.md. The result is valid CommonMark — paste it straight back into your editor or Pandoc pipeline.
What the transform matches — and what it leaves alone
The collector uses one regex over prose only (fenced code is excluded). Anything not matched is preserved byte-for-byte.
| Input fragment | Matched? | Result | Why |
|---|---|---|---|
[Smith 2024](https://doi.org/10.1/abc) | Yes | [Smith 2024][1] + [1]: https://doi.org/10.1/abc | Inline link with an http(s) URL — the target of the tool. |
[see notes](http://example.org/page) | Yes | [see notes][2] + [2]: http://example.org/page | Both http:// and https:// are accepted. |
[Kant 1781](https://x.org "Critique") | Yes (title dropped) | [Kant 1781][3] + [3]: https://x.org | An optional "title" is matched but discarded — it does not appear in the reference block. |
[appendix](#appendix) | No | Left unchanged | Anchor/relative target is not http(s) — not collected. |
[chapter](./chapter-2.md) | No | Left unchanged | Relative path is not http(s). |
[mail](mailto:ed@journal.org) | No | Left unchanged | mailto: is not http(s). |
[^1] and [^1]: source text | No | Left unchanged | Real [^id] footnote syntax is not a link match — this tool does not touch it. |
[label][2] (already reference-style) | No | Left unchanged | Already a reference; only inline (url) form is collected. |
A https://x.org/y URL inside a ``` fenced block | No | Left unchanged | Fenced code is split out and skipped entirely. |
Size and file limits by plan
Markdown-family limits. Note the character limit is separate from the byte limit — a document can be under 1 MB on disk and still exceed the Free character cap.
| Plan | Max file size | Max characters | Files per run |
|---|---|---|---|
| Free | 1 MB | 500,000 | 1 |
| Pro | 10 MB | 5,000,000 | 10 |
| Pro-media | 50 MB | 20,000,000 | 50 |
| Developer | 500 MB | Unlimited | Unlimited |
Cookbook
Real before/after pairs from academic Markdown drafts. Each shows the exact body rewrite plus the appended reference block. URLs are illustrative.
A cited sentence becomes readable
The classic case: a DOI link inline in the prose. After the pass, the sentence reads cleanly and the URL lives at the bottom.
Before: The replication failed, as [Smith (2024)](https://doi.org/10.1/abc) showed. After: The replication failed, as [Smith (2024)][1] showed. [1]: https://doi.org/10.1/abc
Same source cited twice → one number
Cite the identical URL with different anchor text and both share number 1. Deduplication keys on the URL, not the text.
Before: See [Smith 2024](https://doi.org/10.1/abc) and later [the same study](https://doi.org/10.1/abc). After: See [Smith 2024][1] and later [the same study][1]. [1]: https://doi.org/10.1/abc
Link titles are dropped
A "hover title" after the URL is matched but not carried into the reference block — the block holds only the bare URL.
Before: Read [the Critique](https://x.org/kant "Critique of Pure Reason"). After: Read [the Critique][1]. [1]: https://x.org/kant
Code-block URLs are untouched
A documentation example inside a fenced block stays exactly as written — even though it looks like an inline link.
Before: ```md [example](https://api.example.org/v1) ``` Now see [the spec](https://spec.example.org). After: ```md [example](https://api.example.org/v1) ``` Now see [the spec][1]. [1]: https://spec.example.org
A document with no http(s) links is returned unchanged
If nothing matches (only anchors, relative paths, or existing footnotes), the tool returns the input byte-for-byte with no trailing block added.
Before: See [the appendix](#appendix) and [chapter 2](./ch2.md). After (identical): See [the appendix](#appendix) and [chapter 2](./ch2.md).
Edge cases and what actually happens
Output is reference-style links, not [^id] footnotes
By designDespite the name, this tool emits CommonMark reference-style notation ([text][1] ... [1]: url), which renders as a normal inline hyperlink. It does NOT produce [^1] footnotes that render as superscript numbers with a footnotes section. If you need superscript footnote rendering, write [^id] syntax by hand — this tool will leave that syntax untouched.
Existing [^id] footnotes are ignored
PreservedReal Markdown footnotes ([^1] in the body, [^1]: text definitions) are not links and are never matched. The tool neither validates nor renumbers them — it passes them through verbatim. This tool does not detect orphaned footnotes or missing definitions.
Only http:// and https:// URLs are collected
By designThe matcher requires an http:// or https:// prefix. Relative links (./file.md), in-page anchors (#section), mailto:, ftp:, and protocol-relative //host links are all skipped and left inline.
URL contains a space
Not matchedThe URL pattern stops at the first whitespace ([^)\s]+). A URL with an unencoded space ends early or fails to match, so the link is left inline. Percent-encode spaces (%20) for the link to be collected.
Anchor text contains a closing bracket
Not matchedThe text capture is [^\]]+, so a ] inside the link text (e.g. [see [note]](https://x.org)) breaks the match and the fragment is left inline. Escape or remove inner brackets first.
Link title is present
DroppedAn optional "title" after the URL is matched but intentionally discarded. The appended reference block contains only [n]: url — no title. If you relied on titles for hover text, they are removed.
Duplicate URLs across the document
DeduplicatedIdentical URLs always share one number, regardless of how many times they appear or what anchor text each uses. The reference block therefore lists each unique URL once.
No matching links found
UnchangedIf the scan finds zero http(s) inline links, the original document is returned exactly as supplied — no reference block is appended and no blank lines are added.
Document exceeds the Free character cap
RejectedA thesis-length manuscript can exceed the Free tier's 500,000-character limit even under 1 MB on disk. The character cap is enforced independently of file size; upgrade or split the document with /markdown-tools/md-splitter.
Frequently asked questions
Does this create [^1] Markdown footnotes?
No. It creates CommonMark reference-style links: [text][1] in the body and a [1]: url block at the bottom. These render as normal hyperlinks, not as superscript footnote markers. The tool name refers to collecting links into a reference list, not to [^id] footnote syntax.
Will it validate my existing footnotes or find orphans?
No. This tool does not detect orphaned footnote references, missing definitions, duplicates, or typos in [^id] IDs. It only converts inline [text](url) links into reference-style notation. Existing footnotes are passed through untouched.
Does it handle Pandoc inline footnotes like ^[text]?
No. Pandoc inline footnotes are not links and are not matched. They are preserved verbatim in the output.
Are duplicate URLs deduplicated?
Yes. If the same URL appears multiple times — even with different anchor text — every occurrence shares one reference number, and the URL is listed once in the block.
What happens to link titles?
An optional "title" after the URL is matched but dropped. The reference block contains only the bare [n]: url. If you need to keep titles, this is not the right tool.
Does it touch URLs inside code blocks?
No. Fenced ``` code blocks are split out before the transform runs, so example URLs inside them are never collected or renumbered.
Which URL schemes are collected?
Only http:// and https://. Relative paths, in-page anchors (#...), mailto:, and other schemes are left inline unchanged.
In what order are the references numbered?
Sequentially from 1, in the order each unique URL first appears in the document (reading top to bottom). The block lists them in that same order.
Is there any option to choose footnote vs. reference style, or a starting number?
No. The tool has no options at all — it is a single deterministic pass. If you want a simpler reference-link output, see /markdown-tools/md-ref-link-converter.
Is my manuscript uploaded anywhere?
No. The transform runs in your browser. Your document is processed locally and never sent to a server.
What is the difference between this and the Ref Link Converter?
Both produce reference-style links. The Ref Link Converter (/markdown-tools/md-ref-link-converter) is the simpler reference-link output and preserves titles in [n]: url 'title' form; this tool drops titles. Pick whichever output shape you need.
Can I check whether the collected URLs are reachable?
Not here. After collecting links, run the output through /markdown-tools/md-link-validator, which extracts URLs and flags malformed syntax, relative paths, and DNS failures.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.