Data and databases · Edition No. 48 · 12 Oct 2026

xataio/pgstream

Streams PostgreSQL changes to another database, a search index, a webhook or a queue, following changes to the table structure as well as to the rows.

← Data and databasesRead the whole edition →
11

xataio/pgstream

💎 hidden gem
pgstream: live copies of a database. Streams rows and schema changes elsewhere.

1,198 stars · Apache-2.0, read from /blob/main/LICENSE, standard and unmodified, and THE COPYRIGHT HOLDER PLACEHOLDER IS UNFILLED — no holder is named anywhere in the file; main.go carries only an SPDX identifier. The fourth such row in this one edition. · v1.5.0 of 2026-09-10, the release page reading '10 Sep 16:55' with no year and settled by ungh's releases endpoint at 2026-09-10T16:55:26Z. A rolling 'nightly' prerelease was published 2026-10-09, so the stable-against-nightly cadence is genuinely live. · Track this in Scout

Streams PostgreSQL changes to another database, a search index, a webhook or a queue, following changes to the table structure as well as to the rows.

▶Repo detailsthe review · specs · pros & cons · install

What it does

You run one command to set it up. It creates a small schema inside the source database holding tables, functions and triggers that record changes to the structure, and it creates a replication slot, which is PostgreSQL's own mechanism for letting a program read the change stream. You can then take an initial snapshot of existing rows, so the destination starts complete. After that a single command streams changes continuously. The source can be PostgreSQL or Kafka; the destination can be another PostgreSQL, OpenSearch or Elasticsearch, a webhook, or Kafka. On the way through, column values can be passed through transformers that mask or anonymise them, which makes it usable for building a safe copy for testing. It also has a standalone snapshot mode for a read-only point-in-time copy. What it does not do: only one Kafka topic is supported, only one PostgreSQL decoding plugin is supported, there is no row-level filtering, and a table with no primary key and no unique NOT NULL column will not replicate at all.

Why it matters

Who it suits. Anyone who keeps a search index alongside a PostgreSQL database and is tired of it drifting out of date, and anyone who needs a masked copy of production data for testing. The structure-change handling is the specific reason to pick this: if your schema changes often, the general-purpose tools make it your problem. Skip it if your schema never changes and you only need rows, because then the larger and better-known tools will serve you better.

Verdict. The most convincing small project in this edition, and a real gap filled rather than a thinner version of something bigger. debezium/debezium at 12,962 stars is the industry default, covers many databases, and is far heavier to run; come here if you are PostgreSQL-only and want one binary. One thing to fix before you start: the README never mentions that PostgreSQL must be configured with wal_level = logical for any of this to work, and without it the first run fails. The project also publishes benchmark results only as an image, so there is no throughput figure to quote. Twenty-four open pull requests on a vendor-run repository is a backlog worth noticing, though 2,085 commits and nightly builds say the work is real.

Stars1,198
LicenceApache-2.0, read from /blob/main/LICENSE, standard and unmodified, and THE COPYRIGHT HOLDER PLACEHOLDER IS UNFILLED — no holder is named anywhere in the file; main.go carries only an SPDX identifier. The fourth such row in this one edition.
Latestv1.5.0 of 2026-09-10, the release page reading '10 Sep 16:55' with no year and settled by ungh's releases endpoint at 2026-09-10T16:55:26Z. A rolling 'nightly' prerelease was published 2026-10-09, so the stable-against-nightly cadence is genuinely live.
Good
  • It follows changes to the table structure, which is the part most tools skip.
  • One binary, four destinations, and transformers for masking data on the way through.
  • A snapshot mode that produces a read-only point-in-time copy without streaming.
Watch for
  • The README omits the wal_level = logical requirement, so the first run fails for a reason it does not explain.
  • A table with no primary key and no unique NOT NULL column will not replicate, silently as far as the documentation goes.
  • No minimum PostgreSQL or Go version is stated anywhere, and its Apache-2.0 licence file names no copyright holder.
Similar repositories
Install
curl -L https://github.com/xataio/pgstream/releases/latest/download/pgstream.linux.amd64 -o pgstream
chmod +x pgstream
sudo mv pgstream /usr/local/bin/
Screenshots
xataio/pgstream: GitHub preview cardxataio/pgstream: Screenshot 1xataio/pgstream: Screenshot 2xataio/pgstream: Screenshot 3

Get the next edition in your inbox

A dozen repositories, opened and checked. The licence read, the last release dated, and the ones that did not make it named with the reason. It is the half most lists leave out.

No tracking pixels. One click to leave. The archive stays free either way.

We use your address to send the edition and nothing else. Confirm by email, leave in one click. How we handle it.