Skip to main content

An extremely fast Python linter and code formatter, written in Rust.

Project description

Ruff

Ruff image image image Actions status Discord

Docs | Playground

An extremely fast Python linter and code formatter, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters (like Flake8) and formatters (like Black)
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.13 compatibility
  • ⚖️ Drop-in parity with Flake8, isort, and Black
  • 📦 Built-in caching, to avoid re-analyzing unchanged files
  • 🔧 Fix support, for automatic error correction (e.g., automatically remove unused imports)
  • 📏 Over 800 built-in rules, with native re-implementations of popular Flake8 plugins, like flake8-bugbear
  • ⌨️ First-party editor integrations for VS Code and more
  • 🌎 Monorepo-friendly, with hierarchical and cascading configuration

Ruff aims to be orders of magnitude faster than alternative tools while integrating more functionality behind a single, common interface.

Ruff can be used to replace Flake8 (plus dozens of plugins), Black, isort, pydocstyle, pyupgrade, autoflake, and more, all while executing tens or hundreds of times faster than any individual tool.

Ruff is extremely actively developed and used in major open-source projects like:

...and many more.

Ruff is backed by Astral. Read the launch post, or the original project announcement.

Testimonials

Sebastián Ramírez, creator of FastAPI:

Ruff is so fast that sometimes I add an intentional bug in the code just to confirm it's actually running and checking the code.

Nick Schrock, founder of Elementl, co-creator of GraphQL:

Why is Ruff a gamechanger? Primarily because it is nearly 1000x faster. Literally. Not a typo. On our largest module (dagster itself, 250k LOC) pylint takes about 2.5 minutes, parallelized across 4 cores on my M1. Running ruff against our entire codebase takes .4 seconds.

Bryan Van de Ven, co-creator of Bokeh, original author of Conda:

Ruff is ~150-200x faster than flake8 on my machine, scanning the whole repo takes ~0.2s instead of ~20s. This is an enormous quality of life improvement for local dev. It's fast enough that I added it as an actual commit hook, which is terrific.

Timothy Crosley, creator of isort:

Just switched my first project to Ruff. Only one downside so far: it's so fast I couldn't believe it was working till I intentionally introduced some errors.

Tim Abbott, lead developer of Zulip:

This is just ridiculously fast... ruff is amazing.

Table of Contents

For more, see the documentation.

  1. Getting Started
  2. Configuration
  3. Rules
  4. Contributing
  5. Support
  6. Acknowledgements
  7. Who's Using Ruff?
  8. License

Getting Started

For more, see the documentation.

Installation

Ruff is available as ruff on PyPI.

Invoke Ruff directly with uvx:

uvx ruff check   # Lint all files in the current directory.
uvx ruff format  # Format all files in the current directory.

Or install Ruff with uv (recommended), pip, or pipx:

# With uv.
uv tool install ruff@latest  # Install Ruff globally.
uv add --dev ruff            # Or add Ruff to your project.

# With pip.
pip install ruff

# With pipx.
pipx install ruff

Starting with version 0.5.0, Ruff can be installed with our standalone installers:

# On macOS and Linux.
curl -LsSf https://astral.sh/ruff/install.sh | sh

# On Windows.
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"

# For a specific version.
curl -LsSf https://astral.sh/ruff/0.11.3/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.11.3/install.ps1 | iex"

You can also install Ruff via Homebrew, Conda, and with a variety of other package managers.

Usage

To run Ruff as a linter, try any of the following:

ruff check                          # Lint all files in the current directory (and any subdirectories).
ruff check path/to/code/            # Lint all files in `/path/to/code` (and any subdirectories).
ruff check path/to/code/*.py        # Lint all `.py` files in `/path/to/code`.
ruff check path/to/code/to/file.py  # Lint `file.py`.
ruff check @arguments.txt           # Lint using an input file, treating its contents as newline-delimited command-line arguments.

Or, to run Ruff as a formatter:

ruff format                          # Format all files in the current directory (and any subdirectories).
ruff format path/to/code/            # Format all files in `/path/to/code` (and any subdirectories).
ruff format path/to/code/*.py        # Format all `.py` files in `/path/to/code`.
ruff format path/to/code/to/file.py  # Format `file.py`.
ruff format @arguments.txt           # Format using an input file, treating its contents as newline-delimited command-line arguments.

Ruff can also be used as a pre-commit hook via ruff-pre-commit:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.11.3
  hooks:
    # Run the linter.
    - id: ruff
      args: [ --fix ]
    # Run the formatter.
    - id: ruff-format

Ruff can also be used as a VS Code extension or with various other editors.

Ruff can also be used as a GitHub Action via ruff-action:

name: Ruff
on: [ push, pull_request ]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/ruff-action@v3

Configuration

Ruff can be configured through a pyproject.toml, ruff.toml, or .ruff.toml file (see: Configuration, or Settings for a complete list of all configuration options).

If left unspecified, Ruff's default configuration is equivalent to the following ruff.toml file:

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".hg",
    ".ipynb_checkpoints",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pyenv",
    ".pytest_cache",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    ".vscode",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "site-packages",
    "venv",
]

# Same as Black.
line-length = 88
indent-width = 4

# Assume Python 3.9
target-version = "py39"

[lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`)  codes by default.
select = ["E4", "E7", "E9", "F"]
ignore = []

# Allow fix for all enabled rules (when `--fix`) is provided.
fixable = ["ALL"]
unfixable = []

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

[format]
# Like Black, use double quotes for strings.
quote-style = "double"

# Like Black, indent with spaces, rather than tabs.
indent-style = "space"

# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false

# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

Note that, in a pyproject.toml, each section header should be prefixed with tool.ruff. For example, [lint] should be replaced with [tool.ruff.lint].

Some configuration options can be provided via dedicated command-line arguments, such as those related to rule enablement and disablement, file discovery, and logging level:

ruff check --select F401 --select F403 --quiet

The remaining configuration options can be provided through a catch-all --config argument:

ruff check --config "lint.per-file-ignores = {'some_file.py' = ['F841']}"

To opt in to the latest lint rules, formatter style changes, interface updates, and more, enable preview mode by setting preview = true in your configuration file or passing --preview on the command line. Preview mode enables a collection of unstable features that may change prior to stabilization.

See ruff help for more on Ruff's top-level commands, or ruff help check and ruff help format for more on the linting and formatting commands, respectively.

Rules

Ruff supports over 800 lint rules, many of which are inspired by popular tools like Flake8, isort, pyupgrade, and others. Regardless of the rule's origin, Ruff re-implements every rule in Rust as a first-party feature.

By default, Ruff enables Flake8's F rules, along with a subset of the E rules, omitting any stylistic rules that overlap with the use of a formatter, like ruff format or Black.

If you're just getting started with Ruff, the default rule set is a great place to start: it catches a wide variety of common errors (like unused imports) with zero configuration.

Beyond the defaults, Ruff re-implements some of the most popular Flake8 plugins and related code quality tools, including:

For a complete enumeration of the supported rules, see Rules.

Contributing

Contributions are welcome and highly appreciated. To get started, check out the contributing guidelines.

You can also join us on Discord.

Support

Having trouble? Check out the existing issues on GitHub, or feel free to open a new one.

You can also ask for help on Discord.

Acknowledgements

Ruff's linter draws on both the APIs and implementation details of many other tools in the Python ecosystem, especially Flake8, Pyflakes, pycodestyle, pydocstyle, pyupgrade, and isort.

In some cases, Ruff includes a "direct" Rust port of the corresponding tool. We're grateful to the maintainers of these tools for their work, and for all the value they've provided to the Python community.

Ruff's formatter is built on a fork of Rome's rome_formatter, and again draws on both API and implementation details from Rome, Prettier, and Black.

Ruff's import resolver is based on the import resolution algorithm from Pyright.

Ruff is also influenced by a number of tools outside the Python ecosystem, like Clippy and ESLint.

Ruff is the beneficiary of a large number of contributors.

Ruff is released under the MIT license.

Who's Using Ruff?

Ruff is used by a number of major open-source projects and companies, including:

Show Your Support

If you're using Ruff, consider adding the Ruff badge to your project's README.md:

[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

...or README.rst:

.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
    :target: https://github.com/astral-sh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>

License

This repository is licensed under the 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

ruff-0.11.3.tar.gz (3.9 MB view details)

Uploaded Source

Built Distributions

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

ruff-0.11.3-py3-none-win_arm64.whl (10.5 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.11.3-py3-none-win_amd64.whl (11.4 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.11.3-py3-none-win32.whl (10.3 MB view details)

Uploaded Python 3Windows x86

ruff-0.11.3-py3-none-musllinux_1_2_x86_64.whl (11.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.11.3-py3-none-musllinux_1_2_i686.whl (11.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.11.3-py3-none-musllinux_1_2_armv7l.whl (9.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.11.3-py3-none-musllinux_1_2_aarch64.whl (10.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.11.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.11.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (13.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.11.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.11.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.11.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.11.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (9.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.11.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.11.3-py3-none-macosx_11_0_arm64.whl (10.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.11.3-py3-none-macosx_10_12_x86_64.whl (10.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.11.3-py3-none-linux_armv6l.whl (10.1 MB view details)

Uploaded Python 3

File details

Details for the file ruff-0.11.3.tar.gz.

File metadata

  • Download URL: ruff-0.11.3.tar.gz
  • Upload date:
  • Size: 3.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.12

File hashes

Hashes for ruff-0.11.3.tar.gz
Algorithm Hash digest
SHA256 8d5fcdb3bb359adc12b757ed832ee743993e7474b9de714bb9ea13c4a8458bf9
MD5 44a050f2a2fd631154570e267fa437e9
BLAKE2b-256 9893f51326459536f64876c932ed26c54fad11775dfda9a690966a8a8a3388d2

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-win_arm64.whl.

File metadata

  • Download URL: ruff-0.11.3-py3-none-win_arm64.whl
  • Upload date:
  • Size: 10.5 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.12

File hashes

Hashes for ruff-0.11.3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 67f8b68d7ab909f08af1fb601696925a89d65083ae2bb3ab286e572b5dc456aa
MD5 10923b92b0d149843266e028018492b7
BLAKE2b-256 cd2ed04d606d0b13c2c8188111a4ff9a99811c40fe170e1523e20f13cf85235e

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: ruff-0.11.3-py3-none-win_amd64.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.12

File hashes

Hashes for ruff-0.11.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 faf1bfb0a51fb3a82aa1112cb03658796acef978e37c7f807d3ecc50b52ecbf6
MD5 df810111d2bbf65c99ca0055400bfe82
BLAKE2b-256 959530646e735a201266ec93504a8640190e4a47a9efb10990cb095bf1111c3a

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-win32.whl.

File metadata

  • Download URL: ruff-0.11.3-py3-none-win32.whl
  • Upload date:
  • Size: 10.3 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.12

File hashes

Hashes for ruff-0.11.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 73d8b90d12674a0c6e98cd9e235f2dcad09d1a80e559a585eac994bb536917a3
MD5 eb435b67c72f9792cd5680e613392c2d
BLAKE2b-256 51a26878e74efef39cb0996342c48918aff9a9f5632d8d40c307610688d382ae

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3ea2026be50f6b1fbedd2d1757d004e1e58bd0f414efa2a6fa01235468d4c82a
MD5 5abf86bb39b669ac57f61be6148ce741
BLAKE2b-256 f57cba479eb45803165dd3dc8accf32c7d52769f9011df958f983f2bcd40566f

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8f8b1c4ae62638cc220df440140c21469232d8f2cb7f5059f395f7f48dcdb59e
MD5 33783185bacbc5c3b1b6774f66c00109
BLAKE2b-256 c4ee8c8dd6ec903f29a4bd1bd4510d1c9ba1a955cd792601ac3822764c7397d8

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 e63a2808879361aa9597d88d86380d8fb934953ef91f5ff3dafe18d9cb0b1e14
MD5 40bbd2e1ddcb3306da4cab9871bb5b57
BLAKE2b-256 3c31711a3f2c0972f44e3770951a19a1b6ea551b9b7c08f257518c35a46666bd

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4800ddc4764d42d8961ce4cb972bcf5cc2730d11cca3f11f240d9f7360460408
MD5 6827d4d401ee7c07b87b4a34b0831d27
BLAKE2b-256 92faa1d68e12c9a2cb25bf8eef099381ca42ea3c8ed589fc4f04004466f4d19f

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9686f5d1a2b4c918b5a6e9876bfe7f47498a990076624d41f57d17aadd02a4dd
MD5 8f5f4504ece61055b95a6bed698d015e
BLAKE2b-256 d4d195ef70afe169400d1878e69ed4fa8b8361e3c5d0a25d2d3d5c25e6347590

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 4e4c38e9b6c01caaba46b6d8e732791f4c78389a9923319991d55b298017ce02
MD5 27cf11ff6fc6144f295b5edda4598de2
BLAKE2b-256 5b000343bec91e505be5f6ac1db13ffca0afe691789e1dc263a05a72b931570f

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2c81d3fe718f4d303aaa4ccdcd0f43e23bb2127da3353635f718394ca9b26721
MD5 5baaafb5a9de0d4fcc19006cec7d4fbf
BLAKE2b-256 9cb32bbfd8aee10de3eed807c9c3d5b48f927efbdada8c0e87a20073f1eb2537

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 9fa791ee6c3629ba7f9ba2c8f2e76178b03f3eaefb920e426302115259819237
MD5 d381476afd056aac4f4a202f11634b61
BLAKE2b-256 a863cf7915adf71d72ccc95b24f9ea3637311f8efe8221a24400d823607e998a

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 72bf5b49e4b546f4bea6c05448ab71919b09cf75363adf5e3bf5276124afd31c
MD5 7a0fce75d020f668d7f49a680423d639
BLAKE2b-256 4c9d8c03b84476187d48eae3ba5f3b7d550da9b5947ab967d47f832e6141c1b2

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f4341d38775a6be605ce7cd50e951b89de65cbd40acb0399f95b8e1524d604c8
MD5 e7b0da1662dabd3c4c5829679f99e31b
BLAKE2b-256 ed820e6eba1371cc221d5a7255a144dc5ab05f13d2aba46224f38b6628781647

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d1ca4405a93ebbc05e924358f872efceb1498c3d52a989ddf9476712a5480b16
MD5 7fd91880394407de5f85d3ebf0bd9245
BLAKE2b-256 31278010ce0b5dae8ad994635c2b112df76f10e9747802ac417a68a06349971f

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 520f6ade25cea98b2e5cb29eb0906f6a0339c6b8e28a024583b867f48295f1ed
MD5 49cded8d36ef343bc1ecae35904e9a22
BLAKE2b-256 1cd0b196c659fa4c9bea394833fcf1e9ff92a941d59474374e3cbda0ba548d2b

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 58edd48af0e201e2f494789de80f5b2f2b46c9a2991a12ea031254865d5f6aa3
MD5 360f143164e920cd9ec8551527733074
BLAKE2b-256 ee33636511dcacae6710660aa1d746c98f1b63d969b5b04fb4dcaf9a3b068a3f

See more details on using hashes here.

File details

Details for the file ruff-0.11.3-py3-none-linux_armv6l.whl.

File metadata

File hashes

Hashes for ruff-0.11.3-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 cb893a5eedff45071d52565300a20cd4ac088869e156b25e0971cb98c06f5dd7
MD5 e11c9d39ccf54a162bdff4ea8416eb0c
BLAKE2b-256 555434341a6363405eea37d05d0062d3f4bff4b268b08e8f4f36fb6f4593b653

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