SurfSenseSurfSense Docs
How to

Electric SQL

Setting up Electric SQL for real-time data synchronization in SurfSense

Electric SQL enables real-time data synchronization in SurfSense, providing instant updates for inbox items, document indexing status, and connector sync progress without manual refresh. The frontend uses PGlite (a lightweight PostgreSQL in the browser) to maintain a local database that syncs with the backend via Electric SQL.

What does Electric SQL do?

When you index documents or receive inbox updates, Electric SQL pushes updates to your browser in real-time. The data flows like this:

  1. Backend writes data to PostgreSQL
  2. Electric SQL detects changes and streams them to the frontend
  3. PGlite (running in your browser) receives and stores the data locally in IndexedDB
  4. Your UI updates instantly without refreshing

This means:

  • Inbox updates appear instantly - No need to refresh the page
  • Document indexing progress updates live - Watch your documents get processed
  • Connector status syncs automatically - See when connectors finish syncing
  • Offline support - PGlite caches data locally, so previously loaded data remains accessible

Docker Setup

  • The docker-compose.yml includes the Electric SQL service, pre-configured to connect to the Docker-managed db container.
  • No additional configuration is required. Electric SQL works with the Docker PostgreSQL instance out of the box.

Manual Setup (Development Only)

This section is intended for local development environments. Follow the steps below based on your PostgreSQL setup.

Step 1: Configure Environment Variables

Ensure your environment files are configured. If you haven't set up SurfSense yet, follow the Manual Installation Guide first.

For Electric SQL, verify these variables are set:

Backend (surfsense_backend/.env):

ELECTRIC_DB_USER=electric
ELECTRIC_DB_PASSWORD=electric_password

Frontend (surfsense_web/.env):

NEXT_PUBLIC_ELECTRIC_URL=http://localhost:5133
NEXT_PUBLIC_ELECTRIC_AUTH_MODE=insecure

Next, choose the option that matches your PostgreSQL setup:


Option A: Using Docker PostgreSQL

If you're using the Docker-managed PostgreSQL instance, no extra configuration is needed. Just start the services using the development compose file (which exposes the PostgreSQL port to your host machine):

docker compose -f docker-compose.dev.yml up -d db electric

Then run the database migration, start the backend, and launch the frontend:

cd surfsense_backend
uv run alembic upgrade head
uv run main.py

In a separate terminal, start the frontend:

cd surfsense_web
pnpm run dev

Electric SQL is now configured and connected to your Docker PostgreSQL database.


Option B: Using Local PostgreSQL

If you're using a local PostgreSQL installation (e.g. Postgres.app on macOS), follow these steps:

1. Enable logical replication in PostgreSQL:

Open your postgresql.conf file:

# Common locations:
# macOS (Postgres.app): ~/Library/Application Support/Postgres/var-17/postgresql.conf
# macOS (Homebrew):     /opt/homebrew/var/postgresql@17/postgresql.conf
# Linux:                /etc/postgresql/17/main/postgresql.conf

sudo vim /path/to/postgresql.conf

Add the following settings:

# Required for Electric SQL
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10

After saving, restart PostgreSQL for the settings to take effect.

2. Create the Electric replication user:

Connect to your local database as a superuser and run:

CREATE USER electric WITH REPLICATION PASSWORD 'electric_password';
GRANT CONNECT ON DATABASE surfsense TO electric;
GRANT CREATE ON DATABASE surfsense TO electric;
GRANT USAGE ON SCHEMA public TO electric;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO electric;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO electric;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO electric;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO electric;
CREATE PUBLICATION electric_publication_default;

3. Set ELECTRIC_DATABASE_URL in docker/.env:

Uncomment and update this line to point Electric at your local Postgres via host.docker.internal (the hostname Docker containers use to reach the host machine):

ELECTRIC_DATABASE_URL=postgresql://electric:electric_password@host.docker.internal:5432/surfsense?sslmode=disable

4. Start Electric SQL only (skip the Docker db container):

docker compose -f docker-compose.dev.yml up -d --no-deps electric

The --no-deps flag starts only the electric service without starting the Docker-managed db container.

5. Run database migration and start the backend:

cd surfsense_backend
uv run alembic upgrade head
uv run main.py

In a separate terminal, start the frontend:

cd surfsense_web
pnpm run dev

Electric SQL is now configured and connected to your local PostgreSQL database.

Environment Variables Reference

Required for manual setup:

VariableLocationDescriptionDefault
ELECTRIC_DB_USERsurfsense_backend/.envDatabase user for Electric replicationelectric
ELECTRIC_DB_PASSWORDsurfsense_backend/.envDatabase password for Electric replicationelectric_password
NEXT_PUBLIC_ELECTRIC_URLsurfsense_web/.envElectric SQL server URL (PGlite connects to this)http://localhost:5133
NEXT_PUBLIC_ELECTRIC_AUTH_MODEsurfsense_web/.envAuthentication mode (insecure for dev, secure for production)insecure

Optional / Docker-only:

VariableLocationDescriptionDefault
ELECTRIC_PORTdocker/.envPort to expose Electric SQL on the host5133 (dev), 5929 (production)
ELECTRIC_DATABASE_URLdocker/.envFull connection URL override for Electric. Only needed for Option B (local Postgres via host.docker.internal)(built from above defaults)

Verify Setup

To verify Electric SQL is running correctly:

curl http://localhost:5133/v1/health

You should receive:

{"status":"active"}

Troubleshooting

Electric SQL Server Not Starting

Check PostgreSQL settings:

  • Ensure wal_level = logical is set
  • Verify the Electric user has replication permissions
  • Check database connectivity from Electric container

Real-time Updates Not Working

  1. Open browser DevTools → Console
  2. Look for errors containing [Electric]
  3. Check Network tab for WebSocket connections to the Electric URL

Connection Refused Errors

  • Verify Electric SQL server is running: docker ps | grep electric
  • Check the NEXT_PUBLIC_ELECTRIC_URL matches your Electric server address
  • For Docker setups, ensure the frontend can reach the Electric container

Data Not Syncing

  • Check Electric SQL logs: docker compose logs electric
  • Verify PostgreSQL replication is working
  • Ensure the Electric user has proper table permissions

PGlite/IndexedDB Issues

If data appears stale or corrupted in the browser:

  1. Open browser DevTools → Application → IndexedDB
  2. Delete databases starting with surfsense-
  3. Refresh the page - PGlite will recreate the local database and resync

On this page