Run on Node and Postgres
The same server code runs on Node. Recordings are stored as files on disk, or in S3 when you configure a bucket. Session summaries and search use Postgres.
Requires Node 24 or later (the server runs TypeScript directly) and a Postgres server.
Start Postgres
If you do not have one, start it with Docker:
docker run -d --name replayowl-pg -p 15432:5432 \
-e POSTGRES_USER=replayowl -e POSTGRES_PASSWORD=replayowl postgres:17
Build and start Replayowl
git clone https://github.com/replayowl/replayowl
cd replayowl
npm install
DATABASE_URL=postgres://replayowl:replayowl@127.0.0.1:15432/replayowl npm start
The server listens on http://127.0.0.1:8790. The first visit asks you to set the admin password.
To see it working, open http://127.0.0.1:8790/demo/, click and type around the demo shop, then go back to the dashboard and replay the session.
Settings
| Variable | Default | What it does |
|---|---|---|
DATABASE_URL |
required | Postgres connection string |
PORT |
8790 |
Port to listen on |
HOST |
127.0.0.1 |
Address to bind |
DATA_DIR |
./data |
Where recordings are written when no bucket is configured |
SETUP_TOKEN |
none | Required alongside the first admin password, if set |
S3_BUCKET and the other S3_* variables |
none | Store recordings in S3 instead of on disk. The variables are the same as on Workers. |
Tables are created on the first request.
In production
Put the server behind a reverse proxy with HTTPS on a public domain. The session cookie gets the Secure flag over HTTPS, and public websites cannot send recordings to private addresses.