For teams that ship to the App Store and Google Play
Know why your app crashed, froze or felt slow.
Apsio is an SDK for your iOS, Android or React Native app and a console that shows every crash, freeze and slow screen with the steps that led to it. Your coding agent can read the same issues.
14 days, no card. One call to install.
Not ready to install? Explore the sandbox
More than a crash reporter. Runs next to Crashlytics or Sentry.
The problem
A stack trace is the last line of the story.
It says where the app died. The questions your team asks start earlier.
The crash has no before.
You get a symbol and a line, then rebuild the user's path from guesses.
With Apsio: the whole session, with the screen, the failed request and the hang that came first.
The freeze leaves no report.
Watchdog and out-of-memory kills end the process before anything is written.
With Apsio: kills are found from the system's own records and on the next launch.
The numbers do not agree.
When sessions are sampled, a crash-free rate is an estimate.
With Apsio: every session sends a summary, so release health is exact.
Product
From the crash back to the cause.
Five questions a mobile team asks every week, answered from the same sessions.
Symbolicated to the line.
Crashes arrive grouped by cause, with the file and line, the steps that led there and how many people they hit.
- Crashes on iOS, Android and native code, grouped by cause.
- Handled errors and failing endpoints appear next to crashes.
- Symbols upload from your build: the CLI, Xcode, fastlane, Gradle or a GitHub Action.
- Sessions
- 31
- Users
- 29
- Of 5.2 crashes
- 64 %
Stack · thread 0
- objc_msgSendlibobjc.A.dylib
- CheckoutViewModel.total.getterCheckoutViewModel.swift:214
- CheckoutViewModel.submit()CheckoutViewModel.swift:188
- CheckoutView.body.getterCheckoutView.swift:61
Before the crash
- −2.21 sCheckout opened
- −2.00 sPOST /v1/orders 500
- −1.26 shang 1.24 s
- 0app.crash
See what the main thread was doing.
When the app stops responding, Apsio shows the main thread's stack and the session around it, so a freeze has a cause and a place.
- Hangs on iOS and ANRs on Android, with the stack.
- Watchdog and out-of-memory kills, found even when the system leaves no crash report.
- Slow and frozen frames, so the smaller stalls show up too.
Main thread during the hang
- JSONDecoder.decode(_:from:)Foundation
- OrderStore.reload()OrderStore.swift:88
- CheckoutViewModel.submit()CheckoutViewModel.swift:188
Start and screen time, as distributions.
Cold, warm and hot starts are measured apart. Every screen reports time to first display, and time to full display when your app marks it.
- Prewarmed launches on iOS are timed from the moment the app becomes active, so they do not inflate the numbers.
- Full display is one call from your app when the screen is ready.
- MetricKit histograms keep every bucket, so the slow tail stays visible.
- Cold p50
- 410 ms
- Cold p90
- 980 ms
- Warm p50
- 190 ms
| Screen | First display | Full display |
|---|---|---|
| Home | 210 ms | 640 ms |
| Search | 240 ms | 520 ms |
| Checkout | 188 ms | 1.92 s |
Every request, joined to your backend.
Network spans carry the timing and the status, and link to the same trace in your APM, or show your backend's spans if you send them too.
- Failing endpoints become issues, next to your crashes.
traceparenton your own hosts only, never sent to third parties.- Bodies and query strings stay on the phone unless you turn them on.
| Endpoint | Requests | Errors | p90 |
|---|---|---|---|
| GET /v1/feed | 48.2k | 0.1 % | 290 ms |
| POST /v1/orders | 3.1k | 2.4 % | 1.10 s |
| GET /v1/catalog | 22.7k | 0.0 % | 180 ms |
Linked by traceparent. Backend spans arrive through OTLP.
Release health you can trust.
Detail is sampled, but every session is counted, so crash-free rates and adoption are exact.
- Crash-free sessions and users, per build.
- Compare any two releases, in the console or from your agent.
- Regressions reopen resolved issues, and missing symbols show per release.
| Metric | 5.1 (790) | 5.2 (812) |
|---|---|---|
| Crash-free sessions | 99.71 % | 99.38 % −0.33 |
| Crash-free users | 99.80 % | 99.52 % −0.28 |
| Adoption | 61 % | 34 % |
| Cold start p90 | 1.01 s | 980 ms −30 ms |
| New issues | 0 | 1 · iss_8kq2 |
Counted from every session. Detail is sampled; these numbers are not.
Everything Apsio coversStability · Performance · Sessions · Releases · Data · Workflow
Stability
Crashes, hangs and ANRs, out-of-memory and watchdog kills, handled errors, failing endpoints as issues, and breadcrumbs before every failure.
Performance
App start, time to first and full display, slow and frozen frames, network spans, and MetricKit as histograms. Call-stack profiles come later.
Sessions
The timeline of every session, wireframe replay, journeys and funnels, users by a hash you provide, feature flags, and consent controls.
Releases
Exact crash-free rates, adoption by build, release comparison, regressions that reopen resolved issues, and missing symbols per release.
Data
Logs, metrics and custom events, SQL and dashboards, OTLP export, retention per project, and erasure on request.
Workflow
Alerts to Slack, PagerDuty, Linear or GitHub, session sampling and a kill switch, a public API, a remote MCP server and a CLI.
iOS and iPadOS 15+ · Android 7+ · React Native · Flutter later
How it works
One call to start. The rest is on by default.
Add the SDK and call start
Add the SDK with Swift Package Manager, Gradle or npm. Crashes, launches, screens, network and lifecycle are on by default.
Upload symbols from your build
The
apsioCLI finds dSYMs, R8 mappings and NDK symbols and uploads them. Xcode, fastlane, Gradle and a GitHub Action call the same binary.The phone does the careful work
The SDK redacts on the device, samples by session and queues on disk. Data waits out a flight, and a crash is sent on the next launch, still tied to its session.
Read it anywhere
The console, the API, the MCP server and the CLI read the same store, and your data can leave as OTLP to any backend you run.
// AppDelegate.swift import Apsio Apsio.start(key: "a-k3f9q2x7")
// MainApplication.kt import io.apsio.Apsio Apsio.start(this, key = "a-p72xw4mt")
// App.tsx import { Apsio } from '@apsio/react-native' Apsio.start({ key: 'a-r58dn3vq' })
Apache-2.0 · iOS 15+ · Android 7+ · React Native · API preview, names may change before 1.0
Already on OpenTelemetry? Point your OTLP/HTTP exporter at your app's ingest URL with the Apsio-App-Key header. JSON or protobuf, on the standard paths.
Agents
Your agent reads the same issue you do.
Ask your coding agent what broke in the last release. It gets the file and line, the release and the steps before the crash, and answers from your real sessions.
- Works with the agent you already use. Claude, ChatGPT, Cursor and Codex, through MCP, a CLI or skills.
- Same permissions as a person on your team. Read-only by default, and every call is in the audit log.
- Never metered. Agent, CLI and API calls do not count toward your bill.
Developer
Is 5.2 (812) worse than 5.1 on iOS? If the top crash is new, propose a fix.
Agent
Comparing the two releases first.
$ apsio releases compare "5.1 (790)" "5.2 (812)" --app shop-ios --json --jq '.crash_free_sessions' { "5.1 (790)": 99.71, "5.2 (812)": 99.38 }
Down 0.33 points. Pulling the crash groups for the new build.
$ apsio issues --app shop-ios --release "5.2 (812)" --kind crash --json --jq '.[0:3] | map({id, title, sessions, first_seen})' [ { "id": "iss_8kq2", "title": "EXC_BAD_ACCESS in CheckoutViewModel.swift:214", "sessions": 31, "first_seen": "5.2 (812)" }, { "id": "iss_2x9f", "title": "SIGABRT in ImageCache.swift:77", "sessions": 9, "first_seen": "4.8 (701)" }, { "id": "iss_7hd1", "title": "EXC_BREAKPOINT in FeedStore.swift:142", "sessions": 5, "first_seen": "5.0 (744)" } ]
One is new in this build. Reading its stack and the steps before it.
$ apsio issue iss_8kq2 --json --jq '{stack: .frames[0:3], before: .breadcrumbs}' { "stack": [ "objc_msgSend", "CheckoutViewModel.total.getter · CheckoutViewModel.swift:214", "CheckoutViewModel.submit() · CheckoutViewModel.swift:188" ], "before": [ "-2.21 s Checkout opened", "-2.00 s POST /v1/orders 500", "-1.26 s hang 1.24 s", "0 app.crash" ] }
It crashes after POST /v1/orders returns 500: the view model reads the order total after the request failed. Opening the evidence.
$ apsio issue open iss_8kq2 -r https://app.apsio.io/acme/shop/issues/iss_8kq2
5.2 (812) is worse. Crash-free sessions fell from 99.71% to 99.38%, and the drop is one new issue, iss_8kq2: 31 sessions, every one after POST /v1/orders returned 500. Session 7f3c…e19a at the link above shows the whole path.
The fix is to return early from submit() when the order request fails, before the total is read. I have it ready as a pull request for your review.
MCP
For agents without a shell: the Claude and ChatGPT apps, and IDE agents behind a sandbox. OAuth sign-in, your team's permissions, and every call in the audit log.
$ claude mcp add --transport http apsio https://mcp.apsio.io
CLI
For agents with a shell, and for CI. Every read command has --json, a built-in --jq filter and -r for raw strings, so an agent reads only what it needs.
$ apsio login
Skills
Plain text that teaches any agent how to triage an Apsio issue with the CLI or the MCP tools: which command first, how to read a stack, when to stop.
$ npx skills add apsio/apsio-skills
The handoff, when you turn it on later
A rule fires, Apsio opens an issue in GitHub or Linear, your agent opens a pull request, and a person reviews it. Off by default. Apsio never pushes code, never merges and never assigns a person.
Your data
Never locked in.
What Apsio collects is yours. It leaves in a standard format, the format itself is public, and the code that collects it is open for you to read.
It leaves as OpenTelemetry
Export everything as OTLP to Grafana, Datadog or your own collector, whenever you want. Your backend can send its spans in through the same door.
The format is public
Where OpenTelemetry does not cover a phone yet, the Apsio Mobile Profile does, published at spec.apsio.io under CC BY 4.0 with conformance vectors.
The SDKs are open source
Apache-2.0 and developed in public, so you can read what runs inside your app and open an issue when something looks wrong.
Privacy
What leaves the phone is decided on the phone.
Built for the App Store and the GDPR.
Redaction on the device
A field you exclude never leaves the phone.
Replay without pixels
A wireframe of the layout. Text is masked by default.
Bodies stay on the phone
Request bodies and query strings are off unless you turn them on.
No tracking identifiers
Never IDFV, IDFA or Android ID. Users are a hash you provide, and no IP is stored.
One region, stated plainly
Stored in US East during early access, with the EU next.
Retention you set
Per project, enforced per row. Erasure on request.
What you can check
- Open-source SDKsApache-2.0. Read what runs inside your app.
- Built on proven codeKSCrash on Apple platforms, opentelemetry-android on Android.
- Overhead, measuredLaunch, CPU and memory measured in CI and published with every release.
The full profile, with what it adds to OpenTelemetry, is at spec.apsio.io.
Pricing
One unit, no surprises.
You pay for captured sessions: a session is one use of your app, from open to close, and a captured one keeps its full detail. Every session is still counted for crash-free rates.
Pro
For teams50k captured sessions included, then $0.50 per 1k.
50k captured sessions a month included, then $0.50 per 1k.
- Unlimited members and projects
- 30 days of session detail
- 13 months of crashes and release health
- A spend cap you set at checkout
No card. The whole product for 14 days.
Solo
One developerFor one person without a team, by application.
- 10k captured sessions, hard cap, never an overage
- 1 member and 1 project
- 14 days of detail, 90 days of crashes
Reviewed by hand. Until approval you stay on the trial.
Enterprise
Large teamsVolume pricing, SSO and SCIM, and detail retention up to 13 months.
A person replies, with a quote.
Every plan includes the console, the API, the MCP server, the CLI and the agent handoff. Annual plans are 12 months for the price of 10, paid up front.
Compare plans
| Feature | Trial | Solo | Pro | Enterprise |
|---|---|---|---|---|
| Price | $0 for 14 days | $19 a month | $79 a month | Annual contract |
| Members | Unlimited | 1, plus tokens for the CLI, MCP and CI | Unlimited | Unlimited, SSO and SCIM |
| Projects | Unlimited | 1, with its iOS and Android apps | Unlimited | Unlimited |
| Captured sessions | 25k, capped | 10k, hard cap | 50k included, then $0.50 per 1k ($0.40 from 5M, $0.30 from 25M) | Volume price |
| Data | Crashes, hangs, launches, screens, network, logs and replay, and OTLP export at any time, on every plan | |||
| Detail retention | 14 days | 14 days | 30 days | Up to 13 months |
| Crashes and release health | 14 days | 90 days | 13 months | Custom |
| Agent handoff | Yes | Yes | Yes | Yes |
| Support | In the contract | |||
Never metered
Crashes, session summaries, members on team plans, MCP, CLI and API calls, symbol uploads and alerts.
No surprise bills
On Pro, a monthly spend cap is set at checkout, with alerts at 50, 80 and 100 percent. Solo has a hard cap and never an overage.
When the trial ends
Capture stops, so you owe nothing. Your data stays readable for 14 days, and choosing a plan resumes it within a minute.
Price lock
Subscribe before general availability and keep your price for 24 months.
Prices in USD. Customers in Brazil are billed in BRL.
Questions
Before you install.
Can I run it next to Crashlytics or Sentry?
Yes, with one caveat. Two crash reporters in one process both install handlers, and neither can promise to run first, so crash counts will not agree while both are on.
For a fair trial, turn crash capture off in the start options and compare sessions, performance, network and release health, or run the two crash reporters on separate builds.
How big is the SDK, and what does it cost at runtime?
We publish measurements, not promises. Each SDK repository measures launch, CPU and memory overhead in CI, with XCTest metrics on iOS and Macrobenchmark on Android, and the numbers ship with every release.
Crash capture on Apple platforms is KSCrash, and the Android SDK builds on the OpenTelemetry Android agent, so both rest on code with years of production use.
What is a captured session?
A session whose detail Apsio keeps: spans, logs and replay. Whether a session is captured is decided once, at its start, by a deterministic hash of its id, and crashes and errors always pass.
Every session, captured or not, sends a small summary with its outcome, release and device class. Crash-free rates, adoption and session counts come from those summaries, so they are exact, and they are never metered.
What does it cost?
Apsio starts with a trial. It lasts 14 days, with no card, capped at 25k captured sessions. Solo is $19 a month, or $190 a year, for one developer: 10k captured sessions with a hard cap and never an overage, by application. Pro is $79 a month, or $790 a year, for teams: 50k captured sessions included, then $0.50 per 1k, with volume tiers at 5M and 25M.
Crashes, summaries, members on team plans, and MCP, CLI and API calls are never metered. On Pro, a spend cap is set at checkout. Subscribe before general availability and keep your price for 24 months. Sampling and the kill switch are always yours to set.
I already use an OpenTelemetry SDK. Do I need yours?
No. Point any OTLP/HTTP exporter at your app's ingest URL with the Apsio-App-Key header, and your logs, spans and metrics appear in the console and the API.
The Apsio SDKs add what a generic SDK does not do on a phone: crash and exit capture, hangs and ANRs, MetricKit as histograms, a disk queue with batch ids, session sampling and wireframe replay.
Where does my data live, and who can see it?
It is stored in US East during early access, and the EU comes next. Your app talks only to *.apsio.cloud.
Agents see only what your team can see, under the same permissions, and every agent call is in the audit log. Text written by apps and their users is marked as untrusted in tool output.
React Native and Flutter?
React Native ships with the first release, as a thin layer over the two native SDKs. It adds JavaScript errors, fetch and XHR spans, screen names from React Navigation or Expo Router, and Hermes source maps.
Flutter comes after launch. Apsio is for mobile apps only: iOS and iPadOS, Android, React Native and Flutter.
Is it open source?
The SDKs, the CLI, the skills and the conformance vectors are Apache-2.0, developed in public from the start. The profile is CC BY 4.0. The service itself is proprietary.
Can I look around before I install anything?
Yes. The sandbox is a read-only organization with example data from the sample apps on iOS, Android and React Native. It needs no account, and your agent can use it too.
Start
Your first session, this afternoon.
One call to start, 14 days to look around, and a person who replies. Subscribe before general availability and keep your price for 24 months.
- No card
- 25k captured sessions
- Crashes keep flowing past the cap
- Your data leaves as OTLP whenever you want
Not ready? Explore the sandbox, no sign-up.