<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>bitHuman changelog</title>
    <link>https://docs.bithuman.ai/changelog</link>
    <atom:link href="https://docs.bithuman.ai/changelog.xml" rel="self" type="application/rss+xml" />
    <description>Release notes for every bitHuman artifact: the CLI, the Python SDK, the Swift package, the Android SDK, the Flutter plugin, the LiveKit plugin and the REST API.</description>
    <language>en</language>
    <lastBuildDate>Mon, 05 Oct 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>CLI 2.8.9 — 2026-10-05</title>
      <link>https://docs.bithuman.ai/changelog#cli-289--2026-10-05</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-289--2026-10-05</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.9</code>.</p>
<ul>
<li><strong>No GitHub at run time:</strong> the Essence 2 audio front-end files and the daily update check now come from <code>https://downloads.bithuman.ai</code>. Same files, checked against the same sha256 pins. The CLI makes no request to github.com.</li>
<li>CLIs up to 2.8.8 check for updates on GitHub and will stop seeing new versions. Upgrade once.</li>
<li>Rendering, billing and the bundled Essence 2 engine are unchanged from 2.8.8.</li>
<li><strong>Action:</strong> download the file for your machine from <a href="https://docs.bithuman.ai/downloads#release-files">Release files</a>. Homebrew users: re-tap once with <code>brew untap bithuman-product/bithuman; brew tap bithuman/bithuman https://gitlab.com/bithuman/sdk/homebrew-bithuman &amp;&amp; brew install bithuman/bithuman/bithuman-cli</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.21 — 2026-10-05</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21121--2026-10-05</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21121--2026-10-05</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>No GitHub at run time:</strong> the files <code>bithuman</code> downloads on first use (the Essence 2 audio encoder and its 2 s window pair, and on Apple silicon the Expression 2 engine) now come from <code>https://downloads.bithuman.ai</code>. Same files, checked against the same sha256 pins. Versions up to 2.11.20 download them from GitHub.</li>
<li>Nothing else changed from 2.11.20.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.5 — 2026-10-05</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2205--2026-10-05</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2205--2026-10-05</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.5</code> on <a href="https://gitlab.com/bithuman/sdk/homebrew-bithuman/-/tags">gitlab.com/bithuman/sdk/homebrew-bithuman</a>.</p>
<ul>
<li><strong>The package moved to GitLab, and nothing resolves through GitHub any more:</strong> the binary frameworks and Essence 2's runtime files now download from <code>downloads.bithuman.ai</code>. 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.</li>
<li>The engines are unchanged: Essence 2 1.15.5, Expression 2 2.20.4 and the macOS engine core 1.0.2.</li>
<li><strong>Action:</strong> <code>.package(url: &quot;https://gitlab.com/bithuman/sdk/homebrew-bithuman&quot;, from: &quot;2.20.5&quot;)</code>. In Xcode, remove the package and add it again by the new URL, or run File › Packages › Reset Package Caches after editing <code>Package.swift</code>. The package name (<code>homebrew-bithuman</code>), your <code>.product(...)</code> lines and your code do not change.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.38 — 2026-10-05</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2638--2026-10-05</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2638--2026-10-05</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.38</code> on <a href="https://gitlab.com/bithuman/sdk/homebrew-bithuman/-/tags">gitlab.com/bithuman/sdk/homebrew-bithuman</a>.</p>
<ul>
<li><strong>The plugin moved to GitLab, and nothing resolves through GitHub any more:</strong> <code>scripts/bootstrap.sh</code> downloads the iOS and macOS engines from <code>downloads.bithuman.ai</code>. 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.</li>
<li>The engines are unchanged: Android <code>essence2-android</code> 0.9.5 and <code>expression2-android</code> 0.6.1; iOS and macOS Essence 2 <code>essence2-v1.15.5</code> and Expression 2 <code>v2.20.4</code>. The floors stay iOS 16.4 and macOS 14.0.</li>
<li><strong>Action:</strong> in <code>pubspec.yaml</code>, set <code>url: https://gitlab.com/bithuman/sdk/homebrew-bithuman.git</code> and pin <code>ref: flutter-plugin-v2.6.38</code>; <code>path: packages/flutter-plugin</code> stays. Then run <code>flutter pub get</code> and, for iOS and macOS, the plugin's <code>scripts/bootstrap.sh</code> again.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.37 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2637--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2637--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.37</code>. Update before your app ships to customers: a session left in the background now stops billing on its own.</p>
<ul>
<li><strong>A session nobody watches ends after 60 seconds.</strong> 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.</li>
<li><strong>The secret check names the avatar.</strong> If the API secret's account may not use the avatar, the session refuses to start (<code>AGENT_NOT_ENTITLED</code>), and nothing is billed.</li>
<li><strong>Android: the avatar uses no CPU in the background.</strong> 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.</li>
<li><strong>iOS needs 16.4 and macOS 14.0.</strong> The on-device brain moves to <code>converse-apple-v2.5.1</code>, 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 only <code>brew install onnxruntime</code>. 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.</li>
<li>Engines: Android <code>essence2-android</code> 0.9.5 and <code>expression2-android</code> 0.6.1; iOS and macOS Essence 2 <code>essence2-v1.15.5</code> and Expression 2 <code>v2.20.4</code>. Rendering is unchanged.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.37</code>. Set <code>platform :ios, '16.4'</code> in <code>ios/Podfile</code> and <code>IPHONEOS_DEPLOYMENT_TARGET = 16.4</code> on the Runner target. Set <code>platform :osx, '14.0'</code> in <code>macos/Podfile</code> and <code>MACOSX_DEPLOYMENT_TARGET = 14.0</code> on the Runner target.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.5 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-095--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-095--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<p>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.</p>
<ul>
<li><strong>A session nobody is watching ends after 60 s:</strong> 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 <code>pull</code>, <code>pullHardwareBuffer</code>, <code>idle</code> or <code>idleHardwareBuffer</code> call and no render call on <code>ElevateFrames</code>, the legacy <code>ai.bithuman.elevate</code> class kept for compatibility), the session ends and is billed up to that 60 s, not up to your app's return. &quot;Background&quot; 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.</li>
<li><strong>No frames in the background after that:</strong> until the app is visible again, every frame call answers &quot;no frame&quot; (<code>pull</code> and <code>idle</code> return <code>false</code>, the hardware-buffer calls return <code>null</code>, render calls on the legacy <code>ai.bithuman.elevate.ElevateFrames</code> return <code>false</code> or <code>-1</code>). Audio you fed meanwhile is kept, and the avatar catches up with your playout position on the first frame back on screen.</li>
<li><strong>The next session starts by itself:</strong> 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.</li>
<li><strong>An API secret renders only agents it may use:</strong> 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 <code>MeteringRefused</code> message ending &quot;(403 AGENT_NOT_ENTITLED)&quot;. A bundle you staged yourself names no agent and meters as before.</li>
<li><strong>Each installation is named on your usage:</strong> 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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.5&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>expression2-android 0.6.1 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#expression2-android-061--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#expression2-android-061--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<p>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.</p>
<ul>
<li><strong>A session nobody is watching ends after 60 s:</strong> 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 <code>Expression2Avatar.pull</code> and no <code>Expression2IdleLoop.next</code> call), the session ends and is billed up to that 60 s, not up to your app's return. &quot;Background&quot; 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.</li>
<li><strong>No frames in the background after that:</strong> until the app is visible again, <code>pull</code> returns <code>null</code> and <code>Expression2IdleLoop.next</code> returns <code>-1</code> (this includes <code>Expression2.render</code>). Audio you fed meanwhile is kept, and frames carry their presentation time so your presenter catches up on the first frame back on screen.</li>
<li><strong>The next session starts by itself:</strong> 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.</li>
<li><strong>An API secret renders only agents it may use:</strong> the session's startup check names the agent (<code>Expression2Model.code</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 an <code>Expression2Exception</code> message ending &quot;(403 AGENT_NOT_ENTITLED)&quot;. A model you assembled yourself names no agent and meters as before.</li>
<li><strong>Each installation is named on your usage:</strong> 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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:expression2-android:0.6.1&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.4 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2204--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2204--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.4</code>.</p>
<ul>
<li><strong>A session nobody watches ends after 60 seconds:</strong> 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.</li>
<li><strong>The secret check names the avatar:</strong> if the API secret's account may not use the avatar, the session refuses to start with an error naming <code>AGENT_NOT_ENTITLED</code>, and nothing is billed. Use the API secret of the account that owns the avatar, or of a workspace it is shared with.</li>
<li>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.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.20.4&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.36 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2636--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2636--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.36</code>. A security release: update every app that caches avatars on the device.</p>
<ul>
<li><strong>Security:</strong> 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 <code>load</code> or the installer throws <code>BithumanEntitlementException</code>. On Android the engines move to <code>essence2-android</code> 0.9.4 and <code>expression2-android</code> 0.6.0, whose stores apply the same rule. On iOS and macOS they move to Essence 2 <code>essence2-v1.15.4</code> and Expression 2 <code>v2.20.3</code>.</li>
<li><strong>iOS:</strong> an app that links Essence 2 starts on iOS 16 and later again. Essence 2 renders on iOS 26 and later; below that, <code>load(engine: 'essence2')</code> fails with <code>unsupported</code>, naming the version it needs.</li>
<li><strong>macOS:</strong> 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 <code>platform :osx, '26.0'</code> in <code>macos/Podfile</code> and <code>MACOSX_DEPLOYMENT_TARGET = 26.0</code> in the Runner target.</li>
<li><strong>New:</strong> <code>BithumanAvatar.clearCredentials()</code>. Call it when an account signs out: the engines forget the secret, and on Android the loads still running end with <code>load_cancelled</code>.</li>
<li><strong>Changed:</strong> <code>engine:</code> defaults to <code>'expression2'</code>, and an unknown engine name fails with <code>unsupported</code> on iOS and macOS too. <code>BithumanRealtimeSession</code>'s model defaults to <code>gpt-realtime-mini</code>. On Android, <code>pushAudio</code> plays your speech, and <code>load</code> accepts the public model ids (<code>'essence-2'</code>, <code>'expression-2'</code>).</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.36</code>. Catch <code>BithumanEntitlementException</code> (<a href="https://docs.bithuman.ai/platforms/flutter/errors#loading-an-avatar">Flutter errors</a>), pass <code>apiSecret</code> to the installers, and raise macOS apps to 26.0.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.4 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-094--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-094--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<p>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.</p>
<ul>
<li><strong>Security: a cached private avatar opens only for the account it was downloaded for.</strong> 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 (<code>Essence2StoreException</code>, code <code>NOT_FOUND</code>), and the files are left in place.</li>
<li><strong>After the update, the first open of each cached avatar asks bitHuman once</strong> (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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.4&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>expression2-android 0.6.0 — 2026-10-04</title>
      <link>https://docs.bithuman.ai/changelog#expression2-android-060--2026-10-04</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#expression2-android-060--2026-10-04</guid>
      <pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>An installed avatar picks up updates:</strong> <code>Expression2ModelStore.fetch()</code> 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 next <code>fetch()</code>, so a session that is already open never has a file replaced under it. Through 0.5.2 an installed avatar kept its files until <code>fetch(code, force = true)</code>. <code>revalidateInBackground = false</code> makes the check part of the open, and <code>revalidateMinIntervalMs</code> sets the interval (<code>0</code> checks on every open).</li>
<li><strong>Opening an installed avatar does not wait for the network:</strong> offline, a server error or a timeout, the installed, verified files open.</li>
<li><strong>Security: a cached private avatar opens only for the account it was downloaded for.</strong> 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 (<code>404 Agent not found</code>). After the update, the first open of each cached avatar asks bitHuman once (nothing is downloaded again), so that one open needs the network.</li>
<li><strong>A first open that is interrupted finishes in the background:</strong> 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.</li>
<li><strong>Billing:</strong> 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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:expression2-android:0.6.0&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.3 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2203--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2203--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.3</code>. A security release; update.</p>
<ul>
<li><strong>A private avatar cached on a device opens only for an account allowed to open it:</strong> <code>Essence2Download</code> and <code>Expression2Download</code> check 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.</li>
<li><strong>Apps at the package's minimum (iOS 16, macOS 13) launch again on systems below iOS 18.4 and macOS 15.4:</strong> 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, <code>Essence2Engine.create</code> throws with a clear message instead of the app failing to start.</li>
<li><strong>Expression 2's frame and event streams end at shutdown:</strong> after <code>shutdown()</code>, a <code>for await</code> loop over <code>frames()</code> or <code>events()</code> finishes and <code>nextFrame()</code> returns <code>nil</code>.</li>
<li><strong>Expression 2 downloads stay out of backups</strong> (<code>isExcludedFromBackup</code>), as Essence 2's do since 2.20.2.</li>
<li>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.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.20.3&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.2 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2202--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2202--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.2</code>.</p>
<ul>
<li><strong>App Store privacy manifest:</strong> the package now ships <code>PrivacyInfo.xcprivacy</code>, so Xcode's privacy report includes the SDK. See <a href="https://docs.bithuman.ai/platforms/swift/reference#storage-and-privacy">Storage and privacy</a>.</li>
<li><strong>Essence 2 downloads stay out of backups:</strong> the avatar files <code>Essence2Download</code> keeps and Essence 2's runtime files are excluded from iCloud and computer backups (<code>isExcludedFromBackup</code>). They are downloaded again when needed. A directory you pass in is not flagged as a whole.</li>
<li>Essence 2 (1.15.3), Expression 2 (2.20.1) and the macOS engine core (1.0.2) are unchanged.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.20.2&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.35 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2635--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2635--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.35</code>.</p>
<ul>
<li><strong>iOS and macOS:</strong> 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.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.35</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.1 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2201--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2201--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.1</code>.</p>
<ul>
<li><strong>Opening an avatar that is already on the device no longer waits for the network:</strong> <code>Essence2Download.identity</code> and <code>Expression2Download.avatar</code> return it at once and check for a newer file in the background; the next call picks it up. On an iPhone 18 Pro, <code>Essence2Download.identity</code> for an avatar on the phone took a median of 90 ms instead of 571 ms.</li>
<li><strong>A service outage no longer stops an avatar you already have:</strong> 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.</li>
<li><code>revalidateInBackground = false</code> on either type restores the check before returning.</li>
<li>Expression 2 is now 2.20.1. Essence 2 (1.15.3) and the macOS engine core (1.0.2) are unchanged.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.20.1&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.34 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2634--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2634--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.34</code>. Android Essence 2 engine: <code>essence2-android</code> 0.9.3.</p>
<ul>
<li><strong>Android, Essence 2:</strong> 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 <code>ACCESS_NETWORK_STATE</code> and the engine's job service.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.34</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.3 — 2026-10-03</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-093--2026-10-03</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-093--2026-10-03</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>An avatar opens in about 3 seconds:</strong> 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.</li>
<li><strong>Opening an installed avatar no longer waits for the network:</strong> <code>Essence2ModelStore</code> returns it at once and checks for an update in the background, at most once an hour per avatar.</li>
<li><strong>A first download is faster and survives interruptions:</strong> 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 <code>ACCESS_NETWORK_STATE</code>, a normal install-time permission, and a service only the system can bind (<code>BIND_JOB_SERVICE</code>).</li>
<li><strong>Avatars published before October 1 refresh themselves:</strong> 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.</li>
<li><strong>Less CPU per frame on a warm phone, same frames:</strong> on a throttled Galaxy Z Flip5 the face's motion step takes about 9 % less CPU time per frame.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.3&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.33 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2633--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2633--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.33</code>.</p>
<ul>
<li><strong>Android, Expression 2:</strong> 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.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.33</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.32 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2632--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2632--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.32</code>. Android Essence 2 engine: <code>essence2-android</code> 0.9.2.</p>
<ul>
<li><strong>Android, Essence 2:</strong> 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.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.32</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.31 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2631--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2631--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.31</code>. iOS and macOS Essence 2 engine: <code>essence2-v1.15.3</code> (Swift package 2.20.0).</p>
<ul>
<li><strong>iOS and macOS, Essence 2:</strong> 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.</li>
<li><strong>iOS and macOS, Essence 2:</strong> <code>BithumanAvatar.load(..., voiceClock: true)</code> 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.</li>
<li><strong>iOS and macOS, Essence 2:</strong> <code>skipAhead: true</code> now takes effect with the new engine, together with <code>voiceClock: true</code>. Off by default.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.31</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.20.0 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2200--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2200--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.20.0</code>.</p>
<ul>
<li><strong>Essence 2 on iPhone, iPad and Mac:</strong> a new optional <code>be_essence2_set_playout_position</code> tells 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: <code>be_essence2_last_frame_index</code> and <code>be_essence2_skipped_frames</code>.</li>
<li><strong>Essence2Kit:</strong> <code>create</code> names an avatar file published before the renderer this engine carries with the new error <code>Essence2KitError.identityOutdated</code>, and fetches a file that <code>Essence2Download</code> downloaded again once. Essence 2 1.15.3 still opens such files, so this does not apply yet.</li>
<li><strong>Playing the voice yourself:</strong> 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.</li>
<li>Essence 2 is now 1.15.3. Expression 2 (2.19.2) and the macOS engine core (1.0.2) are unchanged.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.20.0&quot;)</code>. If you <code>switch</code> over <code>Essence2KitError</code>, add a case for <code>.identityOutdated</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.30 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2630--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2630--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.30</code>. Engines unchanged.</p>
<ul>
<li><strong>iOS and macOS, Essence 2:</strong> 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.</li>
<li><strong>iOS and macOS, Essence 2:</strong> <code>BithumanAvatar.load(..., skipAhead: true)</code>, 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.</li>
<li><strong><code>downloadAgentImx</code>:</strong> fetches today's catalog. It follows the door's redirect to the file and takes <code>apiSecret:</code>. 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.</li>
<li><strong>Android:</strong> skip-ahead stays off by default; pass <code>skipAhead: true</code> to use it.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.30</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.29 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2629--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2629--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.29</code>. Android Essence 2 engine: <code>essence2-android</code> 0.9.1.</p>
<ul>
<li><strong>Android, Essence 2:</strong> 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: <code>BithumanAvatar.load(..., skipAhead: true)</code> tells the engine where the voice is, so a slow phone shows fewer frames, each in step with the voice.</li>
<li><strong>Errors:</strong> new code <code>MODEL_REJECTED</code>. When the on-device engine refuses the model file, <code>BithumanAvatar.load</code> throws <code>BithumanModelRejected</code>, and a session on that avatar ends on <code>errorStream</code> the same way as <code>PAYWALL</code>. On iOS and macOS this replaces a still face that never became ready. Custom voice hosts: <code>VoiceHost</code> gains <code>modelRejections</code>.</li>
<li><strong>Android, Expression 2:</strong> a reply's first words start sooner (faster voice start, Expression 2 only).</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.29</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.2 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-092--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-092--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Adaptive 720p while the device is thermally throttled:</strong> 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.</li>
<li><strong>Less GPU work per frame, same pixels:</strong> 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.</li>
<li><strong>New, optional: <code>Essence2Options(outputHeight = 720)</code></strong> opens a session at the avatar's 720p output when it publishes one (the default, <code>0</code>, is the full-size output).</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.2&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.1 — 2026-10-02</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-091--2026-10-02</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-091--2026-10-02</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>The face keeps up with the voice on phones with little cores:</strong> 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.</li>
<li><strong>New, optional: <code>setPlayoutPosition(samples16k)</code>.</strong> 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. <code>lastFrameIndex</code> says which part of the audio a pulled frame belongs to, and <code>skippedFrames</code> counts the skips. Without the call, frames come out exactly as before.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.1&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.28 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2628--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2628--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.28</code>.</p>
<ul>
<li><strong>The character's own voice no longer cuts it off:</strong> 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 <code>BithumanRealtimeSession(bargeFloorDb:)</code>.</li>
<li><strong>Android:</strong> 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.</li>
<li><strong>Errors:</strong> <code>PAYWALL</code> (no Live minutes left) now ends the session on <code>errorStream</code>. 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.</li>
<li><strong>Captions:</strong> when a reply is cut short, <code>spokenTranscriptStream</code> stops at the words that were spoken.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.28</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.27 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2627--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2627--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.27</code>.</p>
<ul>
<li><strong>Captions:</strong> <code>BithumanRealtimeSession.spokenTranscriptStream</code> releases 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. <code>botTranscriptStream</code> is unchanged. A custom <code>VoiceHost</code> gains one member, <code>speechPlayout</code>.</li>
<li><strong>Android:</strong> closing the app with Back while an avatar is on screen no longer crashes it.</li>
<li><strong>iOS and macOS:</strong> the plugin's privacy manifest declares the APIs it uses and ships inside the app.</li>
<li><strong>Release builds:</strong> the words of a transcribed turn are no longer written to the device log.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.27</code>; for captions, listen to <code>spokenTranscriptStream</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.20 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21120--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21120--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>Quieter console:</strong> an Essence 2 render no longer prints the engine's per-session diagnostic lines or ONNX Runtime's initializer warnings. Set <code>BITHUMAN_DEBUG=1</code> to see them again. Warnings and refusals still print.</li>
<li><code>render(audio, out_mp4=...)</code> and <code>python -m bithuman render</code> write as many frames as the audio lasts, like <code>bithuman render</code>: 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.</li>
<li>Progress is shown only on a terminal. With <code>--json</code>, a failure is one JSON object on stderr in the CLI's shape (<code>{&quot;error&quot;: {&quot;kind&quot;, &quot;code&quot;, &quot;message&quot;, &quot;command&quot;, &quot;hint&quot;}}</code>), with the same exit codes.</li>
<li>The 2.11 spelling <code>python -m bithuman &lt;avatar&gt; &lt;audio&gt;</code> is reported as deprecated (removed in 2.14.0).</li>
<li>On Apple silicon, Expression 2 renders through the render host that the <code>bithuman</code> CLI 2.8.7 ships.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.26 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2626--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2626--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.26</code>.</p>
<ul>
<li><strong>Essence 2:</strong> the mouth blends into the face without the visible edge that could show at the corners of the lips. Android gets it with <code>essence2-android</code> 0.9.0; on iOS and macOS it comes with the avatar files and Essence 2 1.15.2.</li>
<li><strong>Android:</strong> 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.</li>
<li><strong>macOS:</strong> an app built for macOS 13 links again (macOS engine core 1.0.2).</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.26</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.9.0 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-090--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-090--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Essence 2 on Android:</strong> 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.</li>
<li><strong>Changed (billing):</strong> every session bills its active session time, talking or idle, from its first frame to <code>close()</code>, file renders included. <code>Essence2Metering.basis</code> is ignored (deprecated). Idle frames shown before the first reply now start the session clock, as on iOS.</li>
<li><strong>Changed:</strong> 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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.9.0&quot;)</code>. Delete any <code>Essence2Metering.basis = …</code> line, and close a file-render session right after its last frame.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.8 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#cli-288--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-288--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.8</code>.</p>
<ul>
<li><strong>Removed:</strong> the <code>text_to_speech</code> and <code>list_voices</code> tools in <code>bithuman mcp</code>. They called bitHuman's text-to-speech service, which is <a href="#text-to-speech-service-retired--2026-10-01">retired</a>. Make the audio with any speech tool and pass it to <code>bithuman render</code> (<a href="https://docs.bithuman.ai/build/talking-video">talking video</a>).</li>
<li>The bundled Essence 2 engine is the one in <code>bithuman</code> 2.11.20. Billing is unchanged from 2.8.7.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code>, or re-run the installer.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Text-to-speech service retired — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#text-to-speech-service-retired--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#text-to-speech-service-retired--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Docs</category>
      <description><![CDATA[<ul>
<li><strong>Removed:</strong> bitHuman's own text-to-speech service. <code>POST /v1/tts</code>, <code>POST /v1/audio/speech</code> (the OpenAI-compatible endpoint), <code>GET /v1/voices</code> and <code>/v1/studio/*</code> now answer <code>410 ENDPOINT_RETIRED</code>. The voice playground at <a href="http://www.bithuman.ai/voice">www.bithuman.ai/voice</a> redirects to the <a href="https://docs.bithuman.ai/build/talking-video">talking video guide</a>, and the <code>text_to_speech</code> and <code>list_voices</code> tools leave the MCP server in the next CLI release.</li>
<li><strong>Unchanged:</strong> an agent's conversation voice (its voice provider, voice cloning, <a href="https://docs.bithuman.ai/build/voices">voices</a>) and <code>POST /v1/agent/{code}/speak</code>, which use third-party voice providers.</li>
<li><strong>Action:</strong> if you called these endpoints, generate the audio with any TTS provider (or record it) and send it to the <a href="https://docs.bithuman.ai/build/talking-video">talking video API</a>. bitHuman renders the avatar from your audio.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.7 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#cli-287--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-287--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.7</code>.</p>
<ul>
<li><strong>Clearer:</strong> <code>bithuman --help</code> and <code>bithuman run --help</code> no longer call the Wise Pup sample avatar free; every session bills your credits for active session time (<a href="https://docs.bithuman.ai/pricing">pricing</a>). <code>run --help</code> says 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 <code>--json</code> <code>session_started</code> event carries <code>&quot;mode&quot;:&quot;local&quot;</code>.</li>
<li><strong>Fix:</strong> <code>bithuman doctor</code> no longer reports a fresh install as not ready only because the agent worker is not set up yet (the first <code>bithuman run</code> sets it up). Its missing-encoder advice says to reinstall the CLI.</li>
<li><strong>Fix:</strong> <code>bithuman render</code> on Linux names the encoder it uses (<code>libx264</code>).</li>
<li>The rendering engine and billing are unchanged from 2.8.6.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code>, or re-run the installer.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.19.4 — 2026-10-01</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2194--2026-10-01</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2194--2026-10-01</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.19.4</code>.</p>
<ul>
<li><strong>Mac apps on macOS 13:</strong> the macOS engine core is now built for macOS 13, the package's declared minimum, so an <code>Expression2</code> Mac app built for macOS 13 links without the <code>built for newer 'macOS' version (14.0)</code> warning and runs there. (<code>Essence2Kit</code> and <code>Essence2</code> still need macOS 26.)</li>
<li>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.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.19.4&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Android packages now come from maven.bithuman.ai — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#android-packages-now-come-from-mavenbithumanai--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#android-packages-now-come-from-mavenbithumanai--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Changed:</strong> Android packages now come from maven.bithuman.ai, bitHuman's own Maven repository. New versions of <code>ai.bithuman:essence2-android</code> and <code>ai.bithuman:expression2-android</code> are published there; every earlier version is served there too and stays on Maven Central. The Flutter plugin declares the repository itself.</li>
<li><strong>Action:</strong> add <code>https://maven.bithuman.ai</code> to <code>dependencyResolutionManagement.repositories</code> in <code>settings.gradle.kts</code>, as on the <a href="https://docs.bithuman.ai/platforms/android#install">Android page</a>. A Flutter app needs no change.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.19.3 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2193--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2193--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.19.3</code>.</p>
<ul>
<li><strong>Essence 2 on iPhone, iPad and Mac:</strong> 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.</li>
<li>Essence 2 is now 1.15.2. Expression 2 (2.19.2) and the macOS engine core (1.0.1) are unchanged.</li>
<li><strong>Action:</strong> <code>.package(url: …, from: &quot;2.19.3&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.6 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#cli-286--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-286--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.6</code>.</p>
<ul>
<li><strong>Essence 2 on Linux:</strong> 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; <code>bithuman pull &lt;CODE&gt;</code> fetches the updated file. An avatar that has not been updated renders exactly as in 2.8.5.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code>, or re-run the installer.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.25 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2625--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2625--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<p>Tag <code>flutter-plugin-v2.6.25</code>.</p>
<ul>
<li><strong>Fix:</strong> 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 <code>endOnAudioInterruption: false</code>.</li>
<li><strong>Fix:</strong> 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.</li>
<li><strong>Fix:</strong> disposing an avatar is safe at any time, including mid-load, and a switched-away download can be cancelled (<code>BithumanAvatar.cancelLoad</code>); Android reports load progress (<code>BithumanAvatar.loadEvents</code>).</li>
<li><strong>Faster:</strong> 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.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.25</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.19 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21119--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21119--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>Fix:</strong> if the startup credential check is lost in transit, or the service answers 5xx or 429, <code>bithuman.open()</code> asks once more before it refuses. A 2xx, 401, 402 or 403 is never repeated.</li>
<li>On Apple silicon, Expression 2 renders through the render host that the <code>bithuman</code> CLI 2.8.5 ships. That host checks your API secret and bills its own session, so each session is still billed once.</li>
<li>Essence 2: the renderer can apply the mouth structure carried in an avatar's template. Avatars without that structure render as before.</li>
<li>Pins PyAV below 19 to avoid a thread leak in Expression 2 idle clips.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.5 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#cli-285--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-285--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.5</code>.</p>
<ul>
<li><strong>Fix:</strong> 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.</li>
<li><strong>Fix:</strong> a retried stop is billed once.</li>
<li><strong>Fix:</strong> a 403 names what to do. A plan limit names the plan and links the plans page.</li>
<li>On a Mac, the Expression 2 render host checks your API secret and bills its own session. <code>bithuman run</code> and <code>bithuman render</code> still bill each session once.</li>
<li><strong>Security:</strong> a release build ignores the meter's tuning settings.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code>, or re-run the installer.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.19.2 · Flutter plugin 2.6.24 — 2026-09-30</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2192--flutter-plugin-2624--2026-09-30</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2192--flutter-plugin-2624--2026-09-30</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<ul>
<li><strong>Security (iPhone, iPad and Mac):</strong> 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: <code>.package(url: …, from: &quot;2.19.2&quot;)</code>, or pin <code>ref: flutter-plugin-v2.6.24</code> and re-run the plugin's <code>scripts/bootstrap.sh</code>.</li>
<li><strong>Fix:</strong> 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.</li>
<li>Expression 2 is now 2.19.2 and Essence 2 is 1.15.1. The macOS engine core (1.0.1) is unchanged.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.18 — 2026-09-29</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21118--2026-09-29</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21118--2026-09-29</guid>
      <pubDate>Tue, 29 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>New:</strong> <code>pip install bithuman</code> installs 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.</li>
<li><strong>New:</strong> <code>python -m bithuman pull &lt;AVATAR&gt;</code> gets an avatar onto the machine together with the engine files its model fetches on the first render. While online, pull each avatar once, and <code>python -m bithuman pack redeem</code> once for an offline pack; after that, rendering needs no network. The same verb, <code>--model</code> and <code>--force</code> as the <code>bithuman</code> CLI.</li>
<li><strong>Changed:</strong> a refusal because of the account's plan says so (&quot;API and SDK access starts at the Creator plan&quot;, 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 <a href="https://www.bithuman.ai/billing#credits">/billing#credits</a>. What is refused, and the exception raised, are unchanged.</li>
<li><strong>Changed:</strong> <code>render(out_mp4=...)</code> 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; <code>python -m bithuman render --json</code> carries <code>wall_seconds</code>, as the CLI does. On Apple silicon, Expression 2 renders through the same render host CLI 2.8.4 ships.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.4 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#cli-284--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-284--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.4</code>.</p>
<ul>
<li><strong>New:</strong> an offline pack now covers Essence 2 and Expression 2 renders too. Once <code>bithuman pack redeem</code> has installed a pack for the model, <code>bithuman render</code> of 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.</li>
<li><strong>New:</strong> <code>bithuman pull &lt;CODE&gt;</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.</li>
<li><strong>New:</strong> the CLI runs natively on Windows 10 and 11 (x86_64): <code>irm https://install.bithuman.ai/windows | iex</code>. Rendering on the machine and offline packs are not in the Windows build yet.</li>
<li><strong>Changed:</strong> <code>bithuman pack status</code> lists every installed pack, one line per model (<code>--json</code>: <code>packs</code>).</li>
<li><strong>Fixed:</strong> <code>render --json</code> <code>seconds</code> is the video's length (frames / fps), as in the Python package; the render's wall time is <code>wall_seconds</code>.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code> or <code>curl -fsSL https://install.bithuman.ai | sh</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.17 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21117--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21117--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>New:</strong> an installed offline pack now covers Essence 2 and Expression 2 avatars too: <code>bithuman.open()</code>, <code>render()</code> and <code>python -m bithuman render</code> need 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).</li>
<li><strong>New:</strong> 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, <code>python -m bithuman pack redeem</code> says so and nothing is spent.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.19.1 · Flutter plugin 2.6.22 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2191--flutter-plugin-2622--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2191--flutter-plugin-2622--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<ul>
<li><strong>Security (macOS):</strong> the macOS engine core is rebuilt so that only its public interface is linkable. Please update: <code>.package(url: …, from: &quot;2.19.1&quot;)</code>, or pin <code>ref: flutter-plugin-v2.6.22</code> and re-run the plugin's <code>scripts/bootstrap.sh</code>.</li>
<li>iPhone and iPad are unaffected. Expression 2 (2.19.0) and Essence 2 (1.15.0) are unchanged.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.19.0 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2190--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2190--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Tag <code>v2.19.0</code>.</p>
<ul>
<li><strong>Changed:</strong> 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 <code>EngineCore</code> binary target. The <code>Expression2</code>, <code>Essence2</code> and <code>Essence2Kit</code> products link it for you, with <code>Security</code> and <code>curl</code>. iPhone and iPad builds link nothing new.</li>
<li><strong>Action:</strong> update to 2.19.0. A Mac app that links the engine archives outside SwiftPM must also link <code>EngineCore.xcframework</code> from the <a href="https://github.com/bithuman-product/homebrew-bithuman/releases/tag/essence2-v1.15.0">essence2-v1.15.0 release</a>, plus <code>Security</code> and <code>curl</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.21 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2621--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2621--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<ul>
<li><strong>Changed:</strong> 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 <code>EngineCore</code>. Android is unchanged: <code>essence2-android</code> 0.8.1 and <code>expression2-android</code> 0.5.2.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.21</code> and run the plugin's <code>scripts/bootstrap.sh</code> again.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.3 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#cli-283--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-283--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.3</code>.</p>
<ul>
<li><strong>New:</strong> <code>bithuman pack redeem</code> installs a prepaid offline pack (Business and Enterprise) on the machine that runs it; <code>bithuman pack status</code> shows the render-seconds left. Afterwards <code>bithuman render</code> of an Essence 1 avatar the pack covers needs no network and no API secret until the pack is spent. The MCP server adds the <code>pack_redeem</code> tool. Offline packs open platform by platform; where the CLI's support has not opened yet, the redeem says to use <code>python -m bithuman pack redeem</code>, and nothing is spent.</li>
<li><strong>Changed:</strong> the removals announced for CLI 2.9 (the <code>./.env</code> read, the spellings retired in 2.7.3) ship no earlier than 2026-12-26; the notices say so.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code> or <code>curl -fsSL https://install.bithuman.ai | sh</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.16 — 2026-09-28</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21116--2026-09-28</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21116--2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>New:</strong> <code>python -m bithuman pack redeem</code> installs 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. <code>python -m bithuman pack redeem PURCHASE_ID</code> redeems a named one; <code>--file PACK</code> installs a saved pack with no network. Afterwards <code>python -m bithuman render</code> of an avatar the pack covers needs no network and no API secret until the pack is spent.</li>
<li><strong>Changed:</strong> a refused redeem says in plain words what to do (the plan, the platform, a pack already installed) and that nothing was spent.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.15 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21115--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21115--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>New:</strong> <code>bithuman.open(path).render(audio, out_mp4=&quot;out.mp4&quot;)</code> writes the MP4 (H.264 with the speech) and returns the number of frames, for every model. It is the one offline route.</li>
<li><strong>Fixed:</strong> an Essence 1 file render (<code>bithuman.open(...).render(...)</code> or <code>python -m bithuman render</code>) billed every frame twice; a render of N seconds of video now bills N seconds. Live <code>AsyncBithuman</code> sessions were not affected.</li>
<li><strong>Deprecated</strong> (removed in bithuman 4.0, no earlier than 2026-12-26; each prints one warning naming the replacement): <code>bithuman.offline</code> (<code>render_offline</code>, <code>OfflineRenderer</code>), the deprecated alias <code>BITHUMAN_API_KEY</code>, <code>token=</code> on <code>AsyncBithuman.create</code>, and the name <code>bithuman.AsyncAvatar</code>. <code>python -m bithuman</code> stops reading the API secret from <code>./.env</code> in the next release.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.2 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#cli-282--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-282--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.2</code>.</p>
<ul>
<li><strong>Changed:</strong> <code>bithuman run &lt;CODE&gt;</code> with a code that is not one of your agents plays the free gallery avatar with that code, the way <code>pull</code>, <code>render</code> and <code>open</code> already did.</li>
<li><strong>Changed:</strong> <code>bithuman open</code> names the model (for example Essence 2 or Expression 2). Asking <code>pull</code> for a model a gallery avatar does not have names the models it does have (<code>MODEL_NOT_GENERATED</code>).</li>
<li><strong>Changed:</strong> with <code>BITHUMAN_LOCAL=1</code>, <code>run</code> checks that the on-device voice packages are installed before the session starts, and prints the one command that installs them.</li>
<li><strong>Deprecated:</strong> reading the API secret from a <code>.env</code> file in the working directory prints a notice; CLI 2.9 stops reading it. Export <code>BITHUMAN_API_SECRET</code>, or run <code>bithuman login</code> once.</li>
<li><strong>Deprecated:</strong> the deprecated alias <code>BITHUMAN_API_KEY</code> is read until CLI 3.0 (no earlier than 2026-12-26). Rename it to <code>BITHUMAN_API_SECRET</code> (same value).</li>
<li><strong>Changed:</strong> <code>BITHUMAN_API_BASE</code> is no longer a documented setting; the CLI talks to <code>https://api.bithuman.ai</code>.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code> or <code>curl -fsSL https://install.bithuman.ai | sh</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.20 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2620--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2620--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<ul>
<li><strong>Changed:</strong> the realtime voice session takes your bitHuman API secret and connects through bitHuman's <a href="https://docs.bithuman.ai/api/realtime">realtime relay</a>; there is no <code>ek_…</code> 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 on <code>errorStream</code>.</li>
<li><strong>Fixed:</strong> iOS and macOS build from the published tag. They link the published Expression 2 (2.18.0) and Essence 2 (1.14.2) engines.</li>
<li><strong>Changed:</strong> Android uses <code>essence2-android</code> 0.8.1 (memory stays flat in long sessions) and <code>expression2-android</code> 0.5.2.</li>
<li><strong>Action:</strong> pin <code>ref: flutter-plugin-v2.6.20</code> and pass your API secret to <code>BithumanRealtimeSession(apiKey:)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>expression2-android 0.5.2 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#expression2-android-052--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#expression2-android-052--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Changed:</strong> the Hexagon accelerator prepares the decoder once and keeps it. On a Galaxy S25+, <code>create()</code> 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.</li>
<li><strong>Added:</strong> read-only <code>Expression2Backend</code> fields report whether the prepared decoder was reused and how long it took.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:expression2-android:0.5.2&quot;)</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.18.0 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2180--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2180--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Essence 2 engine 1.14.2 · Expression 2 engine 2.18.0</p>
<ul>
<li><strong>New:</strong> Expression 2 hands out one stream of frames to show: <code>frames(audioClock:)</code> 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 (<code>isSpeech</code>) and which one ends the reply (<code>endsReply</code>); <code>events()</code> reports <code>.replyStarted</code> and <code>.replyEnded</code> once per reply, and <code>interrupt()</code> cuts a reply. <code>pull()</code> is unchanged.</li>
<li><strong>Fixed:</strong> an Expression 2 session that only shows its idle animation is billed for its active time, like any other session.</li>
<li><strong>Action:</strong> set <code>from: &quot;2.18.0&quot;</code>, then <code>swift package update</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>CLI 2.8.1 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#cli-281--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#cli-281--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>CLI</category>
      <description><![CDATA[<p>Tag <code>cli-v2.8.1</code>.</p>
<ul>
<li><strong>Fixed:</strong> opening a <code>bithuman run</code> page 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.</li>
<li><strong>Changed:</strong> 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).</li>
<li><strong>Fixed:</strong> a long Essence 2 session no longer grows in memory while the avatar talks.</li>
<li><strong>Changed:</strong> <code>--help</code> examples use the free <code>wise-pup</code> avatar; <code>bithuman list</code> says rendering needs <code>bithuman login</code>; with <code>--json</code>, a mistyped command prints one JSON error (<code>USAGE</code>, exit 2).</li>
<li><strong>Fixed:</strong> a long-running <code>bithuman run</code> uses a re-published avatar file for the next session without a restart.</li>
<li><strong>Action:</strong> <code>brew upgrade bithuman-cli</code> or <code>curl -fsSL https://install.bithuman.ai | sh</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Swift package 2.17.3 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#swift-package-2173--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#swift-package-2173--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Swift</category>
      <description><![CDATA[<p>Essence 2 engine 1.14.2 · Expression 2 engine 2.7.0</p>
<ul>
<li><strong>Fixed:</strong> 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.</li>
<li><strong>Action:</strong> set <code>from: &quot;2.17.3&quot;</code>, then <code>swift package update</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>essence2-android 0.8.1 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#essence2-android-081--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#essence2-android-081--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Fixed:</strong> 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 <code>endOfAudio()</code>, <code>resetAudio()</code> or a 600 ms pause in <code>feed()</code>. 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.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:essence2-android:0.8.1&quot;)</code>, especially if your app streams audio without pauses.</li>
</ul>]]></description>
    </item>
    <item>
      <title>bithuman 2.11.14 — 2026-09-27</title>
      <link>https://docs.bithuman.ai/changelog#bithuman-21114--2026-09-27</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#bithuman-21114--2026-09-27</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <category>Python</category>
      <description><![CDATA[<ul>
<li><strong>Fixed:</strong> <code>bithuman.open()</code> with no API secret, offline licence or prepaid pack refuses at once, before it loads the model or downloads anything, and names <code>BITHUMAN_API_SECRET</code> and where to get one.</li>
<li><strong>Fixed:</strong> 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.</li>
<li><strong>Fixed:</strong> memory stays flat when an Essence 2 avatar speaks without a pause; it grew about 1 MB per second of speech.</li>
<li><strong>Changed:</strong> 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.</li>
<li><strong>Changed:</strong> usage reports go only to bithuman.ai hosts.</li>
<li><strong>Changed:</strong> <code>AsyncBithuman.sync_to(sink)</code> shows each picture when its voice plays; with the LiveKit <code>AvatarRunner</code>, an Expression 2 mouth led its voice by about 120 ms at a browser viewer and now leads by about 60 ms.</li>
<li><strong>Changed:</strong> 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.</li>
<li><strong>Action:</strong> <code>pip install -U bithuman</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>Flutter plugin 2.6.19 — 2026-09-26</title>
      <link>https://docs.bithuman.ai/changelog#flutter-plugin-2619--2026-09-26</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#flutter-plugin-2619--2026-09-26</guid>
      <pubDate>Sat, 26 Sep 2026 12:00:00 GMT</pubDate>
      <category>Flutter</category>
      <description><![CDATA[<ul>
<li><strong>Changed:</strong> 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.</li>
<li><strong>Changed:</strong> Android uses <code>essence2-android</code> 0.8.0 and <code>expression2-android</code> 0.5.1, which bill correctly whatever the app sets and name each installation on the meter. iOS and macOS are unchanged.</li>
<li><strong>Action:</strong> set <code>ref: flutter-plugin-v2.6.19</code> in your <code>pubspec.yaml</code>.</li>
</ul>]]></description>
    </item>
    <item>
      <title>expression2-android 0.5.1 — 2026-09-26</title>
      <link>https://docs.bithuman.ai/changelog#expression2-android-051--2026-09-26</link>
      <guid isPermaLink="true">https://docs.bithuman.ai/changelog#expression2-android-051--2026-09-26</guid>
      <pubDate>Sat, 26 Sep 2026 12:00:00 GMT</pubDate>
      <category>Android</category>
      <description><![CDATA[<ul>
<li><strong>Fixed:</strong> billing can no longer be changed from app code: the meter's endpoint, whether from <code>Expression2Metering.apiBaseUrl</code> or the <code>BITHUMAN_API_URL</code> environment variables, is honoured only for an <code>https://</code> bitHuman host.</li>
<li><strong>Added:</strong> each installation names itself on the meter: a random id is kept in the app's storage. Set <code>Expression2Metering.installId</code> or <code>BITHUMAN_INSTALL_ID</code> to choose it yourself.</li>
<li><strong>Action:</strong> <code>implementation(&quot;ai.bithuman:expression2-android:0.5.1&quot;)</code>.</li>
</ul>]]></description>
    </item>
  </channel>
</rss>
