recording = ph.session_recording.get('SESSION_ID')
Before we unpack "portable," let's look at the status quo.
Most SaaS session replay tools operate on a Black Box model. You install their script, they capture a massive video-like feed, and you pay per "recording." If you want to leave, you lose your history. If you want to analyze the data-layer differently, you are subject to their query limits.
The core problems of non-portable Replay:
PostHog fixes this not by building a slightly better player, but by changing the data model entirely.
// session-replayer.ts
class SessionReplayer
private container: HTMLElement;
private playbackSpeed = 1;
private currentEventIndex = 0;
private isPlaying = false;
private animationFrame: number
In the modern world of product analytics, data silos are the enemy of insight. For years, teams have relied on Session Replay tools to watch user sessions, debug frontend issues, and understand drop-off points. But there has always been a catch: vendor lock-in.
Once you record a session in Hotjar, FullStory, or LogRocket, that session stays there. You cannot easily take that JSON payload of clicks, hovers, and scrolls and run your own custom Python script on it. You cannot merge that Replay data with your internal CRM without using brittle third-party APIs.
Enter PostHog, the open-source product analytics platform. And at the heart of its flexibility lies a game-changing concept: Portability.
But what does "Portable Session Replay" actually mean? And why does it matter more than navigator.sendBeacon?
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.