Skip to main content

bitHuman avatar runtime + bundled CLI — `bithuman serve model.imx` for talk-to-your-avatar quickstart.

Project description

bithuman

This is the Python flavor of Layer 3: a platform-specific library for app developers. It wraps the Layer 1 libessence engine. For the CLI tool see docs/CLI.md.

┌─────────────────────────────────────────────────────────────┐
│ Layer 3: Platform-specific libraries (app developers)       │
│   - Python wheel       pip install bithuman    ◄──── you are here
│   - Swift package      SwiftPM Bithuman                     │
│   - Kotlin AAR         ai.bithuman:sdk                      │
│   - (future) Rust crate, JS/TS, Go, ...                     │
└─────────────────────────────────────────────────────────────┘
                          ▼ embeds
┌─────────────────────────────────────────────────────────────┐
│ Layer 2: bithuman CLI (end-user tool)                       │
│   - one cross-platform binary on macOS / Linux / Windows    │
│   - brew install bithuman · curl-pipe installer             │
└─────────────────────────────────────────────────────────────┘
                          ▼ links
┌─────────────────────────────────────────────────────────────┐
│ Layer 1: libessence engine (cross-platform C++ core)        │
│   - portable C ABI, same source on every target             │
│   - macOS · iOS · Android · Linux · Windows                 │
│   - never imported directly by app developers               │
└─────────────────────────────────────────────────────────────┘

Python bindings for the bitHuman SDK — the portable C++ avatar engine (libessence) that powers our cross-platform lipsync pipeline. The wheel ships a native pybind11 module that talks directly to libessence, so you get the same per-frame cost as our Swift and Kotlin clients with none of the GIL noise.

On an Apple M5 with 24 GB unified memory we measure ~640 FPS sustained compose (1.56 ms/frame mean, 2.03 ms p99) for a 1248×704 avatar, with ~206 MB peak RSS end-to-end. Cold load is ~14 ms for the fixture and ~400 ms for the first compose tick (lazy ONNX init).

This package is namespace-isolated from the v0 bithuman SDK; you can install both side-by-side.

Install

pip install bithuman

Status. The PyPI bithuman wheel is at v2.2.1 (2026-05-25) shipping the bundled Rust CLI + conversation brain. bithuman run is the fast-path live-avatar command; bithuman[local] adds a fully on-device brain (whisper.cpp + llama.cpp + Supertonic). The legacy low-level streaming API (AsyncBithuman.push_audio + async for ... in runtime.run()) is still exported for library users — see the legacy quickstart.

Compatibility

  • Platforms: macOS arm64, Linux x86_64, Linux arm64 — all ship as wheels. Windows is tracked for a follow-up.
  • Python: 3.10 – 3.13 (cp310, cp311, cp312, cp313). CPython only.
  • ABI: the published wheel wraps libessence ABI v4. The libessence engine itself is on ABI v6 — that surface is currently exposed via the Swift / Kotlin / Rust bindings only. PyO3 wheel migration in flight.
  • Auth: ships with live heartbeat against api.bithuman.ai baked into libessence. Avatar.load(api_secret=...) is the entry point; BITHUMAN_API_SECRET env var works too. Set BITHUMAN_UNMETERED=1 for dev / parity-test runs.

What you get

The package exposes three API tiers (all importable from bithuman):

Tier Types Use when…
Async AsyncAvatar, AudioChunk, VideoControl, VideoFrame Hosting a service / parity with legacy AsyncBithuman
Sync facade Avatar, ComposedFrame, EP Offline / batch / CLI rendering
Low-level Fixture, Runtime, EP_CPU/EP_AUTO/EP_COREML/EP_NNAPI/EP_QNN Direct C ABI access, custom audio pipeline

Error types: BithumanError (base), TokenError / TokenExpiredError / TokenValidationError / TokenRequestError / AccountStatusError (auth), ModelError / ModelNotFoundError / ModelLoadError / ModelSecurityError / ExpressionModelNotSupported (fixture), RuntimeNotReadyError.

Version info: bithuman.__version__ (Python package), bithuman.__core_version__ (linked libessence), bithuman.__abi_version__.

Quickstart (legacy AsyncBithuman — PyPI)

This is the shape of the current published wheel. It ports directly from the v0 bithuman SDK: feed PCM with push_audio, drain frames from the runtime.run() async generator.

import asyncio
from bithuman import AsyncBithuman

async def main():
    runtime = await AsyncBithuman(
        model_path="model.imx",
        api_secret="...",  # or BITHUMAN_API_SECRET env var
    ).start()

    await runtime.push_audio(pcm_16k_mono_int16_bytes,
                             sample_rate=16000, last_chunk=True)

    async for frame in runtime.run():
        # frame.bgr_image is (H, W, 3) uint8 in BGR order
        ...

asyncio.run(main())

PCM accepted is int16 little-endian bytes at 16 kHz mono. WAV / MP3 / FLAC / OGG decoding is the caller's responsibility (use soundfile).

Quickstart (low-level, C-level streaming surface)

The Rust PyO3 wheel will expose the ABI-v6 streaming pair (runtime.push_audio + runtime.pull_frame) on the same shape as the Swift / Kotlin bindings. Until it ships to PyPI, the snippet below uses the legacy Fixture / Runtime types in the published wheel.

Live avatar — bithuman run (browser + voice chat)

The wheel also ships the bithuman Rust CLI plus an embedded conversation brain (a livekit-agents worker). bithuman run avatar.imx stands up the whole stack — embedded livekit-server, libessence runtime, brain, browser player — and prints a URL you open to talk to the avatar.

pip install bithuman
export BITHUMAN_API_KEY=...     # avatar-runtime auth (https://www.bithuman.ai/#developer)
export OPENAI_API_KEY=sk-...    # the conversational brain (OpenAI Realtime)

bithuman run ~/.cache/bithuman/models/sample-avatar.imx
# → open the printed http://127.0.0.1:8088/<CODE> URL in a browser

Fully on-device — bithuman[local]

For zero-cloud operation, install the [local] extra and set BITHUMAN_LOCAL=1. No OpenAI key, no outbound network — the brain swaps to whisper.cpp (STT) + llama.cpp (LLM) + Supertonic (TTS), all in-process, all auto-downloaded from HuggingFace on first run.

pip install 'bithuman[local]'

export BITHUMAN_API_KEY=...
BITHUMAN_LOCAL=1 bithuman run ~/.cache/bithuman/models/sample-avatar.imx
Slot Library (mobile-portable C++ core) Default model Disk RAM
STT pywhispercpp → whisper.cpp tiny.en 77 MB ~150 MB
LLM llama-cpp-python → llama.cpp Qwen 2.5 0.5B-Instruct Q4_K_M 400 MB ~600 MB
TTS supertonic → ONNX Runtime Supertonic 3 (voice M1, 31 languages) 380 MB ~600 MB
VAD livekit-plugins-silero Silero 5 MB ~50 MB

Total ~860 MB on disk, ~1.5 GB RAM, ~717 ms warm load, ~1.4 s warm end-to-end (STT + LLM + TTS) on Apple Silicon. Cold start adds ~90 s once for first-run model downloads.

Optional knobs (env vars)

Var Default What
BITHUMAN_LOCAL unset =1 flips the brain to the local stack.
BITHUMAN_LOCAL_WHISPER tiny.en whisper.cpp model size (tiny.en / base.en / small / large-v3-turbo).
BITHUMAN_LOCAL_LLM Qwen/Qwen2.5-0.5B-Instruct-GGUF HuggingFace repo id of a GGUF LLM.
BITHUMAN_LOCAL_LLM_FILE qwen2.5-0.5b-instruct-q4_k_m.gguf GGUF file within the repo.
BITHUMAN_LOCAL_VOICE M1 Supertonic voice preset (M1M5 / F1F5).
BITHUMAN_LOCAL_LANG en Supertonic language (31 supported: en, ko, ja, es, de, …).
BITHUMAN_INSTRUCTIONS short default Override the system prompt.

All three local backends have first-party iOS/Android C++ builds, so the same .gguf / .bin / .onnx model files are reusable when porting to mobile — see cpp/bindings/python/livekit_local_plugins/README.md.

CLI

A essence-render console script ships with the wheel:

pip install 'bithuman[cli]'

essence-render \
  --model ~/.cache/bithuman/models/sample-avatar.imx \
  --audio speech.wav \
  --output out.mp4

Pass --output - to stream raw BGR24 frames to stdout (handy for piping into a separate ffmpeg pipeline or a custom encoder). Other flags:

Flag Default Description
--fps 25 Output FPS for the MP4 container.
--quality 80 libx264 quality 1..100 (higher = better).
--ep cpu Execution provider hint (cpu/auto/coreml/…).
--threads 1 ORT intra-op thread count.
--no-audio Skip audio muxing; produce a silent video.

Example end-to-end run (5 s sine sweep):

essence-render 0.1.0: model=sample-avatar.imx audio=sine_sweep_5s.wav ep=cpu threads=1
essence-render: loaded fixture in 14.9 ms — 1248x704 @ 25 fps, 183 clusters, 202 src frames
essence-render: composed 122 frames in 1.83s (14.96 ms/frame, 66.8 fps)
essence-render: wrote /tmp/sine_sweep_5s.mp4

(Throughput here is bounded by H.264 encode, not Essence inference. Use --output - if you want to measure raw compose speed.)

Low-level API

If you need finer control or want to swap in a custom audio pipeline, the C ABI is exposed directly:

import numpy as np
from bithuman import Fixture, Runtime, EP_CPU

fx = Fixture("model.imx", preferred_ep=EP_CPU, intra_op_threads=1)
rt = Runtime(fx)
pcm = np.fromfile("speech.f32", dtype=np.float32)  # 16 kHz mono float32
cluster_idx, bgr = rt.tick_compose(pcm, frame_idx_hint=-1)
# bgr.shape == (fx.frame_height, fx.frame_width, 3), dtype uint8

Pass the entire pcm buffer to each tick_compose call; the runtime maintains an internal cursor and advances one tick per call until the audio is exhausted.

Zero-alloc hot path (since 1.12.4)

For tight render loops, pre-allocate the BGR buffer once and pass it via out=. The runtime writes into it in place and returns just the cluster_idx. This drops wrapper overhead to within ~3 % of raw libessence (vs ~8 % for the alloc-per-tick path):

out = np.empty((fx.frame_height, fx.frame_width, 3), dtype=np.uint8)
for _ in range(num_ticks):
    cluster_idx = rt.tick_compose(pcm, -1, out=out)
    # `out` now holds this tick's frame; read it before the next call.

The same out= keyword works on tick_compose_to_size. See docs/ARCHITECTURE.md §9 for the cross-wrapper perf table.

Build from source

You need the prebuilt parent C++ archive at cpp/build/libessence.a (run the parent CMake build first), plus the runtime deps from Homebrew (onnxruntime, webp, ffmpeg, hdf5, jpeg-turbo).

cd cpp/bindings/python
uv pip install -e '.[cli,test]' --no-build-isolation

The CMake glue links the prebuilt static archive directly — it does NOT re-run the parent build, so iterate on bindings without paying the C++ rebuild cost.

Performance

Measured with tests/bench.py against the v1 compose path (audio → composited BGR frame) on Apple M5 24 GB, libessence 1.16.0:

Metric Alloc per tick out= reuse buffer
Steady-state mean 1.53 ms / frame 1.45 ms / frame
p99 1.66 ms 1.53 ms
Sustained throughput 655 FPS 692 FPS
Overhead vs raw libessence +8.3 % +2.6 %
Peak RSS (proc) 192 MB 182 MB

Wrapper overhead is within 5 % of raw libessence on the out= path; see docs/ARCHITECTURE.md §9 for the apples-to-apples methodology and the cross-wrapper comparison. Reproduce with:

scripts/bench-wrappers.sh

Linux wheels

Pre-built manylinux_2_28 wheels ship for x86_64 + aarch64 across cp310 through cp313 — 8 wheels in total, all auditwheel-repaired with the full dep tree bundled (ORT, FFmpeg, HDF5, libjpeg-turbo, libwebp, libcurl, OpenSSL).

To rebuild them locally:

# One-time: build the dep-baked Docker images (~10 min each).
docker build --platform linux/amd64 -t libessence/manylinux-x86_64:0.1 \
    -f scripts/Dockerfile.manylinux-x86_64 scripts/
docker build --platform linux/arm64/v8 -t libessence/manylinux-aarch64:0.1 \
    -f scripts/Dockerfile.manylinux-aarch64 scripts/

# Per wheel build (~2 min):
docker run --rm --platform linux/amd64 -v "$REPO":/src \
    -e PYTAG=cp311 -e ARCH_INSIDE=x86_64 \
    libessence/manylinux-x86_64:0.1 \
    bash /src/cpp/bindings/python/scripts/build-wheel-in-container.sh

Limitations

  • Windows wheels not yet built — tracked for v0.2.
  • The CLI's output framerate is fixed at 25 fps to match the model's internal rate. Pass --output - and pipe to your own encoder if you need temporal resampling.
  • preferred_ep=COREML/NNAPI/QNN is accepted but currently no-ops to CPU in the v0.1 build.

License

Commercial. Contact hello@bithuman.ai.

See also

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

bithuman-2.2.2-cp314-cp314-manylinux_2_28_x86_64.whl (74.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bithuman-2.2.2-cp314-cp314-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

bithuman-2.2.2-cp314-cp314-macosx_26_0_arm64.whl (76.6 MB view details)

Uploaded CPython 3.14macOS 26.0+ ARM64

bithuman-2.2.2-cp313-cp313-manylinux_2_28_x86_64.whl (74.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bithuman-2.2.2-cp313-cp313-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

bithuman-2.2.2-cp313-cp313-macosx_26_0_arm64.whl (76.6 MB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

bithuman-2.2.2-cp312-cp312-manylinux_2_28_x86_64.whl (74.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bithuman-2.2.2-cp312-cp312-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

bithuman-2.2.2-cp312-cp312-macosx_26_0_arm64.whl (76.6 MB view details)

Uploaded CPython 3.12macOS 26.0+ ARM64

bithuman-2.2.2-cp311-cp311-manylinux_2_28_x86_64.whl (74.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bithuman-2.2.2-cp311-cp311-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

bithuman-2.2.2-cp311-cp311-macosx_26_0_arm64.whl (76.6 MB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

bithuman-2.2.2-cp310-cp310-manylinux_2_28_x86_64.whl (74.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bithuman-2.2.2-cp310-cp310-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-2.2.2-cp310-cp310-macosx_26_0_arm64.whl (76.6 MB view details)

Uploaded CPython 3.10macOS 26.0+ ARM64

File details

Details for the file bithuman-2.2.2-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1b93efed109d73c9ab2e031c1d38742453fc0e03568b2f3bbd0ab32d168e41a5
MD5 e83c4dd11e59e4f80a829782f9ae0581
BLAKE2b-256 c7e8491ab04e465405502c4242f80ffc3d1805a66aced5b03dadb1a3194baa1b

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4c5af6cdac711d5ef7fc4fd9f8f55c04f611903ffea3107eb7b8e2cf8649ec07
MD5 44f1019038dad4dd3cae36da8fbf2850
BLAKE2b-256 21bd55df438b2ef4fc28d9e3bdca0134ecc6f3ec52587386b3455a2f80006731

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp314-cp314-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp314-cp314-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 f9bc56dcd38347d8524a33f380d97b93232e13be135123b5ceb40cd9de2fdf3d
MD5 5639c1fc2f298576765b16b980d53f5d
BLAKE2b-256 61e717ae81686a3babf386fae73d5646844418db1435af28b7bb4e15ae9640cb

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8b392a31e778b9f2e2a837ca6bf57f83c816e06a3f50050db0f9b3c778d79fd7
MD5 f0e1dee3fc04cec229606bae2a21ce54
BLAKE2b-256 e1dadf9b2e523680b21a14f325be86c32649407ed3c31fa67927f606ddce76cc

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a6bb24ced43cde5326a7c04a541b2591b49a3938df8c14cacd303e5c7ec331b9
MD5 024cbab65a697abc998884c14ea131c2
BLAKE2b-256 ff79dab7e54cf27673d888c3ac821a12ab8afbcc7e2ba86aa7d905a0685155b9

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp313-cp313-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 497492ca5682e1e1c787cb0f4f53c6c341d9d599b6122d11038cd55246d6d31e
MD5 4f548697baa1cccb69f1e728b4ad43ad
BLAKE2b-256 96a261ae26f32660f884ab96d561efc32976a548d28366b7d727098c9de0a911

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0448021e55826333f9e989e36da96ac8c5bdf32953611fc68ef57e52cc45a8b
MD5 bc60864c0a95fa4454a6f7f5188b9404
BLAKE2b-256 9d1b5f4c0db86b2efd7cf65f77b6283f8619c793554a6150c915f4f9bf15b301

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c528e2a11d677fedfa23572c08aea97322d95fa7ed64118937dcd7e46c2883ff
MD5 6ad3cae94b380b011eb82a391d344363
BLAKE2b-256 5e0169292515b7d8d7bda126d1ef46add33152153161baa1b6e599c51ea1b1f0

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp312-cp312-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 f17b6ecd847d82ac7fbb8c6d2f875d95dc909191155ce9de6931758099d84300
MD5 a16cfab539463f5a696f9e0fe7907589
BLAKE2b-256 d8319840e1a107aa4a26d93e4ad8eae85828ceec5e5495a9efd46424098c2e15

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8cf0a90c45931824f93d02b92bf39aa6347d0ae7df6109cf77091bf12bb22865
MD5 987287f91922de1a106d88b656ec369a
BLAKE2b-256 1373765bf3beb89e256c0f852a49a7eff25b80f792195f49faae16ddb7698848

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 86fbdfff26cb653b07703bfad3345574bdd81305d37a19b65e16746db41e3a3a
MD5 c4377a2fbe7f1f57bacd7af1a4b8c0dc
BLAKE2b-256 f273600f51a2236c3e19847286b8210d87d684baaa4afb4778063d2acbb66a1c

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp311-cp311-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 b21154fb61cf2bb623e1e77c52d5e634181f5c60def94db320787a324caef39f
MD5 1ff8cb23b39e9b9345187b4035ad3d71
BLAKE2b-256 20428161aba727a0a158cc665f666bf239e64dcf2c26e15beeddca509d3a5b9e

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1e6e6c95fdd292ff58e262998dae77c15cb023b21419ce6359e3d7feaa702f6b
MD5 43149b241407bf32520dde040200f9df
BLAKE2b-256 849652b0f2e4c9a63cdf80a148cc68edc728017ece25d94cb6afa10a63175195

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 835c42aff79fa80600abda3d983c85488f0f26d9e0ef35c465aaee609655cafc
MD5 52c618a4d90ec4f6be5919b950ff2871
BLAKE2b-256 2ced9f9dc22ae62c4facd7ec54bb09ea18f900fd467f987f99f043143e442e06

See more details on using hashes here.

File details

Details for the file bithuman-2.2.2-cp310-cp310-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.2-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 5ffc60a08433f95550b31723b797d765fd338014708eb3b899ad5d923c852e1f
MD5 2b6a0f7c350dde0e755a161c542fd2b5
BLAKE2b-256 d3441be3482240f2153d6ebb8559f1f912a6097e7748b224bae9626f429f362d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page