Skip to main content

Fast YAML linter inspired by yamllint

Project description

ryl

ryl - the Rust Yaml Linter is intended to ultimately be a drop in replacement for yamllint. It is usable today, but parity and edge-case behavior are still maturing.

Compatibility note:

  • ryl aims to match yamllint behavior and includes many parity tests.
  • ryl uses the saphyr parser stack, while yamllint uses the PyYAML parser stack.
  • saphyr and PyYAML do not always agree on which files are valid YAML.

Quick Start

# Using uv (Python)
uvx ryl .

# Using npx (Node.js)
npx @owenlamont/ryl .

For prek / pre-commit integration, see ryl-pre-commit.

Installation

uv

uv tool install ryl

NPM

npm install -g @owenlamont/ryl

pip

pip install ryl

Cargo

cargo install ryl

Usage

ryl accepts one or more paths: files and/or directories.

Basic:

ryl <PATH_OR_FILE> [PATH_OR_FILE...]

Behavior:

  • Files: parsed as YAML even if the extension is not .yml/.yaml.
  • Directories: recursively lints .yml and .yaml files.
    • Respects .gitignore, global git ignores, and git excludes.
    • Does not follow symlinks.

Exit codes:

  • 0 when all parsed files are valid (or no files found).
  • 1 when any invalid YAML is found.
  • 2 for CLI usage errors (for example, no paths provided).

Examples:

# Single file
ryl myfile.yml

# Multiple inputs (mix files and directories)
ryl config/ another.yml

# Multiple directories
ryl dir1 dir2

# Explicit non-YAML extension (parsed as YAML)
ryl notes.txt

Help and version:

Fast YAML linter written in Rust

Usage: ryl [OPTIONS] [PATH_OR_FILE]...

Arguments:
  [PATH_OR_FILE]...  One or more paths: files and/or directories

Options:
  -c, --config-file <FILE>           Path to configuration file (YAML or TOML)
  -d, --config-data <YAML>           Inline configuration data (yaml)
  -f, --format <FORMAT>              Output format (auto, standard, colored, github,
                                     parsable) [default: auto]
                                     [possible values: auto, standard, colored,
                                     github, parsable]
      --print-toml-config-schema     Print the JSON Schema for ryl TOML config
                                     and exit
      --print-yaml-config-schema     Print the JSON Schema for yamllint-compatible
                                     YAML config and exit
      --fix                          Apply safe fixes in place before reporting
                                     remaining diagnostics
      --migrate-configs              Convert discovered legacy YAML config files
                                     into .ryl.toml files
      --list-files                   List files that would be linted (reserved)
  -s, --strict                       Strict mode (reserved)
      --no-warnings                  Suppress warnings (reserved)
      --migrate-root <DIR>           Root path to search for legacy YAML config
                                     files (default: .)
      --migrate-write                Write migrated .ryl.toml files (otherwise
                                     preview only)
      --migrate-stdout               Print generated TOML to stdout during migration
      --migrate-rename-old <SUFFIX>  Rename source YAML configs by appending
                                     this suffix after migration
      --migrate-delete-old           Delete source YAML configs after migration
  -h, --help                         Print help
  -V, --version                      Print version

Performance benchmarking

This repo includes a standalone benchmark script that compares PyPI ryl and yamllint using synthetic YAML corpora and hyperfine.

Prerequisites:

  • uv
  • hyperfine

Run a quick sample:

uv run scripts/benchmark_perf_vs_yamllint.py --file-counts 25,100 --file-sizes-kib 1,8 --runs 5 --warmup 1

Run a fuller matrix (explicit lists):

uv run scripts/benchmark_perf_vs_yamllint.py --file-counts 25,100,400,1000 --file-sizes-kib 1,8,32,128 --runs 10 --warmup 2

Run a fuller matrix (ranges with increments):

uv run scripts/benchmark_perf_vs_yamllint.py --file-count-start 100 --file-count-end 1000 --file-count-step 100 --file-size-start-kib 4 --file-size-end-kib 64 --file-size-step-kib 4 --runs 10 --warmup 2

The script uses Typer; use --help for all options.

Artifacts are written under manual_outputs/benchmarks/<UTC_TIMESTAMP>/:

  • benchmark.png and benchmark.svg: side-by-side facet plot with shared Y axis.
  • summary.csv: aggregated timing table.
  • meta.json: tool versions and run parameters.
  • hyperfine-json/: raw results from hyperfine.

Example benchmark figure (5x5 matrix, 5 runs per point):

Benchmark: ryl vs yamllint scaling (5x5 matrix, 5 runs per point)

Configuration

  • Flags:
    • -c, --config-file <FILE>: path to a YAML or TOML config file.
    • -d, --config-data <YAML>: inline YAML config (highest precedence).
    • --print-toml-config-schema: print the JSON Schema for .ryl.toml / ryl.toml / [tool.ryl].
    • --print-yaml-config-schema: print the JSON Schema for yamllint-compatible YAML config files such as .yamllint / .yamllint.yml / .yamllint.yaml.
    • --fix: apply safe fixes in place before reporting remaining diagnostics.
    • --list-files: print files that would be linted after applying ignores and exit.
    • --migrate-configs: discover legacy YAML configs and plan TOML migration.
    • --migrate-root <DIR>: root to search for legacy YAML configs (default .).
    • --migrate-write: write migrated .ryl.toml files (without this it is preview-only).
    • --migrate-stdout: print generated TOML in migration mode.
    • --migrate-rename-old <SUFFIX>: rename discovered legacy YAML config files after writing.
    • --migrate-delete-old: delete discovered legacy YAML config files after writing.
    • -f, --format, -s, --strict, --no-warnings: reserved for compatibility.
  • Discovery precedence: inline --config-data > --config-file > env YAMLLINT_CONFIG_FILE (global) > nearest project config up the tree: TOML (.ryl.toml, ryl.toml, pyproject.toml with [tool.ryl]) then YAML fallback (.yamllint, .yamllint.yml, .yamllint.yaml)

    user-global ($XDG_CONFIG_HOME/yamllint/config or ~/.config/yamllint/config) > built-in defaults.

  • Rules Documentation: see docs/rules.md for a full list of supported rules and their fixable status.
  • TOML and YAML are not merged during discovery. If a TOML project config is found, YAML project config discovery is skipped (and ryl prints a warning).
  • Native fix policy is TOML-only. YAML config remains yamllint-compatible and does not support fix settings.
  • Per-file behavior: unless a global config is set via --config-data, --config-file, or YAMLLINT_CONFIG_FILE, each file discovers its nearest project config. Ignores apply to directory scans and explicit files (parity).
  • Presets and extends: supports yamllint’s built-in default, relaxed, and empty via extends. Rule maps are deep-merged; scalars/sequences overwrite.
  • TOML preset examples: see docs/config-presets.md for default/relaxed equivalents.
  • Canonical schema artifacts are checked into this repo as:
    • ryl.toml.schema.json for .ryl.toml / ryl.toml / [tool.ryl]
    • ryl.yaml.schema.json for yamllint-compatible YAML config files such as .yamllint / .yamllint.yml / .yamllint.yaml
  • SchemaStore sync only targets the native TOML config and publishes a draft-07 projection for ryl.toml / .ryl.toml. SchemaStore cannot target the [tool.ryl] table inside pyproject.toml, so that remains covered by the broader pyproject.toml schema association.
  • Automatic release-time SchemaStore sync is currently left commented out in release.yml; run the sync workflow manually to test it in isolation before re-enabling the release hook.
  • Regenerate them with:
    • cargo run --quiet --bin ryl -- --print-toml-config-schema > ryl.toml.schema.json
    • cargo run --quiet --bin ryl -- --print-yaml-config-schema > ryl.yaml.schema.json
  • Print the SchemaStore projection locally with:
    • uv run scripts/print_ryl_schemastore_schema.py > /tmp/ryl.schemastore.json

Example TOML config (.ryl.toml):

yaml-files = ["*.yaml", "*.yml"]
ignore = ["vendor/**", "generated/**"]
locale = "en_US.UTF-8"

[rules]
document-start = "disable"

[rules.line-length]
max = 120

[rules.truthy]
allowed-values = ["true", "false"]

[fix]
fixable = ["ALL"]
unfixable = []

For a fully expanded TOML example that names every built-in rule explicitly, see /.ryl.toml.example.

Migration example:

# Preview migration actions
ryl --migrate-configs --migrate-root .

# Write .ryl.toml files and keep old files with a suffix
ryl --migrate-configs --migrate-root . --migrate-write --migrate-rename-old .bak

Acknowledgements

This project exists thanks to the tooling and ecosystems around YAML linting and developer automation, especially:

  • yamllint - for giving me the shoulders to stand on and the source of many of the automated tests that ryl uses now to check for behaviour parity. Copying the behaviour of an existing tool is infinitely easier than building one from scratch - there'd be no ryl without yamllint.
  • ruff - for showing the power of Rust tooling for Python development and inspiring the config and API for ryl.
  • rumdl - for giving me another template to follow for Rust tooling and showing me almost the only dev tool I was still using after this that wasn't written in Rust was yamllint (which inspired me to tackle this project)
  • saphyr - ryl is built on saphyr and saphyr's developers were very patient in showing some of the nuance and complexity of parsing YAML which I was embarrassingly ignorant of when start ryl.
  • esbuild and biome - for providing the "binary wrapper" blueprint for distributing high-performance native tools via NPM.

Project details


Download files

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

Source Distribution

ryl-0.7.0.tar.gz (226.9 kB view details)

Uploaded Source

Built Distributions

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

ryl-0.7.0-py3-none-win_arm64.whl (3.3 MB view details)

Uploaded Python 3Windows ARM64

ryl-0.7.0-py3-none-win_amd64.whl (3.5 MB view details)

Uploaded Python 3Windows x86-64

ryl-0.7.0-py3-none-musllinux_1_2_x86_64.whl (4.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ryl-0.7.0-py3-none-musllinux_1_2_aarch64.whl (4.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ryl-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ryl-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (4.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ryl-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ryl-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ryl-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ryl-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ryl-0.7.0-py3-none-macosx_11_0_arm64.whl (3.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file ryl-0.7.0.tar.gz.

File metadata

  • Download URL: ryl-0.7.0.tar.gz
  • Upload date:
  • Size: 226.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0.tar.gz
Algorithm Hash digest
SHA256 3d80ba8a8b0a05f70e520189c33dd0a7012c8cc0fe78cf9e9f8e2325da6c37bd
MD5 204bfe415948f897d218819afbd41796
BLAKE2b-256 f6697bee30359acd8a027d0e81a1bfe506a9fc1b44441edd158bf221853762dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0.tar.gz:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: ryl-0.7.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 3.3 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 8c74bd75849757730f41240903e3e39e91f0a90573b45a0d7c22932e528fa0c2
MD5 ca8dd1f98fcbfeb4721d9d09a877707c
BLAKE2b-256 7daab78202fd9f0ac8e4dcf72651cf2c4f37601aef51341c51515d2128a36e8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-win_arm64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: ryl-0.7.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6d75776234ae5bff2c11aef935872828e7e64f7e8775f530672c7831c84bd2d9
MD5 56819709f865f0ce3e52ea03bda1bb60
BLAKE2b-256 e8456da864c598316c50ae68da7ae1d7b68fbebe993e1bc458d0136adc91aa31

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-win_amd64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: ryl-0.7.0-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 4.4 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e0938cf64d0d9b6b772fbf24b908ae1f2fe030a7576c583c35e7ec6143dd0894
MD5 30c444d8a87f3411993e64d3b0539973
BLAKE2b-256 588874a3e6986a42a0de08e71d49b757717addde47c0cce3f6177ac848385eb4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: ryl-0.7.0-py3-none-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 4.1 MB
  • Tags: Python 3, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7d728990986c897cd41ed89c8e670043b9b03cb02aa4c9d059adfafd29f277ce
MD5 d08a5fce575bb44a84c0d86f582c1935
BLAKE2b-256 833726ba20abcbaea268f7b9150e871bbe9cf67dd590846cc6101cb55b5016e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f005ea2b364814843cb88a748556cc804707193d5d0b2809bdcfe26ce1f26bc
MD5 38dabe2e5169f88d8d155f56694d972e
BLAKE2b-256 fc750aaeeb8a4905ab75a5c61002e70a75d852e10b708f0939994af763c08168

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7f66afc766b77cca9f3b7ab79c15bc04304cb149f0640543cc1f022b4a87eca0
MD5 6bc20705fa3f4ccb42a91a0357217293
BLAKE2b-256 b21eafafe9d5b0a86a9c1a497e4987c419d05cbe065df4be4bf9ae95435316fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 21e3206fec32f4d0a62e0fbc71883a893f83375523a823bc126bf676cb600b0d
MD5 4ab9fb3f66490912797528f10ad0bf74
BLAKE2b-256 aafedb83bbd265da5c8505fcb3e41b7a63a481f3bf4ffebf51a8d457c32969a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9ca8cf122669cdf6a84ca02e9f77f867f209ca0ab357d02d9632b05483e14a36
MD5 df9a2199cbd9582228d8f12f40b60e1e
BLAKE2b-256 9eaf52cac8d07eb751e1ed1d9a2ada3acbbbf67915002aa5bbe51b0c22f4e9a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 897c474499e99421e659ab3372f038c206cac26ad7e2bb7feb78b5174f5f7862
MD5 e5960d35aea256f03d135187b58e97d3
BLAKE2b-256 ef30890b4435aa3d0ad53ee2939ad9af96ba6ace215074784c9d036d66c000a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ryl-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c98560f943e96d7555c35a9eda37bbc2f849b29754ce57f8da44f4978e09a863
MD5 92d578609dfc9a0fc290e48a00463d45
BLAKE2b-256 416558f2a2a2b5baf472ba93da44274f10d4cf0667e05c4fecbc483cb201d7cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ryl-0.7.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: ryl-0.7.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ryl-0.7.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b26b1adceca96a97f154d8b014022d82acc15a5cadb09930897e429025b3b117
MD5 a8119c38ceb1503b181e92afe941bb26
BLAKE2b-256 7cfc560cbded49503b4f9303f760ce5253fa4944e7c819b8da119f24a427074e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.7.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on owenlamont/ryl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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