Create, navigate, and edit Obsidian footnotes all from the keyboard:

The plugin adds its commands without hotkeys, so assign your own right after installing by going to:
Settings → Hotkeys → search for "Footnote Shortcut" → click the ⨁ next to a command → press your preferred keys
Of the plugin's 7 commands, the ones you'll press constantly should have hotkeys. I personally use:
| Command | Recommended hotkey |
|---|---|
| Insert / navigate numbered footnote | Alt+0 |
| Insert / navigate named footnote | Alt+- |
| Insert inline footnote | Alt+= |
| Insert inline footnote from clipboard | Alt+Shift+= |

The other 3 (Lint footnotes, Rename footnote, and Set footnote prefix) come up less often, so running them from the command palette works fine. Give them hotkeys too if they become part of your routine.
Everything also works on mobile from the toolbar, each with their own unique toolbar icons.
Put your cursor where the footnote belongs and press the hotkey. The plugin finds the next free number, inserts the reference (say [^1]), creates the matching [^1]: definition at the bottom of the note, and lets you type the definition text immediately.
Footnotes are never created inside code, math, comments, frontmatter, or another footnote's definition, where they would be invalid. The plugin refuses in those locations and alerts you.

Named footnotes (like [^smith2024]) take 2 quick presses:
[^] with your cursor between the brackets. Type the name.[^smith2024]: line and lets you write the definition text.Names can hold almost anything ([^smith2024], [^arXiv:1234.5678], [^注]). The exceptions are spaces, backticks, brackets, and #, which Obsidian can't render or find. The plugin refuses those invalid characters and alerts you.

2 commands cover Obsidian's inline ^[...] style:
^[] with your cursor inside, ready to type. Press the hotkey again when you're done and the cursor hops out past the closing bracket, so you never need the arrow keys.^[...] in one press. Multi-line clipboard text is flattened to one line, and anything that would break the footnote (e.g. stray brackets) is escaped automatically.
Footnotes work in table cells too: the reference goes into the cell and the definition lands below the table. Undoing a footnote made from a cell can take 2 undos, because the cell and the note are separate editors. A notice tells you when the first undo has only removed the definition, and whether a second undo removes the reference too.
Sometimes you write something mid-sentence and realize it should be a footnote. Select it and press a footnote hotkey:
[^yourname]. Confirm with Enter, the Create button, or just press any footnote hotkey again.^[...] right where it is. It accepts single-line selections only, as only those format correctly. For a multi-line selection, it points you to the previous 2.
Multiple cursors (Alt+click) get the same footnote at every one of them, handy when one source is cited in several places:
[^N] at every cursor, sharing a single definition.If any cursor sits where a footnote can't go, nothing is inserted anywhere. Every multi-cursor insertion ends with a single cursor after the first reference.

The insert hotkeys double as navigation. What they do depends on where your cursor is:
[^3] in your text): open its definition in a popup right at your cursor (or by jumping to the definition, when the footnote popup is off).[^3]: … line): jump back to where its reference is used in your text.One hotkey takes you back and forth between a reference and its note.

Put your cursor on any reference or definition and run Rename footnote. It works like renaming a variable in a code editor: every reference and the definition get the new name in one step. It's also in the right-click menu when you click on a footnote, just like Obsidian's own rename for headings. Names are case-insensitive, so [^Note] and [^note] count as the same footnote. The command refuses names that are already taken and names a footnote can't have, and under a per-note prefix the new name gets the prefix added for you.

Creating or visiting a footnote opens its definition text in a small editor right at your cursor, so you never lose your place in the note. Close it with the same hotkey, Escape, or by clicking anywhere outside. Switching to Reading view closes it too. If a footnote has more than one definition, the hotkey jumps to the last definition instead (the one Reading View renders) so you can sort it out (or let the linter merge them). If you prefer the classic jump-to-the-bottom behavior, turn off Edit footnotes in a popup in the settings.
Writing and revising can leave footnotes messy. The Lint footnotes command cleans up the whole note in one pass:
word[^1]. becomes word.[^1], and "quote[^1]". becomes "quote".[^1]), the placement every major style guide recommends.[^1]: line typed directly under a paragraph is plain text to Obsidian, and its footnote never shows. The linter inserts the blank line it needs (or, with the rule off, alerts you about it).1, 2, 3… in the order they appear and reorders their definitions to match. Named footnotes keep their names (or get numbers too, if you enable Renumber named footnotes).
Each rule can be toggled individually in Settings → Footnote Shortcut → Linting, along with 2 automatic triggers (both off by default):
:w works too).The linter also watches for problems it can't fix by itself and tells you about them, naming every footnote involved:
[^] reference you never named, references with no definition or definitions nothing uses (while delete orphaned references/definitions are off)#)If you're writing a book via chapter notes (e.g. when using the Longform or Easy Bake plugins), plain numbering collides when you merge the chapters back together: every chapter has its own [^1], so Obsidian confuses footnotes from chapter 1 with those from every other chapter.
To fix this, turn on Per-note footnote prefix and give each chapter its own unique prefix, so footnotes stay unique across the whole book:
2- for chapter 2 (this saves a footnote-prefix property in the note).[^2-1], [^2-2], … and the named command starts new references with the prefix ([^2-]) filled in.[^2-x] footnotes within their own namespace, and can also convert a note's existing plain footnotes to carry the prefix (Apply the note's footnote prefix, on by default).Notes without the property keep normal [^1], [^2], … numbering. A prefix follows the same rules as a footnote name and can't end in a digit, as then [^2-1] and [^21] would be indistinguishable.

# Footnotes) above your footnote definitions. The heading text is fully customizable, can span multiple lines, and if it already exists in the note it's reused instead of duplicated.This plugin is based on the great idea by jacob.4ristotle posted in the "Footnote Shortcut" thread:
Use case or problem:
I use Obsidian to take school notes, write essays and so on, and I find myself needing to add frequent footnotes. Currently, to add a new footnote, I need to:
- scroll to the bottom to check how many footnotes I already have
- type [^n] in the body of the note, where n is the next number
- move to the end of the note, type [^n] again, and then add my citation.
Created by Alexis Rondeau and Micha Brugger, maintained and expanded by Jason Qin.
npm install, then npm run build (type-checks with tsc and bundles with esbuild). npm run dev watches for changes.npm test runs the Vitest unit suite in test/; behavioral policies (reindexing rules, reference parsing, edge cases) are pinned there, and the fast-check property tests fuzz both the linter and the insert commands over randomly generated documents, including a differential oracle that re-parses every document with micromark before and after linting. manual-tests/ contains scripted in-app scenarios, and scripts/smoke-test.mjs drives a live Obsidian instance.npm run lint (ESLint with the Obsidian plugin guidelines plus typescript-eslint's strict-type-checked) and npm run knip (dead exports and unused files/dependencies, kept at zero findings).npm run mutation runs Stryker locally as a pre-release audit (incremental cache makes re-runs fast). Not wired into CI on purpose.src/main.ts registers commands and settings; the command cascade and creation steps live in src/commands/, the shared markdown scanner and footnote grammar in src/parsing/, editor and caret utilities in src/editor/, and the linter with its pure rules in src/linting/.