What is rumdl?
rumdl is a Markdown linter and formatter written in Rust. It implements the rule set everyone already knows from markdownlint, the MD001 to MD059 checks for heading levels, list indentation, line length, code fence style, link syntax and trailing whitespace, and it runs them over a documentation tree in milliseconds instead of seconds. Most of those rules come with a fix, so rumdl check --fix repairs what it reports rather than leaving you a list, and rumdl fmt reformats a file outright. Configuration is a rumdl.toml file or a [tool.rumdl] table in pyproject.toml, an existing .markdownlint.json can be converted with rumdl import, and rumdl server speaks the Language Server Protocol so the same binary underlines problems in your editor. Think of it as what Ruff is to Python, applied to Markdown.
node_modules tree for one check, and a lint step that crawls once the docs directory grows past a few hundred files. rumdl is a single static binary with no runtime behind it, it reads the config you already have, and installing it with apt puts it on the PATH of every project, CI job and pre-commit hook on the machine without npm or pip.
rumdl.toml written against today's documentation may name options an older build silently ignores. Neither Debian nor Ubuntu packages rumdl at all, so a current build is not a nicety here; it is the only way to have it through apt.
⚡ Key Features of rumdl
🏎️ markdownlint Rules at Rust Speed
The familiar MD001 to MD059 checks, run by a compiled binary with no interpreter to start. A documentation tree that took a lint step of its own in CI finishes fast enough to run on every save.
🔧 Fixes, Not Just Complaints
rumdl check --fix repairs the violations that have a safe fix: heading punctuation, list markers and indentation, blank lines around blocks, trailing spaces, fence style, in place across the whole tree.
🖊️ A Formatter Too
rumdl fmt reformats Markdown the way a code formatter does, so the shape of a file stops being a review comment. --check makes it a CI gate that changes nothing.
🔌 Editor Integration Built In
rumdl server is a Language Server, so VS Code, Neovim, Helix and Zed get the same diagnostics and the same fixes as the command line, from the one binary you installed.
♻️ Keeps Your markdownlint Config
rumdl import reads an existing .markdownlint.json or .markdownlintrc and writes the equivalent rumdl.toml, so switching a repository over is one command, not a rules audit.
📖 Rules That Explain Themselves
rumdl rule lists every check and rumdl explain MD013 describes one, with what it fixes and how to configure it, so nobody has to guess what a code in a CI log meant.
apt upgrade keeps you on the latest version.
📦 Installation from deb.griffo.io
Step 1: Add Repository
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 updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | 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" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt update🆓 There is an always-free mirror. deb-free.griffo.io serves packages free forever, no account, no subscription, at most 2 months behind upstream, security fixes immediately. It currently carries cliamp, Ghostty, lazydocker, Oh My Posh and Zed; rumdl is not one of them, so the repository above is the only way to get it today, ask and it can be enrolled.
Step 2: Install rumdl
# Install latest rumdl
sudo apt install rumdl
# Verify installation
rumdl --version# Install latest rumdl
apt install rumdl
# Verify installation
rumdl --versionStep 3: First run
# Lint every Markdown file under the current directory
rumdl check .
# Fix everything that has a safe fix
rumdl check --fix .
# Write a starting rumdl.toml you can edit
rumdl init
# See what a rule code means
rumdl explain MD013
# Every subcommand and flag
rumdl --help🎯 Basic Usage Examples
Checking and fixing:
# One file, a directory, or a glob
rumdl check README.md
rumdl check docs/
rumdl check "**/*.md"
# Fix in place, then show what is left
rumdl check --fix .
# Turn one noisy rule off for this run
rumdl check --disable MD013 .
# Run only the rules you care about right now
rumdl check --enable MD001,MD009,MD047 .
# Machine-readable output for a CI annotation step
rumdl check --output-format json .Formatting:
# Reformat the files in place
rumdl fmt docs/
# Fail without writing anything, the CI form
rumdl fmt --check docs/
# See the changes before accepting them
rumdl fmt --diff docs/Configuration and rules:
# Create rumdl.toml in this repository
rumdl init
# Convert a markdownlint config you already have
rumdl import .markdownlint.json
# What configuration is actually in effect, and from where
rumdl config
# List every rule, then read one in full
rumdl rule
rumdl explain MD024
# Shell completions, written where your shell reads them
rumdl completions bash | sudo tee /etc/bash_completion.d/rumdl > /dev/null# Create rumdl.toml in this repository
rumdl init
# Convert a markdownlint config you already have
rumdl import .markdownlint.json
# What configuration is actually in effect, and from where
rumdl config
# List every rule, then read one in full
rumdl rule
rumdl explain MD024
# Shell completions, written where your shell reads them
rumdl completions bash | tee /etc/bash_completion.d/rumdl > /dev/null🔧 Tool Integrations
rumdl is built to drop into the places markdownlint already sits:
- Your editor:
rumdl serveris a Language Server, so Neovim, Helix, VS Code and Zed show the diagnostics inline and apply the fixes as code actions - markdownlint configs:
rumdl importturns.markdownlint.jsonor.markdownlintrcintorumdl.toml, and the rule codes are the same ones your team already argues about - pyproject.toml: a
[tool.rumdl]table keeps the settings next to your Ruff and pytest configuration instead of adding another dotfile - CI and pre-commit:
rumdl check .exits non-zero on violations andrumdl fmt --checkgates formatting, with no Node or Python runtime to install first on the agent - Static site generators: the docs sources for MkDocs, Hugo, Docusaurus and mdBook are ordinary Markdown, so the same check runs over them before the build does
🚀 Why Choose deb.griffo.io?
- Official Ubuntu: does not package rumdl,
apt install rumdlfails on a stock system - npm or pip: works, but ties a Markdown check to a Node or Python environment and reinstalls it in every project and every CI image
- Building from source: current, but a Rust toolchain on every machine and a binary that apt knows nothing about
- deb.griffo.io: latest version with automatic updates
- ✅ The Only apt Source: rumdl is in neither the Debian nor the Ubuntu archives; this repository packages the official upstream release
- ✅ System-Wide, No Runtime: one
/usr/bin/rumdlfor every repository on the machine, with no npm install and no virtualenv behind it - ✅ Automatic Updates: packages updated within hours of upstream releases, so new rules and fixes arrive with a plain
apt upgrade - ✅ Complete Package: the official upstream Linux build installed as
/usr/bin/rumdl, nothing added, nothing patched - ✅ Honest Dependencies: a statically linked Rust binary that needs nothing else installed to lint, fix, format or serve
- ✅ Two Architectures: amd64 and arm64, so the same package covers your laptop, your servers and your arm64 build agents
- ✅ Multi-Distribution: works on Ubuntu 22.04, 24.04, 25.10 and 26.04
- ✅ Easy Maintenance: standard apt commands for updates
📦 Package Build Repository
The Ubuntu packages are automatically built and maintained in this GitHub repository:
- 📐 rumdl-debian - Latest release builds
🔗 Related Packages
Also available from deb.griffo.io:
- Ruff - The same idea for Python source, a Rust linter and formatter in one binary
- uv - Rust-fast Python packaging, for the projects whose docs you are linting
- Neovim - An editor that will talk to
rumdl serverand show the diagnostics as you type - ripgrep - For the searches across the same Markdown tree that a linter cannot answer
--fix run, and getting the same warnings in your editor that the build will give you.
💝 Support This Project
If this repository saves you time and effort, please consider supporting it!