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.1.6.tar.gz (648.2 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.1.6-cp314-cp314-manylinux_2_28_x86_64.whl (7.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

a11_kit-0.1.6-cp314-cp314-manylinux_2_28_aarch64.whl (7.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 14.0+ x86-64

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

Uploaded CPython 3.14macOS 14.0+ ARM64

a11_kit-0.1.6-cp313-cp313-manylinux_2_28_x86_64.whl (7.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

a11_kit-0.1.6-cp313-cp313-manylinux_2_28_aarch64.whl (7.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 14.0+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

a11_kit-0.1.6-cp312-cp312-manylinux_2_28_x86_64.whl (7.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

a11_kit-0.1.6-cp312-cp312-manylinux_2_28_aarch64.whl (7.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 14.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

a11_kit-0.1.6-cp311-cp311-manylinux_2_28_x86_64.whl (7.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

a11_kit-0.1.6-cp311-cp311-manylinux_2_28_aarch64.whl (7.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 14.0+ x86-64

a11_kit-0.1.6-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.1.6.tar.gz.

File metadata

  • Download URL: a11_kit-0.1.6.tar.gz
  • Upload date:
  • Size: 648.2 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.1.6.tar.gz
Algorithm Hash digest
SHA256 cbd574fb837712d5a515e400f07f828b4ab96693063abb7da964cce85fa072ab
MD5 3bf70ac56ceee5eb528154d6df177cb9
BLAKE2b-256 8d99b7053984ef641bd2b4c779cc9fd1b8dee42bdd1aad088dea41d5b294e60b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d95d4772445fad6d98589ef6f3f7c70211aeebfa6c39abecf15820f8353f9947
MD5 038bb71240b7c9342395d617cc49ad02
BLAKE2b-256 dbf3c76ddb8a7d4a9ab5ed57792c0783c154b153f27a2118c79876edbb689821

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d3c024aaf92984fbac0c61f5d93b5afd47a714fb1ac45a2fe42ae357add0fd15
MD5 a6adfb5c27c7f5b199afd3092eb7fd8f
BLAKE2b-256 21f360b541675cbc3ded5f6fea7ac013c031661bfc9a5d58f9427a05fe7ab6c7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 63f318bc3efd15b344b2144aca8bf1813e3ede6dfa8ef789d43da7f2f0f9e980
MD5 60f7ed8e0dae5c34c0fc331bb343301c
BLAKE2b-256 6b3a77520c21f1a77ade1c08c86dc19c74b66f0a7b14769ac5b65f00d73c6dd9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 65412e2db1cd79991f514238fa8c675ebf2560a4bfd237b9a53c649418a9dcff
MD5 f04f9a872c963390957e819fcd46018d
BLAKE2b-256 8b36ee7f571cb66564e60eb9b0291e8d8e4cecd51fc44302566c565165df1896

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2289b603dd0f3f8bccb8ec2add392fad68fa1637cb5f28c6e420c7cdec98cd33
MD5 80f8aa8912f4881ca64be6fe8c28aafc
BLAKE2b-256 f18b04925dc198fe394d734b72c1bdbd0054b4e08b773ca28507b5aae50d7944

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b69b5fdeb683108d6f2d93fc6145010cc73d64827cf4a37fad45ae5049ec8252
MD5 20f062a947f89cb351d4aca9cf9b7774
BLAKE2b-256 dd5294259272db2c307a2d4692a55373a163f78d53c3ecfdfbba1609d893b70d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 176ad9ca1adf0e10445c2bfbd543d6fb78bebc5c2e81876bee18ffa657f9463a
MD5 88c4799e946db72a9de29495c543521c
BLAKE2b-256 70cf4047a46a4127dc152f3d45c9f07a0a136674090bb6273bf57eae93a9f410

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3c7a49976f71b23a2e5b571877140a51855bdc4fb16b28d16b547ccc3192ba0e
MD5 f35836c8f1309df2013408f36568c2d5
BLAKE2b-256 a188800048da6b6f363af8aa26b5e8051fd2ad7d02ba6b02de08ee9eee4d4855

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e5372ec298582ba70edbc1e11d0464a50e64aa71b57fa1ce309ccb6c351fe7bc
MD5 2d5a0f87d2d3c61b5bb223501f1591d8
BLAKE2b-256 8781f38cc33dbada803e28819fe6ccf698b68affd64dcc7ce8eab06aee969e88

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 42652163a967a45c945b3be70caadb54c4114ddbc8612e34ebc2426eedeef97b
MD5 01da99d20b6ee78aaf10104a61e334b2
BLAKE2b-256 263ddb709774f2af0f34f3decedae1353dbc40a387a78b5cb9bee4fa7026fefa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 0dcf89b74743dec5102248652bec3484d2c649753af7ce992d69745e364430de
MD5 e4991297db1142e4bdc4d573a000f1ce
BLAKE2b-256 2ad3c7e0eb62a4dd06ddd7e964b4470ab3607f5893b398c5c36031013491b529

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e276845d3ba4d79ff101c863e030f2e530601cb18ff3a16d31364ad40fb92817
MD5 dceab68404311a6c7d3f75559317e7af
BLAKE2b-256 a98048c7ba2d2ec7f1a3c6d53e3c40bd4dd2f8d263492c021c59c77f155dd7bb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86446a9ad2bd6ba3d11b0f87789419b90c121cd9456c771c42dee6dc15cbba44
MD5 05127803660deb0536cb2dc35a75b829
BLAKE2b-256 38cf10fd98e71c6a403a8eb89b23ec1687b91bb6bf93646234f714b342631b23

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e5e04adfa241627236b1825671fefde7c00734f133e513cb9c16afc72e113826
MD5 804079f0fe8797b35bc93823c18d5dcb
BLAKE2b-256 be2e806f549661ec8a199ae70576f01ec458b9e8a570f6625d85cc2d6c9f6566

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 2f27b573edf6a4b5606c9f9f2661687185fd152a723521b7ec24d2ba7a5ddbe6
MD5 cb08586789c083d4ddc1781b5847ff69
BLAKE2b-256 9d99cd9375880880b1b43742de95c44d66d43643ab4dc35c26c8fa48429896ce

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.1.6-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 5ed19eac43faa6ee3917b4ad2c060f08e466841c332cacd3bfbdeccd9b8db7e9
MD5 8ed7657279373f935549e0aa1e7a9ec8
BLAKE2b-256 9651f0c86278c027b8495a8cc53dd99c5177952d4542ee6ddd51f0a29342bd8b

See more details on using hashes here.

Provenance

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

0.2.0

17 files

0.1.8

17 files

0.1.7

17 files

This release

0.1.6 This release

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