Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

pyaio: asynchronous file I/O for Python on Linux

pyaio gives asyncio programs file reads, writes and fsyncs that don't block the event loop, backed by io_uring. It also still ships the original callback API on glibc POSIX AIO.

flowchart LR
    A["await io.read()"] --> B["UringIO<br/>(asyncio)"]
    B --> C["Ring<br/>(C, liburing)"]
    C <-->|"submission and<br/>completion queues"| K["Linux kernel<br/>io_uring"]
    K -->|"eventfd"| L["event loop"]
    L -->|"results"| B

How it works, with diagrams: docs/architecture.md.

Requirements

  • Linux 6.1 or newer with io_uring allowed, CPython 3.10+
  • Building from source also needs the liburing headers (2.2 or newer: liburing-dev on Debian/Ubuntu 24.04+, liburing-devel on Fedora, liburing on Arch).

Where pyaio does not run: there is no fallback. Creating a UringIO raises OSError (with the reason) when io_uring is unavailable, which is common in:

  • containers using Docker's default seccomp profile, and most sandboxes;
  • systems with kernel.io_uring_disabled set (hardened or shared hosts);
  • kernels older than 6.1.

If your code has to run in those places, use a thread pool (loop.run_in_executor with os.pread) or a library with fallbacks.

Install

pip install --pre pyaio      # release candidates need --pre

Wheels for x86_64 and aarch64 bundle liburing, so nothing else is needed. To build from source instead, install the liburing headers first (tools/install-liburing.sh builds the pinned version) and run pip install ..

Quick start

import asyncio
import os

from pyaio.uring import UringIO

async def main():
    fd = os.open('/tmp/pyaio.txt', os.O_RDWR | os.O_CREAT, 0o644)
    async with UringIO() as io:
        await io.write_all(fd, b'hello io_uring', 0)
        await io.fsync(fd)
        data = await io.read(fd, 0, 5)           # bytearray(b'hello')
        chunks = await asyncio.gather(           # one syscall for all four
            *[io.read(fd, off, 4) for off in range(0, 16, 4)])
    os.close(fd)

asyncio.run(main())

API

UringIO(entries=256, max_inflight=None) must be created inside a running event loop and used from that loop's thread:

Method Result
await io.read(fd, offset, nbytes) bytearray; shorter than nbytes at end of file, empty past it
await io.write(fd, data, offset) bytes written, which can be short like os.pwrite
await io.write_all(fd, data, offset) len(data); retries short writes
await io.fsync(fd, datasync=False) 0
await io.aclose(timeout=None) cancels outstanding work without blocking the loop
io.close(timeout=None) the same, blocking the calling thread
io.inflight, io.queued, io.closed introspection
  • offset=-1 means "current file position". Concurrent requests that use it run in no guaranteed order.
  • Errors raise the matching OSError subclass (FileNotFoundError, IsADirectoryError, BrokenPipeError, ...).
  • Cancelling the awaiting task cancels the kernel request. Pipes and sockets stop immediately; reads and writes on regular files the kernel has already started usually finish anyway, and their result is discarded.
  • Backpressure: at most max_inflight requests (default 2 * entries) are handed to the kernel at once. The rest wait in a queue without allocating buffers.
  • Close timeouts: if requests are still running when the timeout expires, pyaio abandons them. Their futures fail with ECANCELED, their buffers are leaked rather than freed (freeing memory the kernel may still write to would corrupt memory), and a ResourceWarning is emitted.
  • Don't use a UringIO in a child process after fork(); create a new one there.

Limitations

  • Only read, write and fsync. No open/stat/close, vectored I/O, registered buffers or O_DIRECT aligned buffers.
  • Kernel cancellation cannot interrupt disk I/O already in progress, so a close on a hung network filesystem waits until its timeout.
  • The C extension relies on the GIL. On free-threaded Python builds the GIL is re-enabled when pyaio is imported.
  • CI covers Python 3.10 to 3.14 on Linux 6.8 and 6.17 (GitHub's Ubuntu runners) with liburing 2.15.

Legacy POSIX AIO API

The original callback API is still available. It uses glibc's POSIX AIO, which runs blocking I/O on a user-space thread pool (see the comparison). It is loaded only when first used.

import os
import time

import pyaio

def on_read(buf, rcode, errno):
    if rcode > 0:
        print('read', bytes(buf))
    elif rcode == 0:
        print('EOF')
    else:
        print('error', errno)

def on_write(rcode, errno):
    print('wrote', rcode) if rcode >= 0 else print('error', errno)

fd = os.open('/tmp/pyaio.txt', os.O_RDWR)
pyaio.aio_read(fd, 0, 20, on_read)               # fd, offset, length, callback
pyaio.aio_write(fd, b'data', 30, on_write)       # fd, buffer, offset, callback
time.sleep(0.1)  # callbacks run on the main thread while it executes Python

Wait for callbacks before queuing many more requests in a tight loop, or pyaio may stall when glibc's AIO queue is full. Tune the pool with pyaio.aio_init(max_threads, max_queue_size, max_thread_idle_seconds). pyaio uses 5 * cores threads and 4 * threads queue entries when that is more than glibc's default of 20 threads and 64 entries. An exception raised in a callback is reported through sys.unraisablehook.

Development

python -m venv .venv && . .venv/bin/activate
pip install setuptools pytest
python setup.py build_ext --inplace
python -m pytest

See CHANGELOG.md for release notes and RELEASING.md for the release process.

License

BSD-3-Clause. See LICENSE.

Metadata

Release files for pyaio 0.5.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyaio 0.5.0rc1
File Size Uploaded Provenance Actions
pyaio-0.5.0rc1.tar.gz 33.9 kB With provenance Details for pyaio-0.5.0rc1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pyaio 0.5.0rc1
File Actions
pyaio-0.5.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyaio-0.5.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyaio-0.5.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyaio-0.5.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyaio-0.5.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyaio-0.5.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyaio-0.5.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyaio-0.5.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyaio-0.5.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyaio-0.5.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyaio-0.5.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyaio-0.5.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyaio-0.5.0rc1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyaio-0.5.0rc1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyaio-0.5.0rc1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64, Linux glibc 2.17+ ARM64 Details for pyaio-0.5.0rc1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyaio-0.5.0rc1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyaio-0.5.0rc1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyaio-0.5.0rc1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyaio-0.5.0rc1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Total release size: 857.1 kB

Release files / pyaio-0.5.0rc1.tar.gz

Download URL pyaio-0.5.0rc1.tar.gz
Size 33.9 kB
Tags Source
SHA-256 checksum
How to use checksums
efcd0d1e1ffa8c025666d74f9b23b9f58efc9fc91768d83baa296e8107187cef
BLAKE2b-256 checksum
How to use checksums
b8e2bb3851951bd6ca3b327eecd2059b31332085897b834a9795a0956f84eb1d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyaio-0.5.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 80.3 kB
Tags CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8f2255e27802273f02e050ee5b7167e57cc266aa69e8f890e6c77eb5e83786b7
BLAKE2b-256 checksum
How to use checksums
8c8747dc22572b9254ece167d5680717500f522741e9611215d8bc793f1471bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyaio-0.5.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 85.6 kB
Tags CPython 3.14 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
08ae06b5cc7699a8d65382b14b4c05d0a971be4a7deb016eab2299a96640a883
BLAKE2b-256 checksum
How to use checksums
1bd746056404f7883a903625bd989d59ced3ae384937775ef198bea8116e9b34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyaio-0.5.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 80.4 kB
Tags CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6490d86cf162b4f071a75ab5d4bb8678439624d34446fd83e557c5ea6c5af179
BLAKE2b-256 checksum
How to use checksums
b50292377168b309551356a6b2acccf348847b0e49a94f79cf50363d9be7322f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyaio-0.5.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 85.5 kB
Tags CPython 3.13 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
68e4045f36b9670ccab1d41ab61370b865dbefeab760e599f6b17c855e6366f7
BLAKE2b-256 checksum
How to use checksums
8449cdc4cfd5717f565a4030ca3878da0c3d669b8d9008c98d919303f2e0f116
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyaio-0.5.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 80.3 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a489ea439edba2445663e25fe91d07a540ac43f31d030fa0db3ea215fb93070b
BLAKE2b-256 checksum
How to use checksums
f80f336a72ea041e0ed0ac828e8583f6688574bcd2d97abe697c0dfb6b15b11b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyaio-0.5.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 85.4 kB
Tags CPython 3.12 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
1efc8c159cf4c784349fdc4438fc1c8b09704a6c624ef816c3c402f5dcacb807
BLAKE2b-256 checksum
How to use checksums
719b1369f929ae6120eb55ba57615dc9bf15b016dcaef59cdc1bdc5832afc87d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyaio-0.5.0rc1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 79.3 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d9d7d595e7782e0b24905b00bcdd560a4630b11f142e7b944d5becccd0282fae
BLAKE2b-256 checksum
How to use checksums
cf17a6237f9cd5fb63ad646318e148427cd28d978f492e8790d3a798fda117ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyaio-0.5.0rc1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 84.9 kB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
4cee95c504aff4add48853d73055890539af750a040b7d60671d05e050333191
BLAKE2b-256 checksum
How to use checksums
e9de6286f09bc6c807d9ee0eff605928246b6f665e6fdad233943f92ae0439d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyaio-0.5.0rc1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 77.9 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f71ff3a73b477381067d460bafcdc9ea90f45bd99e709c7b2551df51b4b1afd4
BLAKE2b-256 checksum
How to use checksums
f6628afe816a4f0ca064d758dbefa450af26e8101184268e09d90926b0050f71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / pyaio-0.5.0rc1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyaio-0.5.0rc1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 83.5 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
405253f40db50ecea058f810c247643bbcce3eeadb57f9cd7842407672fda0ed
BLAKE2b-256 checksum
How to use checksums
2acb0fe9afcc9cb0695d204272741faa498a689cddc1b3c546a6cf5baeacd063
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Security for pyaio 0.5.0rc1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 11 files in this release have been uploaded with provenance metadata.

Select from 11 files

Attestation for pyaio-0.5.0rc1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page