Security and data handling
What Extentos collects (aggregate dev + runtime metadata), what it never collects (transcripts, AI prompts, PII), and the one path that puts end-user media on our infrastructure — display hosting. Anonymous-first, GDPR-friendly.
Extentos collects aggregate metadata about how developers use the platform — which capabilities are popular, which vendors get adopted, how flows perform, where errors surface. This data powers three things: the developer-facing analytics dashboard (coming soon — you'll see your own app's usage in one view), the Extentos team's product roadmap (which vendors to add next, which capabilities to harden), and the ecosystem insights Extentos shares with glasses vendors as aggregate market data (10+ account minimum). What Extentos never collects as telemetry is end-user content (speech transcripts, photo or video bytes, audio samples, AI prompts and responses), end-user PII (names, emails, phone numbers), toggle values, or stack traces.
Captured media runs locally. Photos, video, and sensor frames flow from the glasses to your app on the user's phone and never touch an Extentos server — the production transport is Bluetooth, and we are not in the path.
There is exactly one exception, and it is not telemetry: rendering a captured photo or clip on a Ray-Ban Display. The glasses can only load media from an http(s) URL they fetch themselves, so rather than make every developer stand up storage, we host a copy for you. It's a convenience you can decline — host the media yourself and pass a URL, and nothing is uploaded. If you do use it, read Hosted display media; it changes what your own privacy policy has to say.
This page is the honest, complete picture of what crosses the network from your install and your shipped apps to Extentos's backend.
TL;DR
| What | |
|---|---|
| What we collect | Aggregate metadata — tool calls, install events, vendor adoption, capability usage, error rates, library/MCP versions, device models, country-from-IP, anonymous device identifiers, plus managed-gateway AI usage (token counts + cost, no content). Tagged with anonymous IDs that can never be reversed back to a person. |
| What we never collect | Speech transcripts, photo bytes, video frames, audio samples, AI prompt and response text, handler-code input/output payloads, toggle values, IP addresses (dropped after country derivation), stack traces, end-user PII. The managed AI gateway relays assistant audio and text but never stores it (see AI calls). |
| The one content exception | Rendering a captured photo or clip on a Ray-Ban Display uploads a copy to Extentos's media host, because the glasses fetch media only from an http(s) URL. It persists until your app releases it. Capture never uploads; no other capability does. See Hosted display media. |
| What end users see | Nothing about Extentos. End users have no relationship with us. The production transport (RealMetaTransport) never talks to our backend — it speaks only to Meta DAT and the glasses over Bluetooth. A shipped app has up to three network paths to us: runtime telemetry (metadata only, on by default, telemetryConsent = false disables it), the managed AI gateway if you use the assistant (relayed, never stored), and the display media host if you render captured media (see above). |
| Opt-out | Three independent surfaces — EXTENTOS_TELEMETRY=0 env var, extentos-mcp decline-privacy CLI, or ExtentosConfig.telemetryConsent = false in your shipped app. Any one disables telemetry upload; on-device debug logs still work. |
| Compliance | GDPR-friendly by construction — no end-user PII ever stored. Aggregate metadata retained indefinitely under Art. 6(1)(f) legitimate-interest basis to power both the developer dashboard and (multi-vendor-dependent) the vendor data product; right-to-erasure honored within 30 days regardless of retention policy. CCPA: planned cross-vendor data product qualifies as a "sale"; developer-level Do-Not-Sell opt-out is ExtentosConfig.dataSharingConsent = false (a shipped SDK field — the vendor aggregate product it gates is still forthcoming). SOC 2 Type II on the post-launch roadmap. |
Why we collect telemetry — the honest answer
Extentos's business model includes monetizing aggregate ecosystem insights, and we're upfront about it.
Three concrete uses:
- Your own analytics dashboard. When the developer dashboard ships, you'll see your app's usage at
extentos.com/apps/<your-app>— which voice triggers your users fire, which AI calls are slowest, which device models your users have, error rates, session lengths, weekly active users. Same data Extentos collects centrally, scoped to youraccountId. This is genuinely valuable to developers and is why the underlying collection is broad rather than narrow. - Extentos's product roadmap. Aggregate signal across all developers tells us which vendors to add next (if 30% of new MCP installs ask about a vendor we don't support, we prioritize that transport), which capabilities are over-used relative to expectations, where the SDK has rough edges. Without this, every roadmap call is a guess.
- Cross-vendor ecosystem signals to glasses vendors (planned, multi-vendor only). Once Extentos supports ≥2 vendors with material installed bases, aggregate comparative market data — capability mix across the ecosystem, vendor market share, session-hour totals across vendors — becomes uniquely valuable to glasses vendors who only see their own SDK telemetry. We plan to sell this as market research, only as aggregates over at least 10 distinct accounts, never as individual-developer or individual-end-user data. This is a planned future revenue line that activates at multi-vendor scale; a single-vendor version isn't a meaningful product because each vendor already collects their own platform's usage data.
We chose a transparent collect-and-aggregate model rather than a "we collect nothing" claim that vendors quietly walk back. The discipline is in the firm content/PII boundary, not in collecting less data overall.
What we collect
All telemetry events conform to a single envelope:
{
"eventId": "tev_a1b2c3d4",
"timestamp": "2026-04-18T14:22:10.432Z",
"category": "runtime",
"name": "connection.opened",
"accountId": "acct_xyz",
"installId": "inst_abc123",
"appId": "com.example.app",
"anonymousDeviceId": "dev_789",
"libVersion": "2.8.0",
"mcpVersion": null,
"vendor": "meta_rayban",
"platform": "android",
"osVersion": "14",
"deviceModel": "pixel_8",
"country": "US",
"userSegment": null,
"properties": { "transportType": "RealMeta", "timeToConnectMs": 1820 }
}The events split into two categories:
Dev-time events (MCP server, category: "mcp")
Emitted from your machine while your AI agent operates Extentos — so they're tagged with your installId (anonymous) and, after linking, your accountId.
| Event | What it carries |
|---|---|
mcp.installed | First run on this machine. npm version, OS, detected agent host. |
mcp.consent_accepted / mcp.consent_declined | Privacy policy version. |
tool.called | Every MCP tool invocation. toolName, durationMs, outcome. |
session.created | createSimulatorSession invoked. Vendor, recording flag. |
account.login_initiated / _completed / linked / logged_out | Auth flow lifecycle. Trigger reason (cli_explicit, account_required), outcome, duration. |
Runtime events (your shipped app, category: "runtime")
Emitted by the Extentos library if the developer enables runtime telemetry (ExtentosConfig.telemetryConsent = true, default). Tagged with appId and anonymousDeviceId — never with end-user identity.
| Event | What it carries |
|---|---|
app.initialized | Library version, vendor, deviceModel, osVersion. |
connection.opened / closed | Transport type (SystemAudio/RealMeta/BrowserSim/LocalSim), timeToConnectMs / durationMs, disconnect cause (typed enum). |
stream.started / stopped | streamType (video_frames, audio_chunks, transcription_incremental, etc.), durationMs. Safe subset of negotiated config (resolution, frame rate, codec, bitrate). No peer addresses, URIs, destination identifiers. |
toggle.changed | key (which of the 8 runtime toggles flipped), source (ui / voice / automation). No old/new values — the values can reveal product behavior. |
Notice the bold disclaimers — every event explicitly carries metadata only, never content.
Retired (deprecated) runtime events: pre-pivot the library also emitted trigger.fired, flow.completed, block.executed, callback.invoked, and spec.loaded to describe spec-DSL execution. Those events were retired with the pure-SDK pivot — the library no longer interprets a spec, so the events that described its execution no longer fire. Their schemas remain in the event registry marked deprecated: true for historical event-log validation; no new code emits them.
What we never collect
Verbatim list from the canonical telemetry doc (this list is published in the privacy policy). It describes the telemetry pipeline — the events your shipped app uploads to api.extentos.com/api/telemetry/events. Two features sit outside the telemetry pipeline and have their own data stories: the managed AI gateway (relays, never stores) and hosted display media (stores, until you release it).
- Speech transcripts (the words your user said)
- Photo bytes, video frames, audio samples — as telemetry. The display media host is the documented exception; see below.
- Handler-code input/output payloads (the LLM prompts your handler builds, the responses it receives, anything your business logic passes around between SDK calls)
- AI provider responses, prompt text, tool-use traces
- Toggle values, variable values
- End-user PII of any kind (names, emails, phone numbers, account identifiers in your app)
- IP addresses (derived to country at ingest, then dropped — we never store the raw IP)
- Stack traces (may contain arbitrary values; stay local in your on-device event log)
- Anything tied to a specific end-user identity beyond the per-device anonymous
anonymousDeviceId
The library architecture enforces this — events are payload-stripped before they enter the upload queue, not in transit. No end-user content can reach the telemetry pipeline even if the network were intercepted, because the content never enters the queue in the first place.
That guarantee is about telemetry. It is not a claim that no end-user content ever reaches Extentos by any route — the gateway and the display media host are two routes that do, both opt-in by the capability you choose to use, both documented below.
Hosted display media — the one content path
If your app renders a captured photo or clip on a Ray-Ban Display, the SDK uploads a copy to Extentos before the glasses can show it. This is the only feature in the SDK that puts end-user media at rest on our infrastructure, and it exists because of a hardware constraint, not a product preference: the display fetches media only from an http(s) URL it can reach over its own Wi-Fi. A data: or file: URL is rejected on hardware, and the phone does not proxy the bytes. So a locally captured asset cannot reach the lens without becoming a fetchable URL first. Rather than make every developer stand up hosting, the SDK does it.
Exactly what happens.
| Trigger | display.show { image(photo) } or { video(clip) } with a local capture. Passing image(url) / video(url) uploads nothing. |
| Not triggered by | Capture itself. capturePhoto(), captureVideo(), frame streams and audio never upload. Media only leaves the device if you display it. |
| Where it goes | An Extentos-operated storage bucket, reached at an unguessable random UUID path. |
| Who can read it | Anyone with the exact URL — the glasses fetch it unauthenticated, so it cannot be access-gated. The URL is not enumerable and is never published, but treat it as a secret-by-obscurity link, not a private object. |
| How long | Until your app deletes it. There is no expiry — deliberately, so an asset can't vanish mid-life while a user is looking at it. |
| How to delete it | forgetHostedImage(photo) / forgetHostedVideo(clip). Build the Photo / VideoClip the same way you built it for show, so both resolve to the same hosted copy. |
| Scope today | Android only. The iOS display client has no local-media hosting path yet — on iOS you pass an http(s) URL you host. |
| Tagging | The upload carries the app's anonymousDeviceId for attribution. No end-user identity is attached. |
What this means for you as the developer. Two obligations, both small:
- Wire
forgetHosted*into your delete path. If a user deletes a photo in your app and you don't call it, the hosted copy stays. That is the single most likely way this becomes a real privacy problem, and it is entirely in your code. - Disclose it in your own privacy policy if you use the display with captured media. Your end user's relationship is with your app, not with us; "media is uploaded to our SDK vendor's host to render on the glasses, and deleted when you delete the item" is the honest line.
How to avoid it entirely. Host the media yourself and pass image(url) / video(url). The SDK uploads nothing on that path. If your app never uses the display, or only renders text and layout nodes, this section doesn't apply to you at all.
A developer-supplied storage option (bring your own bucket) is on the roadmap so this stops being a choice between our host and hand-rolling your own.
End-user privacy — your shipped apps
The clearest line: on real Ray-Ban Meta glasses, the production transport never talks to Extentos.
RealMetaTransport(the production transport) speaks to Meta DAT and the glasses over Bluetooth. It does not connect toapi.extentos.com. End users on real hardware have no network relationship with Extentos at all.BrowserSimTransport(the simulator transport) does talk to the Extentos backend over WebSocket — butBrowserSimTransportonly runs inconfig.debug == truebuilds during development. Shipped release builds resolve toRealMetaTransportwhen a vendor module claims bonded glasses, otherwiseSystemAudioTransport, which doesn't connect.LocalSimTransport(in-memory simulation — no DAT SDK) is fully on-device. No network at all.
Runtime library telemetry is on by default (ExtentosConfig.telemetryConsent = true): the library emits the runtime events above to https://api.extentos.com/api/telemetry/events. It carries metadata, never content. The developer can turn it off per-app via telemetryConsent = false.
Telemetry is the only network path that is on by default. Two more open only if you use the capability behind them:
| Path | When it opens | What crosses | Turn it off by |
|---|---|---|---|
| Runtime telemetry | On by default | Metadata only, never content | telemetryConsent = false |
| Managed AI gateway | You use the Phase 4 assistant runtime | Audio, transcripts, responses — relayed verbatim, never stored | Don't use the managed assistant; call your own provider from handler code |
| Display media host | You render a captured photo/clip on a Ray-Ban Display | The media file itself, stored until released | Pass image(url) / video(url) with your own hosting |
A shipped app that leaves telemetry on, uses the managed assistant, and renders captured media on the display touches all three. An app that does none of those emits nothing to us at runtime.
End users never see Extentos branding, never get prompted by us, never need to consent to anything from us. Their privacy relationship is entirely with the developer's app — Extentos is invisible.
The 5 ID model
Five identifiers, each with a distinct scope. None of them is end-user PII, and Extentos cannot reverse any ID back to a person.
| ID | Scope | When created | Where stored |
|---|---|---|---|
installId | Per-machine MCP install | First npx @extentos/mcp-server run | ~/.extentos/install.json |
accountId | Per-Extentos-account | When developer signs up via device-code flow | Backend; cached in ~/.extentos/auth.json |
appId | Per-Extentos-app | Set by developer in ExtentosConfig.appId at library init | Compiled into the app |
anonymousDeviceId | Per-end-user-device | First library init on the user's device | App-private storage on the user's device |
userSegment | Developer-defined cohort label | Optional; glasses.telemetry.setUserSegment("...") | App memory; flushes with events |
The anonymousDeviceId lets Extentos count distinct devices and sessions without ever learning end-user identity. The userSegment is set by the developer — Extentos never sets or interprets it. It exists so the developer can cut their own dashboard by cohorts they define (beta tiers, geography, app version) without exposing any personal information.
AI calls: the managed gateway, and your own calls
Extentos touches AI two different ways, with two different data stories. The full mechanics are on the managed AI gateway page; here's the privacy-relevant summary.
Managed gateway (the Phase 4 assistant runtime, default). Voice-AI traffic routes through Extentos's gateway on Extentos's provider key. Extentos is in the path — but as a transient relay: audio, transcripts, and model responses are forwarded verbatim and never stored. The only thing recorded is the provider's per-response usage object — token counts (input/output, text/audio, cached) plus the computed cost — tagged with your appId and accountId for per-project metering. No prompt, transcript, photo, or response content is stored. The content boundary in the "what we never collect" list holds for the gateway: relayed, never inspected, never persisted.
Your own AI calls. Your handler calls a non-assistant provider (a vision model on a captured photo, a translation API) directly, with a key you wire into your own code. Extentos has no hook into that path — it never sees the key, the request, or the response. The getCredentialGuide MCP tool generates setup instructions for you to follow with your provider; Extentos never receives the credentials.
So "Extentos never proxies your AI" is true for AI you call yourself from handler code — and that was the only model the earlier docs described. For the managed gateway it isn't: Extentos relays the call, but never stores its content. This page states both honestly.
Three opt-out surfaces
Telemetry is opt-out at three independent levels, each disabling a different layer:
| Surface | Where | What it disables |
|---|---|---|
EXTENTOS_TELEMETRY=0 env var | Developer's shell | MCP-server-side telemetry for the current shell session. Doesn't persist across reboots. |
extentos-mcp decline-privacy CLI command | Writes ~/.extentos/consent | MCP-server-side telemetry permanently for this install. Survives reboots. Run accept-privacy to re-enable. |
ExtentosConfig.telemetryConsent = false | Developer's app code | Library-runtime telemetry from this app. Per-app — a developer with multiple apps can opt one out and leave others on. |
Any combination works. Telemetry never affects functionality — opting out doesn't disable any feature, just stops uploads.
The on-device event log (the 512-entry ring buffer your agent queries via getEventLog) keeps working regardless of telemetry consent — in production that data never crosses the network (in simulator mode it is mirrored to the backend for agent debugging). See event log vs telemetry boundary.
Retention and deletion
| Data class | Retention |
|---|---|
| Raw telemetry events | Indefinite. Historical trend data is the asset behind both the developer dashboard and the (multi-vendor-dependent) vendor data product — cutting retention kills year-over-year comparisons. Lawful basis under GDPR is Art. 6(1)(f) legitimate interest, with a documented Legitimate Interest Assessment (aggregate metadata, no end-user PII, clearly disclosed purposes, full right-to-erasure preserved). |
| Aggregated rollups (daily / weekly / monthly per account, plus global) | Indefinite |
anonymousDeviceId records | Retained while the device sends events. No automatic expiration on inactivity — that destroys cohort retention analysis. |
| Backend session event log (dev-time simulator only) | 48 hours after each event is recorded, then purged automatically. |
| Hosted display media | Until the app deletes it via forgetHostedImage / forgetHostedVideo. No time-based expiry by design — an asset disappearing while a user is viewing it is worse than one that persists. This is the one retention window that is controlled by your code rather than by us; wire it to your delete path. |
Right-to-erasure (GDPR Art. 17 / CCPA right to delete). The indefinite-retention default does not block right-to-erasure. Developers can email support to delete their account's events; Extentos runs DELETE WHERE accountId = ... and acknowledges within 30 days (GDPR-compatible SLA). Note that this covers telemetry events — hosted display media is not reachable by an account-scoped delete, because uploads are not account-attributed. Delete those from your app with forgetHostedImage / forgetHostedVideo; if you need a bulk purge, contact support. This deletes raw events tied to the account; aggregated rollups derived before the deletion request stay (those have no accountId attribution by construction). Anonymous events without an accountId (emitted before account linking and never retroactively re-tagged) cannot be associated to a person and are kept as aggregate-only data.
CCPA "sale" classification. The planned cross-vendor data product qualifies as a "sale" under CCPA when it ships. The developer-level Do-Not-Sell mechanism is ExtentosConfig.dataSharingConsent = false (a shipped SDK field) — disables aggregate inclusion only, while the developer's own analytics dashboard keeps working. The current telemetryConsent = false is all-or-nothing.
Transport and auth security
- TLS everywhere. All Extentos backend connections (
api.extentos.comfor telemetry and simulator-session WebSockets) use TLS 1.2+. No plaintext channels. - Auth tokens at file mode
0600. When you link an account,~/.extentos/auth.jsonis written with owner read/write only. Other users on the machine can't read your token. - Identity on telemetry calls. Telemetry uploads carry the
installId(MCP-side) orappId + anonymousDeviceId(library-side). When the developer has linked an account, the MCP server also attaches its account bearer so events attribute to the account — no end-user credentials are ever sent. - Local bridge bound to
127.0.0.1only. The MCP server's auto-bind listener (port31337) refuses non-loopback connections. TheinstallIdit serves is not a secret — it's the same value sent toapi.extentos.comon every tool call — so loopback exposure is intentional. - Pre-GA hardening note. The current telemetry ingest scheme trusts self-reported IDs (per
docs/mcp/TELEMETRY.md). For MVP this is acceptable — spoofed events skew aggregate fleet data, not security-sensitive. Before external GA, this hardens to one of: ingest-signed install tokens, per-request HMAC keyed on a secret baked at library init, or rate-limit-based outlier detection.
How to verify what we collect
You don't have to take this page's word for it — inspect the wire. Proxy your install's and your app's traffic to api.extentos.com and you'll see exactly what's sent: aggregate metadata, never content or PII. The @extentos/mcp-server package is MIT-licensed on npm, so its telemetry pipeline (src/telemetry/) is open to read directly; the native libraries are proprietary, but everything they send crosses that same observable network boundary.
Documentation can drift; the bytes leaving your app can't. Watch the wire and hold us to this page.
Compliance posture
| Standard | Status |
|---|---|
| GDPR | Compatible. Lawful basis for analytics is Art. 6(1)(f) legitimate interest, documented in our LIA. No end-user PII stored. Right-to-erasure honored within 30 days regardless of retention policy. |
| CCPA | Compatible with explicit "sale" disclosure. The planned cross-vendor data product qualifies as a "sale" under CCPA when it ships. Developer-level Do-Not-Sell mechanism is ExtentosConfig.dataSharingConsent = false (a shipped SDK field) — separate from telemetry collection. Right to know honored at request. |
| HIPAA | Not certified at MVP. Production runtime emits no Extentos traffic from RealMetaTransport, so a HIPAA-bound app shipping with telemetry-off is technically usable; a formal BAA isn't available pre-GA |
| SOC 2 | Type II on the post-launch roadmap. The architecture is designed SOC 2-compatible (audit logging, access controls, vendor management, retention policies). Once the 12-month observation period kicks off, the report becomes available under NDA to vendor data-product customers. |
| ISO 27001 | Not pursued at MVP |
For compliance-sensitive apps today: ship with ExtentosConfig.telemetryConsent = false to disable all library telemetry. Combined with the fact that RealMetaTransport doesn't talk to Extentos's backend, your shipped app emits zero traffic to us at runtime — provided you also skip the two opt-in paths: use your own AI provider from handler code rather than the managed assistant, and pass pre-hosted image(url) / video(url) rather than local captures if you use the display. With those three settings, the privacy boundary is enforced architecturally, not just by policy.
For developers who want telemetry on (for the developer dashboard) but want to opt their app's data out of vendor aggregates: set ExtentosConfig.dataSharingConsent = false. Your own dashboard analytics keep working; your data is excluded from cross-account aggregates we may sell to glasses vendors once the multi-vendor product ships. (The dataSharingConsent field is available in the SDK; the cross-vendor product it would exclude you from is still forthcoming, so today it changes nothing in practice.)
Frequently asked questions
Wait — Extentos collects telemetry from my shipped app?
By default, yes — runtime metadata events (no content, no PII) flow to api.extentos.com/api/telemetry/events from your shipped app if ExtentosConfig.telemetryConsent = true (the default). Set it to false and your app emits zero Extentos network traffic. Many apps will leave it on because the developer dashboard is built on this data — you're trading runtime metadata for an analytics surface for your own app.
Will my users' voice transcripts ever leave their device?
It depends which AI path you use. Transcripts your own handler processes (via glasses.audio.transcriptions()) are never read, logged, or transmitted by Extentos. If you use the managed-gateway assistant, the audio and transcripts are relayed through Extentos's gateway to the AI provider — forwarded verbatim and never stored; only token-usage metadata is recorded. If your handler calls your own provider directly (handler-code BYOK), that's between your app and your provider — Extentos isn't in the path. See the gateway data path.
Can Extentos see what my user captured in a photo?
No — Extentos never inspects photo content. Capture bytes flow from the glasses to your handler and Extentos doesn't read, store, or upload them.
But "can Extentos see it" and "does a copy ever sit on Extentos infrastructure" are different questions, and the honest answer to the second is: once, in one case. If you render a captured photo or clip on a Ray-Ban Display, the SDK uploads a copy to our media host so the glasses can fetch it — it stays until your app calls forgetHostedImage / forgetHostedVideo, and nobody at Extentos looks at it, but it is stored. Full details, including how to avoid it.
Two smaller nuances: if you pass an image to the managed-gateway assistant for vision, it's relayed to the AI provider (never stored by us); and during development, simulator sessions mirror captured frames to the backend debug log, truncated, for 48 hours. Outside those paths, photo bytes only reach an external service if your own handler code sends them.
Will Extentos sell data about my app to my competitors?
When Extentos supports multiple vendors, we plan to sell aggregate cross-vendor ecosystem signals (vendor market share, capability popularity across platforms, session-hour totals across the ecosystem) to glasses vendors as market research, only as aggregates over at least 10 distinct accounts. We additionally suppress vendor-level data when fewer than 25 developers ship to that vendor — small-vendor ecosystems are protected from inadvertent disclosure. Individual-account data, your specific app's usage patterns, and anything that could identify your app or your users is never shared with third parties. These two floors are the structural guarantees against competitive leakage. This product is multi-vendor-dependent — at single-vendor scale today, no such sale takes place because each vendor already has their own platform's data via their SDK.
Developers can also opt their app out of inclusion in future vendor aggregates via ExtentosConfig.dataSharingConsent = false (a shipped SDK field) — separate from disabling telemetry collection. Your own developer-dashboard analytics keep working; your data is excluded from cross-account aggregates.
Can my users opt out of Extentos telemetry?
End users have no direct relationship with Extentos and don't see our branding. Their opt-out is via the developer's app — if you want to give your users a toggle, gate ExtentosConfig.telemetryConsent behind a setting in your app. Or simply ship with telemetry off if your privacy posture requires it.
Is my Extentos auth token shared across machines?
No. ~/.extentos/auth.json is per-machine. To use the same account on another machine, run extentos-mcp login there. The token is stored at file mode 0600 (owner read/write only).
Does Extentos work in air-gapped or no-network environments?
The MCP-driven dev loop (code generation, validation, on-device LocalSimTransport simulation) works fully offline. The browser simulator (BrowserSimTransport) and the simulator-session features need network access to api.extentos.com. Your shipped app on real glasses (RealMetaTransport) doesn't need network access to Extentos — only between the phone and the glasses, plus whatever AI providers your app calls.
When does the developer dashboard ship?
It's on the roadmap; the data pipeline is already collecting events from MVP day-one so the dashboard is purely a backend query layer over data that already exists. Watch the changelog for actual ship dates.
What about developer source code?
Your generated code, your spec, your handler implementations, your test fixtures — none of it ever leaves your machine. The MCP server reads your project to inspect state (inspectIntegration, validateIntegration) and writes generated files, but it does not upload your code, contents, or git history anywhere.
How do I request deletion of my data under GDPR?
Email Extentos support from the email associated with your account. We run DELETE WHERE accountId = ... and acknowledge within 30 days. The indefinite-retention default does not block right-to-erasure — deletion requests are honored independent of retention policy. Aggregated rollups derived before the deletion request stay (those have no accountId attribution by construction); raw events tied to your account are removed. Anonymous events without an accountId (emitted before account linking) cannot be associated to you and are retained as aggregate-only data.
Related
- Pricing — what the free tier covers, the account-required browser simulator
- Auth — anonymous-first identity model, device-code flow, account linking
- Architecture — how telemetry fits into the broader system, what the on-device event log captures
- Changelog — track when the developer dashboard and other features ship
Pricing
Extentos is free to start — discovery, validation, the on-device simulator, and real-hardware DAT testing need no account. A free account unlocks the browser simulator, project scaffolding, and the managed AI gateway. The gateway is the one metered surface; every account gets $2 of free credit, then prepaid credits at provider list price.
Terms of Service
The terms that govern your use of Extentos, the SDKs, MCP server, simulator, and managed AI gateway. Plain-language, early-stage, Danish and EU law.