Skip to main content

A11

A concurrent action and streaming runtime for building AI agents.

A11 lets you write agents as ordinary async def code: values stream between producers and consumers, work is packaged as composable actions, and the same code runs in one process or across a network with a transport swap. The API is Python; the runtime underneath is a native C++20 implementation, so the streaming and concurrency stay fast and off the event loop's critical path.

📖 Documentation →

Install

pip install "a11-kit[llm]"

The [llm] extra pulls in the Anthropic and Google model SDKs. Drop it for the core runtime only.

See it in 30 seconds

Chat with a model right from the terminal (streaming its reply, and its thoughts with -v):

export GEMINI_API_KEY=...        # or ANTHROPIC_API_KEY
a11 chat -v

The ideas

A11 is small at its core — a few ideas compose into everything from a one-file helper to a fleet of networked agents. (The Principles page goes deeper.)

  • Everything is asynchronous. Every operation that can wait is a coroutine you await; the runtime schedules thousands cooperatively. Completion is an event (await action.done.wait()) and lifecycles are context managers that finalise — or abort with the right status — for you.
  • Everything is a stream. The unit of state is a node: a single ordered sequence of chunks with a writer end and a reader end. An agent rarely has its whole answer at once — it has the next token, frame, or tool call — so nodes make incremental production and consumption the natural shape, with backpressure built in.
  • Actions are wired streams. An action's typed input/output ports are nodes, so calling one is wiring streams together. A handler can emit output before it has finished reading input — exactly what streaming an LLM response through a pipeline looks like.
  • Two extension points: storage and transport. A ChunkStore is the log behind a node (swap the in-memory default for disk, a database, or fault injection); a WireStream moves bytes between peers (in-process, WebSocket, HTTP SSE, WebRTC). Everything above them is unchanged, so making an agent distributed is a transport swap, not a rewrite.
  • Sessions tie it together. A Session multiplexes wire streams, dispatches incoming action calls against a registry, and drains and closes the connection cleanly.

A taste

Produce into a node and read it back — backpressure and finalisation included:

import asyncio
import a11


async def main() -> None:
    async with a11.AsyncNode.create("tokens") as node:   # seals on exit
        for word in ["A11", "streams", "everything"]:
            await node.put(word)                          # await = backpressure

    async for token in node:
        print(token)


asyncio.run(main())

Stream a model's reply through that same node abstraction — interact_with_llm is just an action whose text_output port carries tokens as they arrive:

import a11
from a11.sdk.interact_with_llm import INTERACT_WITH_LLM_SCHEMA, interact_with_llm
from a11.sdk.llm import LlmHeaders

interact = (
    a11.Action(INTERACT_WITH_LLM_SCHEMA)
    .bind_handler(interact_with_llm)
    .set_header(LlmHeaders.PROVIDER.value, "gemini")
    .set_header(LlmHeaders.MODEL.value, "gemini-3.5-flash")
    .run()
)

# ...then, inside your async code, feed the conversation in and stream the reply:
async for chunk in interact["text_output"]:   # tokens as the model emits them
    print(chunk, end="", flush=True)

The guides build these up step by step — from a node, to a WebSocket echo session, to calling an action on a remote server, to a tool-using agent.

Learn more

  • Documentation — principles, guides, and the full Python API reference.
  • Guides — hands-on walkthroughs from a single stream to a networked, tool-using agent.
  • Examples — runnable programs under examples/.

Building the C++ runtime

A11's runtime is a standalone C++20 library you can build and link without Python. The steps below are self-contained; for the editable Python build, wheel matrix, testing workflow, and architecture, see BUILDING.md.

1. Install the tools, then build the C++ libraries. A11 links a pinned set of statically-built libraries (Boost, OpenSSL, libcurl, nghttp2, hiredis, nlohmann-json, uvw) rather than system copies; scripts/bootstrap_wheel_deps.sh builds them into a per-architecture prefix. From Homebrew you install only the tools (a C++20 compiler, CMake ≥ 3.28, Ninja; Linux tool package names vary):

brew install cmake googletest ninja pkg-config

export A11_DEPS_PREFIX="$HOME/.cache/a11-deps/$(uname -m)"
export CMAKE_PREFIX_PATH="$A11_DEPS_PREFIX"
export OPENSSL_ROOT_DIR="$A11_DEPS_PREFIX"
export PKG_CONFIG_PATH="$A11_DEPS_PREFIX/lib/pkgconfig"
export MACOSX_DEPLOYMENT_TARGET=14.4   # macOS only
scripts/bootstrap_wheel_deps.sh

CMake still fetches the pinned Abseil (and libdatachannel, for WebRTC) automatically. See BUILDING.md for the full rundown.

2. Configure, build, and install to a prefix (the exports above point CMake at the dependency prefix):

cmake -S . -B build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DA11_BUILD_PYTHON=OFF \
  -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \
  -DCMAKE_INSTALL_PREFIX="$PWD/install"

cmake --build build -j
cmake --install build

On macOS, pass -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 as shown — it must match the value the prefix was bootstrapped with. Setting it as a cache variable here (not only via the MACOSX_DEPLOYMENT_TARGET environment export, which CMake may not pick up) is what enables the Boost.Fiber futex spinlock; a lower target compiles Boost.Fiber without futex support and fails with "futex not supported on this platform". The flag is ignored on Linux.

3. Use it from your own CMake project. The install exports a CMake package named a11 with per-component targets (a11::service links the whole runtime). Point your consumer's CMAKE_PREFIX_PATH at both the install prefix and the dependency prefix from step 1, so the transitive static Boost/OpenSSL/… resolve:

find_package(a11 CONFIG REQUIRED)

add_executable(my_agent main.cc)
target_link_libraries(my_agent PRIVATE a11::service)
target_compile_features(my_agent PRIVATE cxx_std_20)
#include "a11/nodes/node_map.h"

int main() {
  auto node_map = a11::nodes::NodeMap::Create();
  return node_map.ok() ? 0 : 1;
}

Configure your project with -DCMAKE_PREFIX_PATH=/path/to/install so find_package locates it. The generated C++ API reference is published alongside the docs.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

a11_kit-0.3.1.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

a11_kit-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl (10.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

a11_kit-0.3.1-cp314-cp314-manylinux_2_28_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

a11_kit-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl (8.4 MB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

a11_kit-0.3.1-cp314-cp314-macosx_14_0_arm64.whl (8.2 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

a11_kit-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl (10.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

a11_kit-0.3.1-cp313-cp313-manylinux_2_28_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

a11_kit-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl (8.4 MB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

a11_kit-0.3.1-cp313-cp313-macosx_14_0_arm64.whl (8.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

a11_kit-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl (10.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

a11_kit-0.3.1-cp312-cp312-manylinux_2_28_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

a11_kit-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl (8.4 MB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

a11_kit-0.3.1-cp312-cp312-macosx_14_0_arm64.whl (8.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

a11_kit-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl (10.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

a11_kit-0.3.1-cp311-cp311-manylinux_2_28_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

a11_kit-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl (8.4 MB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

a11_kit-0.3.1-cp311-cp311-macosx_14_0_arm64.whl (8.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

File details

Details for the file a11_kit-0.3.1.tar.gz.

File metadata

  • Download URL: a11_kit-0.3.1.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for a11_kit-0.3.1.tar.gz
Algorithm Hash digest
SHA256 aa46db2bcb032f1a277c43ddf378dd68399a8b496ca6f83c65ad4bb41201597a
MD5 a17fb565fd34fff4bbf673582a63dfec
BLAKE2b-256 ed3f9363351bc595d7f8bdd75f7dc7159ce6fa65eda89f708399c81bb64e3140

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1.tar.gz:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 47ff2b22512c413ad9f7a954a6494607ef784a9811d5609febbb6de5a998d0b4
MD5 811717619392fa41644a0b05d8db9578
BLAKE2b-256 0a89de82158a8ca978cedbe56c371414a3dd681aea8f906c46b7ca9f5c0151ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c6fe3e8bdd82dae5ce2055a73c6b56b044464e1efda41418f904ed5fe6bd9d4c
MD5 22c8bd67b82a041ae3a4ef7beb83fcbd
BLAKE2b-256 d83c95d56daf853b0dffbea232013aa6f28095446abc09c1292852649fa40ed1

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp314-cp314-manylinux_2_28_aarch64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7cc8d2b8aba4071fd0e94a9ae267ed4b4e96ddc598ce56880be93e6b84a30448
MD5 d7360d05bf474598cac9288e542e95c4
BLAKE2b-256 a4c00e3890eea7cba7d227afd065093fe652c506aca8aa18c49d688bbc54fd60

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 fb6349f0a5cb45bce7c7a770b6a2590cb315d82ed2ee5acb5f702af303c05a6f
MD5 3ba2f859dad4b7cc41ca6387ffce5774
BLAKE2b-256 8cd21bc8955ebf658bb7ae4aa8188ba6694ee1cd51feb2b69e30a3703bc1d326

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 59bffbd054f7bf4273b4aee6235874e3744164d29f6e3806e229c5e5cb73b375
MD5 a03a370af134a27ab026068444e8ef82
BLAKE2b-256 a35f05cbca81690c32487c8d3260cdf7281a1566cab3e32683c7b68a79427b3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 79d9b955e07c2e58a458b892882fd009ab5cae125604da9ef8aa3fa6df3161d7
MD5 a88c1f8761d85720c1b4b672dd70b3f7
BLAKE2b-256 954437fc2a840e3cccba25728a50c0463a101f9bfaa8f00f8e3ff4235dfb2bcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 2654ab4b9ebe6f77544d3586b1880845970e6daeb70a1971abd46689fa3b4ff2
MD5 81c6e48b560bbac20f8dd13a8c038ed0
BLAKE2b-256 8690a4d8fe2f75dfec203269be785184edf4648ff5b84e3437fcfef8a0f262b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 37f58044afbfd09e0095f7a5644c033144d0d8ed1bf801ac0cd4ed5f6a37e1e1
MD5 582d2f849da5446c8bd06da174761c8c
BLAKE2b-256 40c805a7d671b7cf681fb1dbdfd9f441b717571c18a48dd802d15cac1645d858

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d2d6b10d74102d0b0d3f0afcc2c72e7b4bd680f7809e9236ce3e4e8002554010
MD5 fc0ec62f1149e297a981442607183048
BLAKE2b-256 e3c57f9967ab8c38d0bb8aca268f16ba66d9d8a0712a70bbb9e5aebe61bd376d

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fc8efa409f00750319746a6e892731165563eee2e506d827fe73c2b6932c00a5
MD5 d3d99b6e8335f0e1f916c8f3069e4168
BLAKE2b-256 a1b4f36a4ed1b662979098901abaad5d0a5130c1d15cbe413a36624100ce9097

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 0385769a6cd0667ecbcfa309eb021d215c8be13d498e0f09e2c9372d51141256
MD5 d0e99197286aca7a707d19161b65a875
BLAKE2b-256 eb2fae3d9376e5fdcdc098bb37a860ac78115d41abdfb1a282a781449d65e2a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b267baa19c3973a3627b52c984561afb54e13ee6f0481a41654765705bdfc66e
MD5 ae22e23d5f508c7cd12e1bc00681cbf9
BLAKE2b-256 12cabea330fa43fcef033a87456082b43a4b9861990766e0352242d2f83f7946

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6028e3d50c14da8cc0f5ed2bbf3e4c070f6e501f67cf5be239af7468acbbb3e7
MD5 62e9ffe5644dcfa1c99d6c38ede30f8b
BLAKE2b-256 577afb6a2c31e379b27902b2050aa6b677dc71ce8000047b3028006541286be6

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 776c4a84cf42fab64248220e0aae754db6c4963c05bd1105a9c2c7fa818c6822
MD5 070d3bdb839cb14f31e5141e79aa91e2
BLAKE2b-256 c1d49a4fb0d4a346a4d4334ef9a0afe781db6e381aea01c1634379868d5a5807

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp311-cp311-manylinux_2_28_aarch64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 661744ad38292d6140ff5be7beead87a186f187ceafb2f167f1246becaa0ba7f
MD5 7e8fef25e0ececa47eb4c42955738e99
BLAKE2b-256 5049f284cb70baf070c175477bfef3457bab587cc06eef043fb90b6e63d323cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a11_kit-0.3.1-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.3.1-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9ec8c3c49f7826305545a317f2ff4b8dd8005cdc9d35a55ffed26c73201805b4
MD5 b6969176250683d667a50b68c90a5a74
BLAKE2b-256 054c504833616daeaed0d3f53fe5b5f95c138e9ecbb967458f6ee5523412de15

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.3.1-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: release.yml on hpnkv/a11

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.5.6

17 files

0.5.5

17 files

0.5.4

17 files

0.5.3

17 files

0.5.2

17 files

0.5.1

17 files

0.5.0

17 files

0.4.6

17 files

0.4.4

17 files

0.4.2

17 files

0.4.1

17 files

0.3.3

17 files

0.3.2

17 files

This release

0.3.1 This release

17 files

0.3.0

17 files

0.2.5

17 files

0.2.3

17 files

0.2.2

17 files

0.2.1

17 files

0.2.0

17 files

0.1.8

17 files

0.1.7

17 files

0.1.6

17 files

0.1.5

16 files

0.1.4

16 files

0.1.3

8 files

0.1.2

8 files

0.1.1

17 files

0.1.0

3 files

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