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.2.0.tar.gz (660.0 kB 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.2.0-cp314-cp314-manylinux_2_28_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

a11_kit-0.2.0-cp314-cp314-manylinux_2_28_aarch64.whl (7.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

a11_kit-0.2.0-cp314-cp314-macosx_14_0_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

a11_kit-0.2.0-cp314-cp314-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

a11_kit-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

a11_kit-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl (7.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

a11_kit-0.2.0-cp313-cp313-macosx_14_0_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

a11_kit-0.2.0-cp313-cp313-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

a11_kit-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

a11_kit-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl (7.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

a11_kit-0.2.0-cp312-cp312-macosx_14_0_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

a11_kit-0.2.0-cp312-cp312-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

a11_kit-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

a11_kit-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl (7.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

a11_kit-0.2.0-cp311-cp311-macosx_14_0_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

a11_kit-0.2.0-cp311-cp311-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for a11_kit-0.2.0.tar.gz
Algorithm Hash digest
SHA256 483731e201ad5c813404c7c5b392878a79e29592d1cbfe99fbd6b9f508e7e8aa
MD5 d50d2daacaa59481d0fbe36c4cde72c5
BLAKE2b-256 d202f2f0940aab635ed788f26ed781f88a1e82e7e2cf5629f51586c1ae740404

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0.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.2.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9ffbd744c6c650bd69d37a48d3c65559811122d4b9ab2278a4d9bb14dd2d7dcb
MD5 7992eb23c205c4f4113537a18e93612d
BLAKE2b-256 da1f47f36d3e98232cb3e9f83367f161d420cf4fd279c428de1a0678eb06bfe5

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d31b8e6431d8fa173efc49358113ccce795960a93a697c3e64b52b30de12c29f
MD5 8bcbf379ce05c0de769ac4c66618507f
BLAKE2b-256 611b6a9360d51c68fbdb9aa8ce816a3566c3466f553c45684c205ecd3fc9eb44

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp314-cp314-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 8d8972cf8c015e6b4894774c7740f761bc9c397317ecbd73272bd40995498624
MD5 8cf7124cd5061051c12166a181d1a1a0
BLAKE2b-256 27410ace01400df8ddf935c442963083e59f6e7cf6a55160d45ee49af4ebcf71

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 71a9d3b39d110d37d221354bd2e9c165f094815e525b3d01f16e86362ae754b4
MD5 e7369b83313aa7635c53b48473c2d39f
BLAKE2b-256 c8073861ad58eeacb0216c3c7a800beb7464ee87966935d2d28b122b76b8c3f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b9aed7666f0856364e4c0fc411549865d25440ffd47a8e18053c7cca90ff6c19
MD5 1e176119cb8c631abc913a7a23b7f482
BLAKE2b-256 a185731f06f001cdcf2de5486f945f3b96d2eefcc4cd6ce2af39fb6929143ce7

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b35264ed3cc7ced946c4e1c880dbd810b5c746cdb28fa2ceb067bbac9b158a8e
MD5 abaa69032fb4d95b0c89dd90635487aa
BLAKE2b-256 1edfb4135c2db9766966533d6f8f333fe54ea0ed80f1926e8525a065af3b605e

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp313-cp313-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 a630044d7ba579b9f07a95b6479e0882b2bef1958c3f91a03c25d57e54ff3e18
MD5 63a413e4559804149bf68c5c1c3b5219
BLAKE2b-256 21dd16bee70281332eee84dc312b9ff9675f96af608046fc31c63079c774ecc3

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6c3f5655a6923f69bd3b9430d73cd93a4449c5217ac13417dee155d5013a8839
MD5 00855d9965335c5910e3253fe3dd34ec
BLAKE2b-256 0a12b790604981fe949e535ec055a6d9cf7cdc794c7fd272b18ab04bbae60466

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b665ac40b75b0cbf362c6d54829e7701d40f2d04a6c39cda1feaed88523a1a25
MD5 3c9d948ee4715ae31db4c27e3bb8f038
BLAKE2b-256 440da90052b2ba0e893af66176c81fe1bc06980f64a0fb1ad9994cd622a3fb50

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 aaf663a4e618721c228a214b68b4cf85b170774a128aac32829ff70ad933e42b
MD5 0632f6bf7d51fcb50bf97230e08e253b
BLAKE2b-256 9c5c957c2b09cbf845e0ac045531045c03eab95c11b08642d9aeafd6d0fdfbdd

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp312-cp312-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 61ecb5e7dbff9bcb20e066c977e4e1024d774f9aa31b9e1f49a9544e0d44d08d
MD5 5dba3d97fa69d5cf6415a98f692252e3
BLAKE2b-256 9ae5c8c73d991f7b1fdef75e0eb7f92ec07e30c93d040257865764a3783e3a97

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e5aef0644fb37d926a9729a1581140855abf970645b06c9790ca2e39efa0f31f
MD5 125477c3877ee6685f9649f877ab0087
BLAKE2b-256 9cbb5fc40cf3d0bd53ae27e34a1f9a76396683dbf147632c15fd49ff16039653

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0ce1b26591a8a74fb5997e67db2052ccdc8c78414ff53e2ef85e7ff5bb48acf9
MD5 7ae17e183a007cc16748752d4899aa71
BLAKE2b-256 1b7402da88f8b3dad20d2076975f69dffcbc55005e2c07ad4514a25f00f4ad9f

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 db9bba5e252b56772451abaf018431b8eb6cf54d22d1baa9cc01098e7aa77c7e
MD5 28b13768c99aae22e2a44bc502ee5d2e
BLAKE2b-256 69b5152fb57dadc7f316939a545671eb9fa9f323365c13aff76097a7e1bdda25

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp311-cp311-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 f8c12d53801a464bbf34cf3ad192aded30fcf74f9770868184374b78a57f202d
MD5 c8e40fc1aa8ddd7039ac261d2e961f65
BLAKE2b-256 c479a2d210389820164ad36afadf031bf5ed2b4158b42d7db6938d1765c420e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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.2.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for a11_kit-0.2.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 04a1b8de5b8ae3d79cf8dd4aa607fc33957a7548bac1f1d742a9eb0c7051af0b
MD5 ec22b756b30f68fbe72669fe420a2bc2
BLAKE2b-256 ee4f0bc66fb414282bfd4cd0a72a51bdc5219d1dd2ffffa6bf05940f530774a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for a11_kit-0.2.0-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

0.3.1

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

This release

0.2.0 This release

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