Reference Search docs

Session Replay

Session Replay reconstructs user DOM/sessions (and Kit-level interactive capture) for debugging and support. It is not control-plane event-log replay and not auth session.*.

Naming split (critical)

ConceptMeaningFamily / surface
Event-log replayFold durable facts for projections/auditEventStore / hobo inspect
Auth sessionLogin/refresh/revokesession.Started / Refreshed / Revoked
Session ReplayDOM/session reconstructionreplay.* + Session Replay
App KitBindle-declared app surface (api, web, service, …)hobo/bindles app kit kinds

Heavy rrweb streams never enter the control-plane event log — only content-addressed blob refs.

Defaults

EnvironmentDefault
Local / dual fixtures / Station air-gap / every App KitOn (zero Bindle config)
Production / stagingOff unless OpenFeature hobo.session-replay or sample rate
Kill switchHOBO_REPLAY=0 (or flag false)

Deep Bindle integration (App Kits)

Every App Kit receives a default platform annotation session-replay at construction — not only web:

App KitKindDefault Session Replay
API KitapiOn
Web KitwebOn
Service KitserviceOn
UI KituiOn
Realtime KitwebsocketOn
Job KitjobOn
Component Kitwasm-componentOn

Infra Kits (kv, bucket, queue, topic, secret, data, …) are not entrypoint hosts — no default Session Replay.

Local Yard / hobo dev wraps every HTTP App Kit (api, web, service, ui) so HTML gets a privacy-first bootstrap and /__hobo/replay/* serves ingest/list — no app tracker code required. JSON API Kits still expose the ingest path on the same wrap.

PiecePackage / surface
Annotation helpersessionReplay({ enabled?, sampleRate? }) from hobo/bindles
Kit taxonomyapp kit kinds, isAppKitKind, appKitLabel
Runtime plan + wrapSession Replay bindle integration
Local hosthobo dev / Yard entrypoints
Ingest path/__hobo/replay/*
Response markerx-hobo-session-replay: 1 when HTML wrap applied
import { bindle, sessionReplay } from "hobo/bindles";

export default bindle("shop", (b) => {
 const api = b.api(() => apiHandler); // API Kit — Session Replay default-on
 const web = b.web(() => storefront); // Web Kit — Session Replay default-on
 const worker = b.service(() => worker); // Service Kit — Session Replay default-on
 const cache = b.kv(); // Infra Kit — no default Session Replay
 // opt out one Kit:
 // const api = b.api(() => apiHandler).with(sessionReplay({ enabled: false }));
 return { api, web, worker, cache };
});

Privacy (client-side before send/persist)

  • Mask password / email / tel inputs
  • Mask [data-hobo-mask], .hobo-mask, payment autocomplete fields
  • Redact Authorization / Cookie in network capture
  • Continuous-identity principalRef only — no free-text PII

CLI / MCP

hobo replay doctor
hobo replay list
hobo replay get <sessionId>
hobo replay summarize <sessionId>
hobo replay open <sessionId>
hobo replay retention

MCP tool parity via canonical verbs. Player surfaces are read-oriented; mutation stays on CLI under policy/PAM. hobo doctor lists contract boundary ids.

Event family (replay.*)

Started · ChunkIngested · Ended · ErrorLinked · RetentionApplied · Accessed · Disabled · Metered

Composition

Composes withHow
App KitsDefault annotation + host wrap on every Kit
StationIsolation + local path
Harness / OpenFeatureProd enablement + sampling
TrailsPlatform recipe replay.retention
Continuous identityPrincipal refs only
MeteringIngest bytes, storage, player access
PAMAccess policy for open/list
PACTIntegration boundaries via the replay HTTP surface

Performance budget (targets)

MetricBudget
Batch interval1000 ms
Batch size50 events
Main-thread per flush≤ 16 ms
Tracker overhead beyond rrweb≤ ~15 KB gzipped

Honest scope

  • Live multi-cloud object storage + Junction federation: ports present; dual fixtures prove the path
  • Full OpenReplay Assist / Helm stack: optional, not default
  • High-volume product analytics warehouse: residual

Bindles · App Kits · Trail map · Harness · CLI · Event families · Dual fixtures · Stations