In this quickstart, you’ll create a real-time data pipeline that streams changes from a Postgres database to an S2 stream. You’ll:

  • Set up an S2 stream using the S2 web console and CLI
  • Boot Sequin and connect to a sample playground database
  • Configure Sequin to stream database changes to your S2 stream
  • See your changes flow in real-time

By the end, you’ll have hands-on experience setting up Postgres change data capture (CDC) with Sequin and S2.

Prerequisites

Set up your S2 stream

First, let’s create an S2 stream

1

Create an S2 Access Token

In the S2 web console, navigate to the “Access Tokens” section and click the ”+ Issue” button to generate a new token.

Save this token to a secure location as you’ll need it to configure the S2 CLI and your Sequin S2 sink.

2

Create an S2 Basin

Navigate to the “Basins” tab and click the ”+ Create Basin” button. Enter a name for your basin (e.g. sequin-quickstart) and accept the default settings. Click the “Create Basin” button to create your basin.

3

Create an S2 Stream

Select the basin you just created and click the ”+ Create Stream” button. Name your stream products and accept the default settings. Click the “Create Stream” button to create your stream.

4

Connect to your S2 stream using the S2 CLI

Now, open your terminal and configure the S2 CLI with your access token:

s2 config set access-token <your-access-token>

Then, begin reading from your stream:

s2 read s2://{{your-basin-name}}/products

$

Your S2 stream is now ready to receive data.

Run Sequin

The easiest way to get started with Sequin is with our Docker Compose file. This file starts a Postgres database, Redis instance, and Sequin server.

1

Create directory and start services

  1. Download sequin-docker-compose.zip.
  2. Unzip the file.
  3. Navigate to the unzipped directory and start the services:
cd sequin-docker-compose && docker compose up -d
2

Verify services are running

Check that Sequin is running using docker ps:

docker ps

You should see output like the following:

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                    PORTS                              NAMES
bd5c458cabde   sequin/sequin:latest            "/scripts/start_comm…"   11 seconds ago   Up 9 seconds              4000/tcp, 0.0.0.0:7376->7376/tcp   sequin-sequin-1
3bacd89765e7   grafana/grafana                 "/run.sh"                11 seconds ago   Up 11 seconds             0.0.0.0:3000->3000/tcp             sequin-sequin_grafana-1
3ad41319a66c   postgres:16                     "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds (healthy)   0.0.0.0:7377->5432/tcp             sequin-sequin_postgres-1
6139a5fc4e80   redis:7                         "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds             0.0.0.0:7378->6379/tcp             sequin-sequin_redis-1
7e07a5b052de   prom/prometheus                 "/bin/prometheus --c…"   11 seconds ago   Up 11 seconds             0.0.0.0:9090->9090/tcp             sequin-sequin_prometheus-1

Sequin, Postgres, Redis, Prometheus, and Grafana should be up and running (status: Up).

Login

The Docker Compose file automatically configures Sequin with an admin user and a playground database.

Let’s log in to the Sequin web console:

1

Open the web console

After starting the Docker Compose services, open the Sequin web console at http://localhost:7376:

2

Login with default credentials

Use the following default credentials to login:

  • Email:
admin@sequinstream.com
  • Password:
sequinpassword!

View the playground database

To get you started quickly, Sequin’s Docker Compose file creates a logical database called sequin_playground with a sample dataset in the public.products table.

Let’s take a look:

1

Navigate to Databases

In the Sequin web console, click Databases in the sidebar.

2

Select playground database

Click on the pre-configured sequin-playground database:

The database “Health” should be green.

3

View contents of the products table

Let’s get a sense of what’s in the products table. Run the following command:

docker exec -i sequin-sequin_postgres-1 \
  psql -U postgres -d sequin_playground -c \
  "select id, name, price from products;"

This command connects to the running Postgres container and runs a psql command.

You should see a list of the rows in the products table:

  id |         name          | price 
----+-----------------------+-------
  1 | Avocados (3 pack)     |  5.99
  2 | Flank Steak (1 lb)    |  8.99
  3 | Salmon Fillet (12 oz) | 14.99
  4 | Baby Spinach (16 oz)  |  4.99
  5 | Sourdough Bread       |  6.99
  6 | Blueberries (6 oz)    |  3.99
(6 rows)

We’ll make modifications to this table in a bit.

Create a S2 Sink

With the playground database connected, create a sink that will send changes to your S2 stream:

1

Navigate to Sinks

Click “Sinks” in the sidebar navigation, then click “Create Sink”.

2

Select sink type

Select “S2” as the sink type and click “Continue”.

3

Note "Source" configuration

In the “Source” card, note that the sequin-playground database is selected and all schemas and tables are included. Leave these defaults:

4

Setup a backfill

In the Inital backfill card, select the public.products table to initate a backfill when the sink is created.

5

Configure S2 connection

In the S2 configuration card, enter:

  • Basin: The name of the basin you created previously
  • Stream: The name of the stream you created previously
  • Access Token: The access token for the S2 account associated with the basin and stream
6

Create the sink

Click “Create Sink” to finish setting up your S2 sink.

See changes flow to your S2 stream

On the new sink’s overview page, you should see the “Health” status turn green, indicating data is flowing to your stream.

1

Messages tab

Click the “Messages” tab to see recently delivered messages.

2

Verify in S2

Return to your terminal and you should see the data flowing into your S2 stream.

s2 read s2://sequin-quickstart/products
⦿ 3500 bytes (6 records in range 6..=11)
{"record":{"id":1,"inserted_at":"2025-06-11T01:19:22.402358","name":"Avocados (3 pack)","price":"5.99","updated_at":"2025-06-11T01:19:22.402358"},"metadata":{"consumer":{"id":"282713d8-76c4-42db-8e16-3e0df04cc5f6","name":"sequin-playground-s2-sink","annotations":null},"table_name":"products","commit_timestamp":"2025-06-17T19:19:51.955551Z","commit_lsn":null,"commit_idx":null,"transaction_annotations":null,"table_schema":"public","idempotency_key":"ODQ5NWNhMzEtYTM0MC00MDI5LThjODItMTcxYmRjMmY4YjI2OjE=","database_name":"sequin-playground"},"action":"read","changes":null}
{"record":{"id":2,"inserted_at":"2025-06-11T01:19:22.402358","name":"Flank Steak (1 lb)","price":"8.99","updated_at":"2025-06-11T01:19:22.402358"},"metadata":{"consumer":{"id":"282713d8-76c4-42db-8e16-3e0df04cc5f6","name":"sequin-playground-s2-sink","annotations":null},"table_name":"products","commit_timestamp":"2025-06-17T19:19:51.955968Z","commit_lsn":null,"commit_idx":null,"transaction_annotations":null,"table_schema":"public","idempotency_key":"ODQ5NWNhMzEtYTM0MC00MDI5LThjODItMTcxYmRjMmY4YjI2OjI=","database_name":"sequin-playground"},"action":"read","changes":null}
...

Messages are flowing from Sequin to your S2 stream.

3

Make some changes

Let’s make some changes to the products table and see them flow to your S2 stream.

In a new terminal window, run the following command to insert a new row into the products table:

docker exec -i sequin-sequin_postgres-1 \
  psql -U postgres -d sequin_playground -c \
  "insert into products (name, price) values ('Organic Honey (16 oz)', 12.99);"

Back in your S2 stream, you should see a new message appear in the request log:

{"record":{"id":7,"inserted_at":"2025-06-17T21:03:40.350239","name":"Organic Honey (16 oz)","price":"12.99","updated_at":"2025-06-17T21:03:40.350239"},"metadata":{"consumer":{"id":"282713d8-76c4-42db-8e16-3e0df04cc5f6","name":"sequin-playground-s2-sink","annotations":{}},"table_name":"products","commit_timestamp":"2025-06-17T21:03:40.355455Z","commit_lsn":73220408,"commit_idx":0,"transaction_annotations":null,"table_schema":"public","idempotency_key":"NzMyMjA0MDg6MA==","database_name":"sequin-playground"},"action":"insert","changes":null}

Feel free to try other changes:

Each change will appear in your S2 stream within a few seconds.

Great work!

You’ve successfully:

  • Created an S2 stream
  • Connected Sequin to stream Postgres changes to S2
  • Verified changes are flowing to your S2 stream

Ready to stream

Now you’re ready to connect your own database to Sequin and start streaming changes: