Resources

Changelog

Release notes for Extentos — the MCP server (@extentos/mcp-server), the Android library (com.extentos:glasses), and the iOS library (swift-glasses). Newest first. The MCP server is pre-1.0; APIs may shift between minor versions until the hardware test loop closes. The first stable iOS release (the 1.7.0 lockstep cut), the managed AI gateway, the Phase-4 voice assistant, and the display capability are the most recent additions; the pure-SDK pivot, the browser simulator, getEventLog, auto-bind, and device-code auth landed earlier.

Release notes for Extentos, newest first. The MCP server is pre-1.0 (the SDK line is 2.x on both platforms — Maven Central and the swift-glasses SPM package, released in lockstep) — minor versions of the MCP server may introduce breaking changes until the hardware test loop closes. For the current published MCP version see the npm package; for the exact live capability state of any primitive, have your agent call getPlatformInfo (more accurate than any docs page).

Dates are given where they're verifiable. Items grouped under Recent shipped in the same period but aren't pinned to a precise date — we'd rather say "recent" than invent a date.

Recent

These landed across recent releases (mid-2026) and represent the current shape of the platform.

Managed AI gateway

The Phase-4 voice assistant now routes its voice AI through Extentos's managed gateway on Extentos's provider key — a developer can ship a voice-AI glasses app with zero AI configuration (no key to obtain, store, or rotate). Conversation content (audio, transcripts, model responses) is relayed but never stored; only token-usage metadata and computed cost are recorded per project. Metering and billing are live — a prepaid-credit model with a $2 free grant per account (see the milestone below). (There is no bring-your-own-key option.) See pricing.

Phase-4 assistant runtime

The glasses.assistant.* runtime — a real-time voice loop with a wake/sleep state machine, session.say(), barge-in, intent-based end, and tool calling — is stable on both platforms: on Android since com.extentos:glasses 1.4.0 (Maven Central), on iOS in the 1.7.0 Swift package (see the release entries below). Setup and API surface: the assistant page.

Meta DAT 0.8.0

The Android library now builds on Meta Device Access Toolkit 0.8.0 (the iOS package followed on 2026-07-03 — its DAT floor is now 0.8.0 too). The one developer-visible addition is the generic META_GLASSES device type, surfaced as glasses.device.type on Android; it's handled by the same capability dial as every other camera + audio model, so no app changes are needed. Camera, audio, voice, and display behavior are unchanged.

Display capability

Meta opened heads-up display content to third parties; Extentos exposes it as glasses.display.* — a UI tree plus full-surface video — shipped in both SDKs and fully testable in the simulator on both. On-glasses rendering via Meta DAT is live on Android (DAT 0.8.0); iOS on-glasses delivery is in progress. Per-variant display status is on the Meta vendor page.

Library releases

The Android and iOS libraries version in lockstep — one release number covers both.

2.0.0 — the vendorless baseline (Maven Central + Swift Package)

Read this before upgrading if your app uses the camera or the display. This is the one release in Extentos's history that can disable a working feature without a build error.

What changed. com.extentos:glasses no longer contains the Meta transport. Camera, display and the Meta device session moved into a new optional artifact, com.extentos:glasses-meta. The core artifact now carries no vendor SDK at all.

If your app uses camera or display — add one line:

app/build.gradle.kts
implementation("com.extentos:glasses:2.0.0")
implementation("com.extentos:glasses-ui:2.0.0")
implementation("com.extentos:glasses-meta:2.0.0")   // ← add this

No Kotlin change is needed. The module registers itself at app start, so TransportChoice.Auto resolves to real glasses exactly as before. Keep your settings.gradle.kts as-is — the Meta DAT repository and its read:packages token are still required, because those artifacts now arrive through glasses-meta.

If you skip it, nothing fails loudly. Gradle resolves, the build succeeds, voice keeps working and the connection still reports as up — only capture breaks. That shape survives CI and a smoke test, so check explicitly after upgrading: glasses.transportChosen reads SYSTEM_AUDIO where you expect REAL_META, glasses.capabilities.camera is false, and the SDK logs a warning naming the missing module (adb logcat -s Extentos:W).

Android only, for now. The artifact split is an Android change: SwiftPM has no credentialed-repository problem to solve, and splitting would mean restructuring the published swift-glasses package. On iOS the DAT modules remain unconditional dependencies of GlassesCore, so an iOS voice app still links them — it just never uses them, needs no Meta credentials, and no Info.plist DAT keys. The vendorless runtime behaviour is identical on both platforms; only the dependency hygiene differs.

Why. The Meta DAT artifacts live on a credentialed GitHub Packages repository. While they sat inside the core artifact, every customer had to accept Meta's terms and mint a GitHub token — including voice-only apps that never touch a camera. Skipping it failed the build with a 401 that never mentioned Extentos. That toll is now charged only to apps that actually use vendor hardware.

What this unlocks — voice apps need no vendor setup whatsoever. A new SystemAudioTransport serves the complete agent runtime (turn-taking, barge-in, tool calling, conversation memory, local and cloud models) over the phone's own Bluetooth audio routing. No vendor SDK, no Meta Developer account, no App ID, no GitHub token, no connection page, no pairing flow. It works on smart glasses, on ordinary Bluetooth earbuds, and — with nothing connected — on the phone's own microphone and speaker, so a voice app never dead-ends because the glasses are in their case. See choose your path.

TransportChoice.Auto gains a rung for it, placed below every vendor arm and below the simulator arms: an app with bonded glasses still resolves to RealMeta, and the browser-simulator dev loop is unchanged.

Renamed: AssistantProvider.OpenAiAssistantProvider.Managed (Swift .openAI.managed). The type was named after one vendor while the model id picks the vendor — gpt-* OpenAI, grok-* xAI, gemini-* Google, local-* on-device. So OpenAi(model = "local-auto") ran an on-device model with no network, which reads like a bug and isn't one.

Your code keeps working. The old name stays as a fully functional deprecated case on both platforms — same shape, same behaviour, with a deprecation warning and an IDE fix-it pointing at the new one. Migrate when convenient:

AssistantProvider.Managed(model = "local-auto")   // was AssistantProvider.OpenAi(...)

Also in this release: bring-your-own-key is fully removed. The assistant runs on the Extentos managed gateway, always; there is no option to supply a provider key and none is on the roadmap.

1.11.1 — 2026-07-26 (Maven Central + Swift Package)

Android-only cut that restores lockstep: ExtentosLocalTier.autoChoice(context) landed for iOS parity just after 1.11.0 was tagged, so on Android it wasn't callable until this release. If you use the local tier's automatic rung selection, this is your floor.

1.11.0 — 2026-07-26 (Maven Central + Swift Package)

The local tier ships whole. com.extentos:glasses-local (on-device text models) and com.extentos:glasses-local-voice (on-device speech) are both on Maven Central, with GlassesLocal / GlassesLocalVoice as the Swift-package equivalents. glasses-local-voice is the first public release of the high-quality on-device voice. Automatic joins the model picker — the assistant selects a local rung sized to the phone and falls back to the gateway when the device can't serve one. See local models.

1.10.0 — 2026-07-26 (Maven Central + Swift Package)

The first release carrying com.extentos:glasses-local — the on-device text tier, published alongside the existing artifacts on both platforms.

1.9.0 — 2026-07-19 (Maven Central + Swift Package)

Adds OpenAI's two newest realtime models to the assistant catalog, so they're selectable from the dashboard's Agent tab, from AssistantProvider.Managed(model = …), and from AssistantCatalog.realtimeModels in your own in-app picker.

  • gpt-realtime-2.1 — a drop-in successor to gpt-realtime-2: same voices, same reasoning.effort knob, same price on every dimension.
  • gpt-realtime-2.1-mini — distilled reasoning at mini pricing. Despite the name it is not a newer gpt-realtime-mini: it does accept reasoning.effort (the older mini does not) and carries the full 128k context window (the older mini is 32k). Its image-input rate also differs from the rest of the realtime line.
  • Both are token-billed through the managed gateway at OpenAI's published rates; the dashboard's cost estimate and the exact per-response ledger both price them from day one.

Existing models are unchanged, and the SDK default stays gpt-realtime-2 — upgrading does not move any project onto a new model.

1.8.0 — 2026-07-17 (Maven Central + Swift Package)

Google Gemini Live joins the assistant, alongside OpenAI Realtime and xAI Grok — the model id picks the vendor (gemini-*), so switching providers is a string change. Gemini adds streaming video input (session.sendVideoFrame) on the video-capable models: gate it with session.modelSupportsVideoInput, because an ungated send on a text-only model surfaces an error to your app and tells the model it can't see, rather than dropping the frame silently. All of it bills through the managed gateway at list price.

1.7.0 — 2026-07 (Maven Central + Swift Package — first stable iOS release)

The first joint Android + iOS release, and the iOS library's stable debut: the Swift package is published from github.com/extentos/swift-glasses, version-locked to the Android line. .package(url: "https://github.com/extentos/swift-glasses", from: "1.7.0") resolves the binary core and builds with no workarounds — see install.

  • iOS SDK, stable. The capability surface ships on iOS: camera (photo, video with audio, live frames), the Phase-4 voice assistant on the managed gateway (wake/sleep, barge-in, tool calling), named sounds (playSound / registerSound + dashboard slots), the display API, connection page, telemetry. A season of real-hardware dogfooding landed reliability work across the voice loop (silence endpointing, mic-subscription persistence across STT restarts, barge-in flush) and the camera/video path (AAC video audio at the encode ceiling, stream re-arm, auto-finalize when the stream stops mid-record).
  • Core (both platforms): CameraStatus (ready / starting / broken) replaces the boolean capture gate; connection-state fixes — no transient Disconnected while the glasses stay reachable, no Active → Connecting blip when the camera starts; strictly monotonic frame timestamps across stream re-arms; a shared named-sound registry behind both shells.
  • Published as com.extentos:glasses:1.7.0 + com.extentos:glasses-ui:1.7.0 (Maven Central) and the swift-glasses 1.7.0 tag (SPM).

1.6.0 — 2026-07-11 (Maven Central)

Camera-capture refinements and browser-simulator fidelity for the temple-tap capture button.

  • PhotoConfig.fullResolutiondedicatedCapture (breaking rename, no deprecation alias — pre-adoption). DAT's discrete capturePhoto takes no resolution argument, so the non-frame-grab path is a dedicated capture whose resolution DAT sets independently of the stream — not a caller-chosen resolution. The old name was a misnomer.
  • Capture mechanism in the simulator event log. capture_photo_returned now carries mechanism = frame_grab | dedicated, so a developer testing in the browser simulator — where the returned image is identical either way — can confirm which path their code would take on real hardware.
  • The capture button is reproducible in the simulator. The wearer's temple-tap pause/resume/stop and the resulting CaptureError.StreamPaused are now testable without hardware: BrowserSimTransport honors a simulated paused state through the same shared gate real glasses use, and a shell-declined capture records capture_denied in the event log. Published as com.extentos:glasses:1.6.0 + com.extentos:glasses-ui:1.6.0.

1.5.0 — 2026-07 (Maven Central)

Camera reliability on real Meta hardware, and honest handling of the wearer's temple-tap pause.

  • CaptureError.StreamPaused — a capture attempted while the wearer has paused the camera (a single temple tap) returns this typed error carrying an actionable "tap the right temple to resume" message, instead of fighting the platform. DAT 0.8 exposes no app-callable resume; the honest response is to prompt the wearer, then retry.
  • Camera-streaming reliability fixes from a full audit of the frame-grab / video / live-frames paths (cold-start re-arm, stream-state teardown on disconnect).
  • Capture failures funnel to the assistant by default — an assistant tool that captures a photo surfaces the failure's actionable message to the model, so the assistant tells the user exactly what to do.

1.4.0 — 2026-07-02 (Maven Central)

The Phase-4 assistant runtime graduates to stable: glasses.assistant.* (wake/sleep state machine, session.say(), barge-in, intent-based end, tool calling) is now in the public Maven Central release — the 1.4.0-phase4-dogfood preview snapshot and its mavenLocal() setup are retired. Published as com.extentos:glasses:1.4.0 + com.extentos:glasses-ui:1.4.0.

1.3.0 — 2026-05-24 (Maven Central)

Added the Phase-3 conversation runtime (glasses.conversation.onWake { listen() / speak() / cancelSpeak() / ai.complete() }). Superseded by the Phase-4 assistant runtime (see Recent) for new voice-AI work, but still resolvable from Maven Central. Published as com.extentos:glasses:1.3.0 + com.extentos:glasses-ui:1.3.0.

1.2.0 — 2026-05-22 (Maven Central)

First public release of the Android library on Maven Central, via the Sonatype Central Portal. com.extentos:glasses (core) + com.extentos:glasses-ui resolve from the default mavenCentral() repository with no workaround.

The iOS Swift package ships from github.com/extentos/swift-glasses, version-locked to the Android release line — stable since 1.7.0 (see the entry above). Some primitives landed Android-first; per-primitive status: getPlatformInfo.

Platform milestones

Managed-gateway billing — 2026-06-26

The managed AI gateway went from metered-only to live prepaid billing. Every account gets $2 of free managed-gateway credit; past that, usage draws down a prepaid credit balance bought in the dashboard's account Billing hub (any amount, with optional auto-reload), and the gateway stops when the balance hits zero — prepaid, so no surprise invoice. Pricing is the provider's list price with no markup — tokens for token-billed models, connected minutes for per-minute voice models. All managed usage counts (simulator, dev, and real hardware). Nothing outside the managed gateway is affected — the free surfaces stay free. Full detail on pricing.

Pure-SDK pivot — 2026-05

The library stopped interpreting a declarative runtime and became a pure Kotlin/Swift SDK. Customer code now writes its own handler classes directly against capability primitives (glasses.audio.transcriptions(), glasses.camera.capturePhoto(), glasses.audio.speak(), …) — there is no intermediate authoring layer to fight through. The MCP server, simulator, and backend all moved post-pivot in the same period. The canonical voice-glasses patterns are available via the getCodeExample MCP tool.

Earlier foundation

These shipped before the pivot period and remain core to the developer loop:

  • Browser simulator at extentos.com/s — the hardware surrogate the library connects to in BrowserSim mode, running the same library code as production with only the transport and I/O swapped.
  • getEventLog — the structured event log (queryable per chip: errors / voice / camera / display / ai / lifecycle / custom), mirrored to the backend during simulator mode so an AI agent can debug a run.
  • Auto-bind dev loop — shipped on Android and iOS; the library's debug-build probe finds the agent's local MCP server and binds a running app to a simulator session automatically (the extentos.session.plist URL-bake path remains as the iOS fallback).
  • Device-code auth — the OAuth-style flow (RFC 8628) that links an anonymous install to a free email-only account. It's required for browser-simulator session minting, project scaffolding (generateConnectionModule), and the managed AI gateway; discovery, validation, guidance, and on-device simulation stay anonymous.

Notes

  • Last updated: 2026-07-16. Entries marked "Recent" are honest about approximate timing; precise dates appear only where verifiable.
  • Versioning: the Android and iOS libraries version in lockstep; the MCP server versions independently (always install @latest unless you're pinning for reproducibility — see the npm package).
  • For where Extentos is going rather than what shipped, see the roadmap.
  • Roadmap — forward-looking direction
  • The managed AI gateway — how the assistant's AI runs, and metering
  • Pricing — free surfaces and the one metered surface
  • License — MIT for the MCP server; proprietary libraries (public packages)