Find the regression in minutes, not days.

xprem implements the expo-observe protocol: every metric, event and log comes back tied to the exact update that produced it, into your own ClickHouse, so a bad release shows up while the rollout is still small.

ota.xprem.dev/overview

Overview

Is the app healthy right now?
AllLive24h
Online now
14,208

Pinged in the last 20 minutes, any route

Devices
1.24M

Installs that reported in

Sessions
8.6M

App runs observed

Events
41.2M

Logs and exceptions

OTA updates
37

Distinct updates running

App versions
6

Store versions in the field

Builds
14

Native builds in the field

Live activity

Devices by city over the selected period. Ripples are check-ins as they land.

listening4,182 cities

Busiest in view

  • New York47.3k
  • Tokyo44.1k
  • Paris41.2k
  • London38.6k
  • Mumbai36.7k
  • Delhi34.5k

Observe.

Monitor crashes, performance and the JS runtime of your apps, so you can tell what each update actually did to them.

CapabilityBuilt innothing to installObserveneeds ClickHouse · SDK 56+
Native crashBuilt inObserve
DownloadsBuilt inObserve
GeolocationBuilt inwith GeoIP DBObservewith GeoIP DB

Metrics

Bundle loadBuilt inObserve
Time to first renderBuilt inObserve
Time to interactiveBuilt inObserve
Cold launchBuilt inObserve
Warm launchBuilt inObserve
Update downloadBuilt inObserve
LogsBuilt inObserve
EventsBuilt inObserve
JS crashBuilt inObserve

Enterprise

Custom device attributesBuilt inObserve
Default needs no extra infrastructure.

Every update carries its own crash and download counts, which is the health figure you watch during a rollout. Point the server at a MaxMind database and check-ins also get a city.

ClickHouse is yours to query.

xprem implements the expo-observe protocol and writes into your own ClickHouse. Point anything that speaks SQL at it and keep the data where it already lives.

ClickHouseGrafanaDatadogPostHog
Two questions it answers.
  • Did this update change how the app performs?Every record carries the update that produced it, so you read a release against the one before it instead of one blended average across every version in the field.
  • Where do I need to debug?Break the same data down by device model, OS, app version, build and region to find the segment that is actually failing. A crash on one Android model does not look like a problem until you stop averaging it away.

An MCP server on your data.

xprem ships an MCP server that exposes the Observe dataset: metrics, events and logs. Ask a question, the agent queries Observe and answers from your data, with the signed-in user's per-app permissions.

Claudexprem mcp · oauth · acme-app
Ask about your app…

Split by anything

The same cuts the dashboard offers: update, device model, OS, app version, build and region.

Release against release

Every record carries the update that produced it, so a release reads against the one before, not a blended average.

Scoped per app

The agent inherits the signed-in user's permissions on each app: read here, publish there, nothing else.

More about the MCP server →

Run it on infrastructure you own.

xprem is one Go process: your Postgres, your bucket, your network. Deploy it on Railway, Docker, Kubernetes or a bare binary, and ship your first update today.