Session replay is invaluable for debugging UX issues—but it’s often locked inside vendor silos, making data migration, compliance audits, or custom analysis a nightmare. PostHog’s approach stands out because it’s built portable from the start.

Critically, PostHog does not record a video MP4. It records a series of DOM mutation events and user interactions via JSON. This is massive for portability.

Traditional session replay records DOM mutations. PostHog captures these events as JSON blobs. Instead of storing these in a proprietary database format, PostHog allows you to pipe these blobs directly into object storage.

The workflow is simple:

Because the data is stored as standard JSON (not a binary proprietary format), you can write a simple Python or Node script to read these files and reconstruct the session without ever touching PostHog’s server.


recording = ph.session_recording.get('SESSION_ID')

snapshots = recording['snapshot_data']

This method ensures that the moment a session is recorded, a portable copy lives in your cloud storage.

Prerequisites: A Kubernetes cluster or Docker host, AWS S3 bucket, and PostHog Helm charts.

Step 1: Configure object_storage In your values.yaml for the PostHog Helm chart, define your external storage.

object_storage:
  enabled: true
  bucket: "my-posthog-replays-prod"
  region: "us-east-1"
  access_key_id: "AKIA..." 
  secret_access_key: "..."

Step 2: Enable Session Recording Ensure your PostHog instance is capturing $snapshot events. PostHog automatically writes these to the posthog_session_recording_events table and mirrors them to S3.

Step 3: Verify the Data Navigate to your S3 bucket. You will see a folder structure like: /clickhouse/.../session_recording_events/. Open one of the .parquet or .json files. You will see raw event data including timestamp, window_id, and snapshot_data.

| Feature | Hotjar / FullStory | LogRocket | PostHog (Portable) | | :--- | :--- | :--- | :--- | | Data Format | Proprietary Binary / Video | Proprietary Binary | Open JSON (DOM Snapshots) | | Self-Hosting | No | Limited (Enterprise only) | Yes (MIT Open Source) | | Export to Warehouse | Rows (aggregated) | API limits | Real-time Stream (All raw data) | | Delete via API | Partial | Yes | Full CRUD access | | Run ML on data | Not possible (no raw access) | Very difficult | Native (Export to Colab/Jupyter) |


If you are building software for the military, offline factories, or internal corporate networks without internet access, cloud session replays are useless. The portable nature of PostHog means you can run the entire session replay stack on a laptop in a bunker.