When you manage notes in Obsidian, renaming or deleting notes can leave broken links behind. In this post, I’ll show you how to detect them automatically using lychee, a fast link checker written in Rust.
What is lychee?
lychee is a fast link checker written in Rust.
Highlights:
- Fast checks thanks to async processing
- Native support for Markdown files
- The
--offlineoption lets you check only local links - Easy to plug into GitHub Actions
Prerequisite: Obsidian link formats
There’s an important caveat to be aware of with lychee. Obsidian’s default wiki-link format [[note]] is not supported. To check links with lychee, you need to use standard Markdown link syntax.
If you set Obsidian’s “New link format” option to “Relative path”, new links will be created in the standard format automatically.

| Format | Example | lychee support |
|---|---|---|
| Wiki link | [[note]] | ❌ Not supported |
| Standard Markdown | [note](./note.md) | ✅ Supported |
To convert existing wiki links, plugins like obsidian-link-converter come in handy.
Installation
macOS (Homebrew)
brew install lycheeLinux
curl -sSfL https://github.com/lycheeverse/lychee/releases/latest/download/lychee-x86_64-unknown-linux-gnu.tar.gz | tar xzf - -C /usr/local/binBasic usage
To check the internal links in an Obsidian vault, use the --offline option:
lychee --offline vault/Sample output
When broken links exist, you’ll see output like this:

When all links are healthy:

How to write standard Markdown links
Using relative paths lets lychee detect broken links accurately.
[関連ノート](../03_PermanentNotes/related-note.md)Tips:
- Use relative paths (
../folder/file.md) - Avoid URL encoding (
%20, etc.)
Excluding files
In practice, there will always be files or directories you want to exclude from the check.
Excluding from the command line
# Exclude a specific pathlychee --offline --exclude-path "vault/99_Archive" vault/
# Exclude multiple pathslychee --offline \ --exclude-path "vault/99_Archive" \ --exclude-path "vault/.obsidian" \ vault/Excluding via .lycheeignore
You can create a .lycheeignore file at the project root and list exclusion patterns there:
# Exclude archivevault/99_Archive/
# Exclude templatesvault/98_Templates/
# Exclude files matching a pattern**/draft-*.mdManaging settings with lychee.toml
Keeping your settings in a config file is convenient:
exclude_path = [ "vault/99_Archive", "vault/.obsidian"]
# Timeout (for external URL checks)timeout = 10
# Concurrencymax_concurrency = 32You can point to the config file when running the command.
lychee --offline --config lychee.toml vault/Auto-check with a pre-commit hook
To run a link check automatically on commit, set up pre-commit.
.pre-commit-config.YAML
repos: - repo: local hooks: - id: lychee-link-checker name: Check links with lychee entry: lychee --offline --config lychee.toml vault/ language: system files: '\.md' pass_filenames: falseInstalling and enabling pre-commit
pip install pre-commitpre-commit installNow the link check runs automatically on every commit, and the commit will be aborted if any broken links are found.
Continuous checking with GitHub Actions
Running the link check in CI catches problems before a PR is merged.
.GitHub/workflows/ci.yml
name: CI
on: push: branches: [main] pull_request: branches: [main]
jobs: link-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Install lychee run: | curl -sSfL https://GitHub.com/lycheeverse/lychee/releases/latest/download/lychee-x86_64-unknown-linux-gnu.tar.gz | tar xzf - -C /usr/local/bin
- name: Run link checker run: lychee --offline --config lychee.toml vault/Running from a Makefile
It’s handy to wrap commands you use often in a Makefile:
VAULT_PATH := vault
.PHONY: check-linkscheck-links: ## Check for broken links using lychee lychee --offline --config lychee.toml $(VAULT_PATH)/make check-linksWrapping up
With lychee, you can check an Obsidian vault for broken links quickly and automatically.
| Scenario | Command |
|---|---|
| Manual local check | lychee --offline vault/ |
| At commit time | Automatic check via a pre-commit hook |
| CI | Continuous checks via GitHub Actions |
One thing to keep in mind: lychee only supports standard Markdown links. If you’re using wiki links [[note]], you’ll need to convert them to the standard format first.
Keep your knowledge base healthy and free of broken links.