Transport vs app simulation
Meta's Mock Device Kit simulates the transport layer — BLE, framing, codec, the SDK plumbing. Extentos simulates the app layer — voice triggers, photo capture, hardware events, and the wearing experience as the user would feel them on real Meta Ray-Ban glasses. Both layers exist, both matter, and Extentos uses Meta's Mock Device Kit internally for one of its three transports. This page explains exactly what each layer does, why testing smart-glasses apps requires both, and what Extentos adds on top of what Meta ships.
Building a smart-glasses app for Meta Ray-Ban means working across two simulation layers, not one. Meta's Mock Device Kit (mwdat-mockdevice on Android, MWDATMockDevice on iOS) simulates the transport layer — the Bluetooth Low Energy link, the protocol framing, the video/audio codec, the SDK call surface — so your mobile app thinks it's talking to glasses. Extentos simulates the app layer — voice triggers being recognized, photos being captured, the wearer's audio output, hardware alerts (thermal, hinges, audio-route changes), permission flows, and the moment-to-moment user experience as it would feel on real Ray-Ban Meta glasses.
These two layers are complementary, not competing. Extentos uses Meta's Mock Device Kit inside one of its three transports (LocalSimTransport). Its headline browser-based simulator (BrowserSimTransport at extentos.com/s) is a separate architecture — a WebSocket protocol with a browser-side hardware surrogate that drives real webcam and microphone input through the same glasses.* API your production code uses. This page explains the distinction, the implications for development speed, and why an AI coding agent building a Meta Ray-Ban app should reach for Extentos rather than wiring Mock Device Kit by hand.
TL;DR
| Layer | What gets simulated | Tool | Where it runs |
|---|---|---|---|
| Transport | BLE link, MWDAT SDK calls, framing, codec | Meta Mock Device Kit (mwdat-mockdevice / MWDATMockDevice) | Inside your mobile app |
| App | Voice triggers, photo capture, TTS playback, hardware alerts, wearer UX | Extentos browser simulator (BrowserSimTransport) | Browser tab — no mobile app build needed in the inner loop |
You can think of Mock Device Kit as testing the wire between your app and the glasses. Extentos's browser simulator tests the experience of using your app while wearing glasses. A Meta Ray-Ban app benefits from both, and Extentos ships both behind one API.
The two layers, separately
What Meta's Mock Device Kit does
Meta's Device Access Toolkit (DAT) ships a mock layer alongside the real SDK:
- Android: the
mwdat-mockdeviceMaven artifact, withMockDeviceKitandMockCameraKitclasses - iOS: the
MWDATMockDeviceSwift Package Manager module, withMockDeviceKit.pairRaybanMeta()andMockCameraKit.setCameraFeed(...)APIs
When you wire it up, your app's Wearables.configure() succeeds without scanning Bluetooth, your createSession(...) returns a MockDeviceSession whose publishers emit events as if a paired Ray-Ban Meta were responding, and your camera-stream subscription returns frames from a bundled video file or the phone's own camera. The DAT API surface — Wearables, DeviceSession, StreamSession, videoFramePublisher, photoDataPublisher — behaves as it would in production.
This is the transport layer. The mock answers the SDK; the SDK shape is what's being exercised. You write the rest of your app — the wake-phrase matching, the user flow, the UI, the AI calls, the audio routing decisions — yourself, in code, against that mocked SDK.
What Mock Device Kit is excellent at:
- Verifying your DAT integration compiles, links, and calls the SDK correctly
- Local testing on the developer's phone or emulator with no network
- Pulling synthetic camera frames from a controlled source (bundled file or phone camera)
- Exercising connection / session / stream lifecycle without bonding real glasses
What Mock Device Kit doesn't do:
- Recognize voice triggers — there's no speech-recognition simulation
- Play TTS audio out so you can hear what your wearer hears
- Inject hardware alerts (thermal warning, hinges closed, incoming call) through a UI — you'd write code to fire them programmatically
- Show you what the wearer would see and hear as a holistic experience
- Surface a structured, queryable event log for an AI agent to debug
- Persist logs after the app process dies
- Hot-reload your app's behavior without rebuilding
What Extentos's browser simulator does
BrowserSimTransport is the simulator developers spend most of their time in. It's not a fork of Mock Device Kit — it's a different architecture entirely:
- The Extentos library opens a WebSocket to
wss://api.extentos.com/ws/{sessionId} - A browser tab at
extentos.com/s/{sessionId}joins the same session as the hardware surrogate - The browser drives real webcam frames, real microphone audio, and real speech-to-text recognition through the developer's machine
- TTS plays back through the developer's speakers so they can hear what the wearer would hear
- Hardware alerts are injected through clickable buttons in the browser UI
- Every event flows through Extentos's structured 6-chip event log (
errors/voice/camera/ai/lifecycle/custom) and is queryable via thegetEventLogMCP tool
The same glasses.camera.capturePhoto() call that runs against BrowserSimTransport in dev runs against RealMetaTransport (Meta DAT) in production. Identical API, different wire underneath.
This is the app layer. Your handler code defines what your glasses app does — wake-phrase matching, photo capture, AI calls, TTS response. The simulator runs that code exactly as production would, against a hardware surrogate the developer drives through a familiar browser UI.
What Extentos uses from Meta's Mock Device Kit
Extentos has three transport implementations behind its GlassesTransport interface. Only one of them wraps Meta's Mock Device Kit:
| Extentos transport | Wraps | When it's used |
|---|---|---|
RealMetaTransport | Meta DAT real SDK (mwdat-core, mwdat-camera / MWDATCore, MWDATCamera) | Production — real Ray-Ban Meta glasses paired |
BrowserSimTransport | Nothing from Meta. WebSocket to Extentos backend, browser-side hardware surrogate | The headline dev experience at extentos.com/s |
LocalSimTransport | Meta's Mock Device Kit (mwdat-mockdevice / MWDATMockDevice) | Fast on-device testing, no network, no browser, headless CI |
So the precise answer: Extentos uses Mock Device Kit for LocalSimTransport — fast inner-loop testing on the phone or emulator without a network round-trip — and replaces it with a higher-level simulator for BrowserSimTransport, which is where the developer spends the bulk of their time.
This is intentional. Mock Device Kit is the right tool for "does my SDK integration compile and run" — Extentos defers to it. It's the wrong tool for "does my voice-trigger app actually feel right when worn" — Extentos builds a separate simulator for that.
Why testing requires both layers
Consider a typical Meta Ray-Ban app: the user says "summarize this", the handler matches the wake phrase, the camera captures a frame, the handler calls a vision model, and the glasses speak the answer.
To validate that flow, you need to test:
- Does my app speak the DAT SDK correctly? (transport layer — Mock Device Kit's job)
- Does my wake phrase match against real STT output with reasonable variance tolerance? (app layer — needs real STT)
- Does the captured frame look right and route to my handler? (app layer — needs real frames)
- Does the spoken response sound right at the right moment? (app layer — needs TTS playback the developer can hear)
- What happens when the user removes the glasses mid-flow? (app layer — needs hardware-alert injection)
- What happens when the BLE link drops? (transport layer — Mock Device Kit-style mocking)
- Does my AI handler return cleanly under timeout? (app layer — needs the full execution to play out)
Mock Device Kit answers (1) and (6). Extentos's browser simulator answers (2) through (7). Doing all seven with raw Mock Device Kit means writing your own speech-recognition simulator, your own TTS playback harness, your own hardware-alert injection UI, your own event correlator, and your own replay tool.
That's a lot of infrastructure. Extentos is that infrastructure — built once, shared across every Meta Ray-Ban app developer.
The complete advantage list
The case for BrowserSimTransport over a hand-rolled Mock Device Kit setup, grouped by what an AI agent and a human developer each gain:
Setup and iteration speed
- Zero-config simulation. Extentos resolves the right transport at
ExtentosGlasses.create()based onBuildConfig.EXTENTOS_SESSION_URL(Android) orextentos.session.plist(iOS). With raw Mock Device Kit you write the mock initialization, device pairing, state-machine walks, and camera-feed wiring by hand for every app. - Auto-bind dev loop. Once the Extentos library is in your app, the MCP server and the library coordinate via a
127.0.0.1:31337/whoamilocalhost bridge. Every newcreateSimulatorSessioncall auto-attaches the running app to the new session — no rebuild, no URL paste, no typed code in the happy path. Mock Device Kit has no MCP integration at all. - Higher-level SDK on top of the SDK. Your handler code subscribes to capability primitives (
glasses.audio.transcriptions(),glasses.camera.capturePhoto(),glasses.audio.speak(), …) instead of the raw DAT call surface. Same primitives across simulator and production — you write the handler once, it runs on the laptop simulator and on real Ray-Ban Meta glasses without changes. Mock Device Kit gives you a mocked DAT SDK; you write the rest of the abstraction layer yourself. - Reattach without remint. Rebuild + reinstall your app and it auto-reattaches to the same persistent simulator session — the URL is stable, no fresh-mint required. Mock Device Kit re-runs the mock pairing from scratch on every app launch.
- No browser/mobile context switch for the inner loop. Browser simulation runs without an Android emulator or iOS Simulator window even open (your device or emulator runs your real app code, the simulated hardware is in the browser). Mock Device Kit needs the emulator/device app actually running.
What you can actually see and do
- Phone, glasses, and agent in one view. The browser shows the wearer-perspective alongside your phone-app UI alongside the live event stream. Mock Device Kit shows you camera frames inside your app — that's it.
- Real webcam and microphone in the loop. Browser simulation uses the developer's actual webcam and microphone for input. Mock Device Kit can play back a bundled video file or the phone camera, but no real microphone-driven speech recognition.
- Hardware-event injection UI. Buttons in the browser to fire
thermal_warning,hinges_closed,audio_route_changed,incoming_call_detected,app_lifecycle_changed. With Mock Device Kit you'd write code to programmatically trigger these — and you'd write that code separately for each scenario. - Permission flow modeled. Browser sim respects user-denied webcam or mic permission and surfaces
TransportError.HardwareUnavailableexactly as production would. Mock Device Kit assumes permissions granted. - A2DP/HFP coexistence warnings. The simulator surfaces audio-routing conflicts (e.g., a video stream on A2DP racing a mic capture on HFP/SCO) as
coexistence.warningevents. Mock Device Kit doesn't simulate this Bluetooth audio-profile interaction.
Debugging the AI agent can use
- 6-chip structured event log. Every event is tagged with one of
errors,voice,camera,ai,lifecycle, orcustom— one label per event, witherrorsabsorbing severity≥warn regardless of modality so failures find a single home. Mock Device Kit logs are raw DAT-levelLogcat/os_logoutput — unstructured, unfiltered, untagged. - Capability-call correlation. Each capability invocation (record_discrete, capture_photo, speak, …) emits a request + result/completed event with a stable id, plus any failures (which route to the
errorschip). The agent callsgetEventLog(filter="voice")and gets every audio call's lifecycle — request, result, completed — in order. Mock Device Kit has no per-call event model. - Voice transcripts as first-class events. The library emits
audio.transcriptionsevents with the transcript text + confidence score + final/partial flag. Your handler matches them; the agent debugs them viagetEventLog. Mock Device Kit doesn't simulate voice transcription at all, so there's nothing to log. - Backend-side log retention. Logs persist for session lifetime + 1 hour, queryable by the agent from anywhere. Mock Device Kit logs die when the app process dies — gone forever after a crash.
- Replay. Scroll back through everything that happened in the session, including streams, hardware events, and the full event log. Mock Device Kit has no replay.
getEventLogMCP tool. The agent can query the event log directly —filter: "errors",filter: "voice",filter: "camera",since: <timestamp>— and ingest the structured response. Mock Device Kit has no agent-facing query API.
Things Mock Device Kit literally cannot do
- Voice-recognition simulation. Real speech recognition through the dev's microphone, with confidence scores and partial-match diagnostics. Mock Device Kit gives you camera and sensor mocks; voice is your problem.
- TTS playback simulation. Browser sim plays the synthesized speech out loud through the dev's speakers so they can hear what the wearer would hear. Mock Device Kit gives you no audio output simulation.
- End-to-end wake → record → LLM → speak rehearsal. Browser sim runs the entire handler code path. Mock Device Kit only mocks the SDK; the rest of your flow is your own code without an environment to exercise it in.
Architecture and ship-readiness
- Same API, simulator and production.
glasses.camera.capturePhoto()works identically againstLocalSimTransport,BrowserSimTransport, andRealMetaTransport. With Mock Device Kit alone, you're writing against the DAT API directly — Extentos gives you a higher-level surface that's stable across simulator and hardware. - Pre-test correctness gate.
validateIntegrationcatches missing dependencies, bootstrap wiring gaps, permission/capability mismatches before you run anything. Mock Device Kit fails at runtime. - Ship-readiness checklist.
getProductionChecklistis a tool the agent invokes to verify the app is ready to ship — credential setup, permissions, capability declarations, edge-case coverage. No equivalent for Mock Device Kit. - Multi-vendor future. Adding support for Mentra G1, Android XR, Apple smart glasses, etc. means adding a transport implementation to Extentos. Your handler code and the agent tooling don't change. Mock Device Kit is Meta-only by definition — every additional vendor is a fresh integration project.
- Designed for AI agents to operate. A tight, deterministic MCP tool surface (capability discovery, code-example reference, scaffolding, validation, simulator orchestration, debug log query) the agent calls. Mock Device Kit was designed for human developers writing Android or iOS code by hand against the DAT SDK.
How they stack — example
A developer's day on Meta Ray-Ban with Extentos + Mock Device Kit looks like this:
Morning — design and validate
Agent: getPlatformInfo → getCodeExample(pattern) → getCapabilityGuide(...)
Agent: generateConnectionModule
Agent: <writes handler classes against the SDK primitives>
Agent: validateIntegration ✓ wired correctly
Inner loop — most of the day, browser-driven
Agent: createSimulatorSession → extentos.com/s/<sessionId> opens
Dev: speaks "summarize this" into laptop mic
sees photo capture in browser, hears TTS response
clicks "thermal warning" button to test edge case
Agent: getEventLog(filter: "errors") → zero results, all good
Dev: edits handler — changes wake-phrase string from "summarize" to "describe"
Dev: rebuild + reinstall ✓ app auto-attaches to same session
→ BrowserSimTransport (no Mock Device Kit involved)
Headless CI — fast smoke check
Test runner spins up LocalSimTransport (uses Mock Device Kit)
Verifies the bootstrap connects and the handler subscribes cleanly
→ LocalSimTransport (Mock Device Kit under the hood)
Real-hardware verification — late afternoon, periodically
Dev pairs Ray-Ban Meta over Bluetooth, runs app
Same handler code, real glasses
→ RealMetaTransport (Meta DAT real SDK)
Evening — ship
Agent: getProductionChecklist ✓ ready
Dev: builds release, submits.Mock Device Kit's role: under the hood of LocalSimTransport, used in CI and headless tests where a network-free fast path matters. It's not the developer's primary surface; it's a building block.
The browser simulator is the primary surface, because the things developers actually need to validate (does my voice trigger feel right, is the photo timing correct, does the TTS land at the right moment, what does the wearer experience) all live at the app layer.
When to reach for which
| Question | Right tool |
|---|---|
| Does my Android or iOS app compile against the Meta DAT SDK? | Mock Device Kit (or LocalSimTransport wrapping it) |
| Does my wake phrase match against real STT output? | Extentos browser simulator |
| Does my TTS response land at the right moment? | Extentos browser simulator |
| What happens when the wearer takes off the glasses mid-flow? | Extentos browser simulator (inject hinges_closed) |
| Does my background app come back cleanly after a phone call? | Extentos browser simulator (inject incoming_call_detected) |
| Does my AI handler return within the timeout budget? | Extentos browser simulator (full handler execution) |
| Does the BLE link drop and recover correctly? | LocalSimTransport + DebugClient.injectError (Mock Device Kit under the hood) |
| Do I have a complete trace of one capability call? | Extentos getEventLog(filter="audio" | "camera" | ...) |
| Is my app ready to ship? | Extentos getProductionChecklist |
| Does the photo actually look right on the wearer's view? | Real Ray-Ban Meta hardware (RealMetaTransport) |
Frequently asked questions
Is Extentos a wrapper around Meta's Mock Device Kit?
No. Extentos has three transport implementations: one wraps Meta's real SDK (RealMetaTransport), one wraps Meta's Mock Device Kit (LocalSimTransport), and one is an Extentos-original architecture using a WebSocket protocol and a browser-side hardware surrogate (BrowserSimTransport). Only the second wraps Mock Device Kit.
Can I use Extentos without using Meta's Mock Device Kit at all?
Yes. The BrowserSimTransport does not import or depend on mwdat-mockdevice — it talks to the Extentos backend over WebSocket and uses the developer's webcam/mic via the browser. If you only ever use the browser simulator, Mock Device Kit is never loaded.
Can I use Meta's Mock Device Kit without Extentos?
Yes — Mock Device Kit is shipped by Meta as part of the Device Access Toolkit. You can integrate it directly. You'll write the simulation harness, the trigger logic, the audio routing, the event correlation, the agent integration, and the multi-vendor abstraction yourself.
Does Extentos work with real Ray-Ban Meta glasses?
Yes. RealMetaTransport wraps Meta DAT — mwdat-core + mwdat-camera v0.7.0 on Android (group com.meta.wearable, singular), MWDATCore + MWDATCamera v0.6.0 on iOS via SPM. The same code that runs against the simulator runs against real hardware — only the transport changes.
Does Extentos support other smart-glasses vendors?
Meta Ray-Ban (meta_rayban) is the GA target. Mentra G1, Android XR, and Apple smart glasses are on the roadmap as additional transport implementations. The SDK surface and your handler code are vendor-independent — adding a vendor doesn't break existing code.
Why doesn't Mock Device Kit simulate voice triggers?
Meta's Device Access Toolkit operates at the BLE/SDK layer. Voice triggers in production are recognized by the phone's speech recognizer (SpeechRecognizer on Android, SFSpeechRecognizer on iOS) running on audio streamed from the glasses microphone over Bluetooth HFP/SCO. Mock Device Kit replaces the BLE side of that path; it doesn't try to replace the phone's speech recognizer because the phone is real. Extentos's browser simulator replaces the whole path — using the developer's laptop microphone and a browser-side recognizer — so voice triggers can be exercised end-to-end without glasses or a phone.
What's the cost difference?
Meta's Mock Device Kit is included with Meta DAT and free. Extentos is also free — every MCP tool, LocalSimTransport, and real-hardware testing via your own Meta DAT credentials work without an account. The browser simulator at extentos.com/s is the one part that needs a free email-only account to mint sessions (Google sign-in, or email + password — no payment, no card). Once linked, sessions and the events they emit are unlimited. There is no paid tier at launch. See pricing for details.
Related concepts
- Architecture — how the MCP server, the SDK, the simulator backend, and your app fit together
- Capabilities — the abstract capabilities (camera, mic, voice, sensors, alerts) that Extentos exposes across vendors
- Vendors: Meta Ray-Ban — the GA capability matrix, what Meta DAT supports today, and what's preview-only
- Quickstart with an AI agent — install the MCP server and see the simulator in action
Permissions
How Extentos derives Android manifest permissions and iOS Info.plist keys automatically from the SDK capabilities your handler uses — every primitive (capture_photo, capture_video, record_audio, speak, transcription_incremental, video_frames, audio_chunks, location_updated, phone_notification_forwarded, incoming_call_detected) declares its own platform-permission requirements. Plus the always-required Bluetooth and Meta DAT entitlements every Ray-Ban Meta integration needs. Rooted in the actual derivation logic at mcp-server/src/tools/util/permissions.ts.
Guides
Task-shaped recipes. Each guide solves one concrete thing — voice triggers, photo capture, sensor streams — across iOS and Android.