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.9.8/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.9.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.9.8
  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.9.8.tar.gz (3.7 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.9.8-py3-none-win_arm64.whl (10.4 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

ruff-0.9.8-py3-none-win32.whl (10.2 MB view details)

Uploaded Python 3Windows x86

ruff-0.9.8-py3-none-musllinux_1_2_x86_64.whl (11.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.9.8-py3-none-musllinux_1_2_i686.whl (10.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.9.8-py3-none-musllinux_1_2_aarch64.whl (10.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.9.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.9.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.9.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.9.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.9.8-py3-none-macosx_10_12_x86_64.whl (10.8 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.9.8-py3-none-linux_armv6l.whl (10.0 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.8.tar.gz
Algorithm Hash digest
SHA256 12d455f2be6fe98accbea2487bbb8eaec716c760bf60b45e7e13f76f913f56e9
MD5 a45c660ea26163186f74d328ceeb4e43
BLAKE2b-256 e959ac745a2492986a4c900c73a7a3a10eb4d7a3853e43443519bceecae5eefc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.8-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 e459a4fc4150fcc60da26c59a6a4b70878c60a99df865a71cf6f958dc68c419a
MD5 d478988776b09a43dd05f5137973ee67
BLAKE2b-256 6e98de77a972b2e9ded804dea5d4e6fbfa093d99e81092602567787ea87979af

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.9.8-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.3

File hashes

Hashes for ruff-0.9.8-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 b0878103b2fb8af55ad701308a69ce713108ad346c3a3a143ebcd1e13829c9a7
MD5 ed9ce2d1ed148eb988a35e94f5c29481
BLAKE2b-256 f5e735877491b4b64daa35cbd7dc06aa5969e7bb1cd6f69e5594e4376dfbc16d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.8-py3-none-win32.whl
Algorithm Hash digest
SHA256 54b57b623a683e696a1ede99db95500763c1badafe105b6ad8d8e9d96e385ae2
MD5 ec7b97cb25e3254632d377d1941f9458
BLAKE2b-256 c4906c98f94e036c8acdf19bd8f3f84d246e43cbcc950e24dc7ff85d2f2735ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6ef7cc80626264ab8ab4d68b359ba867b8a52b0830a9643cd31289146dd40892
MD5 5d33c67035773f0bb0fa36e2b9766327
BLAKE2b-256 74660a7677b1cda4b2367a654f9af57f1dbe58f38c6704da88aee9bbf3941197

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f774998b9c9a062510533aba9b53085de6be6d41e13a7a0bd086af8a40e838c3
MD5 7605a56775dca56d81c73cf2c468c152
BLAKE2b-256 ca332a2934860df6bd3665776ec686fc33910e7a1b793bdd2f000aea3e8f0b65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2f090758d58b4667d9022eee1085a854db93d800279e5a177ebda5adc1faf639
MD5 f06238a5eeb9968497f95e7c7a4f940b
BLAKE2b-256 d81e9339aef1896470380838385dbdc91f62998c37d406009f05ff3b810265f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 100031be9777f67af7f61b4d4eea2a0531ed6788940aca4360f6b9aae317c53b
MD5 58595a18a636111d5f0b3b5026341712
BLAKE2b-256 2865c133462f179b925e49910532c7d7b5a244df5995c155cd2ab9452545926f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 733647b2fe9367e1aa049c0eba296363746f3bc0dbfd454b0bc4b7b46cdf0146
MD5 b8302e03e706cf3c53efeaac7a4e4c60
BLAKE2b-256 2468f1629e00dbc5c9adcd31f12f9438b68c50ab0eefca8b07e11b6c94f11b09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 66662aa19535d58fe6d04e5b59a39e495b102f2f5a2a1b9698e240eb78f429ef
MD5 861b892babb87107911ef3d850799c33
BLAKE2b-256 c68e8520a4d97eefedb8472811fd5144fcb1fcbb29f83bb9bb4356a468e7eeac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 bc86d5a85cd5ab1d5aff1650f038aa34681d0692cc2467aa9ddef37bd56ea3f9
MD5 9a8c186bed45edab3976dfbaa430378e
BLAKE2b-256 1ad4949a328934202a2d2641dcd759761d8ed806e672cbbad0a88e20a46c43ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 a1dfc443bee0288ea926a4d9ecfd858bf94ddf0a03a256c63e81b2b6dccdfc7d
MD5 93c56cca7d2c62da18cba54df466c954
BLAKE2b-256 6a7b53cd91b99a1cef31126859fb98fdc347c47e0047a9ec51391ea28f08284d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c18356beaef174797ad83f11debc5569e96afa73a549b2d073912565cfc4cfd1
MD5 b2b5fc31e962d58a6fe7d76051897259
BLAKE2b-256 fb398fc50b87203e71e6f3281111813ab0f3d6095cb1129efc2cf4c33e977657

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 65961815bb35d427e957940d13b2a1d0a67d8b245d3a7e0b5a4a2058536d3532
MD5 81629fcb39ad2ae0b08acb5e23847d86
BLAKE2b-256 54c0df2187618b87334867ea7942f6d2d79ea3e5cb3ed709cfa5c8df115d3715

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e06635d12321605d1d11226c7d3c6b1245a0df498099868d14b4e353b3f0ac22
MD5 f89dd818f5d5a6b952b229f3b4770671
BLAKE2b-256 f3085e7e8fc08d193e3520b9227249a00bc9b8da9e0a20bf97bef03a9a9f0d38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a82082ec72bde2166ec138055307396c4d4e543fd97266dc2bfa24284cb30af6
MD5 50d26b6f4479324b40b9776beed7d490
BLAKE2b-256 5734cf7e18f2315926ee2c98f931717e1302f8c3face189f5b99352eb48c5373

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 59fac6922b336d0c38df199761ade561563e1b7636e3a2b767b9ee5a68aa9cbf
MD5 faa197140ce91051416c2c807a44da7c
BLAKE2b-256 3510a4eda083ad0b60a4c16bc9a68c6eda59de69a3a58913a0b62541f5c551cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.8-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 d236f0ce0190bbc6fa9b4c4b85e916fb4c50fd087e6558af1bf5a45eb20e374d
MD5 931e3a3956b84f666bb862e345759635
BLAKE2b-256 5c1c9de3a463279e9a203104fe80881d7dcfd8377eb52b3d5608770ea6ff3dc6

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