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.0.tar.gz (965.3 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.3.0-cp314-cp314-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

a11_kit-0.3.0-cp314-cp314-manylinux_2_28_aarch64.whl (10.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

a11_kit-0.3.0-cp314-cp314-macosx_14_0_x86_64.whl (8.3 MB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

a11_kit-0.3.0-cp314-cp314-macosx_14_0_arm64.whl (8.1 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

a11_kit-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

a11_kit-0.3.0-cp313-cp313-manylinux_2_28_aarch64.whl (10.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

a11_kit-0.3.0-cp313-cp313-macosx_14_0_x86_64.whl (8.3 MB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

a11_kit-0.3.0-cp313-cp313-macosx_14_0_arm64.whl (8.1 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

a11_kit-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

a11_kit-0.3.0-cp312-cp312-manylinux_2_28_aarch64.whl (10.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

a11_kit-0.3.0-cp312-cp312-macosx_14_0_x86_64.whl (8.3 MB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

a11_kit-0.3.0-cp312-cp312-macosx_14_0_arm64.whl (8.1 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

a11_kit-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

a11_kit-0.3.0-cp311-cp311-manylinux_2_28_aarch64.whl (10.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

a11_kit-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl (8.3 MB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

a11_kit-0.3.0-cp311-cp311-macosx_14_0_arm64.whl (8.1 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

File details

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

File metadata

  • Download URL: a11_kit-0.3.0.tar.gz
  • Upload date:
  • Size: 965.3 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.3.0.tar.gz
Algorithm Hash digest
SHA256 fd4068a64ba15fcf69057e826ca315a265f89a6c0e8484644a2a055e01ec928d
MD5 6a344514ac4bc1a99fab26356f67f14c
BLAKE2b-256 639144a524a57beae7c3c5fbb168978010d794b45917010b009659b18906aab9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3cb85c3cf5d77441f275c36ea3022cd9f514762a086e7c54bea0c4c76710f488
MD5 ee450ac87ccce75043f3d5cf09b205bb
BLAKE2b-256 f8413c0b50a4e720c8de9cdca7be6262d708bd359bcc0cacf1cdcf250ad0a7f2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f6d9618ddc30db4363f9d902bb493f42d8ddff0a3da26f4535f5e47967974cac
MD5 70bd5bc964fcaf4cf5f42777fe6ec2fa
BLAKE2b-256 9cd37c98fac2a2edbb052975a34d19816ce617a0b76b3b7aad548ddb01176c4e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 4a5d9536f06d169075f0dcebe4d29cf59ee5ae98a09f949357221072fd920542
MD5 c85f94a5af4288d4b740edd1ec917888
BLAKE2b-256 1335b70e71c9e66e5b0532158ac2ea8fcb6bde42b0eac13fd2384656a131fc0b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6fa50514f64c3d5cf89f3655ed67d5a1ae47bf4085bd37523b39e5549eacccda
MD5 b1bbbdf3ad6b72d31cc7cd13c6327da2
BLAKE2b-256 0e85a80f39ed323b0731cd449f65935581cdf258677526377006682ae2efce08

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae599746d699bd093f2af73b1cf177ddaf8541f8bf187031afea1d9029d59f84
MD5 ff6366d655c44ddb5c238bd1564722dc
BLAKE2b-256 127bdb3daf0b0dd370b80c7ab435fea7e58240bdc897da419e2ab45e03e0182d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9f884bf77a01203e996d793ec0df1d716d09008866911082843fb4acd80cff20
MD5 3f3e299cf182cde2ef2fb9269a3ba7d0
BLAKE2b-256 478a723a9898991924bf9aaab0b8fdfccdd77aec7a3ed90f8590b83435eef5d5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 e2aa76129a4512aa5c7786b710973fb434aea1dac0391b727dbe977f9a176d96
MD5 5b636868ad3fc1a7c6f2f5fd17c1ddab
BLAKE2b-256 81aefb5f47952e3116ca2c4766f836c5ec209ee1df5edb46627c273fcfa84f70

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 fa74dab66e5fa5bd4b51f8c7c1a2af90b9ffcb818142690f215bc2aed02efb79
MD5 306618badeb15a73691fdd1e4545623e
BLAKE2b-256 1d1819bd656273dfa3f587ec002adb0f53f754fd80c8daaf408257ebd40858ca

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b87594ba6e1686d8d17c56ab71625ce35dc8acf68f9381d898b8e6fa3b5f400
MD5 eabad46a336eb6a3288be690ccf2b8b0
BLAKE2b-256 83c37fad75cf9cced4603b66b3430a8e66492c560a01fd33ab7d55efb2d85261

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 74f76c01241cff1cb707b949dc97d0f9aea0475314fc8c0d108683d9aac27380
MD5 078406f3910f18c110254dceabf68680
BLAKE2b-256 1e6789cb903cf038aece6a600ba75727fb61b413425852865c3f62f24b4f96be

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 4de18f6850d65128cdf584dd38a998fee409aec71e2fa3849c6a9378bd8cc8b9
MD5 98e0a8f78980ba59b625823fc0ec1cd1
BLAKE2b-256 1f9c0f0b0893bbde483a1c54348a848c9e0f89811f444e038ad2fbf8b4959896

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4eb6864faa518e8af19d58c9888b046e16dd4bf5ae45dc5bbd2cdde173f0b696
MD5 61ce1975a74372aa640020f69d9710ec
BLAKE2b-256 3838ed425f8d5fbd63fef587b0a0b5318d499f189757fbcf030d8ceb1aa6ed63

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9fdcd632eef388e1e6beef8073838870dac774f1e99dceef084fe9c1702227e9
MD5 4301d30b833f7ee2f729ed8978b4afd6
BLAKE2b-256 564b25c45addb00f4f137d08ee85fdb1f7a701c126ed7b2f4032872328e5624f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5757bc95205bac10a6854e806914c77b5b59c6ca69954f013843faf551d03832
MD5 2e4820a7d03e05f3f5628cfc430ed0d6
BLAKE2b-256 fd4135dc6953718e77a3ecf6751da5d81be33064ec11d1d3f4d3d3d27dfcf256

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 5528e5fef488c1e1b5a29238a60ed4028a6289a9af0c2ab8620553d2b01e3eb7
MD5 f721d3f97bef900cd28e8bc8c5dc101a
BLAKE2b-256 c2a4db8dd510a63402082cd8749233a639a4f30e3e32845e2490765a6ea32ac1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for a11_kit-0.3.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 336278dfa9f2443166a265d02713bfb9c58f6eeb93630a431f2c538fa7c9616a
MD5 fc8d1e24f3d10c664012688ca52db43f
BLAKE2b-256 ab2d161f08cbe621ebee09aa57dc31b7eeb2310cf4e96a068964a796a6e089a1

See more details on using hashes here.

Provenance

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

This release

0.3.0 This release

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