Skip to content

Supabase

Supabase is a Postgres hosting and backend-as-a-service platform for building web, mobile and AI applications.

Electric and Supabase

You can use Electric on Supabase's hosted Postgres.

You can also use Electric to sync data into Supabase Edge Functions.

Need context?

See the Deployment guide for more details.

Deploy Postgres

Supabase Postgres databases come with logical replication enabled and the necessary permissions for Electric to work.

Create a database on Supabase.com. Click the "Connect" button in the top right to get the connection string.

Make sure you untick the "Display connection pooler" option to get the direct access URL, because the pooled URL does not support logical replication. Note that this direct access URL only works with IPv6, which means you will need to configure Electric to connect over IPv6.

Connect Electric

Configure Electric to connect to the direct access DATABASE_URL you copied above. Set ELECTRIC_DATABASE_USE_IPV6 to true, e.g.:

shell
docker run -it \
    -e "DATABASE_URL=postgresql://postgres:[YOUR_PASSWORD]@db.[YOUR_PROJECT_ID].supabase.co:5432/postgres" \
    -e "ELECTRIC_DATABASE_USE_IPV6=true" \
    -p 3000:3000 \
    electricsql/electric:latest

Troubleshooting IPv6

The network where Electric is running must support IPv6. If you're running Electric on your own computer, check if you have IPv6 support by opening test-ipv6.com. If you see "No IPv6 address detected" on that page, consider sshing into another machine or using a VPN service that works with IPv6 networks.

When running Electric in a Docker container, there's an additional hurdle in that Docker does not enable IPv6 out-of-the-box. Follow the official guide to configure your Docker daemon for IPv6.

If you're subscribed to the Pro or Team plan on Supabase Platform, you can side-step those hurdles by purchasing the IPv4 add-on to make your database host available at an IPv4 address.

Need somewhere to host Electric?

If you need to deploy Electric, then Supabase works great with Fly.io.

Sync into Edge Function

You can also use Electric to sync data into a Supabase Edge Function.

Install the Supabase CLI and follow the steps in this Quickstart to initialise a new project and create an edge function, e.g.:

shell
supabase init
supabase functions new hello-electric

Start Supabase and serve the functions locally:

shell
supabase start
supabase functions serve

Run tail to see the curl command at the bottom of the generated supabase/functions/hello-electric/index.ts file:

shell
tail supabase/functions/hello-electric/index.ts

Copy the curl command (with the real value for [YOUR_ANON_KEY]) and run it once against the default function implementation:

console
$ curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/hello-electric' \
    --header 'Authorization: Bearer [YOUR_ANON_KEY]' \
    --header 'Content-Type: application/json' \
    --data '{"name":"Functions"}'
...

{"message":"Hello Functions!"}

Now, replace the contents of supabase/functions/hello-electric/index.ts with the following, replacing [YOUR_ELECTRIC_URL] with the URL of an Electric service, running against a Postgres database with an items table. (This can be http://localhost:3000 if you're running the local docker command we used above when connecting Electric to Supabase Postgres).

ts
import { Shape, ShapeStream } from 'npm:@electric-sql/client'

Deno.serve(async (req) => {
  const stream = new ShapeStream({
    url: '[YOUR_ELECTRIC_URL]/v1/shape',
    table: 'items'
  })
  const shape = new Shape(stream)
  const items = [...await shape.value]

  return new Response(
    JSON.stringify(items),
    { headers: { "Content-Type": "application/json" } },
  )
})

Save it, wait a second and then run the same curl command you just ran before to make a request to the edge function. You should see the data from your items table in the HTTP response, e.g.:

console
$ curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/hello-electric' \
    --header 'Authorization: Bearer [YOUR_ANON_KEY]' \
    --header 'Content-Type: application/json' \
    --data '{"name":"Functions"}'
...

[["\"public\".\"items\"/\"69ad0c7c-7a84-48e8-84fc-d92e5bd5e2f4\"", ...]

PGlite

Electric and Supabase are also collaborating to develop PGlite, which Supabase sponsor, contribute to and have developed database.build on.