Skip to content
RECDiagnosticSDK

Record it once. Replay it forever.

See every request your iOS app makes.Replay any bug.

An in-app network debugger: two lines in your AppDelegate, no proxy, no certificate to install. Your SSL pinning keeps working.

  1. 01

    Capture

    Every request, as your app makes it.

  2. 02

    Inspect

    Grouped by the screen that sent it.

  3. 03

    Share

    One encrypted file for your team.

  4. 04

    Replay

    Same responses, same bug, anywhere.

The problem

“It only happens on her phone.”

Fine in dev. Broken in UAT.

QA finds a bug on their phone. On yours, everything works. Another account, other data, or another backend: the bug never shows up for you. Unless it was recorded.

POST /v1/transfers · Same request, three places
EnvironmentStatusResult
UAT backend · QA’s phone422Bug
Dev backend · your simulator200Can’t reproduce
Replay · your simulator422Reproduced

Replay

Their bug. Your device. Same responses.

Matching requests receive the recorded responses. Everything else goes to the network, untouched.

  1. 01

    Your QA hits the bug

    Everything is already recorded, grouped by screen.

    Live session2 requests
    TransferViewController10:32:08
    GET/v1/beneficiaries20097ms
    POST/v1/transfers422302ms
  2. 02

    They send you the session

    As plain JSON, or as an encrypted Safe export.

    • Plain JSON

      Readable by anyone you send it to.

      Dx_4f2a9c1.json · 84 kB

      Open it anywhere: a text editor, Session Studio, your own tools. To inspect and replay it in the app, import it from the SDK’s History screen.

    • Safe export

      Encrypted with a password (AES-256-GCM).

      Dx_4f2a9c1_S.json · 84 kB

      After import, the session stays locked: it can’t be viewed or replayed until the password is entered to decrypt it.

  3. 03

    You replay it

    Same responses, same bug, on your simulator or test device.

    Replay active3 requests
    TransferViewController10:32:08
    GET/v1/beneficiariesreplay20097ms
    GET/v1/limitsnetwork20088ms
    POST/v1/transfersreplay422302ms

    1 request not in the recording went to the network

    Matching: Strict (method, path, query) or Ignore query (method, path).

How replay works

One session. Every answer.

The context between request and response.

Not a flat list of URLs: the screen that made each request, what happened next, and the exact session your user experienced.

01 / LIVE

Every request, as it happens.

A real-time list of your app’s requests, grouped by the screen on display when they started. Search, filter by status class and method.

All2xx4xx5xx
GET/v1/accounts200124ms
GET/v1/me20086ms
GET/v1/notifications?unread=true200141ms
GET/v1/beneficiaries20097ms
Explore Live

02 / SCREEN MAP

Traffic, in context.

Every UIViewController visit that starts requests becomes its own chapter. Navigation chronology stays intact, even when a screen is visited twice.

  1. HomeViewController10:32:043
  2. TransferViewController10:32:082
  3. HomeViewController10:32:151
Explore Screen Map

03 / SESSION HISTORY

Every session, saved.

Sessions are saved automatically when the app goes to background. Open any past session in the same viewer as Live.

  • Dx_4f2a9c1.jsonToday, 10:32 · This phone84 kB
  • Dx_9b13e07.jsonYesterday, 18:05 · This phone212 kB
  • IMP_qa-transfer-bug.jsonMon, 14:41 · Imported96 kB
Explore Session History

05 / VAULT SHARE

Share a session. Only people with the password can read it.

Export a session as plain JSON, or encrypt it with AES-256-GCM and a password you choose. Without that password, the file can’t be opened: not in the app, not in Session Studio.

••••••••
Dx_4f2a9c1_S.jsonAES-256-GCM
Explore Vault Share

We listen. We never touch.

Your request never leaves your session.

Most debuggers catch your request and send it again from their own session. We observe your app’s own URLSession instead, so authentication challenges, certificates, cookies and TLS policy keep working.

Read how it works

Typical interceptor

Your appDebugger’s sessionNetwork

Re-sent from a second session: pinning, certificates and session headers stay behind.

DiagnosticSDK

Your appYour session listeningNetwork

Same request, same delegate. Observed on the way, never re-sent.

A tiny integration

Two lines to start listening.

View full setup

Step 1 · Add the package

In Xcode: File → Add Package Dependencies…

https://github.com/elarbi-allam/DiagnosticSDK.git
Step 2 · AppDelegate.swift
import DiagnosticSDK @mainfinal class AppDelegate: UIResponder, UIApplicationDelegate {  private lazy var networkInterceptor = NetworkInterceptor()   func application(_ application: UIApplication,                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {    #if DEBUG    networkInterceptor.start()    #endif    return true  }}

Ready when you are

Your next bug report will replay itself.

Get started with SPM