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.