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.12.8/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.12.8/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.12.8
  hooks:
    # Run the linter.
    - id: ruff-check
      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.12.8.tar.gz (5.2 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.12.8-py3-none-win_arm64.whl (11.9 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.12.8-py3-none-win_amd64.whl (12.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.12.8-py3-none-win32.whl (11.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.12.8-py3-none-musllinux_1_2_x86_64.whl (12.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.12.8-py3-none-musllinux_1_2_i686.whl (12.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.12.8-py3-none-musllinux_1_2_armv7l.whl (11.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.12.8-py3-none-musllinux_1_2_aarch64.whl (11.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.12.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.12.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.12.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (13.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.12.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (14.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.12.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (13.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.12.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (11.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.12.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.12.8-py3-none-macosx_11_0_arm64.whl (11.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.12.8-py3-none-macosx_10_12_x86_64.whl (12.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.12.8-py3-none-linux_armv6l.whl (11.7 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.8.tar.gz
Algorithm Hash digest
SHA256 4cb3a45525176e1009b2b64126acf5f9444ea59066262791febf55e40493a033
MD5 b391a52c260221e468025baaa759867a
BLAKE2b-256 4bda5bd7565be729e86e1442dad2c9a364ceeff82227c2dece7c29697a9795eb

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.8-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 c90e1a334683ce41b0e7a04f41790c429bf5073b62c1ae701c9dc5b3d14f0749
MD5 2b76555a07efba38b8b34f8f53b9e5f7
BLAKE2b-256 cb5c799a1efb8b5abab56e8a9f2a0b72d12bd64bb55815e9476c7d0a2887d2f7

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.8-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 7209531f1a1fcfbe8e46bcd7ab30e2f43604d8ba1c49029bb420b103d0b5f76e
MD5 a63db41d4627792d02e950deab27f3fb
BLAKE2b-256 f6dca2873b7c5001c62f46266685863bee2888caf469d1edac84bf3242074be2

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.8-py3-none-win32.whl
Algorithm Hash digest
SHA256 daf3475060a617fd5bc80638aeaf2f5937f10af3ec44464e280a9d2218e720d3
MD5 fa3fa87deafc5f627bdf438d434a202b
BLAKE2b-256 7113ab9120add1c0e4604c71bfc2e4ef7d63bebece0cfe617013da289539cef8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 45c32487e14f60b88aad6be9fd5da5093dbefb0e3e1224131cb1d441d7cb7d46
MD5 5199f5b51ca12ec213a40cd38ed84218
BLAKE2b-256 189f5c5d93e1d00d854d5013c96e1a92c33b703a0332707a7cdbd0a4880a84fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a2cab5f60d5b65b50fba39a8950c8746df1627d54ba1197f970763917184b161
MD5 18d84f43491ca91e56be1bcc6c95408e
BLAKE2b-256 89fbb3aa2d482d05f44e4d197d1de5e3863feb13067b22c571b9561085c999dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 de4429ef2ba091ecddedd300f4c3f24bca875d3d8b23340728c3cb0da81072c3
MD5 4f6a97749cdab5963ff846e7a8be1c87
BLAKE2b-256 9deef9fdc9f341b0430110de8b39a6ee5fa68c5706dc7c0aa940817947d6937e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 71c83121512e7743fba5a8848c261dcc454cafb3ef2934a43f1b7a4eb5a447ea
MD5 6acce7b9b178e62ca7619c450c9034f2
BLAKE2b-256 4e2a0b6ac3dd045acf8aa229b12c9c17bb35508191b71a14904baf99573a21bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 560e0cd641e45591a3e42cb50ef61ce07162b9c233786663fdce2d8557d99818
MD5 7d609ab49d7c6b28fd4058c09c756f5a
BLAKE2b-256 e8670c3c9179a3ad19791ef1b8f7138aa27d4578c78700551c60d9260b2c660d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 0ac9c570634b98c71c88cb17badd90f13fc076a472ba6ef1d113d8ed3df109fb
MD5 4bad38b391afaf8b0bbae7db253cce79
BLAKE2b-256 814e1b7478b072fcde5161b48f64774d6edd59d6d198e4ba8918d9f4702b8043

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 49ebcaccc2bdad86fd51b7864e3d808aad404aab8df33d469b6e65584656263a
MD5 c1adbe9f3bf746b67f088fa974711c00
BLAKE2b-256 879d98e162f3eeeb6689acbedbae5050b4b3220754554526c50c292b611d3a63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 dbea798fc0065ad0b84a2947b0aff4233f0cb30f226f00a2c5850ca4393de609
MD5 31b95f269a84ca9a0482aa6801d38206
BLAKE2b-256 5ec4f2176a310f26e6160deaf661ef60db6c3bb62b7a35e57ae28f27a09a7d63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 cb82efb5d35d07497813a1c5647867390a7d83304562607f3579602fa3d7d46f
MD5 7bb6330c64bc2957e81e1d14bb0f2c42
BLAKE2b-256 1a4692e8fa3c9dcfd49175225c09053916cb97bb7204f9f899c2f2baca69e450

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ae3e7504666ad4c62f9ac8eedb52a93f9ebdeb34742b8b71cd3cccd24912719f
MD5 0d31945551783df6d837e362b62d50de
BLAKE2b-256 589fea356cd87c395f6ade9bb81365bd909ff60860975ca1bc39f0e59de3da37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c0acbcf01206df963d9331b5838fb31f3b44fa979ee7fa368b9b9057d89f4a53
MD5 a2d9eb778442128093196c229549829d
BLAKE2b-256 feaca363d25ec53040408ebdd4efcee929d48547665858ede0505d1d8041b2e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2fae54e752a3150f7ee0e09bce2e133caf10ce9d971510a9b925392dc98d2fec
MD5 7c3a58d111cd870ec71fd51c4074f713
BLAKE2b-256 999de91f84dfe3866fa648c10512904991ecc326fd0b66578b324ee6ecb8f725

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9a9bbe28f9f551accf84a24c366c1aa8774d6748438b47174f8e8565ab9dedbc
MD5 69adba18046ee0282a53f1fd0a908d9c
BLAKE2b-256 24eeaf6e5c2a8ca3a81676d5480a1025494fd104b8896266502bb4de2a0e8388

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.8-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 63cb5a5e933fc913e5823a0dfdc3c99add73f52d139d6cd5cc8639d0e0465513
MD5 bd924c63779ec9254a573209f494bbf6
BLAKE2b-256 c91ec843bfa8ad1114fab3eb2b78235dda76acd66384c663a4e0415ecc13aa1e

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