Skip to main content
This page runs a throwaway local evaluation of bisibility with synthetic seeded data. It is not a production installation. The demo uses a fixed sign-in code that is intentionally insecure, and the seeded data is synthetic. Do not expose this demo to a network or real users, and do not try to harden it into production. A production instance starts from a fresh environment on the production self-hosting path, not from this demo. See Deployment options to compare the hosted beta, this local demo, and production self-hosting.

Prerequisites

  • Git to clone the repository.
  • Docker with Compose to run the stack.
  • OpenSSL to generate secrets during bootstrap.

1. Bootstrap the local demo

bootstrap-local.sh creates a .env with generated secrets, enables DEMO_FIXED_OTP=1 and DEMO_INSTANCE_INSECURE_AUTH_ACK=1, and validates the Docker Compose configuration. It refuses to run when .env already exists, so it cannot overwrite a configured install. The script prints the startup commands used below.

2. Start the stack

Pick one of the two startup commands the bootstrap printed. The core stack is enough for this quickstart. Core stack - web app, PostgreSQL, Valkey, and migrations. Manual checks only:
Scheduled stack - adds the worker and Temporal for recurring schedules, plus the optional Temporal Web UI:
The core stack sets SCHEDULER_DRIVER=none and supports manual checks. The scheduled stack sets SCHEDULER_DRIVER=temporal. Temporal and the worker are required for recurring schedules, not for manual checks, so you can finish this quickstart with the core stack alone.

3. Verify the stack is live

Expected response:
This confirms the web process is serving requests. See readiness and health for the readiness probe that also verifies the database contract.

Demo login

Open http://localhost:3000. With DEMO_FIXED_OTP=1 active, sign in with:
  • Email: demo@acme.dev
  • One-time code: 000000
The login screen displays both hints while demo mode is active. The fixed code is intentionally insecure: anyone who reaches the app can sign in. Keep the demo on localhost and never expose it on a public address.

4. Confirm the seeded data

After sign-in, open the tracking table. The seeded demo project, search terms, and synthetic rank history are visible. This data is not real and exists only so you can explore the UI without connecting a provider first.

5. Run the first check

bisibility ships without a data source, so a live rank check needs your own supported SERP provider credentials first. Open Integrations, choose a SERP provider, and select Connect. Enter the provider’s credentials and select Test connection before saving; credential-based, non-OAuth providers must pass the test. Provider billing stays between you and the provider - see Integrations for the supported providers, credential fields, cost estimates, and the monthly budget cap. With a provider connected, open Overview or Rank Tracker and select Run first check. To rerun one keyword later, open its detail page and select Run check. Manual checks run on the core stack. Scheduled checks require the worker and Temporal overlays from step 2.

Success

You have a working local evaluation when:
  1. The liveness endpoint returns { "status": "ok" }.
  2. Sign-in with demo@acme.dev and code 000000 succeeds.
  3. The seeded demo project and search terms are visible in the tracking table.
  4. After connecting your own SERP provider, a manual first check starts and returns ranking data.

6. Stop and clean up

Stop the core stack, keeping the data for a later restart:
Stop the scheduled stack, keeping the data:
Delete the data volumes for a clean slate. This is destructive and cannot be undone. It is a local cleanup step, not a production rollback.
For the scheduled stack:
Remove the generated .env to re-run bootstrap-local.sh from scratch.

Next steps