Skip to main content

bitHuman avatar runtime + bundled CLI — `bithuman run model.imx` for talk-to-your-avatar quickstart (cloud), `BITHUMAN_LOCAL=1 bithuman run` with the [local] extra for the on-device brain.

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.3-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.3-cp314-cp314-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 26.0+ ARM64

bithuman-2.2.3-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.3-cp313-cp313-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 26.0+ ARM64

bithuman-2.2.3-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.3-cp312-cp312-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 26.0+ ARM64

bithuman-2.2.3-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.3-cp311-cp311-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 26.0+ ARM64

bithuman-2.2.3-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.3-cp310-cp310-manylinux_2_28_aarch64.whl (73.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-2.2.3-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.3-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.2.3-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30574bf0bfb673ac77406b503f3c053a026f8471e71df2fc55d6375a403301c4
MD5 a43dd88d39b1a1a9ecb0a7b4ebbbaab9
BLAKE2b-256 dea369f47e36206b43ff5e6438c673d9e60c75f8dc8e744d1cc83b81ed1c62ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 048131a46f3403c99323259e148e7b4e49e8ea64d817a130683b9b0661d8bd85
MD5 486a59a2a984216130280fdebd772e77
BLAKE2b-256 5b39aab86bc3a2201219975810c583748f0c4314d33a845700a4f8f0b6f62e2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp314-cp314-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 6c3b9f57e6d070bf55964961cf5854ab9a46745862034819f4a6b87d9fbce5b6
MD5 e012c32c2e9958fe6a05bd79f45b1a4c
BLAKE2b-256 8d3206b5dfebe44ac1baa6e6f9ca93e562cc11bb018e19b55a3dafdb93afc09e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d7c49124f9b743b4fefd7d0fd7ab25b5c938b5431bca78072fb2518add4b771c
MD5 de65883f2e285bab32f03046c606c4d6
BLAKE2b-256 691ac419397cd0ea61deb2d67e925b6e3c49f4524d934045c64ee9b2e1f49d0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 234562bfaf0bcc1f3ddb9a7dbc3cdcfd77572b3881d91ef2e94e1408ca141bd8
MD5 d443dcaa32b39a54aa3622f65f82c9d2
BLAKE2b-256 72e7f6c3bfaf25b67499e1b0eb7e149714a689e46f8b8e8a514ab02747463180

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 4cc53a9f5046b8a0008e9f0bcfbbc43d55bb13f7858d74adffaef80c902a167f
MD5 0ce519fa9cc02d26ce05e47e3c9639c2
BLAKE2b-256 43b4004196bc1be2d8df4d29615b1085d5aa47c9d3246238bf09b934e99363e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d7e5ff7b16fda7bf30026dad39a47fb1762a1d47072d905dca4211c72c48d42
MD5 862ae35a8a08538a0c697438d7c35de0
BLAKE2b-256 3506d6216905ec95722bccdd91f57d0f4b4750eef18a76fedcf85fdddd67f71c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 386fb3828826cd6ffde379b1e77b3561724f900044d4e508c97f7d0f914c2c0f
MD5 77a4f566edae77e67e550ba2a64d2f72
BLAKE2b-256 bd3ccf843141b58b36be53338d352f41d0cbed870d2a51289d8247d42ad0063c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 bbae8777cc18b4254408f5f9a14b3bc214484bf2026cb36bbfca07f4aa8c865d
MD5 0943bf71114c1970f7db120c2e0a0a38
BLAKE2b-256 0cae9ca835dc641bad9b987f12224447faeb63f2fa16547b27f372e8b2bb986e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f8da5a39d89de36210efe8ce61490842a7258c01e39eda57ac6267611a8ebb3
MD5 692408aedde5f1b51fb4adc9ee99166c
BLAKE2b-256 ed747bce32c406e895f757bcf2d52865f0de0df734997438f028f47a05d808f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f35bd2db319ddbcc1cfbe81e4ac31cdba78d8e8ba794df2ee58a36b1b5c5b282
MD5 4c7675e1ff182a0d902cebce1888099c
BLAKE2b-256 630e9d363fab79f27cc5976b563a6a32e05d2615352d0eda45442938250f4bf7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 78914e9e0eba4eb6e9a90b0f713229764b57a1c4acceb30ff4eda4e3cb731072
MD5 9719b699799fa5e03b61fd01dab95445
BLAKE2b-256 86f04700146f0fe4039f04729e2ae3c8c38dc5c719a28fe15765970c13b11026

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 71a8fc365ea9edd6f49681f13449d9e2cd013e0da3b5530ed6a8b6f45dcece0a
MD5 058db63b713bcde68a2295edca009011
BLAKE2b-256 4cf6fe3b3e043bda3e576230935a9dae88bcffe4d2832b2b92a278d6ba518ff9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ec032a5f388fc7213ec8d5e6e5d4cbb9bc3e0999673df9a358f6d7cc2d5b3c82
MD5 e35d37a01fe2391a55891a5f9c157cde
BLAKE2b-256 615c72c4108a34690d5f9c5a9717a8e38fad48ae220861ee89f71e27f05dcad3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.2.3-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 8e676061d3f23a1d58c6cb8be79be1e3ab5d3c5ae4b3e4ffadf20b95455c8133
MD5 e40a4ec0154811bc262abdb294ee4140
BLAKE2b-256 c2362220e018056a8b2d225c7485deb70d5568b87b02648a83cffb9a3571c878

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