Stop reproducing bugs.
Replay them.

Turn a failure you already track into a reproducible case, verify the fix, and keep it as a regression check. Capture the state, events, and environment when your app breaks — alongside Sentry or on its own.

See a real debugging workflow in action. No signup or SDK installation required.

Now in beta. Sign up with Google or GitHub to create your workspace. Get beta support ·

Capsule illustration · sample failure

BUILT FOR YOUR STACK
  • Flutter
  • Android
  • iOS
  • Web
Explore SDKs
  • Auto-captured on the device
  • Redacted before upload
  • Replays the real app code
  • FIXED only when every attempt runs clean

The problem

“Cannot reproduce” is where hours go.

QA sees a bug. The developer gets a screen recording and a description, then spends the afternoon guessing. The bugs that resist are the ones that depend on what the server returned, how long it took, or state left on the device from an earlier version.

A capsule carries exactly that context, so the failure comes back on the developer's simulator instead of in a meeting.

Works on my machine ≠ fixed

How it works

Capture. Replay. Verify.

One capsule, from the failing build to your CI.

  1. 01

    Capture

    When your app fails, the SDK saves a capsule: the actions, HTTP responses with their timing, state and storage that led there. It is redacted on the device before upload.

    BugCapsuleOverlay(child: child!)
  2. 02

    Replay

    The CLI checks out the exact commit and re-runs your real app on a simulator, an emulator or Chromium, feeding it the recorded inputs until the failure fires again.

    bugcapsule run <id> -n 3
  3. 03

    Verify the fix

    Replay against your working tree. Only when every attempt runs clean is the capsule FIXED. Keep it as a regression test in CI so the bug can't come back.

    bugcapsule verify <id> -n 5
BEYOND THE CRASH

Keep the rest of your app in view.

Issues
Grouped errors, symbolicated stack traces and breadcrumbs
Release health
Crash-free sessions and users
Performance & alerts
Traces, vitals, user feedback and notifications

Dashboard · design preview

The whole failure. In focus.

Inspect the timeline, state, events and network of a capsule, copy the replay and verify commands, and share it with your team.

Capsule e73f5ad0

× Crash · 2 hours ago · qa · v1.4.0 (52)

Event 284 / 612

› onTap()
  lib/screens/cart.dart:87
⌄ CartState (expanded)
  {
    "items": [ … ],
    "price": null,
    "subtotal": 84.0
  }

Actions

Design preview with sample data from the shop demo app. Replays run locally with the CLI; the dashboard copies the command.

Platforms

Flutter, Android, iOS and web.

One capsule format, one bugcapsule CLI and one dashboard for all four. A capsule replays on the runtime that captured it.

  • Flutter

    bug_capsule 0.4.1-beta.5

    Replays on iOS simulators and Android emulators

    • BLoC, Riverpod, Provider, GetX and MobX state
    • Dio and package:http (Retrofit, Chopper)
    • GoRouter navigation
    • SharedPreferences checkpoints

    REPRODUCED 3/3 FIXED 2/2

  • Android

    Kotlin · Java · beta

    Replays on an emulator through instrumentation

    • Views and Jetpack Compose
    • OkHttp (and Retrofit on top)
    • Jetpack Navigation, ViewModels
    • SharedPreferences and DataStore checkpoints

    REPRODUCED 3/3 FIXED 3/3

  • iOS

    Swift · SwiftPM · beta

    Replays on a simulator through XCUITest

    • UIKit and SwiftUI, iOS 15+
    • URLSession
    • UINavigationController and SwiftUI routes
    • UserDefaults checkpoints

    REPRODUCED 3/3 FIXED 3/3

  • Web

    TypeScript · beta

    Replays in Chromium through Playwright

    • Any framework, with React helpers
    • fetch and XMLHttpRequest
    • History API and React Router
    • localStorage and sessionStorage checkpoints

    REPRODUCED 3/3 FIXED 3/3

Results from each SDK's demo shop app against a local backend: Flutter on an iPhone 18 Pro simulator (iOS 27), Android on a Pixel 6 emulator (API 35), iOS on an iPhone 18 Pro simulator (iOS 27), web in Chromium 153.

Compare platform support

Integrate

About twenty lines.

Add the SDK for your platform, start it first thing, attach your HTTP client and router, and pin the commit at build time.

# pubspec.yaml: one package, every integration
dependencies:
  bug_capsule: 0.4.1-beta.5

// main.dart
import 'package:bug_capsule/bug_capsule.dart';

final bugCapsuleDio = BugCapsuleDio(rules: [
  // Fields that differ on every run must not affect request matching.
  EndpointRule('POST', '/api/checkout', ignoreBodyFields: {'timestamp', 'nonce'}),
]);
final bugCapsuleRouter = BugCapsuleGoRouter();

void main() => BugCapsule.init(            // first line of main
      config: const BugCapsuleConfig(
        appVersion: '1.4.0',
        appBuild: '52',
        mode: CaptureMode.qa,
        backend: BugCapsuleBackendConfig(url: 'https://bugcapsule.example.com', ingestKey: 'bci_...'),
      ),
      integrations: [
        BugCapsuleBloc(states: [            // or BugCapsuleRiverpod, BugCapsuleNotifiers, BugCapsuleGetx, BugCapsuleMobx
          BugCapsuleState<CartBloc, CartState>(toJson: (s) => s.toJson(), fromJson: CartState.fromJson),
        ]),
        bugCapsuleDio,                      // or BugCapsuleHttp for package:http and Chopper
        bugCapsuleRouter,
        BugCapsuleSharedPreferences(),
      ],
      appRunner: () => runApp(const MyApp()),
    );

// where you build Dio and GoRouter:
bugCapsuleDio.attach(dio);
final router = GoRouter(initialLocation: bugCapsuleRouter.initialLocation('/'), routes: [...]);
bugCapsuleRouter.attach(router);

// QA capture button:
MaterialApp.router(builder: (context, child) => BugCapsuleOverlay(child: child!), ...);

# Build with the commit pinned so replay can check out the same code
flutter build ipa --dart-define=BUGCAPSULE_GIT_SHA=$(git rev-parse HEAD) --dart-define=BUGCAPSULE_MODE=qa

Safety and security

Built to be switched off.

Capture runs inside your users' app, so the SDK is designed to fail quietly and stop on command.

Redacted on the device

Tokens, JWTs, keys, card numbers and sensitive headers are scrubbed before anything is stored or uploaded. Passwords and fields you mark sensitive never leave the device.

Remote kill switch

One command stops capture everywhere. Devices stop recording and delete queued captures, even offline. Sampling and size limits keep overhead bounded.

Isolated from your app

If capture fails, your app starts without it, and SDK errors never reach your handlers. Release builds can't enter replay mode.

Scoped ingest keys, expiring share links and per-project retention. Read how data is handled.

FAQ

Questions teams ask first.

Something missing? Ask us directly.

What is BugCapsule?

A bug replay tool for mobile and web apps. When your app fails, the SDK records what led there: user actions, network responses and their timing, state and storage. The bugcapsule CLI replays that recording against your real code so you can reproduce the bug, fix it and prove the fix.

Which platforms are supported?

Flutter, native Android (Kotlin or Java), native iOS (Swift, iOS 15+) and the web, with React helpers. Flutter apps replay on iOS simulators and Android emulators, native Android on an emulator, native iOS on a simulator, and web apps in Chromium.

How is it different from session replay or crash reporting?

Session replay shows a video of what the user saw, and crash reporting gives you a stack trace. BugCapsule re-runs your actual app with the recorded inputs, so the failure happens again on your machine, where you can debug it and verify the fix.

Does it replace Sentry?

No. It works alongside Sentry or on its own. With Sentry connected, the reproduction and verification result appears on the Sentry issue. The Sentry link is available for web apps today.

What does FIXED actually guarantee?

That every requested verify attempt ran to the end as recorded and the original failure did not fire. One clean attempt and one error is INCONCLUSIVE, never FIXED.

How is sensitive data handled?

Redaction runs on the device before anything is uploaded. You can exclude endpoints, turn off network bodies remotely and add your own redaction rules. Redaction is pattern based, so inspect real capsules before widening a rollout.

What can't it replay yet?

WebSockets, platform channels and third-party native SDKs such as Firebase, databases like SQLite or Core Data, and physical devices. Replay runs on simulators, emulators and Chromium. See the known limitations.

Capture the moment it broke.

Create a workspace, add the SDK and replay your first bug today.

Beta support from the people who wrote the code: contact@bugcapsule.com. We reply within one business day.

Replay · capsule e73f5ad0

  1. Restoring checkpoint
  2. Replaying recorded events
  3. Serving HTTP responses with recorded latency
  4. ● Failure reproduced

Ready.

Animated walkthrough with sample data. Real replays run with bugcapsule run on a simulator.