Skip to main content

An extremely fast Markdown linter written in Rust

Project description

rumdl - A high-performance Markdown linter, written in Rust

rumdl Logo

Build Status License: MIT Crates.io PyPI GitHub release (latest by date) GitHub stars

A modern Markdown linter and formatter, built for speed with Rust

| Docs | Rules | Configuration |

Table of Contents

Quick Start

# Install using Cargo
cargo install rumdl

# Check Markdown files in the current directory
rumdl .

# Automatically fix issues
rumdl --fix .

# Create a default configuration file
rumdl init

Overview

rumdl is a high-performance Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. It offers:

  • ⚡️ Built for speed with Rust
  • 🔍 50+ lint rules covering common Markdown issues
  • 🛠️ Automatic fixing with --fix for most rules
  • 📦 Zero dependencies - single binary with no runtime requirements
  • 🔧 Highly configurable with TOML-based config files
  • 🌐 Multiple installation options - Rust, Python, standalone binaries
  • 🐍 Installable via pip for Python users
  • 📏 Modern CLI with detailed error reporting
  • 🔄 CI/CD friendly with non-zero exit code on errors

Installation

Choose the installation method that works best for you:

Using Cargo (Rust)

cargo install rumdl

Using pip (Python)

pip install rumdl

Download binary

# Linux/macOS
curl -LsSf https://github.com/rvben/rumdl/releases/latest/download/rumdl-linux-x86_64.tar.gz | tar xzf - -C /usr/local/bin

# Windows PowerShell
Invoke-WebRequest -Uri "https://github.com/rvben/rumdl/releases/latest/download/rumdl-windows-x86_64.zip" -OutFile "rumdl.zip"
Expand-Archive -Path "rumdl.zip" -DestinationPath "$env:USERPROFILE\.rumdl"

Usage

Getting started with rumdl is simple:

# Check a single file
rumdl README.md

# Check all Markdown files in current directory and subdirectories
rumdl .

# Automatically fix issues
rumdl --fix README.md

# Create a default configuration file
rumdl init

Common usage examples:

# Check with custom configuration
rumdl --config my-config.toml docs/

# Disable specific rules
rumdl --disable MD013,MD033 README.md

# Enable only specific rules
rumdl --enable MD001,MD003 README.md

# Exclude specific files/directories
rumdl --exclude "node_modules,dist" .

# Include only specific files/directories
rumdl --include "docs/*.md,README.md" .

# Combine include and exclude patterns
rumdl --include "docs/**/*.md" --exclude "docs/temp,docs/drafts" .

Rules

rumdl implements over 50 lint rules for Markdown files. Here are some key rule categories:

Category Description Example Rules
Headings Proper heading structure and formatting MD001, MD002, MD003
Lists Consistent list formatting and structure MD004, MD005, MD007
Whitespace Proper spacing and line length MD009, MD010, MD012
Code Code block formatting and language tags MD040, MD046, MD048
Links Proper link and reference formatting MD034, MD039, MD042
Images Image alt text and references MD045, MD052
Style Consistent style across document MD031, MD032, MD035

For a complete list of rules and their descriptions, see our documentation or run:

rumdl --list-rules

Command-line Interface

rumdl [options] [file or directory...]
rumdl <command> [options]

Commands

  • init: Create a default .rumdl.toml configuration file in the current directory

Options

  • -c, --config <file>: Use custom configuration file
  • -f, --fix: Automatically fix issues where possible
  • -l, --list-rules: List all available rules
  • -d, --disable <rules>: Disable specific rules (comma-separated)
  • -e, --enable <rules>: Enable only specific rules (comma-separated)
  • --exclude <patterns>: Exclude specific files or directories (comma-separated glob patterns)
  • --include <patterns>: Include only specific files or directories (comma-separated glob patterns)
  • --respect-gitignore: Respect .gitignore files when scanning directories
  • -v, --verbose: Show detailed output

Configuration

rumdl can be configured using a TOML configuration file. By default, it looks for rumdl.toml or .rumdl.toml in the current directory.

You can create a default configuration file using the init command:

rumdl init

This will create a .rumdl.toml file in the current directory with default settings that you can customize.

Example configuration file:

# Global configuration options
[global]
# List of rules to disable
disable = ["MD013", "MD033"]

# List of rules to enable exclusively (if provided, only these rules will run)
# enable = ["MD001", "MD003", "MD004"]

# List of file/directory patterns to include for linting (if provided, only these will be linted)
include = [
    # Documentation files
    "docs/**/*.md",
    "README.md",
    "CONTRIBUTING.md",
]

# List of file/directory patterns to exclude from linting
exclude = [
    # Common directories to exclude
    ".git",
    ".github",
    "node_modules",
    "vendor",
    "dist",
    "build",

    # Specific files or patterns
    "CHANGELOG.md",
    "LICENSE.md",
    "generated/*.md",
    "**/temp_*.md",
]

# Whether to respect .gitignore files when scanning directories
respect_gitignore = false

# Rule-specific configurations
[MD002]
level = 1  # Expected level for first heading

[MD003]
style = "atx"  # Heading style (atx, atx_closed, setext)

Output Style

rumdl produces clean, colorized output similar to modern linting tools:

README.md:12:1: [MD022] Headings should be surrounded by blank lines [*]
README.md:24:5: [MD037] Spaces inside emphasis markers: "* incorrect *" [*]
README.md:31:76: [MD013] Line length exceeds 80 characters
README.md:42:3: [MD010] Hard tabs found, use spaces instead [*]

When running with --fix, rumdl shows which issues were fixed:

README.md:12:1: [MD022] Headings should be surrounded by blank lines [fixed]
README.md:24:5: [MD037] Spaces inside emphasis markers: "* incorrect *" [fixed]
README.md:42:3: [MD010] Hard tabs found, use spaces instead [fixed]

Fixed 3 issues in 1 file

For a more detailed view, use the --verbose option:

✓ No issues found in CONTRIBUTING.md
README.md:12:1: [MD022] Headings should be surrounded by blank lines [*]
README.md:24:5: [MD037] Spaces inside emphasis markers: "* incorrect *" [*]
README.md:42:3: [MD010] Hard tabs found, use spaces instead [*]

Found 3 issues in 1 file (2 files checked)
Run with `--fix` to automatically fix issues

Output Format

rumdl uses a consistent output format for all issues:

{file}:{line}:{column}: [{rule*id}] {message} [{fix*indicator}]

The output is colorized by default:

  • Filenames appear in blue and underlined
  • Line and column numbers appear in cyan
  • Rule IDs appear in yellow
  • Error messages appear in white
  • Fixable issues are marked with [*] in green
  • Fixed issues are marked with [fixed] in green

Development

Prerequisites

  • Rust 1.70 or higher
  • Make (for development commands)

Building

make build

Testing

make test

License

MIT License

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rumdl-0.0.34.tar.gz (323.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rumdl-0.0.34-py3-none-win_amd64.whl (1.8 MB view details)

Uploaded Python 3Windows x86-64

rumdl-0.0.34-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

rumdl-0.0.34-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

rumdl-0.0.34-py3-none-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

rumdl-0.0.34-py3-none-macosx_10_12_x86_64.whl (1.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file rumdl-0.0.34.tar.gz.

File metadata

  • Download URL: rumdl-0.0.34.tar.gz
  • Upload date:
  • Size: 323.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for rumdl-0.0.34.tar.gz
Algorithm Hash digest
SHA256 8bc4b3ea6afbbce2fd60e5b3e108d8b3092a85ad8ee38257ded140243137d01c
MD5 baaf95d17bbbfaaa84f74d508f71ff4c
BLAKE2b-256 0ab28c77d125ec10f4c31b3b68538914f6fa3f180452ffbe5fec26753938679c

See more details on using hashes here.

File details

Details for the file rumdl-0.0.34-py3-none-win_amd64.whl.

File metadata

  • Download URL: rumdl-0.0.34-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for rumdl-0.0.34-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d0e602548e15572d44bd267c532a9f88582d63b705ab92d83c8bca744dd03eac
MD5 fb0bacdcfa30510abe10702b80cf3cb8
BLAKE2b-256 b50d8de4a34d233050d0c02cb845581285471a75fefd2ecca6222596e5f9eec0

See more details on using hashes here.

File details

Details for the file rumdl-0.0.34-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rumdl-0.0.34-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7b15f1e54edf19f2e07da9c315296f564fe11df133dd0d1dd522e0792136f8a6
MD5 9de30a26b2bac8ec0a553f99781f192e
BLAKE2b-256 91ab0a790dd4c4b548e4a84b9b243371a7e572cdb9a9d48be6c871811a2eaf8e

See more details on using hashes here.

File details

Details for the file rumdl-0.0.34-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rumdl-0.0.34-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6e7268b37a90d0c387a449bd8ea0b4dd5b885cf8669c224bde09a8056995cf65
MD5 aa6ea43f50d9861228a146ef154e7544
BLAKE2b-256 ba4d2044dd42a5b76dabe86ddbdbeb75168b62f39c434aab9728c3fda73c629c

See more details on using hashes here.

File details

Details for the file rumdl-0.0.34-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rumdl-0.0.34-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 21f285d5fbe34a1957318ac8e6f577019f334435e3ded0851d1643b507eeb8d4
MD5 55d39140ce8a0a693fc7c6bfc907af14
BLAKE2b-256 255b54f6416554ba1ca1d19ab7f2a2b9bcd5fcfd22eeedd095d816476ec89880

See more details on using hashes here.

File details

Details for the file rumdl-0.0.34-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rumdl-0.0.34-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 87dcbb65a538aac9f0e66f3431c9717a9a00cbad0ff4cc6422877bc015b9d029
MD5 c6c6529c38ce3b5cf158796a714150c5
BLAKE2b-256 2dd1bb5419c732016f4d38dc437ca92b1eb8858c999134949290f3f02483998a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page