Concepts

Extentos vs Meta DAT directly

Extentos wraps Meta's Device Access Toolkit — it doesn't replace it. What you write against raw DAT vs what Extentos gives you, and when to go direct.

Extentos isn't an alternative to Meta's Device Access Toolkit — it's a layer on top of it. Extentos's production transport (RealMetaTransport) calls Meta DAT under the hood; the question isn't "Extentos or DAT," it's "compose against Extentos's typed primitives and tooling, or wire the raw DAT API yourself." This page is the honest comparison, including when going direct to DAT is the better choice.

What Meta DAT gives you, and what you still have to build

Meta's Device Access Toolkit is the official SDK for connecting a mobile app to Ray-Ban Meta — it handles Bluetooth pairing, the session/stream lifecycle, camera frames, photo capture, and the audio path. It's solid plumbing. But it stops at the SDK surface. Building a real voice-glasses app on raw DAT means you also write, yourself:

  • The wake-phrase path — DAT doesn't recognize phrases. You stream the glasses mic to the phone's SpeechRecognizer / SFSpeechRecognizer over Bluetooth HFP, normalize transcripts, and match strings.
  • A capability abstraction — DAT exposes raw publishers (videoFramePublisher, photoDataPublisher, …). You build the typed surface your handlers call.
  • A test harness — DAT ships a Mock Device Kit for the transport, but you write the speech-recognition simulation, TTS playback, hardware-alert injection, and an event correlator to actually exercise your app's behavior. (See transport vs app simulation.)
  • Permission derivation — you map each capability to the right Android manifest entries and iOS Info.plist keys (including the Meta DAT-specific ones) by hand.
  • The audio-coexistence decisions — A2DP playback racing an HFP capture is fragile; you write the routing policy.
  • Multi-vendor portability — DAT is Meta-only. Supporting another vendor later is a fresh integration.

What Extentos adds

Extentos builds that layer once, shared across every Meta Ray-Ban app:

  • Typed capability primitives — your handler subscribes to glasses.audio.transcriptions(), glasses.camera.capturePhoto(), glasses.audio.speak(), glasses.assistant.start(), glasses.display.show() — the same API across the browser simulator, the on-device local simulator, and real hardware.
  • A real app-level simulator + agent-driven testing — drive voice, camera, and display from a browser (or from MCP tools, no human), and read a structured 7-chip event log. The bulk of the dev loop happens without pairing glasses.
  • MCP scaffolding for AI agentsgenerateConnectionModule writes the wiring, getPermissions derives the entitlements, validateIntegration gates correctness. See the MCP tools reference.
  • A typed error model — lifecycle ops return ExtentosResult<T, E> with concrete failure variants instead of raw exceptions.
  • A managed AI gateway (optional) — the assistant runtime routes voice AI on Extentos's keys by default; no key in your app. See the gateway.
  • A multi-vendor seam — handler code is vendor-agnostic; adding a vendor is a new transport, not a rewrite.

Side by side

Raw Meta DATExtentos (on top of DAT)
Bluetooth pairing, session/stream lifecycle✅ DAT✅ (wraps DAT)
Camera / photo / audio primitives✅ raw publishers✅ typed glasses.*
Wake-phrase recognition❌ you build itglasses.voice.onPhrase / transcriptions()
App-level simulator (voice, TTS, alerts)❌ you build it✅ browser simulator
Agent-driven E2E testing✅ inject + assert + event log
Permission derivation❌ by handgetPermissions
Typed error model❌ raw exceptionsExtentosResult
Voice AI / assistant runtime❌ you wire a provider✅ managed gateway + glasses.assistant
Ray-Ban Display renderingDAT 0.8.0 primitiveglasses.display.* DSL
Multi-vendor portability❌ Meta-only✅ vendor-agnostic handlers
DependenciesDAT onlyDAT + Extentos SDK

When to use Meta DAT directly

Extentos is the faster path for almost any voice/camera/display glasses app — but going direct to DAT is the right call when:

  • You need a DAT capability Extentos doesn't surface yet. Extentos exposes a curated primitive set; if you need a raw DAT API that isn't wrapped, use DAT directly (and consider emailing us so it gets surfaced).
  • You want zero added dependencies. A minimal app that only does, say, one photo capture may not need the abstraction.
  • You're doing something very low-level with the transport that the capability model would get in the way of.

Adopting Extentos on an existing DAT app is a full cutover today, not a side-by-side blend: the Meta DeviceSession is a single-owner handle, so raw DAT and Extentos can't both own the hardware in one process. The cutover is a call-site swap, not a rewrite (Extentos calls the same DAT underneath) — see Migrating from raw Meta DAT for the symbol-by-symbol map.

Escape hatches: lower altitude, same ecosystem

When you need something the packaged surface doesn't give you, Extentos's answer is an escape hatch that stays inside the ecosystem — an explicitly opt-in API at a lower altitude (Android @ExtentosEscapeHatch, iOS @_spi(ExtentosEscapeHatch)), never a handout of the raw vendor session. That's a deliberate hard rule, for the same single-owner reason as above: two owners of one Bluetooth transport is split-brain by construction. Everything you do through a hatch still rides the Extentos session — same connection state machine, same event log, same toggles and permission gates.

What that looks like today: the shipped hatch lets you replace the packaged connection page with fully custom UI built on glasses.connection.state, glasses.toggles.state, and glasses.voice.hints. And a lot of "low-level" visibility needs no hatch at all — connection.state is a plain observable stream, video frames carry per-frame effective width/height, and glasses.runtime.events streams the SDK's runtime activity. Vendor-specific extension hatches (Meta-only knobs the neutral vocabulary doesn't cover) follow the same in-ecosystem rule as they land; if you're blocked on a specific DAT capability today, tell us and it gets prioritized.

The bottom line

Extentos doesn't hide Meta DAT — it does the repetitive, fragile, per-app work (wake-phrase plumbing, the app-level simulator, permission derivation, the test harness, the error model) once, so you write your app's logic instead of its infrastructure. If you'd end up rebuilding that layer anyway, Extentos is the layer. If you genuinely only need raw transport, DAT alone is fine.