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 --fix and rumdl fmt repair most violations in place.
  • 🔄 Drop-in for markdownlint users - Existing .markdownlint.json or .yaml files are discovered automatically, or converted with rumdl import.
  • 🧩 Markdown flavors - Built-in awareness of GFM, MkDocs, MDX, Quarto, Pandoc, Obsidian, MyST, Hugo and more.
  • 🧠 Built-in Language Server - rumdl server brings diagnostics, quick fixes and formatting to any LSP-capable editor.
  • 🔧 TOML configuration - .rumdl.toml, rumdl.toml or a [tool.rumdl] section in pyproject.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, pip or npm required.
  • 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
  • sudo privileges
  • curl installed (sudo apt install curl if 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:

  1. Create the keyrings directory - ensures /etc/apt/keyrings exists with proper permissions.
  2. Install the GPG key - downloads the repository key and de-armours it into a dedicated keyring for verification.
  3. Add the repository - writes a signed-by source line, with lsb_release -sc supplying your Debian codename.
  4. 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 check into 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:

  1. Re-run sudo apt update after adding the repository.
  2. Confirm your release is supported (Bookworm, Trixie, Forky, or Sid).
  3. Confirm your architecture is amd64 or arm64 with dpkg --print-architecture; upstream publishes no builds for others.
  4. 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


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.