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.
Record it once. Replay it forever.
An in-app network debugger: two lines in your AppDelegate, no proxy, no certificate to install. Your SSL pinning keeps working.
01
Capture
Every request, as your app makes it.
02
Inspect
Grouped by the screen that sent it.
03
Share
One encrypted file for your team.
04
Replay
Same responses, same bug, anywhere.
The problem
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.
| Environment | Status | Result |
|---|---|---|
| UAT backend · QA’s phone | 422 | Bug |
| Dev backend · your simulator | 200 | Can’t reproduce |
| Replay · your simulator | 422 | Reproduced |
Pre-prod, UAT, feature flags, test accounts: the bug only lives where you aren’t.
With DiagnosticSDK
Replay brings the exact recorded responses to your simulator.
VPN, IP allowlist, expired test account, data that changed since.
With DiagnosticSDK
The session file is your backend: every recorded request is answered from it. The others go to the network as usual.
The API isn’t built yet, or the server is down, and the app team waits.
With DiagnosticSDK
Create mocks in Session Studio (a form or a pasted cURL), load the file in the app and start Replay: each mocked request gets its response, as if the backend were there.
Replay
Matching requests receive the recorded responses. Everything else goes to the network, untouched.
01
Everything is already recorded, grouped by screen.
02
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.
03
Same responses, same bug, on your simulator or test device.
1 request not in the recording went to the network
Matching: Strict (method, path, query) or Ignore query (method, path).
One session. Every answer.
Not a flat list of URLs: the screen that made each request, what happened next, and the exact session your user experienced.
01 / LIVE
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.
02 / SCREEN MAP
Every UIViewController visit that starts requests becomes its own chapter. Navigation chronology stays intact, even when a screen is visited twice.
03 / SESSION HISTORY
Sessions are saved automatically when the app goes to background. Open any past session in the same viewer as Live.
05 / VAULT SHARE
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.
We listen. We never touch.
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.
Typical interceptor
Re-sent from a second session: pinning, certificates and session headers stay behind.
DiagnosticSDK
Same request, same delegate. Observed on the way, never re-sent.
A tiny integration
Step 1 · Add the package
In Xcode: File → Add Package Dependencies…
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