posthog.init('phc_xxx', capture_performance: true, capture_console_logs: true, // Crucial for debugging portability session_recording: maskAllInputs: false, // Toggle based on PII needs recordCrossOriginIframes: false ); Here is a script to pull a session replay and dump it locally for analysis.
This article dives deep into the technical architecture, the strategic benefits, and the practical use cases of making your Session Replay data truly portable with PostHog. Before we unpack "portable," let's look at the status quo. posthog session replay portable
curl -X POST "https://app.posthog.com/api/projects/@current/session_recordings/$SESSION_ID" \ -H "Authorization: Bearer $PERSONAL_API_KEY" \ -H "Content-Type: application/json" \ -d '"delete": true' The data is gone from PostHog, but you still have your backup in your data lake. That is portability. | 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) | Part 6: The Future is "Bring Your Own Storage" The keyword "PostHog Session Replay Portable" is rising in search volume for a reason. The industry is shifting from "Software as a Service" to "Software as a Data Layer." posthog
Enter , the open-source product analytics platform. And at the heart of its flexibility lies a game-changing concept: Portability. curl -X POST "https://app
Founders and engineers are tired of paying $500/month to store 30-day-old replays of login pages. They want to own their user interaction data just like they own their production logs.
from posthog import Posthog import json ph = Posthog('YOUR_PROJECT_API_KEY', host='https://app.posthog.com') Fetch a specific session recording ID recording = ph.session_recording.get('SESSION_ID') The 'snapshot_data' is portable JSON snapshots = recording['snapshot_data'] Write to a local file for custom processing with open('user_session.json', 'w') as f: json.dump(snapshots, f) Now you can run any analysis: - Count rage clicks (3+ clicks in 2 seconds) - Detect dead clicks (clicks with no DOM mutation) - Export to Pandas DataFrame Step 4: Destroying for Portability (The Reverse) To prove true portability, you must be able to leave. PostHog allows you to run a delete command via API: