rumdl - An extremely fast Markdown linter, written in Rust
rumdl is a fast Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. Built in Rust for exceptional performance.
Features
- Lightning Fast: Built with Rust for exceptional performance
- 50+ lint rules: Comprehensive rule set covering common Markdown issues
- Automatic fixing: Many rules support automatic fixing with
--fix - Highly configurable: Customize rules to match your project's style
- Modern CLI: User-friendly interface with detailed error reporting
Installation
With Cargo:
Usage
Check Markdown files for issues:
# Check a single file
# Check multiple files
# Check all Markdown files in a directory (recursive)
# Check and automatically fix issues
Command-line Interface
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)-v, --verbose: Show detailed output
Configuration
rumdl can be configured through command-line options. Support for a rumdl.toml configuration file is planned but not currently implemented.
Current configuration options
-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)-v, --verbose: Show detailed output-c, --config <file>: Reserved for future custom configuration file support
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
Rules
rumdl implements over 50 lint rules for Markdown files. By default, all rules are enabled except those specifically disabled in your configuration.
For a complete list of rules and their descriptions, run rumdl --list-rules or visit our documentation.
Rules Overview
The following table provides an overview of all supported rules and indicates whether rumdl can detect violations and automatically fix them:
| Rule ID | Description | Detects | Fixes |
|---|---|---|---|
| MD001 | Heading levels should only increment by one level at a time | ✅ | ✅ |
| MD002 | First heading should be a top-level heading | ✅ | ✅ |
| MD003 | Heading style should be consistent | ✅ | ✅ |
| MD004 | Unordered list style should be consistent | ✅ | ✅ |
| MD005 | Consistent indentation for list items at the same level | ✅ | ✅ |
| MD006 | Start bullets at the beginning of the line | ✅ | ✅ |
| MD007 | Unordered list indentation | ✅ | ✅ |
| MD008 | Unordered list style | ✅ | ✅ |
| MD009 | Trailing spaces | ✅ | ✅ |
| MD010 | Hard tabs | ✅ | ✅ |
| MD011 | Reversed link syntax | ✅ | ✅ |
| MD012 | Multiple consecutive blank lines | ✅ | ✅ |
| MD013 | Line length | ✅ | ❌ |
| MD014 | Dollar signs used before commands without showing output | ✅ | ✅ |
| MD015 | No space after list marker | ✅ | ✅ |
| MD016 | Multiple spaces after list marker | ✅ | ✅ |
| MD017 | No emphasis as heading | ✅ | ✅ |
| MD018 | No space after hash on atx style heading | ✅ | ✅ |
| MD019 | Multiple spaces after hash on atx style heading | ✅ | ✅ |
| MD020 | No space inside hashes on closed atx style heading | ✅ | ✅ |
| MD021 | Multiple spaces inside hashes on closed atx style heading | ✅ | ✅ |
| MD022 | Headings should be surrounded by blank lines | ✅ | ✅ |
| MD023 | Headings must start at the beginning of the line | ✅ | ✅ |
| MD024 | Multiple headings with the same content | ✅ | ❌ |
| MD025 | Multiple top-level headings in the same document | ✅ | ❌ |
| MD026 | Trailing punctuation in heading | ✅ | ✅ |
| MD027 | Multiple spaces after blockquote symbol | ✅ | ✅ |
| MD028 | Blank line inside blockquote | ✅ | ✅ |
| MD029 | Ordered list item prefix | ✅ | ✅ |
| MD030 | Spaces after list markers | ✅ | ✅ |
| MD031 | Fenced code blocks should be surrounded by blank lines | ✅ | ✅ |
| MD032 | Lists should be surrounded by blank lines | ✅ | ✅ |
| MD033 | Inline HTML | ✅ | ❌ |
| MD034 | Bare URL used | ✅ | ✅ |
| MD035 | Horizontal rule style | ✅ | ✅ |
| MD036 | Emphasis used instead of a heading | ✅ | ✅ |
| MD037 | Spaces inside emphasis markers | ✅ | ✅ |
| MD038 | Spaces inside code span elements | ✅ | ✅ |
| MD039 | Spaces inside link text | ✅ | ✅ |
| MD040 | Fenced code blocks should have a language specified | ✅ | ✅ |
| MD041 | First line in a file should be a top-level heading | ✅ | ✅ |
| MD042 | No empty links | ✅ | ✅ |
| MD043 | Required heading structure | ✅ | ❌ |
| MD044 | Proper names should have the correct capitalization | ✅ | ✅ |
| MD045 | Images should have alternate text | ✅ | ✅ |
| MD046 | Code block style | ✅ | ✅ |
| MD047 | Files should end with a single newline character | ✅ | ✅ |
| MD048 | Code fence style | ✅ | ✅ |
| MD049 | Emphasis style | ✅ | ✅ |
| MD050 | Strong style | ✅ | ✅ |
| MD051 | Link fragments should exist | ✅ | ❌ |
| MD052 | Reference links and images should use a reference that exists | ✅ | ❌ |
| MD053 | Link and image reference definitions should be needed | ✅ | ✅ |
| MD054 | Link and image style | ✅ | ❌ |
| MD055 | Table pipe style | ✅ | ✅ |
| MD056 | Table column count | ✅ | ✅ |
| MD058 | Tables should be surrounded by blank lines | ✅ | ✅ |
Development
Prerequisites
- Rust 1.70 or higher
- Make (for development commands)
Building
Testing
License
MIT License