Releases
Each Cefrium version, the CEF and Chromium upstream it tracks, and what changed. Tap a release to expand its notes.
Cefrium tracks upstream CEF release branches. Each release is built from a specific CEF branch and the Chromium revision it pins, so the Chromium security fixes in that revision are present in the corresponding Cefrium release. Upstream security updates are incorporated into the next release rather than backported. Maintained best-effort, in the tradition of upstream CEF; no SLA beyond what is stated here.
Which version, and where
| Version | Engine | Available from | Use it? |
|---|---|---|---|
| 0.9.4 | Chromium 154.0.8037.98 CEF branch 8037 |
Maven Central and the Codeberg registry | Yes. Carries both arm64-v8a and x86_64, so it
runs on a device and on an emulator, and both cefrium-sdk and
cefrium-sdk-libre exist. |
| 0.9.0 - 0.9.3 | Chromium 152.0.7977.82 (0.9.3: 154.0.8037.98) |
Codeberg registry only — never reached Maven Central | No. They cannot be pinned from Central, and 0.9.3 was built for
arm64-v8a alone, so it does not run on an x86_64 emulator and
has no cefrium-sdk-libre. Everything in them is in 0.9.4. |
| 0.8.1 - 0.8.9 | Chromium 149 - 152 | Maven Central, permanently | Only if you are pinned to one. They carry an older engine and therefore older Chromium security fixes. |
Why Central's version list has a gap. It jumps from 0.8.9
to 0.9.4 because 0.9.0 to 0.9.3 were published to the Codeberg registry only.
Maven Central is immutable and append-only, so those versions can never be
added retroactively, and no published version can be withdrawn or marked
deprecated. An older version staying resolvable is a property of Central, not
an endorsement: always check which engine a version carries
— each release below states its Chromium revision, and from 0.9.4 the
published POM carries it too, as cefrium.chromium.version.
Each release also ships an SBOM declaring the embedded engine version and a NOTICE listing every bundled third-party licence, attached to its Codeberg release.
0.9.4 CEF 8037 Chromium 154.0.8037.98 2026-10-07 Maven
- Back on Maven Central, and with every ABI again. 0.9.0 through 0.9.3 were published to the Codeberg registry only, so they were a 404 on Maven Central -- which is where adopters resolve from, since the Codeberg mirror keeps only the latest version and cannot be pinned. Central had served nothing since 0.8.9. On top of that, 0.9.3 was cut for
arm64-v8aalone, so it could not run on an x86_64 emulator and published nocefrium-sdk-librecoordinate at all. 0.9.4 restores the full matrix (codecs/libre x arm64/x86_64) on both channels. - Two guards so neither failure can recur silently.
cut-release.shnow refuses at the publish phase when the variant matrix is incomplete, naming what would be missing, and it has acentralphase that fails when the Central token is absent rather than quietly shipping to Codeberg only. The second one matters because Maven versions are immutable: a release that misses a channel or an ABI cannot be topped up afterwards. - Consumer docs no longer advertise a version the recommended repository does not serve, and no longer promise
x86_64for a release that lacks it.
com.cefrium:cefrium-sdk:0.9.4
0.9.3 CEF 8037 Chromium 154.0.8037.98 2026-10-07 superseded
- Engine bumped two milestones. CEF has no 153 branch, so this moves 152 -> 154 in one step. Debian's chromium is on 154.0.8037.92 and the CEF branch pins .98, so version parity (the mechanism by which this port inherits CVE fixes) is satisfied with room to spare. Nine upstream API changes had to be adapted, the notable ones for consumers being an OSR surface-embedding change and a new
InterceptNavigationDelegateClient.isTabInPopup()that the SDK now implements -- answering false, because no Cefrium browser is ever a popup window, and answering true would have silently disabled the external-scheme hand-off (intent://, market://, tel://) shipped in 0.8.8. - Behaviour change -- the engine no longer queries Google's time service by default. See the entry below; this is the one place Cefrium deliberately diverges from Chromium's own default.
- The engine now registers only the ten component-updater components this embedding actually uses, instead of inheriting Chrome's full list of about twenty. Validated on device: the ten dropped ones no longer register, every kept one still arrives, and certificate revocation data still updates. See the FEATURE-067 entries below.
- A stale checked-in JNI registration would have crashed any consumer of this release on its first child-process launch (
NoSuchMethodErroronSysUtils.hasLargeProcessCountSupport, new in 154). 107 JNI methods were added and 70 removed since 152. The release gate already checked for this; the build now checks too, so a dev build fails on drift rather than producing an AAR that only breaks on a device.
- The
com.cefriumGradle plugin is now compiled to JVM 17 bytecode (class-file 61) instead of inheriting the build JDK's class-file 69. The plugin is plain Groovy against the Gradle API and needs nothing newer; shipping it as Java-25 bytecode forced every consumer onto JDK 25 merely to *load* the plugin during Gradle's configuration phase, which is where the confusingUnsupported class file major version 69first appears. 17 is the floor Gradle 9 and AGP 9 already require. This does not change the SDK's requirements:cefrium-sdkstill ships Java-25 bytecode and still needs JDK 25 / Gradle 9.7.1 / AGP 9.4 / compileSdk 37. - Passkeys: route a modal
get()carryingallowCredentialsto the Android Credential Manager instead of Play Services. Chromium routes such requests straight to Play Services ("non-discoverable allowlist"), which is a Chrome+GMS assumption: for an embedder the passkeys live in a third-party provider that GMS knows nothing about, so Play Services finds no match and the request falls through to the GMSCore hybrid flow (the "check Bluetooth" error page) without ever offering the provider. (patch android/webauthn_3pp_get_credman_routing) - Passkeys: declare the caller origin on Credential Manager requests. Chromium applies
setOrigin()only from aCredManRequestDecoratorthat just Chrome registers via ServiceLoader, so an embedder never declared it; CredMan then treated the request as first-party from the app's own package and providers looked for credentials belonging to the app rather than the page's relying party. Affects both get and create. (patch android/webauthn_credman_embedder_origin) NOTE: with both fixes the request now reaches third-party providers correctly, but releasing an EXISTING passkey additionally requires the app to be on the platform's privileged-browser allowlist -- see FEATURES-CEFRIUM.md. - Fix passkey / WebAuthn not offering third-party providers (Proton Pass, etc.) in the browser. The per-WebContents CHROME_3PP_ENABLED WebAuthn mode (required for the CredMan path's security checks to pass) was set inside the Autofill try/catch; AutofillProvider construction throws on some OEM ROMs (MIUI/Xiaomi, some tablets), which silently left WebAuthn in the global BROWSER mode so CredMan (and thus Proton Pass) was never invoked. Decoupled into its own try/catch. Validated on device: webauthn.io registration now shows the Proton Pass sheet. (FEATURE-064 follow-up)
- Behaviour change -- the engine no longer queries Google's time service by default. Chromium enables
NetworkTimeServiceQueryingon Android, which makes roughly one request a day tohttp://clients2.google.com/time/1/current. Its only purpose is to notice a badly set device clock so that a certificate error can be explained as a clock problem rather than an expired certificate; it carries no identifier and no security data, and Android devices normally get the clock from the carrier or NTP. The SDK now applies--disable-features=NetworkTimeServiceQueryingby default, so that call is gone. Certificate validation is unaffected. Restore upstream behaviour withCefrium.setNetworkTimeQueriesEnabled(true)before the first browser is created -- worth doing if your hardware has no dependable clock source (no cellular modem and no NTP reachability, or an RTC with no battery), where a clock far enough off to break HTTPS is a real support case. Decision note: implemented as the upstream switch rather than by patching the feature's default, so an embedder can still choose and the behaviour survives engine bumps without a patch to carry. (FEATURE-067) - New API to control what the engine does on the network in the background, with the two requests given opposite defaults on purpose:
Cefrium.setComponentUpdatesEnabled(boolean)/areComponentUpdatesEnabled()andCefrium.setNetworkTimeQueriesEnabled(boolean)/areNetworkTimeQueriesEnabled(). Both must be called before the engine initializes; afterwards they are ignored and log a warning. Component updates stay on by default because they are a security feed, not telemetry -- the channel that delivers certificate revocation (CRLSet), Certificate Transparency metadata, the dangerous-download file-type policy, TLS error diagnostics, Trust Token key commitments, First-Party Sets and the subresource filtering ruleset. Disabling them freezes all of that at the SDK version you shipped, and the failure mode is silent, so it is an opt-out intended for air-gapped, metered-network and compliance-constrained deployments that accept pinning their security data to a release. Both are Chromium's own switches, and settingdisable-featuresmerges with any value already on the command line instead of overwriting it. See FEATURES-CEFRIUM.md and <https://cefrium.com/guides/network-behaviour/>. (FEATURE-067)
com.cefrium:cefrium-sdk:0.9.3
0.9.2 CEF 7977 Chromium 152.0.7977.82 2026-09-24 superseded
- OSR text-selection copy/cut/paste quick menu (windowless). Long-pressing text in an off-screen browser now selects a word and shows a Cut/Copy/Paste menu via
CefriumRenderHandler.onQuickMenu+QuickMenuCallback; CEF performs the edit. Fixes the Android OSR selection pipeline (render-frame metadata is now delivered before activation, since the after-activation callback never fires for a windowless view on Android) and wires the context-menu bridge in the OSR path. Validated on device. (FEATURE-066) - Passkey / WebAuthn via the Android Credential Manager.
navigator.credentials.create/get({publicKey})now reaches the Android Fido2 / Credential Manager, so providers such as Proton Pass are offered. (FEATURE-064) - Text-selection floating toolbar (windowed). Selecting text now shows the Android floating ActionMode (Select All / Copy / Paste / Share / Web Search / process-text), via
CefriumActionModeCallback. (FEATURE-065) - Smart Text selection. The windowed selection toolbar now uses the platform TextClassifier, adding entity actions (phone -> call, address -> map, URL -> open), matching WebView. (FEATURE-065 follow-up)
- OSR focused-node value + placeholder.
CefriumRenderHandler.onFocusedNodeChanged(editable, value, placeholder, type)delivers the focused field's value, placeholder and type so an OSR consumer can mirror it in a native input overlay. (FEATURE-062)
com.cefrium:cefrium-sdk:0.9.2
0.9.1 CEF 7977 Chromium 152.0.7977.82 2026-09-22 superseded
- OSR IME + virtual keyboard (issue #9). Off-screen (OSR) browsers now drive the Android soft keyboard:
CefriumRenderHandler.onVirtualKeyboardRequested(int)fires when an editable node gains/loses focus (hide only forTEXT_INPUT_MODE_NONE). New IME input path onCefriumBrowser:imeSetComposition,imeCommitText,imeFinishComposingText,imeCancelComposition, plussendKeyEventfor backspace/enter/arrows. Wire a customInputConnectionto these from the View hosting the OSR frames (see the OsrImeActivity sample). Windowed/Surface mode already uses Android's native IME. - Full CEF public-API parity. The previously-unwired CEF handlers and
CefBrowserHostmethods are now exposed to the Java SDK, so you get WebView/CEF parity in one release: CefriumDisplayHandler-- favicon URLs, JS console messages, fractional loading progress, status text, camera/mic in-use change.CefriumLoadHandler--onLoadStart,onLoadError(net error code + failed URL).CefriumRequestHandler-- open-URL-from-tab, hung-renderer (ANR) un/responsive, render-view-ready, document-available, client-certificate selection, and response-side redirect/response/load-complete inspection.- File chooser (
CefriumDialogHandler) --<input type=file>viaACTION_GET_CONTENT. Plus beforeunload ("Leave site?") and JS-dialog lifecycle. - New handlers:
CefriumKeyboardHandler(intercept keys),CefriumFocusHandler,CefriumDragHandler,CefriumFrameHandler(frame lifecycle),CefriumCommandHandler, andCefriumAudioHandler(raw PCM tap -- opt-in viasetAudioHandler; enabling it redirects page audio). - OSR: HTML
<select>dropdowns now render off-screen (onPopupPaint/onPopupShow/onPopupSize), plus IME composition-rect, text-selection and scroll-offset callbacks. CefBrowserHost:exitFullscreen(),startDownload(url),getNavigationEntries()(history with titles),downloadImage(url,...); plus LifeSpanDoCloseand permission prompt-dismiss.- Opt-in response-body tap (
setResponseTapEnabled->onResponseData) and per-cookie access filter (setCookieFilterEnabled->onCanSendCookie/onCanSaveCookie) -- zero cost unless enabled.
com.cefrium:cefrium-sdk:0.9.1
0.9.0 CEF 7977 Chromium 152.0.7977.82 2026-09-19 superseded
- Open
content://URLs (Android content-provider URIs) in a tab. A FileProvider URI -- e.g. a downloaded file, or a file shared into the app -- now loads and renders (text/HTML/PDF/image). Previouslynet::ERR_UNKNOWN_URL_SCHEME. (Also enables opening a download inside the browser.) - Load APK-bundled web content:
file:///android_asset/...andfile:///android_res/.... Ship an offline web app (HTML/CSS/JS) inside your APK and load it directly, matching Android WebView. Served from the host app's AssetManager/Resources; top-level navigation and subresources both work. - Compose:
CefriumViewStatedownload support. Adownloadslist (per-id, live), anonDownloadEventhook (for notifications), anonBeforeDownloadhook (choose where to save, e.g. a SAF picker), andcancelDownload/pauseDownload/resumeDownload(id). CefriumBrowser.cancelDownload/pauseDownload/resumeDownload(id)-- control a download by id (e.g. from a notification action) without holding the item.- Controllable download API (
CefriumDownloadHandler). The previousOnDownloadListenercould only observe a download after it had already started -- an accidental tap on a download link could not be stopped except by killing the app. The new handler mirrors CEF'sCefDownloadHandler:
- Minified (R8) consumer builds no longer crash at startup with
AbstractMethodError: Consumer.accept(Object). R8 strippedaccept(Object)from Chromium'sWindowLayoutInfoListenerlambda (implementsandroidx.window.extensions.core...Consumer). The SDK now ships a consumer keep rule for the SAM method and declaresandroidx.window.extensions.core:coreas aprovided(compile-only) POM dependency so the consumer's R8 can resolve the interface -- no consumer workaround needed. Validated with a minified release build. - Multiple downloads from one page no longer silently blocked (this is what made
data:/blob:downloads appear "unavailable"). Chromium'sDownloadRequestLimiterallows the first automatic download from a page and then, with no permission-prompt UI attached (CEF attaches none), silently blocked every later one -- and blocked ALL but the first download from an opaque-origin page (data:/blob:pages, or content shown vialoadHtml/loadDataWithBaseURL). The limiter now defers to the embedder'sCanDownloadwhen there is no prompt UI, so every download reaches the download handler and the app decides. Root cause was NOT adata:/blob:scheme filter (none exists in Chromium's download path); single downloads of those schemes already worked. Validated on device: 3 sequentialdata:downloads now all complete (previously only the first did).
com.cefrium:cefrium-sdk:0.9.0
0.8.9 CEF 7977 Chromium 152.0.7977.82 2026-09-18 superseded
- No longer crashes in off-screen (OSR) mode during single-page-app navigation. On a same-document navigation (e.g. an SPA route change on a sign-in page), the browser process could crash (
SIGSEGV, null deref) inside Chromium's back/forward navigation-transition screenshot code, which dereferenced the view's native Android view without checking it -- and an off-screen view has none (GetNativeView()is null in OSR). The interceptor now fails safely when there is no native view, matching the function's existing guards. (Codeberg browser issue: OSR SIGSEGV onaccounts.google.com.)
com.cefrium:cefrium-sdk:0.8.9
0.8.8 CEF 7977 Chromium 152.0.7977.82 2026-09-18 superseded
- External / app URL schemes are handed off to Android. When a page links to a non-web scheme -- an app deep link (
baiduboxapp://,weixin://,intent://,market://) or a well-known external protocol (tel:,mailto:,geo:,sms:) -- the browser now fires an AndroidIntentto open the target app instead of showing "This site can't be reached". Parsing and security hardening (intent:// sanitization,S.browser_fallback_url, user-gesture / redirect rules) come from Chromium's owncomponents/external_intents, installed as a navigation throttle on the browser's WebContents.http/httpsstill load in the browser; an unknown scheme with no installed app fails gracefully (no crash, no error page). The SDK declares the<queries>needed for Android 11+ package visibility so consumers need no manifest changes. (Codeberg browser issue: URL scheme #6.)
com.cefrium:cefrium-sdk:0.8.8
0.8.7 CEF 7977 Chromium 152.0.7977.82 2026-09-17 superseded
- No longer crashes when a page opens a file-download link. A top-level navigation that turns into a download re-issues its request with the same
request_id, which collided with the still-tracked navigation request in the request-interception layer. The colliding entry was freed and then used (use-after-free), crashing the browser process (SIGSEGVinInterceptedRequest::Restart). The interceptor now drops the duplicate instead of restarting a freed request; the download proceeds normally. Custom URL schemes that hit the same path are covered by the same fix. (Codeberg browser issues: file-download crash and URL-scheme crash.)
com.cefrium:cefrium-sdk:0.8.7
0.8.6 CEF 7977 Chromium 152.0.7977.82 2026-09-16 superseded
setDarkMode()now affects the page'sprefers-color-scheme. On Android the chrome ThemeService is not wired up, sosetDarkModewas silently a no-op; the browser now drives the web content's preferred color scheme directly.window.matchMedia('(prefers-color-scheme: dark)')reflects it and CSS dark media queries take effect, in both windowless (OSR) and SurfaceView browsers. (Codeberg issue #4.)
com.cefrium:cefrium-sdk:0.8.6
0.8.5 CEF 7977 Chromium 152.0.7977.82 2026-09-12 superseded
- Intermittent (~50%) startup crash on some devices. A re-entrant recursion in the PartitionAlloc lock-metrics subsampler (its first-use RNG seed allocates under a contended lock, whose acquisition timer re-enters the sampler before the seed completes) could overflow the stack at startup. Guarded against re-entrancy. No API changes.
com.cefrium:cefrium-sdk:0.8.5
0.8.4 CEF 7977 Chromium 152.0.7977.82 2026-09-12 superseded
- Touch automation API.
CefriumBrowser(and the ComposeCefriumNavigator) gainsendTap,sendTouchDown/sendTouchMove/sendTouchUp, andsendSwipe(browser-viewport pixels). In the SurfaceView browser these drive the full gesture pipeline -- a tap synthesizes a click, a swipe scrolls/flings; in windowless (OSR) mode they use the CEF touch path. See theInputAutomationActivitysample.
com.cefrium:cefrium-sdk:0.8.4
0.8.3 CEF 7977 Chromium 152.0.7977.82 2026-09-11 superseded
- Mouse API now works in windowed / SurfaceView (ContentViewRenderView) mode. In 0.8.2 the mouse API only reached the renderer in windowless (OSR) mode; on a
createWithSurfacebrowser the events were silently dropped. They are now forwarded through the Android render widget host, sosendMouseMove/sendLeftClick/sendRightClick/ etc. work in both rendering modes.
com.cefrium:cefrium-sdk:0.8.3
0.8.2 CEF 7977 Chromium 152.0.7977.82 2026-09-11 superseded
- Mouse event API.
CefriumBrowser(and the ComposeCefriumNavigator) gainsendMouseMove/sendMouseLeave/sendMouseClick/sendLeftClick/sendRightClick/sendDoubleClick/sendMouseDown/sendMouseUp/sendMouseWheel, with button and modifier parameters, mirroring the desktop CEF mouse surface. Coordinates are browser-viewport pixels.
- Android OSR input delivery. Injected pointer events were dropped before reaching the renderer on the Android off-screen (windowless) path (no DelegatedFrameHost): they are now dispatched directly, the paint-holding input hold is released on frame delivery, and the native cursor handle is null-guarded.
com.cefrium:cefrium-sdk:0.8.2
0.8.1 CEF 7977 Chromium 152.0.7977.82 2026-09-09 superseded
- Published to Maven Central (
com.cefrium:*), alongside the Codeberg mirror.mavenCentral()resolves the SDK, Compose wrapper, and Gradle plugin with no extra repository line; every version stays available permanently.
- Engine: Chromium 152.0.7977.75 -> 152.0.7977.82 (same CEF branch 7977) -- same-branch security bump for CVE parity with Debian. No API changes.
CefriumBrowser's package-privategetWebContents()/connectWebContentsInternal()now carry@RestrictTo(LIBRARY)-- reaching them from a consumer module now warns at compile time. Never public API; no functional change.
com.cefrium:cefrium-sdk:0.8.1
From Maven Central (mavenCentral(), no extra repo line) or the Codeberg Maven mirror.
0.8.0 CEF 7977 Chromium 152.0.7977.75 2026-09-06 superseded
- Disable pinch-to-zoom from the SDK:
CefriumBrowser.setPinchToZoomEnabled(boolean)(View API) andCefriumNavigator.setPinchToZoomEnabled(boolean)(Compose API). Enabled by default; when disabled it forces a non-user-scalable viewport and blocks the multi-touch pinch gesture for pages you do not control, and reverts cleanly when re-enabled. Validated on device.
- Engine: Chromium 151.0.7922.137 -> 152.0.7977.75 (CEF branch 7922 -> 7977) for CVE parity with the Debian Chromium release.
- Consumer build baseline raised to AGP 9.4, Gradle 9.7.1, JDK 25, compileSdk 37. Chromium 152 ships Java-25 (class-file 69) bytecode, so older toolchains can no longer read or dex the SDK. On AGP 9 use built-in Kotlin (drop
org.jetbrains.kotlin.android) and legacy jniLibs packaging. See the Quick Start.
com.cefrium:cefrium-sdk:0.8.0
0.7.1 CEF 7922 Chromium 151.0.7922.137 2026-08-17 Maven
- WebSockets to a local/private address no longer stall (issue #1). Chromium 151 enabled Local Network Access checks for WebSockets by default; a page connecting to localhost / a LAN address gated the handshake on a permission decision Cefrium has no UI to resolve, so it stalled (reported as extreme WebSocket latency after the 0.6.x -> 0.7.0 bump). Cefrium now disables the LNA feature, matching Android WebView. Validated on device: before, the handshake never completed; after, it connects immediately (50 messages round-trip in ~100 ms). A WebSocket regression guard was added to the on-device release gate.
- Engine: Chromium 151.0.7922.71 -> 151.0.7922.137 (same CEF branch 7922). A same-branch security roll-up for CVE parity with the Debian Chromium release. No API changes.
com.cefrium:cefrium-sdk:0.7.1
0.7.0 CEF 7922 Chromium 151.0.7922.71 2026-08-03 Maven
- Engine: Chromium 150.0.7871.114 -> 151.0.7922.71 (CEF 7871 -> 7922). Tracks the Debian Chromium security release for CVE parity. The API surface is unchanged for SDK consumers;
Cefrium.CHROMIUM_VERSIONnow reports 151.0.7922.71. Validated on device (full instrumented + sample smoke + close-leak gates green on the W90).
com.cefrium:cefrium-sdk:0.7.0
0.6.5 CEF 7871 Chromium 150.0.7871.114 2026-08-03 Maven
CefriumBrowser.setMediaSessionActivity(PendingIntent)(and ComposeCefriumNavigator.setMediaSessionActivity) lets a multi-tab host make the media notification / lock-screen control open the SPECIFIC tab that is playing, not just the app. Each browser'sMediaSessionCompatcarries a settable session activity (overriding the default launcher intent added in 0.6.4); passingnullrestores the default. Validated on device.
com.cefrium:cefrium-sdk:0.6.5
0.6.4 CEF 7871 Chromium 150.0.7871.114 2026-07-31 Maven
- Tapping the media notification / lock-screen control now opens the app (the tab playing the media) instead of another app.
CefriumMediaSessionnow sets acontentIntenton the notification andsetSessionActivityon theMediaSessionCompat(the host app's launcher intent). Without a tap target, Android routed the control's tap to another active media session's owner (e.g. Spotify) even though the notification showed the Cefrium tab.
com.cefrium:cefrium-sdk:0.6.4
0.6.3 CEF 7871 Chromium 150.0.7871.114 2026-07-21 superseded
- Media notification / lock-screen progress bar now advances.
CefriumMediaSessionnow observes Chromium'smediaSessionPositionChangedand pushes the media duration (METADATA_KEY_DURATION) plus the playback position + speed into theMediaSessionCompatPlaybackState, so Android renders and ticks the seekbar. Previously only the play/pause button worked -- the position wasPLAYBACK_POSITION_UNKNOWNand no duration was set, so the bar had no range and never moved. Validated on device.
com.cefrium:cefrium-sdk:0.6.3
0.6.2 CEF 7871 Chromium 150.0.7871.114 2026-07-13 Fixes CVE-2026-15107 +26 superseded
- Engine updated to Chromium 150.0.7871.114 (from 150.0.7871.46), a same-branch security patch bump tracking Debian's 150.0.7871.114-1~deb13u1 upload for CVE parity. The 150.0.7871.114 stable roll-up fixes 27 vulnerabilities, including two CRITICAL use-after-free flaws -- CVE-2026-15112 (Ozone) and CVE-2026-15129 (Views) -- plus high-severity memory-safety fixes across V8, ANGLE, WebRTC, Codecs, Autofill, Payments, Input, DOM and Forms. All 142 CEF + Android-port patches re-apply cleanly on the new tree (same CEF branch 7871 -- no rebase or patch regeneration needed). CVEs: CVE-2026-15107, CVE-2026-15108, CVE-2026-15109, CVE-2026-15110, CVE-2026-15111, CVE-2026-15112, CVE-2026-15113, CVE-2026-15114, CVE-2026-15115, CVE-2026-15116, CVE-2026-15117, CVE-2026-15118, CVE-2026-15119, CVE-2026-15120, CVE-2026-15121, CVE-2026-15122, CVE-2026-15123, CVE-2026-15124, CVE-2026-15125, CVE-2026-15126, CVE-2026-15127, CVE-2026-15128, CVE-2026-15129, CVE-2026-15130, CVE-2026-15131, CVE-2026-15132, CVE-2026-15133.
isPlayingAudio()now uses only the actual-playback signal, not theis_suspendedflag (which flickers mid-playback for media documents and made the getter spuriously read false for an audible tab). Now!mPlayingIds.isEmpty().
com.cefrium:cefrium-sdk:0.6.2
0.6.0 CEF 7871 Chromium 150.0.7871.46 2026-07-05 Fixes CVE-2026-13789 superseded
- Engine updated to Chromium 150.0.7871.46 (from 149.0.7827.102), tracking Debian's security upload for CVE parity (includes the CVE-2026-13789 V8 fix and the rest of the 150 security roll-up). The Android port was rebased onto CEF branch 7871 and adapted to the Chromium 150 API: permission-prompt embedder seam regenerated, Android autofill client
HideAutofillSuggestions->HideSuggestions,RenderWidgetHostView::Show()->ShowWithVisibility(), non-final R viaapp_as_shared_lib, and the payments Javaservice_impl_javadep. No SDK API changes for consumers -- a drop-in engine/security refresh.
com.cefrium:cefrium-sdk:0.6.0
0.5.9 CEF 7827 Chromium 149.0.7827.102 2026-07-03 superseded
- FedCM crash on federated sign-in pages. The Gradle plugin now generates the R class for
org.chromium.chrome.browser.ui.android.webid; without it, a page that invoked the FedCM account chooser (AccountSelectionBridge.getBrandIconIdealSize) threwNoClassDefFoundError webid/R$dimenand crashed the browser process. Only reproduced on CERTIFIED devices (where FedCM runs). Validated on Redmi/HyperOS.
- Incognito (private) browsing.
CefriumBrowser.createWithSurface(activity, incognito)+isIncognito(); ComposeCefriumViewState(incognito = true)/rememberCefriumViewState(url, incognito). Incognito browsers share one off-the-record request context (isolated from normal tabs, in-memory) that is cleared when the last incognito browser closes. Validated on device: cookie isolation normal<->incognito and clear-on-close.
com.cefrium:cefrium-sdk:0.5.9
0.5.8 CEF 7827 Chromium 149.0.7827.102 2026-07-03 superseded
- Tab/session restore now loads the page instead of showing a blank tab (or crashing on some devices).
CefriumViewState(navigationState = ...)restore deferred its load to the wrong moment:Restore()ran while the initial about:blank navigation was still pending (so nothing loaded -> blank), and forcing the load inOnAfterCreatednavigated before the on-screen surface + overscroll handler existed, crashing the overscroll controller on the RenderFrameHost swap. NowrestoreNavigationStaterebuilds the stack without loading and schedules the surface connect (which restored tabs previously never did -- onlyloadUrldid); the load is triggered once, fromconnectWebContentsInternal, after the surface and handler are set up. Validated on a Redmi/W90 (Android 16, arm64) and rooted API-33/36 emulators, single- and multi-tab.
com.cefrium:cefrium-sdk:0.5.8
0.5.7 CEF 7827 Chromium 149.0.7827.102 2026-07-03 superseded
- Native pull-to-refresh: an overscroll-down gesture at the top of a page reloads it. Opt-in via CefriumBrowser.setPullToRefreshEnabled(true) (CefriumNavigator.setPullToRefreshEnabled in Compose); the handler binds once when the WebContents connects.
com.cefrium:cefrium-sdk:0.5.7
0.5.6 CEF 7827 Chromium 149.0.7827.102 2026-07-02 superseded
- Tab back/forward history restore.
CefriumBrowser.serializeNavigationState()/restoreNavigationState(byte[])capture and rebuild a tab's full navigation stack (each entry's URL and page state), andCefriumViewState(navigationState = ...)restores it. A tab restored after the app is killed can navigate back through its history, not just show its current page.
com.cefrium:cefrium-sdk:0.5.6
0.5.5 CEF 7827 Chromium 149.0.7827.102 2026-07-02 superseded
- Background audio now keeps playing reliably when the app is minimized or the screen is off. The media foreground service is driven by actual WebContents playback instead of the media session's controllability signal (which could flicker), so the process stays alive while audio plays rather than being reclaimed after about a minute.
com.cefrium:cefrium-sdk:0.5.5
0.5.4 CEF 7827 Chromium 149.0.7827.102 2026-07-02 superseded
- New host API
stopMediaSession()(onCefriumBrowserand the ComposeCefriumNavigator): stops the page's media session and dismisses its media notification. It operates at the WebContents level, so it also reaches media inside cross-origin iframes (e.g. a YouTube embed) that page JavaScript cannot pause. - Hardware and Bluetooth media keys (play/pause) now control in-page media playback.
- The system media notification now appears reliably for media documents (navigating directly to an audio/video URL) and for pages that wire
navigator.mediaSessionafter load. Previously it could fail to appear depending on when the media session was created.
com.cefrium:cefrium-sdk:0.5.4
0.5.3 CEF 7827 Chromium 149.0.7827.102 2026-06-24 superseded
- Web NFC (
NDEFReaderread/write) works end-to-end -- validated with a physical NDEF tag (read + write round-trip). - Renderer-termination callback: get told when a renderer process for your browser dies (e.g. the OEM low-memory killer reclaims it) so you can show a reload affordance instead of a silent blank page.
CefriumBrowser.setOnRenderProcessTerminatedListener((status, errorCode) -> ...)withTERMINATION_*status constants. Compose: observe the hoistedCefriumViewState.rendererTerminationor passonRenderProcessTerminatedtoCefriumWebView.CefriumBrowser.PERMISSION_NFC-- grant Web NFC via yoursetPermissionHandleror pre-authorize an origin withsetContentSetting(url, PERMISSION_NFC, SETTING_ALLOW).
- Web NFC was previously wired but every scan/write was denied or hung. Three
engine fixes: CEF mapped the NFC permission to an ungrantable type (added
CEF_PERMISSION_TYPE_NFC);NfcBlocklistread a variations field-trial param whose JNI is absent in CEF and threw (guarded); and the consumer also needsandroid.permission.VIBRATE. - Renderer terminations Android reports as
OOM_PROTECTED/EVICTED_FOR_MEMORY(the common OEM low-memory-kill path) now reachOnRenderProcessTerminatedasTS_PROCESS_OOM-- the callback previously never fired for the most common Android renderer death. - Surface-mode crash on close: a deferred WebContents-connect callback could
fire after the browser was torn down and dereference a stale pointer
(
SIGSEGV). It now short-circuits once the browser is closed.
- Web NFC consumers must declare
android.permission.NFCandandroid.permission.VIBRATEin their manifest. - Do NOT declare your own
SandboxedProcessServiceentries -- the AAR provides them (40 isolated slots); a consumer-side count both fails the manifest merge and caps the pool. See the Memory & process model guide.
- Redmi Note 13 Pro 5G / HyperOS: Web NFC read + write round-trip on a physical tag; renderer-termination on a real OEM low-memory kill.
- W90: instrumented suite 41/41 on device before publish.
com.cefrium:cefrium-sdk:0.5.3
0.5.2 CEF 7827 Chromium 149.0.7827.102 2026-06-16 superseded
- Renderer lifetime & memory: showing many pages over time -- e.g. a
CefriumBrowserPoolof pages, each with a cross-origin iframe -- no longer leaks renderers or crashes on process-per-browser devices (HyperOS / Android 16).
- Closing/evicting a browser now completes Chromium's window-destruction
handshake on Android (
CloseHostWindow->WindowDestroyed), so theWebContentsand every subframe renderer (host page + cross-origin iframe) are actually destroyed. - 40 sandboxed render-process slots (was 5); the visible browser is marked IMPORTANT and detached pooled ones MODERATE, so the OS reclaims idle renderers first and never the active one.
- Accessibility: apps with an accessibility service active (TalkBack, Switch
Access) no longer crash with
NoClassDefFoundError SelectionCompatwhen the a11y tree queries a CEFWebContents.
CefriumBrowser.setCookie(url, name, value, secure, httpOnly, sameSite)and the ComposeCefriumNavigatorparity overload -- explicit Secure / HttpOnly / SameSite (NONE / LAX / STRICT / UNSPECIFIED). The 3-argsetCookieis unchanged.- Diagnostics:
closedBrowserCount(),activeRenderProcessCount(),totalRenderFrameHostCount(),zeroFrameRenderProcessCount(),liveBrowserCount().
- Do NOT declare your own
SandboxedProcessServiceentries -- the AAR provides them; a lower count caps the pool. See the Memory & process model guide. - Inline YouTube via
loadHtmlWithBaseUrlloads the real player, but YouTube's server-side integrity check rejects locally-injected documents (Error 152, same as WebView'sloadDataWithBaseURL). To embed YouTube inline, serve the embed HTML from a real HTTP(S)/localhost origin and useloadUrl().
- Redmi Note 13 Pro 5G / HyperOS: 40 pages,
maxAlive=3, inline cross-origin YouTube video -- bounded and crash-free.
com.cefrium:cefrium-sdk:0.5.2
0.5.1 CEF 7827 Chromium 149.0.7827.102 2026-06-14 superseded
loadHtmlWithBaseUrl/loadDataWithBaseUrlonCefriumBrowserand the ComposeCefriumNavigator-- load an HTML string with a real base-URL origin and referrer (like Android WebView'sloadDataWithBaseURL), so string-loaded content can host embeds that validate their parent origin (no Error 153).
- Startup crash on Xiaomi MIUI / HyperOS (DeviceFormFactor resource-resolver guard).
- Native-FCM
FirebaseMessaging.getToken()-- declaresandroidx.datastore-preferencesfor the vendored Firebase token path. - The chrome PasswordManager no longer terminates the renderer on a
loadDataWithBaseURLdata:form (which had left the surface blank).
- Orphaned okio classes stripped from the AAR (consumer's Gradle provides the
single copy) -- no
checkDuplicateClassescollisions.
- On device, both codecs and libre variants.
0.5.0 CEF 7827 Chromium 149.0.7827.102 2026-06-10 superseded
- Major web-platform expansion: WebAuthn / passkeys, Web Bluetooth / USB / Serial device choosers, Payment Request (Google Pay), Contact Picker, File System Access, file upload, WebOTP, Web Speech recognition, Web NFC, screen capture, generic sensors, WebRTC, OPFS, and more -- inherits essentially the full Chromium web platform.
- File-picker result routing.
- Modal-dialog host.
- Video Picture-in-Picture made crash-safe.
- Exhaustively on device.
0.4.1 CEF 7827 Chromium 149.0.7827.102 2026-06-09 superseded
- Chromium security respin: fixes CVE-2026-11645 (out-of-bounds memory access in V8, exploited in the wild) plus the other CVEs in 149.0.7827.102.
- User-Agent now reports the real engine version.
0.4.0 CEF 7827 Chromium 149.0.7827.53 2026-06-08 superseded
- Chromium engine bump 148 -> 149 (149.0.7827.53, CEF branch 7827) for CVE parity with Debian Chromium. 20 Android patches; multi-ABI AAR (arm64 + x86_64).
- On device: CefInitialize, multi-process renderer, OnPaint off-screen render.
0.3.2 CEF 7778 Chromium 148.0.7778.167 2026-06-08 superseded
- Web Notifications (service-worker
showNotification) to the Android shade. - Native FCM push (bring-your-own Firebase).
- Per-origin permission via
setContentSetting(View + Compose).
0.3.1 CEF 7778 Chromium 148.0.7778.167 2026-06-06 superseded
- Maven-consumable fat AAR (self-contained resources + manifest).
- Zero-config init (no
Applicationboilerplate). - SSL cert-error and HTTP-auth handlers (WebView parity).
0.3.0 CEF 7778 Chromium 148.0.7778.167 2026-06-05 superseded
- Web permissions,
getUserMedia, system media controls, print-to-PDF, cookie and dynamic-settings APIs.
0.2.1 CEF 7778 Chromium 148.0.7778.167 2026-06-04 superseded
- First multi-ABI artifact (arm64-v8a + x86_64 in one AAR).
0.2.0 CEF 7778 Chromium 148.0.7778.167 2026-06-04 superseded
- Per-architecture artifacts; superseded the same day by 0.2.1 (multi-ABI).
0.1.0 CEF 7778 Chromium 148.0.7778.167 2026-05-26 superseded
- Early validation release.
Each release above is a source tag with notes -- the permanent parity and
security record. The consumable .aar artifacts that Gradle resolves are
published separately to the
Codeberg Maven registry. See the
Quickstart for the repository and coordinates, e.g.
com.cefrium:cefrium-sdk:0.5.2. This list is the history and never loses an
entry, even after an artifact is pruned.
Artifact retention
Pinning a version? Resolve from Maven Central
(mavenCentral(), com.cefrium:*), where every published
version stays available permanently. Central has carried the SDK since 0.8.1.
The Codeberg Maven mirror serves only the latest version during
early validation, to respect Codeberg's donation-funded storage, so a coordinate
pinned there stops resolving at the next release. Superseded versions are not
retained as binaries on the mirror; each is reproducible from its source tag (see
the build process in BUILD-GUIDE), and every release carries a
SHA256SUMS of the artifacts as published for verification. This mirror
policy will be revisited before 1.0 / first production adopters.
The SHA256SUMS file is GPG-signed (SHA256SUMS.asc,
detached) with the maintainer's key, fingerprint
2A84 0ED0 0DE6 69F4 219B 8B33 02A7 9E3B 8215 1695. To verify a download:
gpg --recv-keys 02A79E3B82151695 # once, to fetch the public key
gpg --verify SHA256SUMS.asc SHA256SUMS # checks the signature
sha256sum -c SHA256SUMS # checks the artifacts against it
These channels are what makes a build official. For how official builds and third-party derivatives are distinguished — and what the LGPL and the Cefrium trademark each cover — see Trademark & Forks.
Versioning: a release that adds public API is a minor bump; a
fixes-only release is a patch; CEF/Chromium engine bumps are recorded regardless. See
VERSIONING-CEFRIUM.md.