Skip to main content
A demo deployment lets people explore AgentSDR before installing it. Visitors open the address and are already inside the app as Alex Morgan, Head of Sales at Northwind, a fictional company. Every page has data: campaigns on all three channels, replies with AI drafts waiting for review, the CRM pipeline, call transcripts, Tables and Analytics. Nothing a visitor does is saved.
A demo is its own deployment with its own database. Never set DEMO_MODE on an instance that holds real data: every visitor is signed in with no password. The app refuses to move the demo’s clock if any organization in the database is not a seeded demo one, but sign-in has no such check.

What DEMO_MODE=true changes

The LinkedIn, WhatsApp, email and R2 integrations are stored with placeholder credentials so their pages open. Nothing ever uses them. Playing a call recording does not work, because there is no audio behind it; transcripts and summaries show as normal.

Set it up

1

Create the deployment and its database

Follow Dokploy or Docker Compose as for any install, with a new, empty PostgreSQL. The database user must be a superuser (the default for the postgres image): the clock rewrites the CRM’s history tables, which are append-only for everyone else.
2

Set the environment

Next to the usual required variables:
Leave every integration and AI key unset. Do not set up an external cron or Dokploy schedule jobs for this deployment.
3

Create the schema and seed it

The seed is not in the Docker image, so it runs from a checkout of the repository on your machine. Give the demo database a temporary External Port (on Dokploy: the database’s page), then, with the deployment’s own values:
If the deployment has already started, it created the schema itself; then bun run db:setup refuses (the database has tables) and you can skip it. Variables you export win over the repository’s .env.local. The key must match the deployment’s, because the seed encrypts the placeholder integrations with it. DEMO_MODE=true lets the seed write to a database that is not on localhost; it prints the host it writes to, and refuses a database that already holds a real organization. The seed takes a few seconds. Remove the external port afterwards.
4

Open it

Open the deployment’s address. You land on Analytics, signed in, with the banner at the top.
To start over, drop and recreate the database, then run both commands again. Deploys of new code keep the data; the seed only needs re-running when you want a fresh one.

Try it locally

Without DEMO_MODE, the same seed is an ordinary organization you can sign in to as [email protected] / demo-password-123 and change freely.

What the seed creates

scripts/db/seed-demo.ts runs the modules in scripts/db/demo/ against one fictional world (content.ts). Northwind, its team and every person are invented; the companies they prospect are real, well-known ones, so lead lists show real logos, but nobody there said anything shown. Phone numbers are in ranges reserved for fiction. Re-running it on a seeded database does nothing.