No description
  • Lua 99.1%
  • Python 0.4%
  • Makefile 0.4%
Find a file
zizhou teng (n451) 2a8af7bd14
Some checks are pending
Docs / Generate Docs (push) Waiting to run
Linting / Lint (push) Waiting to run
Linting / Style (push) Waiting to run
Main / Release (push) Waiting to run
Tests / Run tests (push) Waiting to run
Tests / Run tests-1 (push) Waiting to run
Tests / Run tests-2 (push) Waiting to run
Tests / Run tests-3 (push) Waiting to run
Tests / Run tests-4 (push) Waiting to run
chore(release): bump version to v3.16.4 for release
2026-06-03 01:12:30 +01:00
.github ci: avoid duplicate test runs 2026-04-18 14:08:24 +01:00
after/syntax fix: move the fold options back to init autocmds 2025-08-10 21:18:09 +08:00
data fix: regress to have title field and add add a default note.template (#663) 2026-01-30 01:11:52 +08:00
doc chore(docs): auto generate docs 2026-05-27 22:53:53 +00:00
docs chore(docs): auto generate docs 2026-06-02 15:05:07 +00:00
lua/obsidian chore(release): bump version to v3.16.4 for release 2026-06-03 01:12:30 +01:00
plugin Cmd2 (#709) 2026-02-19 06:52:10 +08:00
scripts test: proper async test and clean log in outputs (#856) 2026-05-28 06:16:41 +08:00
selene CI: use selene and typos in Makefile and CI (#431) 2025-09-25 21:59:24 +08:00
tests feat(sync): supports end-to-end encryption password (#860) 2026-06-01 14:12:00 +01:00
.all-contributorsrc docs: add snapwich as a contributor for code (#858) 2026-05-29 22:45:15 +08:00
.emmyrc.json chore: type fixes from emmylua (#734) 2026-03-08 08:25:52 +08:00
.gitignore chore(release): bump version to v3.15.10 for release 2026-02-18 23:02:42 +00:00
.luarc.json fix: pass label to new note completion (#612) 2026-01-03 00:05:15 +08:00
.stylua.toml Add tests (#2) 2022-08-03 14:28:38 -07:00
_typos.toml feat(lib): moment.lua (#681) 2026-02-06 02:44:51 +08:00
CHANGELOG.md chore(release): bump version to v3.16.4 for release 2026-06-03 01:12:30 +01:00
CONTRIBUTING.md test: proper async test and clean log in outputs (#856) 2026-05-28 06:16:41 +08:00
LICENSE Create LICENSE 2022-07-31 11:02:29 -07:00
Makefile test: use --clean flag to run tests 2026-05-29 15:46:36 +01:00
minimal.lua feat: LSP completion (#757) 2026-05-25 01:34:09 +08:00
README.md docs: add snapwich as a contributor for code (#858) 2026-05-29 22:45:15 +08:00

obsidian.nvim


A community fork of epwalsh/obsidian.nvim, neovim plugin for Obsidian vaults.

Built for people who love the concept of Obsidian -- a simple, markdown-based notes app -- but love Neovim too much to stand typing characters into anything else.

This plugin is not meant to replace Obsidian, but to complement it. The Obsidian app comes with a mobile app and has a lot of functionality that's not feasible to implement in Neovim, such as the graph explorer view. That said, this plugin stands on its own as well. You don't necessarily need to use it alongside the Obsidian app.

🍴 About the fork

The original project has not been actively maintained for quite a while and with bugs, issues and pull requests piling up, people from the community decided to fork and maintain the project.

  • Discussions are happening in GitHub Discussions
  • Sponsor the project at Open Collective
  • To migrate from original repo or older releases, see Breaking changes
  • See the documentation:
    • obsidian.nvim wiki for documentation of the latest release.
    • :Obsidian help or :Obsidian helpgrep for documentation update to date with your current installation.
    • :h obsidian-api for API reference.

Features

▶️ Completion: Ultra-fast, asynchronous autocompletion for note references and tags via in-process LSP (triggered by typing [[ for wiki and markdown links, # for tags)

🏃 Navigation: Navigate throughout your vault via links, backlinks, tags and etc.

📷 Images: Paste images into notes.

📈 Status: See note status in footer like obsidian app.

🔄 Sync: Sync support for Obsidian Sync.

Keymaps

  • smart_action, bind to <CR> will:
    • If cursor is on a link, follow the link.
    • If cursor is on a tag, show all notes with that tag in a picker.
    • If cursor is on a checkbox, toggle the checkbox, see Checkbox.create_new.
    • If cursor is on a heading, cycle the fold of that heading, see Folding to set this up.
  • nav_link, bind to [o and ]o will navigate cursor to next valid link in the buffer.

For other available actions and remapping default ones, see Keymaps

Commands

There's one entry point user command for this plugin: Obsidian

  • Obsidian<CR> (<enter>) to select sub commands.
  • Obsidian <Tab> to get completion for sub commands.
  • Sub commands are context sensitive, meaning some actions will only appear when:
    • you are in a note.
    • you are in visual mode.
  • See Commands for more info.

Warning

Note subcommands related to refactoring, like rename and template And all the visual mode commands, will be moved to code actions in 3.17.0.

Top level commands

  • :Obsidian check - check for common issues in your vault and plugin setup
  • :Obsidian dailies [OFFSET ...] - open a picker list of daily notes
    • :Obsidian dailies -2 1 to list daily notes from 2 days ago until tomorrow
  • :Obsidian help - find files in the help wiki
  • :Obsidian helpgrep - grep files in the help wiki
  • :Obsidian new [TITLE] - create a new note
  • :Obsidian open [QUERY] - open a note in the Obsidian app
    • query is used to resolve the note to open by ID, path, or alias, else use current note
  • :Obsidian today [OFFSET_OR_DATE] - open/create a new daily note
    • offset is in days, e.g. use :Obsidian today -1 to go to yesterday's note.
    • you can also give an argument like 3-1/2026-3-1, it will parse common date formats and open daily for that specific date.
    • Unlike :Obsidian yesterday and :Obsidian tomorrow this command does not differentiate between weekdays and weekends
  • :Obsidian tomorrow - open/create the daily note for the next working day
  • :Obsidian yesterday - open/create the daily note for the previous working day
  • :Obsidian new_from_template [TITLE] [TEMPLATE] - create a new note with TITLE from a template with the name TEMPLATE
    • both arguments are optional. If not given, the template will be selected from a list using your preferred picker
  • :Obsidian quick_switch - switch to another note in your vault, searching by its name with a picker
  • :Obsidian search [QUERY] - search for (or create) notes in your vault using ripgrep with your preferred picker
  • :Obsidian sync [SUBCMD] - use obsidian-headless to access official obsidian sync service. Default off, enable with opts.sync.enabled = true, for more see Sync.
  • :Obsidian tags [TAG ...] - get a picker list of all occurrences of the given tags
  • :Obsidian unique_note [TITLE] - create a new note with a unique, timestamp-based ID
  • :Obsidian workspace [NAME] - switch to another workspace

Note commands

  • :Obsidian backlinks - get a picker list of references to the current note
    • grr/vim.lsp.buf.references to see references in quickfix list
  • :Obsidian follow_link [STRATEGY] - follow a note reference under the cursor
    • available strategies: vsplit, hsplit, vsplit_force, hsplit_force
    • If the link does not exist, you will be prompted to create it. If you choose to create it, the link in the buffer will be automatically updated with the new note's ID and alias.
  • :Obsidian toc - get a picker list of table of contents for current note
  • :Obsidian template [NAME] - insert a template from the templates folder, selecting from a list using your preferred picker
  • :Obsidian links - get a picker list of all links in current note
  • :Obsidian paste_img [IMGNAME] - paste an image from the clipboard into the note at the cursor position by saving it to the vault and adding a markdown image link
  • :Obsidian rename [NEWNAME] - rename the note of the current buffer or reference under the cursor, updating all backlinks across the vault
    • runs :wa before renaming, and loads every note with backlinks into your buffer-list
    • after renaming you need to do :wa again for changes to take effect
    • alternatively, call vim.lsp.buf.rename or use grn
  • :Obsidian toggle_checkbox - cycle through checkbox options

Visual mode commands

  • :Obsidian extract_note [TITLE] - extract the visually selected text into a new note and link to it
  • :Obsidian link [QUERY] - link an inline visual selection of text to a note
    • query will be used to resolve the note by ID, path, or alias, else query is selected text
  • :Obsidian link_new [TITLE] - create a new note and link it to an inline visual selection of text
    • if title is not given, selected text is used

LSP code actions

  • Use gra or :=vim.lsp.buf.code_action() to trigger note specific actions.
  • See LSP code actions and Actions for more info.

📝 Requirements

System requirements

  • Neovim >= 0.10.0
  • For completion and search features: ripgrep
  • Additional system dependencies:
    • Windows WSL users need wsl-open for :Obsidian open.
    • MacOS users need pngpaste (brew install pngpaste) for :Obsidian paste_img.
    • Linux users need xclip (X11) or wl-clipboard (Wayland) for :Obsidian paste_img.

Plugin dependencies

There's no required dependency, but there are a number of optional dependencies that enhance the obsidian.nvim experience.

To use a specific picker, set picker.name in your config, e.g.:

require("obsidian").setup {
  picker = {
    name = "snacks.picker", -- use snacks picker
    -- name = "telescope.nvim",   -- or telescope
    -- name = "fzf-lua",     -- or fzf-lua
    -- name = "mini.pick",   -- or mini.pick
  },
}

📥 Installation

Warning

For stability you may want to use latest release, be aware that the README on main may reference features that haven't been released yet.

So view the README on the tag for the latest release instead of main.

Tip

To see your installation status, run :checkhealth obsidian

To try out or debug this plugin, run nvim -u minimal.lua to try in a clean environment

Using lazy.nvim

return {
  "obsidian-nvim/obsidian.nvim",
  version = "*", -- use latest release, remove to use latest commit
  ---@module 'obsidian'
  ---@type obsidian.config
  opts = {
    legacy_commands = false, -- this will be removed in 4.0.0
    workspaces = {
      {
        name = "personal",
        path = "~/vaults/personal",
      },
      {
        name = "work",
        path = "~/vaults/work",
      },
    },
  },
}

Using rocks.nvim

:Rocks install obsidian.nvim

Using vim.pack (nvim-0.12+)

vim.pack.add {
  {
    src = "https://github.com/obsidian-nvim/obsidian.nvim",
    version = vim.version.range "*", -- use latest release, remove to use latest commit
  },
}

require("obsidian").setup {
  legacy_commands = false, -- this will be removed in 4.0.0
  workspaces = {
    {
      name = "personal",
      path = "~/vaults/personal",
    },
    {
      name = "work",
      path = "~/vaults/work",
    },
  },
}

⚙️ Configuration

To configure obsidian.nvim, pass your custom options that are different from default options to require"obsidian".setup().

🤝 Contributing

Please read the CONTRIBUTING guide before submitting a pull request.

neo451
neo451

💻
Stefan Otte
Stefan Otte

💻
guspix
guspix

💻
ffricken
ffricken

💻
Erlan Rangel
Erlan Rangel

💻
bosvik
bosvik

💻
Jost Alemann
Jost Alemann

📖
Luis Garcia
Luis Garcia

💻
Joe
Joe

💻
Horia Gug
Horia Gug

💻
Aquiles Gomez
Aquiles Gomez

💻
Alvaro Sevilla
Alvaro Sevilla

💻
Sebastian Stark
Sebastian Stark

💻
Jumpei Yamakawa
Jumpei Yamakawa

💻
marcocofano
marcocofano

💻
Jaehaks
Jaehaks

💻
Magnus
Magnus

💻
Noam Stolero
Noam Stolero

💻
aileot
aileot

💻
Rico Sta. Cruz
Rico Sta. Cruz

📖
KIM Hyunjae
KIM Hyunjae

💻
Ben Burgess
Ben Burgess

💻
Sebastian Szyller
Sebastian Szyller

💻
nobe4
nobe4

💻
Anaritus
Anaritus

💻
Michael Davis
Michael Davis

💻
Brian Rodriguez
Brian Rodriguez

💻
carschandler
carschandler

📖
Aki Sasaki
Aki Sasaki

💻
Reinaldo Molina
Reinaldo Molina

💻
Stuart Rackham
Stuart Rackham

💻
Ahmed Mughal
Ahmed Mughal

💻
trash-panda-v91-beta
trash-panda-v91-beta

💻
Jakob Westhoff
Jakob Westhoff

💻
Christian Johansen
Christian Johansen

💻
Volodymyr Kot
Volodymyr Kot

💻
Jorge Villalobos
Jorge Villalobos

💻
Tak
Tak

💻
Emilio Marin
Emilio Marin

💻
Vladimir Gusev
Vladimir Gusev

💻
FirelightFlagboy
FirelightFlagboy

💻
Cameron Ring
Cameron Ring

💻
Miklós Balázs
Miklós Balázs

💻
Clément Vannicatte
Clément Vannicatte

📖
Anatoliy
Anatoliy

💻
acidsugarx
acidsugarx

💻
João Sampaio
João Sampaio

💻
Sundar Gurumurthy
Sundar Gurumurthy

💻
apalermo01
apalermo01

💻
S1RENS
S1RENS

💻
CaeChao
CaeChao

💻
Kahlil Hodgson
Kahlil Hodgson

💻
Frederik Roland Christiansen
Frederik Roland Christiansen

💻
Lucky Laughing
Lucky Laughing

💻
Jorg Jenni
Jorg Jenni

💻
zzhirong
zzhirong

💻
Franco Ruggeri
Franco Ruggeri

💻
John T. Kelly
John T. Kelly

💻
antinomie8
antinomie8

💻
Todd
Todd

📖
beekeepeer
beekeepeer

💻
tdashelby-cmyk
tdashelby-cmyk

📖
Giovanni Smith-Alvarez
Giovanni Smith-Alvarez

💻
Christo
Christo

💻
Rich Snapp
Rich Snapp

💻

❤️ Acknowledgement

We would like to thank epwalsh for creating this beautiful plugin. If you're feeling especially generous, he still appreciates some coffee funds!.