How to Install rumdl on Debian: A Fast Markdown Linter and Formatter Written in Rust
rumdl is a Markdown linter and formatter written in Rust. It implements the familiar markdownlint rule set (MD001 onwards), reports every problem with an exact line and column, and fixes most of them for you. Inspired by Ruff, it bundles linting, formatting, caching and a built-in Language Server into one native binary, and it does the job in a fraction of the time the Node.js tools take.
rumdl is not part of the official Debian archive. The usual ways to get it are cargo install, pip, npm or a tarball from GitHub releases, each of which drags in a toolchain you may not otherwise want, or leaves you to remember updates by hand.
The unofficial deb.griffo.io repository removes that friction: it packages rumdl as a standard Debian .deb served over APT, so installation and updates use the tooling you already run for the rest of your system.
Install the Latest rumdl on Debian: The Short Version
If you only came for the commands, this adds the repository and installs the latest rumdl .deb package on Debian:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt update
sudo apt install rumdl
The rest of this guide explains what each command does, how to verify the install, how to keep rumdl up to date, and what to check when something goes wrong.
What Makes rumdl Special?
- ⚡ Built for speed - A native Rust binary with result caching, so repeat runs only re-lint files that changed.
- 📏 markdownlint rule set - Dozens of rules covering headings, lists, whitespace, code blocks, links and images.
- 🛠️ Fixes, not just complaints -
rumdl check --fixandrumdl fmtrepair most violations in place. - 🔄 Drop-in for markdownlint users - Existing
.markdownlint.jsonor.yamlfiles are discovered automatically, or converted withrumdl import. - 🧩 Markdown flavors - Built-in awareness of GFM, MkDocs, MDX, Quarto, Pandoc, Obsidian, MyST, Hugo and more.
- 🧠 Built-in Language Server -
rumdl serverbrings diagnostics, quick fixes and formatting to any LSP-capable editor. - 🔧 TOML configuration -
.rumdl.toml,rumdl.tomlor a[tool.rumdl]section inpyproject.toml. - 🚦 CI friendly - Clear exit codes, JSON output and a ready-made pre-commit hook.
Why Use the deb.griffo.io Repository?
- Easy installation and updates through APT, no
cargo,pipornpmrequired. - No dependencies at all: the package ships the statically linked musl build of rumdl.
- Shell completions included for bash, fish and zsh, installed where your shell already looks.
- Always tracks upstream releases so you stay close to the latest rumdl.
- Works across supported Debian releases on both amd64 and arm64, with the codename detected automatically.
Prerequisites
Before you start, make sure you have:
- A Debian-based system (Bookworm 12, Trixie 13, Forky 14, or Sid)
- An amd64 or arm64 machine
sudoprivilegescurlinstalled (sudo apt install curlif needed)
The package has no runtime dependencies: the rule set, the configuration schema and the Language Server are all compiled into the one binary.
Step 1: Add the deb.griffo.io Repository
Add the signing key and repository source:
# Create the keyrings directory
sudo install -d -m 0755 /etc/apt/keyrings
# Download and install the repository GPG key
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
# Add the repository (auto-detects your distro codename)
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
# Update the package list
sudo apt update
What each command does:
- Create the keyrings directory - ensures
/etc/apt/keyringsexists with proper permissions. - Install the GPG key - downloads the repository key and de-armours it into a dedicated keyring for verification.
- Add the repository - writes a
signed-bysource line, withlsb_release -scsupplying your Debian codename. - Update the package list - refreshes APT so it knows about the new packages.
Step 2: Update the Package List
If you skipped the last line, run the update now:
sudo apt update
Step 3: Install rumdl
Install rumdl with APT:
sudo apt install rumdl
APT downloads rumdl and installs it system-wide, along with its bash, fish and zsh completions.
Step 4: Verify the Installation
The binary is simply rumdl. Confirm the version:
rumdl --version
You should see output similar to:
rumdl 0.2.73
Upstream ships no man page, so rumdl --help is the command reference, and rumdl <command> --help covers each subcommand.
Getting Started with rumdl
Linting Your First Files
Point rumdl check at a file or a directory; directories are scanned recursively and .gitignore is respected:
# Lint a single file
rumdl check README.md
# Lint every Markdown file under the current directory
rumdl check .
# Show a summary of which rules fire most often
rumdl check --statistics .
Each problem is printed as file:line:column: [rule] message, and the ones rumdl can fix on its own are marked with [*].
Fixing and Formatting
rumdl gives you two ways to repair files, which differ only in their exit codes:
# Preview the changes without touching any file
rumdl check --diff .
# Fix what can be fixed; exits 1 if anything unfixable remains
rumdl check --fix .
# Format in place; exits 0 even if unfixable violations remain
rumdl fmt .
Use check --fix in CI or hooks where leftovers should fail the run, and fmt where a formatter is expected to simply succeed. rumdl fmt also reads from stdin, which is handy from inside an editor:
cat README.md | rumdl fmt --silent - > README.formatted.md
Choosing Rules
# Skip specific rules for this run
rumdl check --disable MD013,MD033 README.md
# Run only specific rules
rumdl check --enable MD001,MD003 README.md
# List every rule, or read up on one of them
rumdl rule
rumdl explain MD013
When a single spot needs an exception, disable a rule inline instead of globally:
<!-- rumdl-disable MD013 -->
This line can be as long as it needs to be.
<!-- rumdl-enable MD013 -->
Existing markdownlint-disable comments are honoured too.
Configuring a Project
Create a starter configuration in the project root:
# Writes .rumdl.toml
rumdl init
# Or add a [tool.rumdl] section to pyproject.toml
rumdl init --pyproject
A small .rumdl.toml might look like this:
[global]
line-length = 100
exclude = ["node_modules", "dist"]
disable = ["MD033"]
flavor = "mkdocs"
[per-file-ignores]
"README.md" = ["MD033"]
[MD007]
indent = 2
rumdl searches upward from the current directory for its configuration, stopping at the repository root. To see what it actually resolved:
# Print the effective configuration, annotated with where each value came from
rumdl config
# Only the values you changed
rumdl config --no-defaults
# Which file was loaded
rumdl config file
Settings that should apply everywhere can go in ~/.config/rumdl/rumdl.toml; a project configuration always takes precedence over it.
Migrating from markdownlint
rumdl picks up .markdownlint.json, .markdownlint.jsonc, .markdownlint.yaml and .markdownlint.yml on its own, so you can compare results before changing anything. When you are ready to switch, convert the file:
# Preview the converted configuration
rumdl import --dry-run .markdownlint.json
# Write it out as .rumdl.toml
rumdl import .markdownlint.json
Editor Integration with the Language Server
rumdl server speaks LSP over stdio, so any editor with LSP support gets live diagnostics, quick fixes and formatting. In Neovim 0.11 or newer:
vim.lsp.config("rumdl", {
cmd = { "rumdl", "server" },
filetypes = { "markdown" },
root_markers = { ".git", ".rumdl.toml" },
})
vim.lsp.enable("rumdl")
In Helix, add this to ~/.config/helix/languages.toml:
[language-server.rumdl]
command = "rumdl"
args = ["server"]
[[language]]
name = "markdown"
language-servers = ["rumdl"]
The [[language]] block replaces Helix’s default servers for Markdown, so list any others you use (such as marksman) alongside rumdl. VS Code users can run rumdl vscode to install the extension.
Pre-commit and CI
rumdl exits 0 when clean, 1 when violations are found and 2 on a tool error, so a plain rumdl check . is enough for most pipelines. For pre-commit, use the official hook repository:
repos:
- repo: https://github.com/rvben/rumdl-pre-commit
rev: v0.2.73
hooks:
- id: rumdl
Add args: [--fix] under the hook if you want it to repair files rather than only report them. For tooling that needs machine-readable results, rumdl check --output-format json . prints one JSON object per issue.
Keeping rumdl Updated
Because rumdl arrived via APT, updates come with the rest of the system:
sudo apt update && sudo apt upgrade
Whenever deb.griffo.io ships a newer rumdl, apt upgrade installs it automatically. rumdl releases often, and new versions regularly add rules and fixes, so letting upgrades ride along with your normal system updates keeps your lint results consistent with upstream.
Other Tools from deb.griffo.io
The repository packages plenty of tools that fit naturally alongside rumdl:
- Ruff - the extremely fast Python linter and formatter that inspired rumdl.
- Neovim - the hyperextensible Vim-based text editor, a natural home for
rumdl server. - Helix - a post-modern modal editor with built-in LSP support.
- just - a handy command runner for wiring
rumdl checkinto your project tasks.
Troubleshooting
GPG or Key Errors
If APT reports an unsigned repository or an invalid key, import it again:
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
sudo apt update
Package Not Found
If APT cannot see the rumdl package:
- Re-run
sudo apt updateafter adding the repository. - Confirm your release is supported (Bookworm, Trixie, Forky, or Sid).
- Confirm your architecture is amd64 or arm64 with
dpkg --print-architecture; upstream publishes no builds for others. - Inspect the source list:
cat /etc/apt/sources.list.d/deb.griffo.io.list.
Conflicting rumdl Installations
rumdl is distributed through Cargo, pip, uv, npm and GitHub release tarballs, so an earlier install may shadow the packaged one:
which -a rumdl
Remove the stray copy with whichever tool installed it (cargo uninstall rumdl, pip uninstall rumdl, uv tool uninstall rumdl or npm uninstall -g rumdl), or delete a binary you dropped into /usr/local/bin, so the APT-managed rumdl in /usr/bin is the one you run.
Unexpected Configuration Is Being Used
If rules fire that you thought were disabled, check which file rumdl loaded:
rumdl config file
Only the first configuration found while walking up the tree is used, and .rumdl.toml takes precedence over rumdl.toml and pyproject.toml. Run with --no-config to compare against the built-in defaults.
Uninstalling
Remove rumdl with:
sudo apt remove rumdl
To also drop the repository and key:
sudo rm /etc/apt/sources.list.d/deb.griffo.io.list
sudo rm /etc/apt/keyrings/deb.griffo.io.gpg
sudo apt update
Conclusion
Installing rumdl from deb.griffo.io gives Debian users a fast, dependency-free Markdown linter and formatter without pulling in a Rust, Python or Node.js toolchain just to keep documentation tidy. The markdownlint rules you already know, automatic fixes, a built-in Language Server and pre-commit support all live behind one command, and keeping it current is just another apt upgrade.
Whether you maintain a project README, a full documentation site or a folder of personal notes, rumdl catches the inconsistencies before your readers do, and APT makes it painless to maintain.
Frequently Asked Questions
How do I install the latest rumdl on Debian?
Add the deb.griffo.io APT repository and its signing key, then run sudo apt install rumdl. The repository tracks upstream rumdl releases, so you get the latest packaged version without installing Cargo, pip or npm.
Is there a .deb package for rumdl?
Yes. deb.griffo.io publishes rumdl as a signed .deb for Debian. You could download that .deb and install it by hand, but adding the repository is the better option: APT then picks up new versions on its own.
How do I update rumdl to the latest version?
Run sudo apt update && sudo apt upgrade. Once rumdl is installed from APT there is no separate updater to remember, since new releases arrive with the rest of your system updates.
Can rumdl replace markdownlint?
For most projects, yes. rumdl implements the markdownlint rule set, reads existing markdownlint configuration files automatically, and understands markdownlint-disable comments, so you can run it side by side and switch once the results match.
How do I install rumdl on Ubuntu?
Exactly the same way; lsb_release -sc simply resolves to a different codename. There is a companion guide with the Ubuntu specifics: How to install rumdl on Ubuntu.
Which Debian releases are supported?
Bookworm 12, Trixie 13, Forky 14 and Sid, on amd64 and arm64. Because the repository line is built from lsb_release -sc, the matching suite is selected for you.
Resources
- rumdl Documentation
- rumdl GitHub Repository
- rumdl Packaging Repository
- deb.griffo.io Repository
- Install guide on deb.griffo.io
Disclaimer: The deb.griffo.io repository is an unofficial community project and is not affiliated with the official Debian or Ubuntu projects, or with the upstream rumdl project.