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.0/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.11.0/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.0
  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.0.tar.gz (3.8 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.0-py3-none-win_arm64.whl (10.5 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.11.0-py3-none-musllinux_1_2_i686.whl (10.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.11.0-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.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (13.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.11.0.tar.gz
Algorithm Hash digest
SHA256 e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2
MD5 8c3fca717ff56a5efd52cd678e04965e
BLAKE2b-256 772b7ca27e854d92df5e681e6527dc0f9254c9dc06c8408317893cf96c851cdd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.0-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.6

File hashes

Hashes for ruff-0.11.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657
MD5 2f62a886af2a6c80295a24d276783018
BLAKE2b-256 4ef7096f6efabe69b49d7ca61052fc70289c05d8d35735c137ef5ba5ef423662

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.0-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.6

File hashes

Hashes for ruff-0.11.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21
MD5 ec2e9ca33aca6d7a1ae8c11309618274
BLAKE2b-256 ed8a163f2e78c37757d035bd56cd60c8d96312904ca4a6deeab8442d7b3cbf89

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.0-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.6

File hashes

Hashes for ruff-0.11.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2
MD5 01e3cf6a41a2e8cc5e888c3b1cfd30f5
BLAKE2b-256 00ef033022a6b104be32e899b00de704d7c6d1723a54d4c9e09d147368f14b62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6
MD5 aa1b73e15eaebfb42a39e7cfaa78b5db
BLAKE2b-256 3032cd74149ebb40b62ddd14bd2d1842149aeb7f74191fb0f49bd45c76909ff2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7
MD5 d10422955ab78d4591cde1b72953da8f
BLAKE2b-256 e2d33e61b7fd3e9cdd1e5b8c7ac188bec12975c824e51c5cd3d64caf81b0331e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7
MD5 d2528630e3be6556ffb08de8b82fcf8b
BLAKE2b-256 60e0475f0c2f26280f46f2d6d1df1ba96b3399e0234cf368cc4c88e6ad10dcd9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445
MD5 38adb3b116438017814fba8c765718ab
BLAKE2b-256 c851dc3ce0c5ce1a586727a3444a32f98b83ba99599bb1ebca29d9302886e87f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db
MD5 b6974e3508f7d56b66a01a5d9c290df8
BLAKE2b-256 9f5e42ffbb0a5d4b07bbc642b7d58357b4e19a0f4774275ca6ca7d1f7b5452cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e
MD5 b87f4b289ec9106037ebbc86da1fe595
BLAKE2b-256 ee47e27d17d83530a208f4a9ab2e94f758574a04c51e492aa58f91a3ed7cbbcb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844
MD5 83649ecdf5a4cb469e6e0c3610976683
BLAKE2b-256 2278da669c8731bacf40001c880ada6d31bcfb81f89cc996230c3b80d319993e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329
MD5 325f45025dcba8ec719784d0d2408045
BLAKE2b-256 84356e7defd2d7ca95cc385ac1bd9f7f2e4a61b9cc35d60a263aebc8e590c462

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905
MD5 33b886ca7db8f995fca169953041c15b
BLAKE2b-256 a69a342d336c7c52dbd136dee97d4c7797e66c3f92df804f8f3b30da59b92e9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8
MD5 da763e7d579fed766424c75d0bc1c51a
BLAKE2b-256 a6c3dcd71acc6dff72ce66d13f4be5bca1dbed4db678dff2f0f6f307b04e5c02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2
MD5 eec96a514fa6d102ded5f55f80450630
BLAKE2b-256 9f5259e0a9f2cf1ce5e6cbe336b6dd0144725c8ea3b97cac60688f4e7880bf13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88
MD5 28bd36e7b2ce785b567e1d38ac2b3e40
BLAKE2b-256 ab62aaa198614c6211677913ec480415c5e6509586d7b796356cec73a2f8a3e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639
MD5 8e7a6968280ac710325cd959506e3473
BLAKE2b-256 eca9d8f5abb3b87b973b007649ac7bf63665a05b2ae2b2af39217b09f52abbbf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.0-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb
MD5 3cbc9012719e5692956f223de26ea5c2
BLAKE2b-256 48403d0340a9e5edc77d37852c0cd98c5985a5a8081fc3befaeb2ae90aaafd2b

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