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.6/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.9.6/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.6
  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.6.tar.gz (3.6 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.6-py3-none-win_arm64.whl (10.2 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.9.6-py3-none-win_amd64.whl (11.0 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.9.6-py3-none-win32.whl (9.9 MB view details)

Uploaded Python 3Windows x86

ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl (12.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.9.6-py3-none-musllinux_1_2_i686.whl (12.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl (11.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl (11.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (14.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (12.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (13.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (12.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.9.6-py3-none-macosx_11_0_arm64.whl (11.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl (11.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.6.tar.gz
Algorithm Hash digest
SHA256 81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9
MD5 6174dc2b94864036eec9aa87efbe0d2f
BLAKE2b-256 2ae1e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.6-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a
MD5 a886cc675d8d022ce16ea85bfe6ad85a
BLAKE2b-256 e8a8d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa
MD5 56ffa9e4732fda4fa71be1f9f582fdd7
BLAKE2b-256 ee30c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.9.6-py3-none-win32.whl
Algorithm Hash digest
SHA256 194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d
MD5 7277215eb46ca83ec3e0cb9d166b7008
BLAKE2b-256 a57d7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656
MD5 fd2d038212ad96c9de7367956a4503ca
BLAKE2b-256 ecbc54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08
MD5 fc21515c2c0b693e368c38d740503064
BLAKE2b-256 3cdb98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897
MD5 9e44638d8a1215162163485802f826f1
BLAKE2b-256 f12b6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6
MD5 f88c12da5cfced747f02ba887ad237e9
BLAKE2b-256 84f5e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217
MD5 9526aebe2f589d0af7155111f1628604
BLAKE2b-256 3170e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5
MD5 d32abf485d53eb7886de5ab86a84e387
BLAKE2b-256 c5268208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5
MD5 35e9245b243a5d2dd1e3b44d30947a62
BLAKE2b-256 6644545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666
MD5 974a1779e9ca1b4c1020acc2ce4662d3
BLAKE2b-256 f5c4db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e
MD5 7785bf46512c779b58c626930308675a
BLAKE2b-256 b56f3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b
MD5 07af664ff037eb7bca68cb85ac1b0ecf
BLAKE2b-256 7df223d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc
MD5 3734b07d704f56f4d442339d2cc375fd
BLAKE2b-256 a6e345de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83
MD5 1017480d0489c36f9f5d4ea3d15b13be
BLAKE2b-256 75a7f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504
MD5 b098aba140e71a0bc6e8cffc47d117b8
BLAKE2b-256 e122aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.9.6-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba
MD5 48a36b9139d80a6f8ffddf7f4e91d168
BLAKE2b-256 76e33d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be

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