Changelog
Release notes for every bitHuman SDK, the CLI, the API and plugins.
What changed in each release, newest day first (grouped by artifact within a day). Current versions are on Downloads & versions and in /versions.json. Follow new releases with the RSS feed. Entries before August 2026 are in the archive.
Highlights
Recent releases worth a look first.
- One frame stream for Expression 2 on Apple
frames(audioClock:)hands out idle and speech frames on your player's clock, andevents()reports when each reply starts and ends. - One call renders an MP4 from Python
bithuman.open(path).render(audio, out_mp4=...)writes the video with its speech, for every model. - Talk to any gallery avatar from the CLI
bithuman run <CODE>plays the gallery avatar with that code, the waypull,renderandopenalready did. - The Flutter plugin builds for iOS and macOSiOS and macOS build from the published tag and link the published Expression 2 and Essence 2 engines.
Breaking changes
| Date | Artifact | Change | What to do |
|---|---|---|---|
| 2026-10-05 | CLI up to 2.8.8, bithuman up to 2.11.20 | bitHuman’s release files moved from GitHub to downloads.; these versions still fetch first-use files (and the CLI its update check) from GitHub | upgrade to CLI 2.8.9 and bithuman 2.11.21 |
| CLI 2.9, no earlier than 2026-12-26 (announced 2026-09-27) | CLI | the CLI stops reading the API secret from a .env file in the working directory | export BITHUMAN_, or run bithuman login once |
| 2026-12-26 (announced 2026-09-27) | REST API | POST / requires model; the bare names essence / expression and the version field are refused with a 400 | send essence-2, expression-2, auto, essence-1 or expression-1 |
| 2026-12-26 (announced 2026-09-27) | REST API | GET /v1/usage rows drop activity_type | read source (already in every row) or pricing_ |
| 2026-12-26 at the earliest (announced 2026-09-27) | CLI 3.0, bithuman 4.0 | the deprecated alias BITHUMAN_ is no longer read; bithuman 4.0 also drops bithuman. (use bithuman.), token= and the AsyncAvatar alias | rename to BITHUMAN_; each old name warns until then |
| 2026-10-05 | Flutter plugin 2.6.38 | the plugin moved from GitHub to GitLab; versions up to 2.6.37 still download their iOS and macOS engines from GitHub | change the git url to https: and pin ref:; path: stays the same |
| 2026-10-04 | Flutter plugin 2.6.37 | iOS apps need iOS 16.4 (was 16.0); macOS apps need macOS 14.0 (was 26.0 in 2.6.36); a session whose app is in the background, or takes no frame, for 60 seconds ends and is billed to that point; an API secret whose account may not use the avatar is refused (AGENT_) | set platform : and IPHONEOS_; set platform : and MACOSX_; an app that runs on macOS 14 bundles an ONNX Runtime built for macOS 14 (Homebrew’s is built for macOS 15); use the API secret of the account that owns the avatar |
| 2026-10-04 | essence2-android 0.9.5, expression2-android 0.6.1 | an app in the background for more than 60 s gets no avatar frames and its session ends (billed to the 60 s); the next frame while the app is visible starts a new session; an API secret is refused (403 AGENT_) for an agent its account may not render | nothing to change for an on-screen avatar; do not rely on frames while the app is in the background |
| 2026-10-05 | Swift package 2.20.5 | the Swift package moved from GitHub to GitLab; versions up to 2.20.4 still download their binary frameworks from GitHub | change the package URL to https: and update to 2.20.5; the package name (homebrew-bithuman) and your .product(...) lines stay the same |
| 2026-10-04 | Flutter plugin 2.6.36 | macOS apps need macOS 26.0 (iOS stays 16.0); BithumanEntitlementException is a new exception from load and the installers; on Android, an Expression 2 load without apiSecret fails; the installers need apiSecret for an avatar that is not public | set platform : and MACOSX_; catch BithumanEntitlementException (Flutter errors); pass apiSecret |
| 2026-10-04 | essence2-android 0.9.4 | a private avatar cached on the phone opens only for an API secret bitHuman has accepted for it; after the update, the first open of each cached avatar asks bitHuman once, so that open needs the network | nothing to change; another account on the same phone gets the download’s refusal (NOT_FOUND) |
| 2026-10-04 | expression2-android 0.6.0 | a private avatar cached on the phone opens only for an API secret bitHuman has accepted for it; after the update, the first open of each cached avatar asks bitHuman once, so that open needs the network | nothing to change; another account on the same phone gets the download’s refusal (404) |
| 2026-10-01 | REST API | bitHuman’s text-to-speech service is retired: POST /v1/tts, POST /, GET /v1/voices and /v1/studio/* answer 410 ENDPOINT_ | send your own audio (from any TTS provider or a recording) to the talking video API; agent conversation voices and / are unchanged |
| 2026-10-01 | essence2-android 0.9.0 | Essence2Metering. is ignored and always reads "session": a file render bills its session time like any other session; SelfHostMeter. no longer exists | delete any basis = … line; call close() right after the last frame of a file render |
| 2026-09-27 | API | POST / is retired (410 ENDPOINT_) | connect through the Realtime relay (wss:) or POST /; CLI 2.8.1+ already does |
| 2026-09-24 | expression2-android 0.5.0 | Expression2ModelStore., CANON and IDLE are no longer compile-time constants | read them at runtime; a when branch or annotation that used them as constants must change |
| 2026-09-23 | Swift package 2.14.2 | Expression2Engine. refuses without an API secret | call Expression2Credential. or set BITHUMAN_ |
| 2026-09-23 | expression2-android 0.4.9 | Expression2Avatar. refuses without an API secret | set Expression2Metering. |
| 2026-09-22 | CLI 2.7.0 | retired command spellings exit 2; account --limit defaults to 10 | use the current names; pass --limit 50 for the old window |
| 2026-09-16 | bithuman 2.11.0 | the 3.x releases are withdrawn from PyPI | unpin 3.x; pip install bithuman |
| 2026-09-16 | expression2-android 0.4.7 | idleLoop is an Expression2IdleLoop, not a List<Bitmap> | call idleLoop?. |
| 2026-09-16 | Swift package 2.13.5 | Expression2Engine. removed | use idleNextPixelBuffer() or idle(into:) |
| 2026-09-15 | essence2-android 0.5.7 | the ElevateFrames constructor (legacy ai. package, kept for compatibility) drops its execution-provider argument | delete that argument |
| 2026-09-14 | CLI 2.6.19 | bithuman auth … removed | bithuman login, logout, account, token |
October 2026
CLI 2.8.9 — 2026-10-05
Tag cli-v2.8.9.
- No GitHub at run time: the Essence 2 audio front-end files and the daily update check now come from
https://downloads.bithuman.ai. Same files, checked against the same sha256 pins. The CLI makes no request to github.com. - CLIs up to 2.8.8 check for updates on GitHub and will stop seeing new versions. Upgrade once.
- Rendering, billing and the bundled Essence 2 engine are unchanged from 2.8.8.
- Action: download the file for your machine from Release files. Homebrew users: re-tap once with
brew untap bithuman-product/bithuman; brew tap bithuman/bithuman https://gitlab.com/bithuman/sdk/homebrew-bithuman && brew install bithuman/bithuman/bithuman-cli.
bithuman 2.11.21 — 2026-10-05
- No GitHub at run time: the files
bithumandownloads on first use (the Essence 2 audio encoder and its 2 s window pair, and on Apple silicon the Expression 2 engine) now come fromhttps://downloads.bithuman.ai. Same files, checked against the same sha256 pins. Versions up to 2.11.20 download them from GitHub. - Nothing else changed from 2.11.20.
- Action:
pip install -U bithuman.
Swift package 2.20.5 — 2026-10-05
Tag v2.20.5 on gitlab.com/bithuman/sdk/homebrew-bithuman.
- The package moved to GitLab, and nothing resolves through GitHub any more: the binary frameworks and Essence 2’s runtime files now download from
downloads.bithuman.ai. They are the same files under the same versions, so the checksums are unchanged. Versions up to 2.20.4 still fetch their frameworks from GitHub. - The engines are unchanged: Essence 2 1.15.5, Expression 2 2.20.4 and the macOS engine core 1.0.2.
- Action:
.package(url: "https://gitlab.com/bithuman/sdk/homebrew-bithuman", from: "2.20.5"). In Xcode, remove the package and add it again by the new URL, or run File › Packages › Reset Package Caches after editingPackage.swift. The package name (homebrew-bithuman), your.product(...)lines and your code do not change.
Flutter plugin 2.6.38 — 2026-10-05
Tag flutter-plugin-v2.6.38 on gitlab.com/bithuman/sdk/homebrew-bithuman.
- The plugin moved to GitLab, and nothing resolves through GitHub any more:
scripts/bootstrap.shdownloads the iOS and macOS engines fromdownloads.bithuman.ai. They are the same files under the same versions, checked against the same sha256 digests. Versions up to 2.6.37 still download them from GitHub. Android builds are not affected. - The engines are unchanged: Android
essence2-android0.9.5 andexpression2-android0.6.1; iOS and macOS Essence 2essence2-v1.15.5and Expression 2v2.20.4. The floors stay iOS 16.4 and macOS 14.0. - Action: in
pubspec.yaml, seturl: https://gitlab.com/bithuman/sdk/homebrew-bithuman.gitand pinref: flutter-plugin-v2.6.38;path: packages/flutter-pluginstays. Then runflutter pub getand, for iOS and macOS, the plugin’sscripts/bootstrap.shagain.
Flutter plugin 2.6.37 — 2026-10-04
Tag flutter-plugin-v2.6.37. Update before your app ships to customers: a session left in the background now stops billing on its own.
- A session nobody watches ends after 60 seconds. On Android, iOS and macOS, an app in the background for 60 seconds, or one that takes no frame for 60 seconds, ends its session, billed up to that point. On iOS the session ends earlier if the background time iOS grants runs out first. When the app is visible again, the next frame starts a new session. Coming back within 60 seconds keeps the session.
- The secret check names the avatar. If the API secret’s account may not use the avatar, the session refuses to start (
AGENT_NOT_ENTITLED), and nothing is billed. - Android: the avatar uses no CPU in the background. While the app is off screen and the avatar has nothing to say, the plugin’s threads wait instead of polling. On a Galaxy Z Flip5, an app that leaves the avatar open in the background measured about 7 wake-ups a second and under 1% of a core, down from 1,400–2,500 wake-ups a second and 30–42% of a core. A reply that arrives in the background still plays. Frames return within about 0.2 s of the app coming back.
- iOS needs 16.4 and macOS 14.0. The on-device brain moves to
converse-apple-v2.5.1, which needs iOS 16.4 and brings macOS back to 14.0 (2.6.36 needed 26.0). llama.cpp is now inside the plugin, so macOS needs onlybrew install onnxruntime. Homebrew’s ONNX Runtime is built for macOS 15, so an app that runs on macOS 14 must bundle an ONNX Runtime built for macOS 14. - Engines: Android
essence2-android0.9.5 andexpression2-android0.6.1; iOS and macOS Essence 2essence2-v1.15.5and Expression 2v2.20.4. Rendering is unchanged. - Action: pin
ref: flutter-plugin-v2.6.37. Setplatform :ios, '16.4'inios/PodfileandIPHONEOS_DEPLOYMENT_TARGET = 16.4on the Runner target. Setplatform :osx, '14.0'inmacos/PodfileandMACOSX_DEPLOYMENT_TARGET = 14.0on the Runner target.
essence2-android 0.9.5 — 2026-10-04
A billing patch for 0.9.4. Rendering, the engine and the native library are 0.9.4’s; only the session meter changes. Nothing to change in your code.
- A session nobody is watching ends after 60 s: when your app has been in the background for longer than 60 s, or has not asked for a frame for longer than 60 s (no
pull,pullHardwareBuffer,idleoridleHardwareBuffercall and no render call onElevateFrames, the legacyai.bithuman.elevateclass kept for compatibility), the session ends and is billed up to that 60 s, not up to your app’s return. “Background” means no visible activity; a process kept alive only by a foreground service counts as background. Time the phone spends asleep counts toward the 60 s and is never billed. - No frames in the background after that: until the app is visible again, every frame call answers “no frame” (
pullandidlereturnfalse, the hardware-buffer calls returnnull, render calls on the legacyai.bithuman.elevate.ElevateFramesreturnfalseor-1). Audio you fed meanwhile is kept, and the avatar catches up with your playout position on the first frame back on screen. - The next session starts by itself: the engine stays loaded, and the next frame handed out while the app is visible starts a new session (a new row in your usage). Idle time on screen still bills.
- An API secret renders only agents it may use: the session’s startup check names the agent. If the secret’s account may not render it (for example another account’s private avatar left in the app’s cache), the session is refused before anything is billed, with a
MeteringRefusedmessage ending “(403 AGENT_NOT_ENTITLED)”. A bundle you staged yourself names no agent and meters as before. - Each installation is named on your usage: Android sessions now report the app installation’s id. The first session after the upgrade starts a new installation in your usage; nothing is billed twice.
- Action:
implementation("ai.bithuman:essence2-android:0.9.5").
expression2-android 0.6.1 — 2026-10-04
A billing patch for 0.6.0. Rendering, the engine and the native libraries are 0.6.0’s; only the session meter changes. Nothing to change in your code.
- A session nobody is watching ends after 60 s: when your app has been in the background for longer than 60 s, or has not asked for a frame for longer than 60 s (no
Expression2Avatar.pulland noExpression2IdleLoop.nextcall), the session ends and is billed up to that 60 s, not up to your app’s return. “Background” means no visible activity; a process kept alive only by a foreground service counts as background. Time the phone spends asleep counts toward the 60 s and is never billed. If the final claim cannot reach bitHuman (a phone often blocks a cached app’s network), it is sent by the next session and billed once. - No frames in the background after that: until the app is visible again,
pullreturnsnullandExpression2IdleLoop.nextreturns-1(this includesExpression2.render). Audio you fed meanwhile is kept, and frames carry their presentation time so your presenter catches up on the first frame back on screen. - The next session starts by itself: the engine stays loaded, and the next frame handed out while the app is visible starts a new session (a new row in your usage). Idle time on screen still bills.
- An API secret renders only agents it may use: the session’s startup check names the agent (
Expression2Model.code). If the secret’s account may not render it (for example another account’s private avatar left in the app’s cache), the session is refused before anything is billed, with anExpression2Exceptionmessage ending “(403 AGENT_NOT_ENTITLED)”. A model you assembled yourself names no agent and meters as before. - Each installation is named on your usage: Android sessions now report the app installation’s id. The first session after the upgrade starts a new installation in your usage; nothing is billed twice.
- Action:
implementation("ai.bithuman:expression2-android:0.6.1").
Swift package 2.20.4 — 2026-10-04
Tag v2.20.4.
- A session nobody watches ends after 60 seconds: if your app takes no frames from Essence 2 or Expression 2 for 60 seconds (for example, while it is in the background), the session closes and is billed up to that point. The next frame you ask for starts a new session. Coming back within 60 seconds keeps the session.
- The secret check names the avatar: if the API secret’s account may not use the avatar, the session refuses to start with an error naming
AGENT_NOT_ENTITLED, and nothing is billed. Use the API secret of the account that owns the avatar, or of a workspace it is shared with. - Essence 2 is now 1.15.5 (the same frames as 1.15.4) and Expression 2 2.20.4. The macOS engine core (1.0.2) is unchanged.
- Action:
.package(url: …, from: "2.20.4").
Flutter plugin 2.6.36 — 2026-10-04
Tag flutter-plugin-v2.6.36. A security release: update every app that caches avatars on the device.
- Security: a kept avatar opens only for the API secret bitHuman’s door said yes to. Before this release, an avatar the installers kept for account A opened for account B on the same device. Now each kept avatar needs a fresh yes for the credential passed: within 24 hours for an account’s own avatar, 7 days for a public one; otherwise the door is asked first and
loador the installer throwsBithumanEntitlementException. On Android the engines move toessence2-android0.9.4 andexpression2-android0.6.0, whose stores apply the same rule. On iOS and macOS they move to Essence 2essence2-v1.15.4and Expression 2v2.20.3. - iOS: an app that links Essence 2 starts on iOS 16 and later again. Essence 2 renders on iOS 26 and later; below that,
load(engine: 'essence2')fails withunsupported, naming the version it needs. - macOS: the pod’s floor is macOS 26.0 for this release, while one of the plugin’s macOS libraries is rebuilt for older macOS. Set
platform :osx, '26.0'inmacos/PodfileandMACOSX_DEPLOYMENT_TARGET = 26.0in the Runner target. - New:
BithumanAvatar.clearCredentials(). Call it when an account signs out: the engines forget the secret, and on Android the loads still running end withload_cancelled. - Changed:
engine:defaults to'expression2', and an unknown engine name fails withunsupportedon iOS and macOS too.BithumanRealtimeSession’s model defaults togpt-realtime-mini. On Android,pushAudioplays your speech, andloadaccepts the public model ids ('essence-2','expression-2'). - Action: pin
ref: flutter-plugin-v2.6.36. CatchBithumanEntitlementException(Flutter errors), passapiSecretto the installers, and raise macOS apps to 26.0.
essence2-android 0.9.4 — 2026-10-04
A security patch for 0.9.3; every app on 0.9.3 or earlier should upgrade. The model store is the only change: the engine, rendering and billing are 0.9.3’s.
- Security: a cached private avatar opens only for the account it was downloaded for. Through 0.9.3 a private avatar cached on a phone opened for any API secret used there. Now a cached copy opens only for a secret that bitHuman has accepted for that avatar; another account gets the same refusal as a download (
Essence2StoreException, codeNOT_FOUND), and the files are left in place. - After the update, the first open of each cached avatar asks bitHuman once (nothing is downloaded again), so that one open needs the network. Later opens are instant and check for updates in the background, as in 0.9.3.
- Action:
implementation("ai.bithuman:essence2-android:0.9.4").
expression2-android 0.6.0 — 2026-10-04
- An installed avatar picks up updates:
Expression2ModelStore.fetch()returns an avatar already on the phone at once and checks for a newer published version in the background, at most once an hour per avatar. A file that changed (for example a repaired idle clip) is downloaded and verified next to the installed one and used from the nextfetch(), so a session that is already open never has a file replaced under it. Through 0.5.2 an installed avatar kept its files untilfetch(code, force = true).revalidateInBackground = falsemakes the check part of the open, andrevalidateMinIntervalMssets the interval (0checks on every open). - Opening an installed avatar does not wait for the network: offline, a server error or a timeout, the installed, verified files open.
- Security: a cached private avatar opens only for the account it was downloaded for. Through 0.5.2 a private avatar cached on a phone opened for any API secret. Now a cached copy opens only for a secret that bitHuman has accepted for that avatar; another account gets the same refusal as a download (
404 Agent not found). After the update, the first open of each cached avatar asks bitHuman once (nothing is downloaded again), so that one open needs the network. - A first open that is interrupted finishes in the background: if the app is closed while the phone prepares an avatar for the first time, a one-shot JobScheduler job finishes the preparation and the next open is fast. Your app’s merged manifest gains this job service; only the system can bind it.
- Billing: a session bills its active time from its first frame, idle frames included, the same rule as every other platform. An app that shows the idle loop from first paint now bills from first paint; close the avatar when it leaves the screen.
- Action:
implementation("ai.bithuman:expression2-android:0.6.0").
Swift package 2.20.3 — 2026-10-03
Tag v2.20.3. A security release; update.
- A private avatar cached on a device opens only for an account allowed to open it:
Essence2DownloadandExpression2Downloadcheck with the download service before handing a cached copy to a different API secret, and refuse when the service does. The first open of an avatar per secret after this update needs the network once. - Apps at the package’s minimum (iOS 16, macOS 13) launch again on systems below iOS 18.4 and macOS 15.4: the Essence 2 library is now built for the package’s minimum. Essence 2 still renders on iOS 26 and macOS 26 and later; below that,
Essence2Engine.createthrows with a clear message instead of the app failing to start. - Expression 2’s frame and event streams end at shutdown: after
shutdown(), afor awaitloop overframes()orevents()finishes andnextFrame()returnsnil. - Expression 2 downloads stay out of backups (
isExcludedFromBackup), as Essence 2’s do since 2.20.2. - Essence 2 is now 1.15.4 (the same frames as 1.15.3) and Expression 2 2.20.3. The macOS engine core (1.0.2) is unchanged.
- Action:
.package(url: …, from: "2.20.3").
Swift package 2.20.2 — 2026-10-03
Tag v2.20.2.
- App Store privacy manifest: the package now ships
PrivacyInfo.xcprivacy, so Xcode’s privacy report includes the SDK. See Storage and privacy. - Essence 2 downloads stay out of backups: the avatar files
Essence2Downloadkeeps and Essence 2’s runtime files are excluded from iCloud and computer backups (isExcludedFromBackup). They are downloaded again when needed. A directory you pass in is not flagged as a whole. - Essence 2 (1.15.3), Expression 2 (2.20.1) and the macOS engine core (1.0.2) are unchanged.
- Action:
.package(url: …, from: "2.20.2").
Flutter plugin 2.6.35 — 2026-10-03
Tag flutter-plugin-v2.6.35.
- iOS and macOS: built on Expression 2 2.20.1 (Swift package 2.20.1). The plugin opens the files your app gives it and does not use the Swift package’s download stores, so nothing changes in how an avatar opens through the plugin.
- Action: pin
ref: flutter-plugin-v2.6.35.
Swift package 2.20.1 — 2026-10-03
Tag v2.20.1.
- Opening an avatar that is already on the device no longer waits for the network:
Essence2Download.identityandExpression2Download.avatarreturn it at once and check for a newer file in the background; the next call picks it up. On an iPhone 18 Pro,Essence2Download.identityfor an avatar on the phone took a median of 90 ms instead of 571 ms. - A service outage no longer stops an avatar you already have: with a copy on the device the call succeeds even when the download service fails or cannot be reached. Without a copy it fails as before.
revalidateInBackground = falseon either type restores the check before returning.- Expression 2 is now 2.20.1. Essence 2 (1.15.3) and the macOS engine core (1.0.2) are unchanged.
- Action:
.package(url: …, from: "2.20.1").
Flutter plugin 2.6.34 — 2026-10-03
Tag flutter-plugin-v2.6.34. Android Essence 2 engine: essence2-android 0.9.3.
- Android, Essence 2: an avatar already on the phone opens in about 3 s (2.5–4.3 s on a Galaxy Z Flip5, from 6.0–11.2 s); the first open after an install takes about 5 s. A first download continues in the background when the app leaves the screen. An avatar file installed before the October 1 re-publish refreshes itself. Your app’s merged manifest gains
ACCESS_NETWORK_STATEand the engine’s job service. - Action: pin
ref: flutter-plugin-v2.6.34.
essence2-android 0.9.3 — 2026-10-03
- An avatar opens in about 3 seconds: the SDK keeps the GPU programs it compiles for the phone and prepares the avatar’s teeth data while your app checks its credential. In bitHuman Live on a Galaxy Z Flip5, opening an installed avatar took 6–11 s with 0.9.1 and 0.9.2 and takes 2.7–4.3 s with 0.9.3. The first open after the app is installed (or after a GPU driver update) still compiles those programs once, about 5 s.
- Opening an installed avatar no longer waits for the network:
Essence2ModelStorereturns it at once and checks for an update in the background, at most once an hour per avatar. - A first download is faster and survives interruptions: it asks for the avatar’s whole file list in one request, downloads four files at a time, resumes where it stopped after a network gap, and keeps going while the app is in the background. That continuation is a JobScheduler job: no foreground service and no notification. The SDK now declares
ACCESS_NETWORK_STATE, a normal install-time permission, and a service only the system can bind (BIND_JOB_SERVICE). - Avatars published before October 1 refresh themselves: an installed avatar from before the mouth-corner fix is updated on the next fetch. A copy that cannot be updated (staged by hand) is refused with the fix: download the agent again.
- Less CPU per frame on a warm phone, same frames: on a throttled Galaxy Z Flip5 the face’s motion step takes about 9 % less CPU time per frame.
- Action:
implementation("ai.bithuman:essence2-android:0.9.3").
Flutter plugin 2.6.33 — 2026-10-02
Tag flutter-plugin-v2.6.33.
- Android, Expression 2: characters published without an idle clip no longer stay blank. The plugin shows a still frame of the character until its first reply, so it appears and can talk. iOS and macOS were not affected.
- Action: pin
ref: flutter-plugin-v2.6.33.
Flutter plugin 2.6.32 — 2026-10-02
Tag flutter-plugin-v2.6.32. Android Essence 2 engine: essence2-android 0.9.2.
- Android, Essence 2: on a heat-throttled phone, characters keep moving more smoothly: the engine renders the character’s 720p output and scales it up, then returns to full resolution once the phone cools. On a Galaxy Z Flip5 at its deepest throttle, about 75% of the frames the voice needs reached the screen, against 37% with the previous engine. No other change.
- Action: pin
ref: flutter-plugin-v2.6.32.
Flutter plugin 2.6.31 — 2026-10-02
Tag flutter-plugin-v2.6.31. iOS and macOS Essence 2 engine: essence2-v1.15.3 (Swift package 2.20.0).
- iOS and macOS, Essence 2: the default is again the presenter that releases each frame’s 40 ms of voice when the frame is shown. A stall guard is new: when a display tick has no frame while the reply’s voice is waiting, that tick’s voice is released anyway and the picture catches up, so the voice never waits more than 40 ms. Measured on an iPhone 18 Pro: no voice gaps of 40 ms or more, and the voice within about 20 ms of the picture.
- iOS and macOS, Essence 2:
BithumanAvatar.load(..., voiceClock: true)opts in to 2.6.30’s presenter. The voice starts 200 ms after the reply’s first frame and plays on its own clock, and frames follow it. This corrects 2.6.30, where it was the default. - iOS and macOS, Essence 2:
skipAhead: truenow takes effect with the new engine, together withvoiceClock: true. Off by default. - Action: pin
ref: flutter-plugin-v2.6.31.
Swift package 2.20.0 — 2026-10-02
Tag v2.20.0.
- Essence 2 on iPhone, iPad and Mac: a new optional
be_essence2_set_playout_positiontells the engine how much of the voice you have played. On a device that renders below real time it skips frames whose sound has already played, so the face keeps moving in step with the voice instead of freezing. An app that does not call it renders exactly as with 2.19.4. Also new:be_essence2_last_frame_indexandbe_essence2_skipped_frames. - Essence2Kit:
createnames an avatar file published before the renderer this engine carries with the new errorEssence2KitError.identityOutdated, and fetches a file thatEssence2Downloaddownloaded again once. Essence 2 1.15.3 still opens such files, so this does not apply yet. - Playing the voice yourself: Recommended: gate each frame’s audio on its display (lowest latency). If your presenter is voice-clocked, open the voice ~200 ms after the first frame to avoid gaps after a barge-in.
- Essence 2 is now 1.15.3. Expression 2 (2.19.2) and the macOS engine core (1.0.2) are unchanged.
- Action:
.package(url: …, from: "2.20.0"). If youswitchoverEssence2KitError, add a case for.identityOutdated.
Flutter plugin 2.6.30 — 2026-10-02
Tag flutter-plugin-v2.6.30. Engines unchanged.
- iOS and macOS, Essence 2: the voice now plays on its own clock and frames follow it, rather than the voice waiting for each frame. It starts 200 ms after the reply’s first frame is ready, and each frame is shown as its sound is heard. Measured on an M4 Mac: no breaks in the voice, frames within a few milliseconds of their sound, and the first word about 200 ms later than in 2.6.29.
- iOS and macOS, Essence 2:
BithumanAvatar.load(..., skipAhead: true), Android’s option since 2.6.29, now also reaches Apple. It takes effect with the next Essence 2 engine for Apple. Off by default. downloadAgentImx: fetches today’s catalog. It follows the door’s redirect to the file and takesapiSecret:. It downloads a gallery Essence 2 character without a key, and any character your key’s account owns. A file it already has opens at once, and it is refreshed in the background when it changes.- Android: skip-ahead stays off by default; pass
skipAhead: trueto use it. - Action: pin
ref: flutter-plugin-v2.6.30.
Flutter plugin 2.6.29 — 2026-10-02
Tag flutter-plugin-v2.6.29. Android Essence 2 engine: essence2-android 0.9.1.
- Android, Essence 2: characters keep moving while they talk on a phone that renders below real time; with 0.9.0 the face could freeze behind the voice. Optional, off by default:
BithumanAvatar.load(..., skipAhead: true)tells the engine where the voice is, so a slow phone shows fewer frames, each in step with the voice. - Errors: new code
MODEL_REJECTED. When the on-device engine refuses the model file,BithumanAvatar.loadthrowsBithumanModelRejected, and a session on that avatar ends onerrorStreamthe same way asPAYWALL. On iOS and macOS this replaces a still face that never became ready. Custom voice hosts:VoiceHostgainsmodelRejections. - Android, Expression 2: a reply’s first words start sooner (faster voice start, Expression 2 only).
- Action: pin
ref: flutter-plugin-v2.6.29.
essence2-android 0.9.2 — 2026-10-02
- Adaptive 720p while the device is thermally throttled: when a phone has been busy for a while and caps its GPU, Essence 2 now renders the avatar’s 720p output and scales it to the full-size frame, then returns to full resolution once the phone cools. The frames your app receives keep their size, so there is nothing to change in an app. It applies to avatars that publish a 720p output; their SDK download adds about 5 MB, verified like every other file, and an offline launch never needs it.
- Less GPU work per frame, same pixels: the avatar renders faster on the GPU and the frames look exactly the same. On a Galaxy Z Flip5 that has been in calls for a few minutes, bitHuman Live shows about 70 % of the frames its voice needs at the deepest throttle, up from about a third, and a cool phone renders about 14 % faster.
- New, optional:
Essence2Options(outputHeight = 720)opens a session at the avatar’s 720p output when it publishes one (the default,0, is the full-size output). - Action:
implementation("ai.bithuman:essence2-android:0.9.2").
essence2-android 0.9.1 — 2026-10-02
- The face keeps up with the voice on phones with little cores: in an app, the Essence 2 renderer could end up on the phone’s slower cores and fall behind its own voice, so the face held one pose while the avatar spoke (seen on a Galaxy Z Flip5). It now runs on the fast cores; on the Flip5 it renders 37–40 frames a second, up from 21–25.
- New, optional:
setPlayoutPosition(samples16k). Tell the avatar how much of the current utterance’s audio your app has sent to the speaker. When a phone cannot keep up (for example once it is warm), the avatar skips the frames whose audio has already played and shows the one that matches the voice, instead of falling behind.lastFrameIndexsays which part of the audio a pulled frame belongs to, andskippedFramescounts the skips. Without the call, frames come out exactly as before. - Action:
implementation("ai.bithuman:essence2-android:0.9.1").
Flutter plugin 2.6.28 — 2026-10-01
Tag flutter-plugin-v2.6.28.
- The character’s own voice no longer cuts it off: on a loudspeaker, short bursts of the character’s voice could reach the microphone and end its reply as if the person had spoken. While the character is heard, the session now sends the microphone on only when it is close in level to the voice heard and stays there for 200 ms. A person talking over the character still cuts in, about 100 ms later than before. The level is set per device and can be changed with
BithumanRealtimeSession(bargeFloorDb:). - Android: Essence 2 characters already on the phone open at once; the check for an update runs after the character is live, and an update is used from the next open.
- Errors:
PAYWALL(no Live minutes left) now ends the session onerrorStream. After any such error, the session also turns the microphone and speaker off, ends the captions and closes its streams. Build a new session to try again. - Captions: when a reply is cut short,
spokenTranscriptStreamstops at the words that were spoken. - Action: pin
ref: flutter-plugin-v2.6.28.
Flutter plugin 2.6.27 — 2026-10-01
Tag flutter-plugin-v2.6.27.
- Captions:
BithumanRealtimeSession.spokenTranscriptStreamreleases the agent’s words as they are heard, so a caption keeps pace with the voice instead of showing the whole reply at once. Each event holds the reply’s caption so far; a reply cut by a barge-in or a typed turn ends with only the words heard.botTranscriptStreamis unchanged. A customVoiceHostgains one member,speechPlayout. - Android: closing the app with Back while an avatar is on screen no longer crashes it.
- iOS and macOS: the plugin’s privacy manifest declares the APIs it uses and ships inside the app.
- Release builds: the words of a transcribed turn are no longer written to the device log.
- Action: pin
ref: flutter-plugin-v2.6.27; for captions, listen tospokenTranscriptStream.
bithuman 2.11.20 — 2026-10-01
- Quieter console: an Essence 2 render no longer prints the engine’s per-session diagnostic lines or ONNX Runtime’s initializer warnings. Set
BITHUMAN_DEBUG=1to see them again. Warnings and refusals still print. render(audio, out_mp4=...)andpython -m bithuman renderwrite as many frames as the audio lasts, likebithuman render: 375 frames for 15.0 s of Essence 2 audio, not 381. The frames after the audio ends are still rendered and metered as before; they are just not written.- Progress is shown only on a terminal. With
--json, a failure is one JSON object on stderr in the CLI’s shape ({"error": {"kind", "code", "message", "command", "hint"}}), with the same exit codes. - The 2.11 spelling
python -m bithuman <avatar> <audio>is reported as deprecated (removed in 2.14.0). - On Apple silicon, Expression 2 renders through the render host that the
bithumanCLI 2.8.7 ships. - Action:
pip install -U bithuman.
Flutter plugin 2.6.26 — 2026-10-01
Tag flutter-plugin-v2.6.26.
- Essence 2: the mouth blends into the face without the visible edge that could show at the corners of the lips. Android gets it with
essence2-android0.9.0; on iOS and macOS it comes with the avatar files and Essence 2 1.15.2. - Android: the engines resolve from maven.bithuman.ai, which the plugin declares itself; a Flutter app adds no repository. Versions already on Maven Central keep resolving from Central.
- macOS: an app built for macOS 13 links again (macOS engine core 1.0.2).
- Action: pin
ref: flutter-plugin-v2.6.26.
essence2-android 0.9.0 — 2026-10-01
- Essence 2 on Android: the mouth blends into the face without the visible edge that could show at the corners of the lips. Avatars get this as they are updated on bitHuman; an avatar that has not been updated renders exactly as in 0.8.1.
- Changed (billing): every session bills its active session time, talking or idle, from its first frame to
close(), file renders included.Essence2Metering.basisis ignored (deprecated). Idle frames shown before the first reply now start the session clock, as on iOS. - Changed: a refused session says why: the plan does not include SDK access (Creator plan or higher), the account’s concurrent sessions are used up, the account is suspended, or it has no credits left.
- Action:
implementation("ai.bithuman:essence2-android:0.9.0"). Delete anyEssence2Metering.basis = …line, and close a file-render session right after its last frame.
CLI 2.8.8 — 2026-10-01
Tag cli-v2.8.8.
- Removed: the
text_to_speechandlist_voicestools inbithuman mcp. They called bitHuman’s text-to-speech service, which is retired. Make the audio with any speech tool and pass it tobithuman render(talking video). - The bundled Essence 2 engine is the one in
bithuman2.11.20. Billing is unchanged from 2.8.7. - Action:
brew upgrade bithuman-cli, or re-run the installer.
Text-to-speech service retired — 2026-10-01
- Removed: bitHuman’s own text-to-speech service.
POST /v1/tts,POST /v1/audio/speech(the OpenAI-compatible endpoint),GET /v1/voicesand/v1/studio/*now answer410 ENDPOINT_RETIRED. The voice playground at www.bithuman.ai/voice redirects to the talking video guide, and thetext_to_speechandlist_voicestools leave the MCP server in the next CLI release. - Unchanged: an agent’s conversation voice (its voice provider, voice cloning, voices) and
POST /v1/agent/{code}/speak, which use third-party voice providers. - Action: if you called these endpoints, generate the audio with any TTS provider (or record it) and send it to the talking video API. bitHuman renders the avatar from your audio.
CLI 2.8.7 — 2026-10-01
Tag cli-v2.8.7.
- Clearer:
bithuman --helpandbithuman run --helpno longer call the Wise Pup sample avatar free; every session bills your credits for active session time (pricing).run --helpsays where a session renders: a showcase name or a file on your machine (self-hosted rate); an agent code on your machine when it can, otherwise on bitHuman cloud (cloud rate). The line that prints the session URL says which, and a local--jsonsession_startedevent carries"mode":"local". - Fix:
bithuman doctorno longer reports a fresh install as not ready only because the agent worker is not set up yet (the firstbithuman runsets it up). Its missing-encoder advice says to reinstall the CLI. - Fix:
bithuman renderon Linux names the encoder it uses (libx264). - The rendering engine and billing are unchanged from 2.8.6.
- Action:
brew upgrade bithuman-cli, or re-run the installer.
Swift package 2.19.4 — 2026-10-01
Tag v2.19.4.
- Mac apps on macOS 13: the macOS engine core is now built for macOS 13, the package’s declared minimum, so an
Expression2Mac app built for macOS 13 links without thebuilt for newer 'macOS' version (14.0)warning and runs there. (Essence2KitandEssence2still need macOS 26.) - The macOS engine core is now 1.0.2. Essence 2 (1.15.2), Expression 2 (2.19.2) and everything on iPhone and iPad are unchanged.
- Action:
.package(url: …, from: "2.19.4").
September 2026
Android packages now come from maven.bithuman.ai — 2026-09-30
- Changed: Android packages now come from maven.bithuman.ai, bitHuman’s own Maven repository. New versions of
ai.bithuman:essence2-androidandai.bithuman:expression2-androidare published there; every earlier version is served there too and stays on Maven Central. The Flutter plugin declares the repository itself. - Action: add
https://maven.bithuman.aitodependencyResolutionManagement.repositoriesinsettings.gradle.kts, as on the Android page. A Flutter app needs no change.
Swift package 2.19.3 — 2026-09-30
Tag v2.19.3.
- Essence 2 on iPhone, iPad and Mac: the mouth blends into the face without the visible edge that could show at the corners of the lips, now also when the engine renders an avatar without its bundled Core ML model. Avatars get this as they are updated on bitHuman; an avatar that has not been updated renders exactly as in 2.19.2.
- Essence 2 is now 1.15.2. Expression 2 (2.19.2) and the macOS engine core (1.0.1) are unchanged.
- Action:
.package(url: …, from: "2.19.3").
CLI 2.8.6 — 2026-09-30
Tag cli-v2.8.6.
- Essence 2 on Linux: the mouth blends into the face without the visible edge that could show at the corners of the lips. Avatars get this as they are updated on bitHuman;
bithuman pull <CODE>fetches the updated file. An avatar that has not been updated renders exactly as in 2.8.5. - Action:
brew upgrade bithuman-cli, or re-run the installer.
Flutter plugin 2.6.25 — 2026-09-30
Tag flutter-plugin-v2.6.25.
- Fix: a phone call (or Siri, an alarm, or another app taking the audio) now ends the realtime session on iOS and Android, so a paused call is no longer billed. Turn this off with
endOnAudioInterruption: false. - Fix: a call stays on connected Bluetooth, wired or USB headsets (including AirPods) instead of being forced to the loudspeaker; the loudspeaker is used only when nothing is connected.
- Fix: disposing an avatar is safe at any time, including mid-load, and a switched-away download can be cancelled (
BithumanAvatar.cancelLoad); Android reports load progress (BithumanAvatar.loadEvents). - Faster: smoother Android rendering, a quicker reveal, and on iOS/macOS the avatar package is unpacked once instead of on every launch; opening and closing the mic no longer stalls the UI on Android.
- Action: pin
ref: flutter-plugin-v2.6.25.
bithuman 2.11.19 — 2026-09-30
- Fix: if the startup credential check is lost in transit, or the service answers 5xx or 429,
bithuman.open()asks once more before it refuses. A 2xx, 401, 402 or 403 is never repeated. - On Apple silicon, Expression 2 renders through the render host that the
bithumanCLI 2.8.5 ships. That host checks your API secret and bills its own session, so each session is still billed once. - Essence 2: the renderer can apply the mouth structure carried in an avatar’s template. Avatars without that structure render as before.
- Pins PyAV below 19 to avoid a thread leak in Expression 2 idle clips.
- Action:
pip install -U bithuman.
CLI 2.8.5 — 2026-09-30
Tag cli-v2.8.5.
- Fix: if the startup credential check is lost in transit, or the service answers 5xx or 429, the CLI asks once more before it refuses. A 2xx, 401, 402 or 403 is never repeated.
- Fix: a retried stop is billed once.
- Fix: a 403 names what to do. A plan limit names the plan and links the plans page.
- On a Mac, the Expression 2 render host checks your API secret and bills its own session.
bithuman runandbithuman renderstill bill each session once. - Security: a release build ignores the meter’s tuning settings.
- Action:
brew upgrade bithuman-cli, or re-run the installer.
Swift package 2.19.2 · Flutter plugin 2.6.24 — 2026-09-30
- Security (iPhone, iPad and Mac): the on-device meter in a release build now ignores its tuning settings, so usage is always billed the way the service defines it. Please update:
.package(url: …, from: "2.19.2"), or pinref: flutter-plugin-v2.6.24and re-run the plugin’sscripts/bootstrap.sh. - Fix: if the startup credential check is lost in transit, or the service answers 5xx or 429, the engine asks once more before it refuses the session. A 2xx, 401, 402 or 403 is never repeated.
- Expression 2 is now 2.19.2 and Essence 2 is 1.15.1. The macOS engine core (1.0.1) is unchanged.
bithuman 2.11.18 — 2026-09-29
- New:
pip install bithumaninstalls on Windows 11 (x86_64, Python 3.10–3.14). Essence 2 and Expression 2 avatars open and render on the machine as on macOS and Linux; Essence 1 renders in the cloud with the Video API. The wheel carries the Visual C++ runtime it needs. - New:
python -m bithuman pull <AVATAR>gets an avatar onto the machine together with the engine files its model fetches on the first render. While online, pull each avatar once, andpython -m bithuman pack redeemonce for an offline pack; after that, rendering needs no network. The same verb,--modeland--forceas thebithumanCLI. - Changed: a refusal because of the account’s plan says so (“API and SDK access starts at the Creator plan”, with one link to the plans) instead of calling the API secret revoked; a plan’s session limit and a suspended account have their own sentences, and an account out of credits points to /billing#credits. What is refused, and the exception raised, are unchanged.
- Changed:
render(out_mp4=...)writes the MP4 with the platform’s own H.264 encoder where there is one (VideoToolbox on macOS, Media Foundation on Windows), and with x264 otherwise;python -m bithuman render --jsoncarrieswall_seconds, as the CLI does. On Apple silicon, Expression 2 renders through the same render host CLI 2.8.4 ships. - Action:
pip install -U bithuman.
CLI 2.8.4 — 2026-09-28
Tag cli-v2.8.4.
- New: an offline pack now covers Essence 2 and Expression 2 renders too. Once
bithuman pack redeemhas installed a pack for the model,bithuman renderof that avatar needs no network and no API secret until the pack is spent. A spent pack, or one that is not for this machine, stops the render with exit 77 and says which; it never falls back to billing the account. Offline packs open platform by platform. - New:
bithuman pull <CODE>also fetches the engine files the avatar’s model needs to render (the Essence 2 audio frontend; the Expression 2 engine on macOS). While online, pull each avatar and redeem once; after that, rendering needs no network. - New: the CLI runs natively on Windows 10 and 11 (x86_64):
irm https://install.bithuman.ai/windows | iex. Rendering on the machine and offline packs are not in the Windows build yet. - Changed:
bithuman pack statuslists every installed pack, one line per model (--json:packs). - Fixed:
render --jsonsecondsis the video’s length (frames / fps), as in the Python package; the render’s wall time iswall_seconds. - Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
bithuman 2.11.17 — 2026-09-28
- New: an installed offline pack now covers Essence 2 and Expression 2 avatars too:
bithuman.open(),render()andpython -m bithuman renderneed no network and no API secret when an installed pack covers the avatar, and every frame is metered on the machine against the pack (Expression 2 at its own 20 fps). - New: on macOS (Apple silicon) a pack is kept in the system keychain, sealed by the Secure Enclave where the Mac has one. Offline packs open platform by platform; where one is not available yet,
python -m bithuman pack redeemsays so and nothing is spent. - Action:
pip install -U bithuman.
Swift package 2.19.1 · Flutter plugin 2.6.22 — 2026-09-28
- Security (macOS): the macOS engine core is rebuilt so that only its public interface is linkable. Please update:
.package(url: …, from: "2.19.1"), or pinref: flutter-plugin-v2.6.22and re-run the plugin’sscripts/bootstrap.sh. - iPhone and iPad are unaffected. Expression 2 (2.19.0) and Essence 2 (1.15.0) are unchanged.
Swift package 2.19.0 — 2026-09-28
Tag v2.19.0.
- Changed: the Expression 2 engine moves to 2.19.0 and the Essence 2 engine to 1.15.0. On a Mac, both engines now take their licensing and metering core from a new
EngineCorebinary target. TheExpression2,Essence2andEssence2Kitproducts link it for you, withSecurityandcurl. iPhone and iPad builds link nothing new. - Action: update to 2.19.0. A Mac app that links the engine archives outside SwiftPM must also link
EngineCore.xcframeworkfrom the essence2-v1.15.0 release, plusSecurityandcurl.
Flutter plugin 2.6.21 — 2026-09-28
- Changed: iOS and macOS link the Swift package 2.19.0 engines (Expression 2 2.19.0, Essence 2 1.15.0), and on macOS the pod also links
EngineCore. Android is unchanged:essence2-android0.8.1 andexpression2-android0.5.2. - Action: pin
ref: flutter-plugin-v2.6.21and run the plugin’sscripts/bootstrap.shagain.
CLI 2.8.3 — 2026-09-28
Tag cli-v2.8.3.
- New:
bithuman pack redeeminstalls a prepaid offline pack (Business and Enterprise) on the machine that runs it;bithuman pack statusshows the render-seconds left. Afterwardsbithuman renderof an Essence 1 avatar the pack covers needs no network and no API secret until the pack is spent. The MCP server adds thepack_redeemtool. Offline packs open platform by platform; where the CLI’s support has not opened yet, the redeem says to usepython -m bithuman pack redeem, and nothing is spent. - Changed: the removals announced for CLI 2.9 (the
./.envread, the spellings retired in 2.7.3) ship no earlier than 2026-12-26; the notices say so. - Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
bithuman 2.11.16 — 2026-09-28
- New:
python -m bithuman pack redeeminstalls a prepaid offline pack (Business and Enterprise) on the machine that runs it: it binds the account’s unredeemed pack to this machine and installs it.python -m bithuman pack redeem PURCHASE_IDredeems a named one;--file PACKinstalls a saved pack with no network. Afterwardspython -m bithuman renderof an avatar the pack covers needs no network and no API secret until the pack is spent. - Changed: a refused redeem says in plain words what to do (the plan, the platform, a pack already installed) and that nothing was spent.
- Action:
pip install -U bithuman.
bithuman 2.11.15 — 2026-09-27
- New:
bithuman.open(path).render(audio, out_mp4="out.mp4")writes the MP4 (H.264 with the speech) and returns the number of frames, for every model. It is the one offline route. - Fixed: an Essence 1 file render (
bithuman.open(...).render(...)orpython -m bithuman render) billed every frame twice; a render of N seconds of video now bills N seconds. LiveAsyncBithumansessions were not affected. - Deprecated (removed in bithuman 4.0, no earlier than 2026-12-26; each prints one warning naming the replacement):
bithuman.offline(render_offline,OfflineRenderer), the deprecated aliasBITHUMAN_API_KEY,token=onAsyncBithuman.create, and the namebithuman.AsyncAvatar.python -m bithumanstops reading the API secret from./.envin the next release. - Action:
pip install -U bithuman.
CLI 2.8.2 — 2026-09-27
Tag cli-v2.8.2.
- Changed:
bithuman run <CODE>with a code that is not one of your agents plays the free gallery avatar with that code, the waypull,renderandopenalready did. - Changed:
bithuman opennames the model (for example Essence 2 or Expression 2). Askingpullfor a model a gallery avatar does not have names the models it does have (MODEL_NOT_GENERATED). - Changed: with
BITHUMAN_LOCAL=1,runchecks that the on-device voice packages are installed before the session starts, and prints the one command that installs them. - Deprecated: reading the API secret from a
.envfile in the working directory prints a notice; CLI 2.9 stops reading it. ExportBITHUMAN_API_SECRET, or runbithuman loginonce. - Deprecated: the deprecated alias
BITHUMAN_API_KEYis read until CLI 3.0 (no earlier than 2026-12-26). Rename it toBITHUMAN_API_SECRET(same value). - Changed:
BITHUMAN_API_BASEis no longer a documented setting; the CLI talks tohttps://api.bithuman.ai. - Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
Flutter plugin 2.6.20 — 2026-09-27
- Changed: the realtime voice session takes your bitHuman API secret and connects through bitHuman’s realtime relay; there is no
ek_…token to mint. The conversation is billed to your account at 10 credits per minute, the avatar included. A refusal a retry cannot fix (a rejected secret, no credits, the time limit) stops the session once and is reported onerrorStream. - Fixed: iOS and macOS build from the published tag. They link the published Expression 2 (2.18.0) and Essence 2 (1.14.2) engines.
- Changed: Android uses
essence2-android0.8.1 (memory stays flat in long sessions) andexpression2-android0.5.2. - Action: pin
ref: flutter-plugin-v2.6.20and pass your API secret toBithumanRealtimeSession(apiKey:).
expression2-android 0.5.2 — 2026-09-27
- Changed: the Hexagon accelerator prepares the decoder once and keeps it. On a Galaxy S25+,
create()took about 31 s on every launch through 0.5.1; with 0.5.2 the first launch takes about 15 s and later launches 1–2 s. Replies start as fast as before, and frames are unchanged. - Added: read-only
Expression2Backendfields report whether the prepared decoder was reused and how long it took. - Action:
implementation("ai.bithuman:expression2-android:0.5.2").
Swift package 2.18.0 — 2026-09-27
Essence 2 engine 1.14.2 · Expression 2 engine 2.18.0
- New: Expression 2 hands out one stream of frames to show:
frames(audioClock:)at 20 frames per second, idle motion between replies and each speech frame when your player has played its audio. Each frame says whether it is speech (isSpeech) and which one ends the reply (endsReply);events()reports.replyStartedand.replyEndedonce per reply, andinterrupt()cuts a reply.pull()is unchanged. - Fixed: an Expression 2 session that only shows its idle animation is billed for its active time, like any other session.
- Action: set
from: "2.18.0", thenswift package update.
CLI 2.8.1 — 2026-09-27
Tag cli-v2.8.1.
- Fixed: opening a
bithuman runpage link no longer starts a billed session in a room nobody joins (a link preview, a prefetch or a reload). A session starts when a person joins; a room nobody joins within 90 seconds ends without starting. - Changed: with the bitHuman brain (no OpenAI key of your own), the voice connects through bitHuman’s own service with your API secret, and says in plain words why it stopped (out of credits, the 60-minute session limit, a rejected secret).
- Fixed: a long Essence 2 session no longer grows in memory while the avatar talks.
- Changed:
--helpexamples use the freewise-pupavatar;bithuman listsays rendering needsbithuman login; with--json, a mistyped command prints one JSON error (USAGE, exit 2). - Fixed: a long-running
bithuman runuses a re-published avatar file for the next session without a restart. - Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
Swift package 2.17.3 — 2026-09-27
Essence 2 engine 1.14.2 · Expression 2 engine 2.7.0
- Fixed: memory stays flat in long Essence 2 sessions. Before this release, an app that fed audio without a pause grew by about 1 MB per second of speech. On an iPhone that could end a session after about 35 minutes.
- Action: set
from: "2.17.3", thenswift package update.
essence2-android 0.8.1 — 2026-09-27
- Fixed: memory no longer grows while an avatar speaks without pausing. Through 0.8.0 the audio frontend kept every frame of an utterance, about 1 MiB per second of speech, until
endOfAudio(),resetAudio()or a 600 ms pause infeed(). Turn-by-turn conversation stayed bounded; an app that fed audio continuously grew for as long as it spoke. On a Galaxy S25+, ten minutes of one continuous utterance now holds at about 920 MiB, where 0.8.0 reached 1,473 MiB. Frames are unchanged. - Action:
implementation("ai.bithuman:essence2-android:0.8.1"), especially if your app streams audio without pauses.
Flutter plugin 2.6.19 — 2026-09-26
- Changed: on Android, Essence 2 frames reach the screen without a CPU copy. On a Galaxy S25+ this uses about 8% less CPU, and the frames are unchanged.
- Changed: Android uses
essence2-android0.8.0 andexpression2-android0.5.1, which bill correctly whatever the app sets and name each installation on the meter. iOS and macOS are unchanged. - Action: set
ref: flutter-plugin-v2.6.19in yourpubspec.yaml.
expression2-android 0.5.1 — 2026-09-26
- Fixed: billing can no longer be changed from app code: the meter’s endpoint, whether from
Expression2Metering.apiBaseUrlor theBITHUMAN_API_URLenvironment variables, is honoured only for anhttps://bitHuman host. - Added: each installation names itself on the meter: a random id is kept in the app’s storage. Set
Expression2Metering.installIdorBITHUMAN_INSTALL_IDto choose it yourself. - Action:
implementation("ai.bithuman:expression2-android:0.5.1").
essence2-android 0.8.0 — 2026-09-26
- Fixed: billing can no longer be changed from app code.
Essence2Metering.fpsis ignored (deprecated, still compiles), and the meter’s endpoint, whether fromapiBaseUrlor theBITHUMAN_API_URLenvironment variables, is honoured only for anhttps://bitHuman host. - Added: each installation names itself on the meter: a random id is kept in the app’s storage. Set
Essence2Metering.installIdorBITHUMAN_INSTALL_IDto choose it yourself. - Added:
useHardwareBuffers(slots)accepts up to 32 slots (was 16), for presenters that queue frames ahead. - Added:
Essence2RenderFailedandEssence2RenderStatusresolve fromai.bithuman.essence2, soimport ai.bithuman.essence2.*covers every type an app uses. - Changed: the GPU work per frame falls by about a third; frames are unchanged.
- Action:
implementation("ai.bithuman:essence2-android:0.8.0").
CLI 2.8.0 — 2026-09-26
Tag cli-v2.8.0.
- Changed: avatars download at about half the size.
pull,runandrenderfetch only the parts this computer uses: an Essence 2 avatar is about 70–90 MB instead of 150 MB, and an Expression 2 avatar about 35 MB on a Mac or 65 MB on Linux instead of 200 MB. Every download is checked against its published digest, and the rendered video is the same. - Changed: the bitHuman brain (the voice chat that needs no OpenAI key) and a prepaid offline pack count active session time, talking or idle, the same rule as every bitHuman surface.
- Changed:
BITHUMAN_API_BASEand--api-baseaccept onlyhttps://api.bithuman.aior anotherhttps://*.bithuman.aiaddress; any other value is ignored with a notice. - Fixed:
bithuman logoutrevokes only the secretbithuman loginstored. A secret from the environment or a./.envfile is never revoked. - Fixed: the notice that a newer CLI is available always finds the newest CLI release.
- Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
bithuman 2.11.14 — 2026-09-27
- Fixed:
bithuman.open()with no API secret, offline licence or prepaid pack refuses at once, before it loads the model or downloads anything, and namesBITHUMAN_API_SECRETand where to get one. - Fixed: a first Essence 2 open on a fresh machine downloads 66 MB instead of 444 MB; the 377 MB audio encoder is fetched only when the avatar uses it. Rendered frames are identical.
- Fixed: memory stays flat when an Essence 2 avatar speaks without a pause; it grew about 1 MB per second of speech.
- Changed: a live avatar reports its whole active session, talking or idle, as the billing rule says; an idle stretch was billed for at most a few minutes of it.
- Changed: usage reports go only to bithuman.ai hosts.
- Changed:
AsyncBithuman.sync_to(sink)shows each picture when its voice plays; with the LiveKitAvatarRunner, an Expression 2 mouth led its voice by about 120 ms at a browser viewer and now leads by about 60 ms. - Changed: prepaid offline packs are debited for the whole active session; the CPU runtimes find a CPU quota set on the process’s own cgroup; a load failure names the product.
- Action:
pip install -U bithuman.
bithuman 2.11.13 — 2026-09-26
- Fixed: an Expression 2 reply through
AsyncBithuman(and the LiveKit plugin) plays through without the brief pause about a second in, where the face froze and the voice stopped. A reply that is already complete starts sooner, and a reply pushed in a single call starts once its first part is rendered instead of after all of it. - Fixed: the Expression 2 and Essence 2 CPU runtimes size their thread pools to the CPUs a container allows instead of the machine’s total core count, so Expression 2 in a CPU-limited container renders at full speed.
BITHUMAN_THREADSstill overrides. - Fixed: a long idle no longer grows the process by dozens of threads.
- Fixed: a reply pushed to
AsyncBithumanin a single call is metered in full; about 80% of it was before. - Changed: a streamed Expression 2 reply renders exactly the frames
bithuman.open()renders for the same audio. - Changed: the offline renderer raises
FileNotFoundErrornaming the path when the avatar file does not exist, and refuses another kind of avatar by its product name. - Changed: usage reports name the installation with a random id kept in
~/.bithuman/install_id, the same file thebithumanCLI uses. SetBITHUMAN_INSTALL_IDto choose your own. - Action:
pip install -U bithuman.
LiveKit docs and examples — 2026-09-26
- Changed: a LiveKit worker keeps your API secret as
BITHUMAN_MASTER_SECRET, neverBITHUMAN_API_SECRET.livekit-plugins-bithuman1.8.4 and older readsBITHUMAN_API_SECRETby itself wheneverapi_secret=is omitted, and copies it into the avatar’s participant attributes, which everyone in the room can read. The LiveKit page and the LiveKit examples now use the new name and refuse to start while the old one is set. - Action: rename the variable in your worker’s environment and mint a room token from it. If a worker ran a cloud avatar with
BITHUMAN_API_SECRETset and noapi_secret=, create a new secret and delete the old one in the console.
Billing — 2026-09-26
- Changed: a managed conversational agent bills one all-inclusive rate (10 credits/min, or 30 with the camera on). It covers the avatar, whether it renders in the bitHuman cloud or in the viewer’s browser; there is no separate avatar charge. An avatar-only session (your own agent through the plugin or the API) that renders in the browser bills the model’s self-hosted rate. Rates are on pricing.
- Changed: realtime sessions bill active session time, talking or idle, by the exact second, with no per-session minimum. A session’s fraction of a credit carries to your next session. This replaces the talking-only billing announced earlier the same day. Talking-video renders are unchanged: whole minutes of output, minimum one minute. Rates are on pricing.
- Changed: Expression 1 avatar sessions are now metered to your account at the standard cloud rate. Rates are on pricing.
Swift package 2.17.2 — 2026-09-26
Essence 2 engine 1.14.1 · Expression 2 engine 2.7.0
- Fixed: Essence 2 sessions are always billed to your API secret. Update from any earlier release.
- Action: set
from: "2.17.2", thenswift package update.
Swift package 2.17.1 — 2026-09-26
Essence 2 engine 1.14.0 · Expression 2 engine 2.7.0
- Fixed: reading
width,height,isReadyorruntimeFailureaftershutdown()no longer crashes the app.
Swift package 2.17.0 — 2026-09-26
Essence 2 engine 1.14.0 · Expression 2 engine 2.7.0
- New:
Essence2Engine.frames(following:), an AsyncSequence of frames paced to 25 per second. Each frame carriesisSpeech,endsReplyandaudioTime, andevents()reports.replyStarted/.replyEndedonce per reply.frames(following: player)hands out a reply’s frames as yourAVAudioPlayerNodeplays their audio, so lips stay on the voice for the whole reply;frames(audioClock:)takes your own clock. - New:
flushTail()ends a reply’s audio at once instead of after 0.6 s of silence;pacing = .unpacedrenders offline as fast as the device allows. - Changed:
pull()andidle(into:)hand out at most 25 frames a second. A tight loop no longer receives hundreds of idle frames a second;nilstill means keep the current frame. The 40 ms loop from 2.16.0 keeps working. - Changed: usage reports name the install with a random id kept in the app’s Application Support directory (
BITHUMAN_INSTALL_IDoverrides it). - Action: set
from: "2.17.1", thenswift package update. Move a display loop toframes(following:).
Flutter plugin 2.6.18 — 2026-09-26
- Changed: iOS and macOS use Essence 2 engine 1.14.0, whose usage reports name the install. Android is unchanged.
- iOS and macOS do not build from the published tag yet; use the plugin on Android.
Swift package 2.16.0 — 2026-09-25
Essence 2 engine 1.13.0 · Expression 2 engine 2.7.0
- Fixed: an app that links its own
mlx-swiftnow links beside Essence 2, also with-ObjCor-all_load. Essence 2 no longer contains MLX, and its download is 22 MB instead of 171 MB. - Action: set
from: "2.16.0", thenswift package update.
Flutter plugin 2.6.17 — 2026-09-25
- Changed: iOS and macOS use Essence 2 engine 1.13.0, which contains no MLX.
- Action: pin
ref: flutter-plugin-v2.6.17. - iOS and macOS do not build from the published tag yet; use the plugin on Android.
Dashboard — 2026-09-25
- Changed: Explore opens the V2 gallery of Essence 2 and Expression 2 agents. Switch to V1 for the classic gallery; your choice is remembered.
- Changed: a new agent starts on Expression 2. Essence 2, Essence 1 and Expression 1 stay one click away in the model dialog.
essence2-android 0.7.0 — 2026-09-25
- Changed: a long session holds a higher frame rate on the same handset. The held-for-10-minutes figure on a Galaxy S25+ is on Performance. Frames are unchanged.
- Added: zero-copy frame delivery. After
useHardwareBuffers(),pullHardwareBuffer()andidleHardwareBuffer()return anEssence2HardwareFramewhose RGBAHardwareBufferyour renderer samples directly; close each frame after presenting it.pull(ByteBuffer)is unchanged, and nothing changes unless you calluseHardwareBuffers(). - Action:
implementation("ai.bithuman:essence2-android:0.7.0").
essence2-android 0.6.0 — 2026-09-24
- Changed: after a pause in the conversation, the first frame of the next reply arrives sooner (about 1,090 → 242 ms on a Galaxy S25+). The picture is otherwise unchanged: frames are identical to 0.5.15.
- Changed: a failed download is retried on one budget shared by the whole store, so a service outage is not met with a burst of retries.
- Changed: the
-sources.jarand-javadoc.jaron Maven Central are placeholders; the API reference is Android API. - Deprecated (still works):
Essence2ModelStore.DEFAULT_MEMBERS. No replacement is needed. - Action:
implementation("ai.bithuman:essence2-android:0.6.0").
expression2-android 0.5.0 — 2026-09-24
- Fixed: lip sync. The mouth moved ahead of the voice; it now lines up. The first frame of each stream is shown twice; a stream still carries the same number of frames.
- Changed: a failed download is retried on one budget shared by the whole store.
- Changed: the
-sources.jarand-javadoc.jaron Maven Central are placeholders; the API reference is Android API. - Breaking (source only):
Expression2ModelStore.MODEL,CANONandIDLEkeep their values but are no longer compile-time constants. - Action:
implementation("ai.bithuman:expression2-android:0.5.0").
Flutter plugin 2.6.16 — 2026-09-24
- Changed: Android uses essence2-android 0.6.0 and expression2-android 0.5.0.
- Action: pin
ref: flutter-plugin-v2.6.16.
Swift package 2.15.0 — 2026-09-24
Essence 2 engine 1.12.1 · Expression 2 engine 2.7.0
- Fixed: Expression 2 lip sync. The mouth moved about 65 ms ahead of the voice; it now lines up (about 15 ms). To do this, the first frame of each stream is shown twice; a stream still carries the same number of frames.
- New:
Expression2Download.avatar(agentCode:)andEssence2Download.identity(agentCode:)download an avatar file from your app. They fetch the smaller Apple build of the file, check its sha256 and keep it in the app’s Caches, so a second call downloads nothing. See Apple. - Action: set
from: "2.15.0", thenswift package update.
Flutter plugin 2.6.15 — 2026-09-24
- Changed: iOS and macOS use Expression 2 engine 2.7.0, which fixes lip sync.
- Action: pin
ref: flutter-plugin-v2.6.15. - iOS and macOS do not build from the published tag yet; use the plugin on Android.
bithuman 2.11.12 — 2026-09-25
- Fixed: a moment of network no longer ends a render. When the service does not answer, or answers that it is busy,
python -m bithumanasks again, up to three times over a few seconds. When it does give up, the message says what the service did, and the exit code is 69 (service unavailable), as with thebithumanCLI. In Python the refusal is still abithuman.Failed. - Changed: a live Essence 2 avatar (
AsyncBithuman) no longer bills the short transition into and out of speech, which carries none of your audio. - Action:
pip install -U bithuman.
bithuman 2.11.11 — 2026-09-25
- Changed: an offline render —
bithuman.open(...).render(audio)andpython -m bithuman render— is billed for the length of the video it produces (frames ÷ frame rate) at the self-hosted rate, the same asbithuman renderin the CLI. It was billed for the time the render took. Live avatars (AsyncBithuman, the LiveKit plugin) are unchanged: they bill the seconds the avatar talks, and idle is free. Renders made before this release are not billed again. - Action:
pip install -U bithuman.
bithuman 2.11.10 — 2026-09-24
- Fixed: Expression 2 lip sync on macOS. The bundled Apple renderer was out of sync by 40–70 ms; it now stays within 25 ms.
- Fixed: when a reply is interrupted,
AsyncBithumanno longer bills the frames the interruption throws away. Before, an interrupted reply could add several seconds of talking time. - Changed:
python -m bithuman render <avatar> <audio>andpython -m bithuman listuse the same command line as the CLI. - Changed: Expression 2 starts replying about half a second sooner.
- Action:
pip install -U bithuman.
bithuman 2.11.9 — 2026-09-24
- Fixed: a rendered MP4’s sound starts on its first sample.
python -m bithumanwrote the audio 64 ms late, so the mouth moved ahead of the voice on every render. - Fixed: Expression 2 lip sync: the mouth no longer leads the voice.
- Changed:
AsyncBithumanstreams Expression 2 at a steady 20 frames a second, through replies and interruptions. - Changed: a first render downloads less: the 8-second speech encoder is fetched only when a render needs it.
- Action:
pip install -U bithuman.
CLI 2.7.8 — 2026-09-26
Tag cli-v2.7.8.
- Fixed: Expression 2 on Linux runs at full speed in a container limited to fewer CPUs than the machine has (for example
docker run --cpus=4). It started one thread per machine CPU and ran several times slower than real time; it now sizes its threads to the CPUs it may use. - Changed: each install sends its own stable, random install id with its usage, so two installs that share one API secret are no longer billed as one.
- Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
CLI 2.7.7 — 2026-09-26
Tag cli-v2.7.7.
- Fixed: lip sync in live
bithuman runsessions. The voice trailed the mouth by about 0.1–0.2 s on macOS and Linux; each frame is now released with its own audio. - Changed: a self-hosted Essence 1 session is billed for the seconds the avatar talks, like Essence 2 and Expression 2. It was billed for every whole minute the session was open, idle included. Idle is free.
- Changed: a live Essence 2 reply is no longer billed for the short transition into and out of speech, which carries none of your audio.
- Changed:
bithuman listand showcase names ask again when the service does not answer, andbithuman listexits 69 (service unavailable) when it cannot be reached. - Action:
brew upgrade bithuman-cliorcurl -fsSL https://install.bithuman.ai | sh.
CLI 2.7.6 — 2026-09-25
Tag cli-v2.7.6.
- Changed: a live Essence 1 reply starts about 0.8 s sooner. The CLI measures how much audio the avatar needs before its first frame (about 0.2 s) instead of waiting a fixed second.
- Fixed: Essence 1 lip sync in a live session: the mouth moved about 0.1 s ahead of the voice; it is now within 30 ms, and the voice never runs ahead of the mouth.
- Fixed: an Expression 2 video rendered on Linux is billed for its length. A 15.0 s video was billed 15.5 s for silent frames past the end of the audio.
- Action:
curl -fsSL https://install.bithuman.ai | sh, orbrew upgrade bithuman-cli.
CLI 2.7.5 — 2026-09-25
Tag cli-v2.7.5.
- Fixed:
bithuman runagain refuses at once when no API secret is set (exit 77), and refuses--host 0.0.0.0withoutBITHUMAN_ALLOW_PUBLIC_BIND=1(exit 2), on a machine without ffmpeg too. 2.7.4 answered both with “ffmpeg not found” (exit 69) on such a machine. - Action:
curl -fsSL https://install.bithuman.ai | sh, orbrew upgrade bithuman-cli.
CLI 2.7.4 — 2026-09-25
Tag cli-v2.7.4.
- Fixed: in a live Expression 2
bithuman run, the mouth now moves with the voice. Every audio chunk goes out with the frame rendered from it. On 2.7.3 the voice led the mouth by about 1.6 s on Apple Silicon and 0.55 s on Linux. A reply now starts about 0.5 s after its first audio arrives on an M4. - Fixed: a live Expression 2 session on Linux bills only the frames you saw. Frames rendered and never shown are no longer billed: the rest of a reply you interrupt, the silent padding after each reply, and the warm-up.
- Fixed:
bithuman run --host <address>now works with the built-in conversation. Before, the conversation looked for the server on127.0.0.1and every session failed. - Fixed: a local Essence 2 or Expression 2 session without ffmpeg stops before it opens and says how to install ffmpeg. The resting clip between turns works with ffmpeg 9.
- Changed: the first frame of an Essence 2
renderorrunarrives about 1.3 s sooner. - Action:
curl -fsSL https://install.bithuman.ai | sh, orbrew upgrade bithuman-cli.
CLI 2.7.3 — 2026-09-24
Tag cli-v2.7.3.
- Changed: one short command line.
bithuman --helplists 13 commands and 10 flags;runtakes--hostand--port.render <avatar> <audio>takes the audio as its second argument, writes<avatar>.mp4unless you pass-o, and, likerunandopen, accepts an agent code or a sample avatar’s name and downloads it on first use. - Changed: every old spelling (
-a,--offscreen,--cloud,--allow-public-bind,chat,info,avatars, …) still works until 2.9.0 and prints one line on stderr naming what to use instead;--jsonoutput is unchanged. The full list is in Renamed in 2.7.3. - Action:
curl -fsSL https://install.bithuman.ai | sh, orbrew upgrade bithuman-cli.
CLI 2.7.2 — 2026-09-23
Tag cli-v2.7.2.
- Fixed: an Essence 2 or Expression 2
bithuman renderno longer opens a second, billed Essence 1 session. Every such render since 2.6.4 was billed 1–2 extra credits. - Changed: you are billed for talking, never for an open room:
bithuman runno longer bills the silence between turns, and the managed voice bills the agent’s speech, not the session’s length. - Changed: the reply starts about half a second after you stop talking, and Expression 2 on a Mac answers about 4 seconds sooner. The default voice model is
gpt-realtime-2.1-mini. - Fixed:
bithuman runworks on a fresh machine. Linux shipslivekit-server; a missing Python or an oldlivekit-serveris refused with the exact install line. - Changed: Essence 2 renders faster on a Linux CPU, and
bithuman renderprints no internal diagnostics. - Action:
curl -fsSL https://install.bithuman.ai | sh, orbrew upgrade bithuman-cli.
Swift package 2.14.4 — 2026-09-23
Essence 2 engine 1.12.1 · Expression 2 engine 2.6.5
- Fixed: building a Swift package or command-line tool that uses Essence 2 no longer prints
.pcm: No such file or directorylinker warnings. The engine itself is unchanged. - Action: set
from: "2.14.4", thenswift package update. See Apple.
Flutter plugin 2.6.14 — 2026-09-23
- Changed: iOS and macOS use Essence 2 engine 1.12.1.
- Action: pin
ref: flutter-plugin-v2.6.14. - iOS and macOS do not build from the published tag yet; use the plugin on Android.
bithuman 2.11.8 — 2026-09-23
- Fixed:
AsyncBithuman, the class the LiveKit plugin uses, loads an Essence 2 avatar on macOS. On 2.11.6 and 2.11.7 it failed with “No module named ‘bithuman.bindings’”, so a LiveKit agent with an Essence 2 avatar on a Mac could not start. - Changed: Essence 2 on a Linux CPU renders faster.
- Action:
pip install -U bithuman.
LiveKit plugin 1.8.4 — 2026-09-23
- Changed:
modelacceptsessence-2andexpression-2. A model you name is the model that renders, or the session is refused; leave it unset and the avatar’s own default is used, as before. - Fixed: the plugin no longer imports OpenCV, so it installs beside
opencv-python-headlesswithout a conflict. - Action:
pip install -U livekit-plugins-bithuman.
Swift package 2.14.3 — 2026-09-23
Essence 2 engine 1.12.0 · Expression 2 engine 2.6.5
- New:
Essence2Kit, a Swift API for Essence 2 with the same shape asExpression2Engine:create,feed,pull,idle(into:),interrupt,shutdown. It sets the API secret withEssence2Credential.set(_:)and fetches the engine’s runtime files for you. - Fixed: apps that link Essence 2 no longer get a
CoreAudioTypeslinker warning. - Fixed: the C header now says what the engine delivers: frames are B, G, R.
- New:
be_essence2_last_refusalreturns the reason behind a-3. - Action: set
from: "2.14.3"and take theEssence2Kitproduct. See Apple.
Flutter plugin 2.6.13 — 2026-09-23
- Changed: Android uses
essence2-android0.5.15 andexpression2-android0.4.10. iOS and macOS use Essence 2 engine 1.12.0. - Action: pin
ref: flutter-plugin-v2.6.13. - iOS and macOS do not build from the published tag yet; use the plugin on Android.
essence2-android 0.5.15 — 2026-09-23
- New:
Essence2Credential.set(secret)sets your API secret once. It covers the avatar download and the session, soEssence2ModelStore(context)needs no resolver. - New: every type an app uses is in
ai.bithuman.essence2, includingEssence2CredentialandEssence2MeteredDoorResolver. - Deprecated:
Essence2Metering.apiSecret. It still works and sets the same value. - Action: use
ai.bithuman:essence2-android:0.5.15, and replaceEssence2Metering.apiSecret = …withEssence2Credential.set(…). See Android.
expression2-android 0.4.10 — 2026-09-23
- New:
Expression2Credential.set(secret)sets your API secret once. It covers the avatar download and the session. - Deprecated:
Expression2Metering.apiSecret. It still works and sets the same value. - Action: use
ai.bithuman:expression2-android:0.4.10, and replaceExpression2Metering.apiSecret = …withExpression2Credential.set(…). See Android.
bithuman 2.11.7 — 2026-09-23
- Fixed:
AsyncBithuman, the class the LiveKit plugin uses, renders an Essence 2 avatar with the avatar’s own teeth, asbithuman.open()does. An avatar file without its teeth is refused when it is opened. - Fixed: on a busy machine (a CI runner, a container with a CPU limit),
render()no longer refuses with “no frames came out of that render” when the audio has speech in it. - Changed: live sessions bill talking time only. Idle frames are free, an Expression 2 streaming session now reports its usage, and
shutdown()sends the session’s last report. - Changed: Essence 2 on a Linux CPU renders faster and uses less memory.
- Action:
pip install -U bithuman.
Swift package 2.14.2 — 2026-09-23
Essence 2 engine 1.11.0 · Expression 2 engine 2.6.5
- Changed: both engines bill talking time only; idle is free.
- Changed: Expression 2 now uses your API secret, like Essence 2 (
Expression2Credential.set(_:)orBITHUMAN_API_SECRET). - Changed: if the service cannot be reached when a session starts,
createrefuses with a retryable error. After the secret is accepted, a network loss is tolerated for 5 minutes of rendered video. - New:
BITHUMAN_API_KEYis read as a deprecated alias. - Action: set
from: "2.14.2", thenswift package update. See Apple.
expression2-android 0.4.9 — 2026-09-23
- Changed: on-device Expression 2 sessions use your API secret and bill talking time; idle is free.
Expression2Avatar.createthrowsExpression2Exceptionwithout a secret. - New:
Expression2Metering(apiSecret,apiBaseUrl,installId,stateDir). - New: after the secret is accepted, a network loss is tolerated for 5 minutes of rendered video; usage that could not be sent is kept and sent at the next start.
- Action: set
Expression2Metering.apiSecretbeforecreate, then useai.bithuman:expression2-android:0.4.9. See Android.
essence2-android 0.5.14 — 2026-09-23
- Changed: talking time is billed; idle frames are free.
- New: after the secret is accepted, a network loss is tolerated for 5 minutes of rendered video, then render calls throw a retryable
MeteringRefused. - New:
Essence2Metering.stateDir; usage that could not be sent is kept for the next session. - Action: use
ai.bithuman:essence2-android:0.5.14.
API — 2026-09-23
- Changed: revealing a stored API secret is console-only.
GET /v2/{user_id}/api-secrets/{alias}/get-valuewith anapi-secretreturns403 SECRET_REVEAL_CONSOLE_ONLY. See API secrets. - Changed: short legacy-format secrets work only if bitHuman has them on record; create a new secret if an old one returns
401. - New:
POST /v1/runtime-tokens/minttakes"scope": "livekit-cloud": a one-hour token that starts one agent’s avatar in one room. Pass it to the LiveKit plugin instead of your secret (LiveKit).
essence2-android 0.5.13 — 2026-09-23
- Fixed: the AAR ships its own keep rule for its native bridge, so a release build with
isMinifyEnabled = trueworks whateverproguardFiles(...)you use. - Action: use
ai.bithuman:essence2-android:0.5.13or newer.
CLI 2.7.1 — 2026-09-23
Tag cli-v2.7.1.
- New: Linux arm64 binary (Graviton, Ampere, arm64 VMs and containers).
- Fixed:
login --with-tokenchecks the secret before storing it (exit 77TOKEN_REJECTED, 69TOKEN_UNVERIFIED). - Fixed: a secret revoked during an Essence 1 session stops the session.
- Changed:
account --jsonnames the config file as the credentialsourcewhenloginstored it. - Action:
curl -fsSL https://install.bithuman.ai | sh.
Swift package 2.14.1 — 2026-09-23
- Fixed: a macOS app built in Xcode can embed the frameworks.
- Fixed:
Essence2declares its own linker settings; no manualc++,VideoToolbox,AccelerateorCoreML. - Fixed: release builds of
Expression2no longer write files to/tmp.
CLI 2.7.0 — 2026-09-22
- Breaking: retired spellings exit 2:
talk,inspect,download,get,ls,browse,gallery,credits,agents-md,whoami,usage,init,__man,engine update. - Breaking:
accountreplaceswhoamiandusage; its--limitdefaults to 10 rows (was 50). - Fixed:
login --jsonprints one JSON object; the rest goes to stderr. - Changed: offline-licence messages say “offline license” for both licence kinds.
expression2-android 0.4.8 — 2026-09-22
- Changed: the AAR declares the Qualcomm accelerator runtime, so Gradle adds it; remove any hand-typed
com.qualcomm.qtilines. Exclude it to render on the CPU and save about 70 MB.
Swift package 2.14.0 — 2026-09-22
- Fixed: one app can link both
Expression2andEssence2.
bithuman 2.11.6 — 2026-09-20
- Changed: the Python package no longer pulls
torch; thebithuman[offline]andbithuman[tessera]extras are removed (a pin on them still installs the base package). - Fixed:
python -m bithuman <CODE>downloads a re-published model again instead of reusing the cached copy.
CLI 2.6.26 — 2026-09-20
- Fixed: a live session’s local video server no longer shows its credentials on the process list.
CLI 2.6.25 — 2026-09-20
- Fixed: usage reporting when a live Linux session is ended with Ctrl-C; upgrade recommended.
Swift package 2.13.8 — 2026-09-20
Essence 2 engine 1.9.0
- Changed: the inside of an Essence 2 avatar’s mouth comes from the identity’s own footage; the Flutter plugin (2.6.7) moves to the same engine.
- Action: update to the current package.
bithuman 2.11.5 — 2026-09-19
- Changed:
bithuman.offlinerenders through the same engine session asbithuman.open(), so a file render matches a live render, on macOS too. The offline route needs no extra.
essence2-android 0.5.12 — 2026-09-19
- Changed: the mouth follows the identity’s own lip contour.
CLI 2.6.24 — 2026-09-19
- Fixed: Essence 2 identities run on Linux again.
- Changed: the mouth follows the identity’s own lip contour.
bithuman 2.11.4 — 2026-09-19
- Changed: the mouth follows the identity’s own lip contour.
CLI 2.6.23 — 2026-09-19
- Changed:
bithuman runwith no argument runswise-pup. - Fixed: an offline render on Linux needs a credential, as on macOS; usage reporting fixed. Upgrade recommended.
- New:
renderreports why the video encoder stopped; MCP tool refusals carry an error code.
bithuman 2.11.3 — 2026-09-18
- Fixed: the inside of the mouth comes entirely from the identity’s own video again; the offline renderer no longer unpacks an extra copy of the model.
essence2-android 0.5.11 — 2026-09-19
- Fixed: the inside of the mouth comes entirely from the identity’s own video again.
bithuman 2.11.2 — 2026-09-17
- Changed: a maintenance release, superseded the next day by 2.11.3.
- Action:
pip install -U bithuman.
CLI 2.6.22 — 2026-09-17
- Changed: a warm
bithuman runreuses avatar files already on disk and fetches only what is missing.
essence2-android 0.5.10 — 2026-09-16
- Fixed: an interruption continues from the current frame instead of restarting the motion.
Swift package 2.13.7 — 2026-09-16
Essence 2 engine 1.8.0
- Fixed: an interruption continues from the current frame.
CLI 2.6.21 — 2026-09-16
- Changed:
bithuman runon an Expression 2 avatar opens a live conversation with your microphone.
Swift package 2.13.6 — 2026-09-16
Essence 2 engine 1.7.0
- Fixed: long audio returns every frame.
- Changed: the source video is decoded as it plays (much less memory), and the idle animation plays whole.
essence2-android 0.5.8 — 2026-09-16
- Fixed: every frame of a reply is delivered when audio arrives faster than real time.
- Changed: the source video is decoded as it plays, with much less memory.
expression2-android 0.4.7 — 2026-09-16
- Breaking:
Expression2Avatar.idleLoopis anExpression2IdleLoop;next(bitmap)draws the next idle frame. - Changed: the idle clip plays whole and wraps at its end.
bithuman 2.11.0 — 2026-09-16
- Breaking: the 3.x releases are withdrawn from PyPI; 2.11.0 carries the same engine with the 2.x import surface (
AsyncBithuman) besideopen()andrender(). Withdrawn — do not pin: 3.0.0 to 3.1.10.
Swift package 2.13.5 — 2026-09-16
Expression 2 engine 2.6.3
- Breaking:
idleLoopis removed; useidleNextPixelBuffer()oridle(into:). - Changed: the idle clip plays whole.
Swift package 2.13.4 — 2026-09-16
- Changed: an utterance delivers exactly the frames its audio covers;
pullPos()returns each frame’s audio position;isSpeechis per-frame voice activity.
expression2-android 0.4.6 — 2026-09-16
- New:
Expression2Avatar.idleLoop;Expression2Frame.isSpeechandaudioSample. - Changed: an utterance delivers exactly the frames its audio covers.
essence2-android 0.5.7 — 2026-09-15
- Breaking: the
ElevateFramesconstructor (legacyai.bithuman.elevatepackage, kept for compatibility) drops its execution-provider argument.
CLI 2.6.20 — 2026-09-14
- Changed:
bithuman runrefuses without a credential on Linux too (exit 77), as on macOS. - Changed:
--host 0.0.0.0needs--allow-public-bind(exit 2PUBLIC_BIND_REFUSED).
CLI 2.6.19 — 2026-09-14
- Changed:
bithuman renderneeds a credential (exit 77NOT_SIGNED_IN). - Breaking:
bithuman auth …is removed. - New:
--jsonerrors carry ahint.
essence2-android 0.5.6 — 2026-09-14
- Changed: rendering uses the phone’s GPU with its CPU; an interruption stops the avatar immediately.
- New:
Essence2ModelStore.fetch()picks up a changed model on the next session and keeps the verified copy when offline.
CLI 2.6.13 to 2.6.18 — 2026-09-13 to 2026-09-14
- Changed: faster Essence 2 and Expression 2 renders on Linux and macOS, hardware video encoding on macOS (
BITHUMAN_FORCE_X264=1selects the CPU encoder), andrender --jsonreportsrender_fps. Frames are unchanged.
Swift package 2.13.3 — 2026-09-14
- Changed: Essence 2 engine 1.6.3: a faster audio step.
essence2-android 0.5.5 — 2026-09-13
- Changed: the default settings are the fast ones. There is no 0.5.4.
API — 2026-09-13
- Changed: the cloud Apple-tier slugs are
essence-2-appleandexpression-2-apple;essence-2-aneandexpression-2-aneremain accepted.
CLI 2.6.8 — 2026-09-12
- Changed:
renderopens avatars the same wayrundoes: faster, same output. The first render downloads the shared audio model once. 2.6.7 was not published.
CLI 2.6.6 — 2026-09-11
- New:
bithuman pull <CODE>downloads any sample avatar without an account. - Fixed:
renderno longer adds warm-up frames before the first spoken frame.
CLI 2.6.1 to 2.6.4 — 2026-09-07
- New: Essence 2 renders locally on macOS and Linux (
bithuman pull <CODE> --model essence-2, thenrenderorrun). - Changed: self-hosted sessions are metered. A secret the service rejects gets 5 minutes, then the session stops.
Swift package 2.11.0 to 2.13.2 — 2026-09-09 to 2026-09-13
Essence 2 engine 1.5.1 to 1.6.2
- Fixed: the Essence 2 engine’s resources archive is complete again (1.5.1), and a downloaded Essence 2 model opens in the iOS engine (1.6.0 to 1.6.2).
- Changed: the binary targets carry a
Binarysuffix;import Essence2andimport Expression2are unchanged. - Action: update to the current package.
Swift package 2.8.0 to 2.10.0 — 2026-09-07
- New: the
Essence2product. A rejected secret gets 5 minutes, then frames stop.
essence2-android 0.5.1 — 2026-09-07
- New: metered Essence 2 on Android. Withdrawn — do not pin: 0.2.0 to 0.5.0.
Swift package 2.6.0 — 2026-09-06
- New:
Expression2Engine.create(avatarContainer:…)opens the downloaded container directly.
expression2-android 0.3.1 — 2026-09-04
- Changed: resolves from
mavenCentral()alone.
CLI 2.5.0 and 2.5.1 — 2026-09-02 to 2026-09-03
- New:
bithuman pull <CODE> --model <MODEL>; the first signed and notarized macOS build; macOS and Linux on one version again.
API — 2026-09-02
- Changed: the cloud “Apple Neural Engine” tier is named Apple; it runs on the Mac’s GPU.
August 2026
API — 2026-08-17
- Changed: every
409 MODEL_NOT_GENERATEDnames the fix: the model-add call and its cost.
bithuman 2.9.0 — 2026-08-02
- New: Essence 2 renders on your own Linux CPU, to frames or an MP4, with your API secret.
Questions and bug reports: Community & support.