Language server, formatter, and linter for Markdown, Quarto, and R Markdown
220
stars
3,324
commits
Rust
primary language
Sep 9, 2026
updated

Panache is a language server, formatter, and linter for Markdown, Quarto, and R Markdown, built in Rust with a lossless CST parser and support for external formatters and linters on code blocks.
Panache is available from several sources:
cargo install --locked panachebrew install panachenpm install -g @panache-cli/panache (or npx @panache-cli/panache)uv tool install panache-cli/pipx install panache-cliaqua install jolars/panachepanache package on
Nixpkgspanache-bin (prebuilt),
panache (built from source).deb, and .rpm from the releases
pageThe installer scripts pick the right release artifact for your platform and install to a user-local directory by default. They download the matching Panache CLI release asset. If you prefer, download and inspect the script before running it.
For macOS and Linux:
curl --proto '=https' --tlsv1.2 -sSf https://panache.bz/install | sh
For Windows PowerShell:
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://panache.bz/install.ps1 | iex"
Set PANACHE_INSTALL_DIR to change the destination and PANACHE_TAG to pin a
version.
See getting started for per-platform detail and the development version.
Panache provides a single CLI interface for formatting, linting, and running the LSP server.
To format a file in place, simply run:
panache format document.qmd
You can also format from stdin by piping content into panache format:
cat <file> | panache format
panache format supports glob patterns and recursive directory formatting:
panache format **/*.{qmd,md}
You can use Panache as a linter via the --check flag to check if files are
already formatted without making changes:
panache format --check document.qmd
Panache supports external formatters for code blocks. For example, you can
configure it to run arity on R code blocks and ruff on Python code blocks:
[formatters]
r = "arity"
python = "ruff"
javascript = "prettier"
typescript = "prettier" # Reuse same formatter
You can setup custom formatters or modify built-in presets with additional arguments:
[formatters]
python = ["isort", "black"]
javascript = "myformatter"
[formatters.isort]
args = ["--profile=black"]
[formatters.myformatter]
cmd = "foobar"
args = ["--print-width=100"]
stdin = true
Panache also features a linter that can report formatting issues and optionally auto-fix them. To run the linter, use:
panache lint document.qmd
As with panache format, you can use glob patterns and recursive formatting:
panache lint **/*.{qmd,md}
As with formatting, Panache supports external linters for code blocks. These are
configured in the [linters] section of the configuration, but due to the
complexity of linting, including dealing with auto-fixing, external linters
cannot be customized and only support presets:
# Enable R linting
[linters]
r = "jarl" # R linter with JSON output
Panache implements the language server protocol (LSP) to provide editor features like formatting, diagnostics, code actions, and more. See the language server documentation for guides on how to connect Panache to your editor and configure LSP features.
The list of LSP features supported by Panache includes, among others:
Panache looks for a configuration in:
--config <path>.panache.toml, panache.toml, or .config/panache.toml in the current
directory or a parent directory$XDG_CONFIG_HOME/panache/config.toml or
~/.config/panache/config.toml~/Library/Application Support/panache/config.toml%APPDATA%\panache\config.toml# Markdown flavor and line width
flavor = "quarto"
# Formatting style
[format]
wrap = "reflow"
line-width = 80
line-ending = "auto"
# External code formatters (opt-in)
[formatters]
python = ["isort", "black"] # Sequential formatting
latex = "badness" # Built-in preset
javascript = "prettier" # Reusable definitions
typescript = "prettier"
# Customize formatters
[formatters.prettier]
prepend-args = ["--print-width=100"]
# External code linters
[linters]
julia = "fatou" # Enable Julia linting
python = "ruff"
See the configuration reference for a complete list of configuration options and their defaults.
For CI, use the dedicated GitHub Action:
- uses: jolars/panache-action@v1
See the Integrations documentation for configuration options.
Panache integrates with pre-commit to automatically format and lint your files before committing.
Installation:
First, install pre-commit if you haven't already:
pip install pre-commit
# or
brew install pre-commit
Then add Panache to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/jolars/panache-pre-commit
rev: v3.4.0 # Use the latest version
hooks:
- id: panache-format # Format files
- id: panache-lint # Lint and auto-fix issues
Note: The hooks live in
jolars/panache-pre-commit, a thin shim repo.
Install the hooks:
pre-commit install
Panache will now automatically run on your staged .qmd, .md, and .Rmd
files before each commit.
See examples/pre-commit-config.yaml for more configuration options.
I wanted a formatter that understands Quarto and Pandoc syntax. I have tried to use Prettier as well as mdformat, but both fail to handle some of the particular syntax used in Quarto documents, such as fenced divs and some of the table syntax.
For a side-by-side overview of how Panache compares to Prettier, Pandoc, rumdl, mdformat, mado, markdownlint, markdownlint-cli2, and marksman, see the comparison page. For benchmarks against the same set of tools, see the performance page.
The development of Panache has simplified considerably thanks to the extensive documentation, well-structured code, and testing infrastructure provided by Pandoc. We also owe significant debt to the rust-analyzer project, on which Panache is heavily inspired.
3,108 commits
131 commits
43 commits
20 commits
Rust
97.7%
Shell
1.2%
Language server, formatter, and linter for Markdown, Quarto, and R Markdown
220
stars
3,324
commits
Rust
primary language
Sep 9, 2026
updated

Panache is a language server, formatter, and linter for Markdown, Quarto, and R Markdown, built in Rust with a lossless CST parser and support for external formatters and linters on code blocks.
Panache is available from several sources:
cargo install --locked panachebrew install panachenpm install -g @panache-cli/panache (or npx @panache-cli/panache)uv tool install panache-cli/pipx install panache-cliaqua install jolars/panachepanache package on
Nixpkgspanache-bin (prebuilt),
panache (built from source).deb, and .rpm from the releases
pageThe installer scripts pick the right release artifact for your platform and install to a user-local directory by default. They download the matching Panache CLI release asset. If you prefer, download and inspect the script before running it.
For macOS and Linux:
curl --proto '=https' --tlsv1.2 -sSf https://panache.bz/install | sh
For Windows PowerShell:
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://panache.bz/install.ps1 | iex"
Set PANACHE_INSTALL_DIR to change the destination and PANACHE_TAG to pin a
version.
See getting started for per-platform detail and the development version.
Panache provides a single CLI interface for formatting, linting, and running the LSP server.
To format a file in place, simply run:
panache format document.qmd
You can also format from stdin by piping content into panache format:
cat <file> | panache format
panache format supports glob patterns and recursive directory formatting:
panache format **/*.{qmd,md}
You can use Panache as a linter via the --check flag to check if files are
already formatted without making changes:
panache format --check document.qmd
Panache supports external formatters for code blocks. For example, you can
configure it to run arity on R code blocks and ruff on Python code blocks:
[formatters]
r = "arity"
python = "ruff"
javascript = "prettier"
typescript = "prettier" # Reuse same formatter
You can setup custom formatters or modify built-in presets with additional arguments:
[formatters]
python = ["isort", "black"]
javascript = "myformatter"
[formatters.isort]
args = ["--profile=black"]
[formatters.myformatter]
cmd = "foobar"
args = ["--print-width=100"]
stdin = true
Panache also features a linter that can report formatting issues and optionally auto-fix them. To run the linter, use:
panache lint document.qmd
As with panache format, you can use glob patterns and recursive formatting:
panache lint **/*.{qmd,md}
As with formatting, Panache supports external linters for code blocks. These are
configured in the [linters] section of the configuration, but due to the
complexity of linting, including dealing with auto-fixing, external linters
cannot be customized and only support presets:
# Enable R linting
[linters]
r = "jarl" # R linter with JSON output
Panache implements the language server protocol (LSP) to provide editor features like formatting, diagnostics, code actions, and more. See the language server documentation for guides on how to connect Panache to your editor and configure LSP features.
The list of LSP features supported by Panache includes, among others:
Panache looks for a configuration in:
--config <path>.panache.toml, panache.toml, or .config/panache.toml in the current
directory or a parent directory$XDG_CONFIG_HOME/panache/config.toml or
~/.config/panache/config.toml~/Library/Application Support/panache/config.toml%APPDATA%\panache\config.toml# Markdown flavor and line width
flavor = "quarto"
# Formatting style
[format]
wrap = "reflow"
line-width = 80
line-ending = "auto"
# External code formatters (opt-in)
[formatters]
python = ["isort", "black"] # Sequential formatting
latex = "badness" # Built-in preset
javascript = "prettier" # Reusable definitions
typescript = "prettier"
# Customize formatters
[formatters.prettier]
prepend-args = ["--print-width=100"]
# External code linters
[linters]
julia = "fatou" # Enable Julia linting
python = "ruff"
See the configuration reference for a complete list of configuration options and their defaults.
For CI, use the dedicated GitHub Action:
- uses: jolars/panache-action@v1
See the Integrations documentation for configuration options.
Panache integrates with pre-commit to automatically format and lint your files before committing.
Installation:
First, install pre-commit if you haven't already:
pip install pre-commit
# or
brew install pre-commit
Then add Panache to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/jolars/panache-pre-commit
rev: v3.4.0 # Use the latest version
hooks:
- id: panache-format # Format files
- id: panache-lint # Lint and auto-fix issues
Note: The hooks live in
jolars/panache-pre-commit, a thin shim repo.
Install the hooks:
pre-commit install
Panache will now automatically run on your staged .qmd, .md, and .Rmd
files before each commit.
See examples/pre-commit-config.yaml for more configuration options.
I wanted a formatter that understands Quarto and Pandoc syntax. I have tried to use Prettier as well as mdformat, but both fail to handle some of the particular syntax used in Quarto documents, such as fenced divs and some of the table syntax.
For a side-by-side overview of how Panache compares to Prettier, Pandoc, rumdl, mdformat, mado, markdownlint, markdownlint-cli2, and marksman, see the comparison page. For benchmarks against the same set of tools, see the performance page.
The development of Panache has simplified considerably thanks to the extensive documentation, well-structured code, and testing infrastructure provided by Pandoc. We also owe significant debt to the rust-analyzer project, on which Panache is heavily inspired.
3,108 commits
131 commits
43 commits
20 commits
Rust
97.7%
Shell
1.2%