A Chrome extension that records every JSON API response, lets you replay history, diff any two versions side-by-side, and automatically detects when a response silently changed shape β even days later.
| Feature | Details |
|---|---|
| Auto-capture | Intercepts all fetch + XMLHttpRequest calls, records JSON responses |
| Shape inference | Derives structural schema from each response |
| Change detection | Flags when an endpointβs shape hash changes between calls |
| Body + Shape diff | LCS-powered line diff between any two records |
| Replay / inspect | Browse full body, shape, and headers in a modal |
| Filter & search | By URL, host, or HTTP method |
| Include/exclude patterns | Config to focus on specific APIs |
| Persistent storage | chrome.storage.local survives SW restarts |
chrome://extensionsapi-time-machine/Manifest V3 service workers die after ~30 seconds idle. This extension uses three strategies to stay alive and resilient:
chrome.alarms β fires every 24 seconds, waking the SW and re-registering listenerschrome.storage.local before the SW can diewebRequestPage world (injected.js)
ββ wraps fetch + XHR
ββ dispatches CustomEvent with body
Content script (content.js)
ββ relays to service worker via chrome.runtime.sendMessage
Service worker (background.js)
ββ receives body + metadata
ββ infers shape + hash
ββ stores to chrome.storage.local
ββ notifies popup if open
Popup (popup.js)
ββ Feed: live-updating list with flash animation
ββ Changes: auto-detected shape diffs
ββ Diff: LCS line diff (shape or body)
ββ Settings: filters, excludes, toggle
The buildShape() function recursively walks a JSON value and replaces leaf values with their type names ("string", "number", "boolean", "null"). Arrays are represented as a one-element sample ["string"]. This shape is then hashed with a fast 32-bit Bernstein hash. Any change in the hash triggers a βshape changedβ alert.
google-analytics, doubleclick, facebook, hotjar, sentryAll data stays local in chrome.storage.local. Nothing is sent to any server.