Download Latest Version pgstream.win.amd64.exe (125.3 MB)
Email in envelope

Get an email when there's a new version of pgstream

Home / v1.4.0
Name Modified Size InfoDownloads / Week
Parent folder
xataio-pgstream_sha256_9471deb04c8d9f81c269294b442760a02f2e083c236f7efe2ba065d23cb7a6d3.spdx.json 2026-08-12 232.8 kB
checksums.txt 2026-08-12 437 Bytes
pgstream.linux.arm64 2026-08-12 112.9 MB
pgstream.linux.amd64 2026-08-12 119.5 MB
pgstream.macos.amd64 2026-08-12 132.1 MB
pgstream.macos.arm64 2026-08-12 126.2 MB
pgstream.win.amd64.exe 2026-08-12 124.9 MB
README.md 2026-08-12 6.7 kB
v1.4.0 source code.tar.gz 2026-08-12 4.1 MB
v1.4.0 source code.zip 2026-08-12 4.5 MB
Totals: 10 Items   624.3 MB 4

Highlights

📊 Native Prometheus scrape endpoint 🎯 Granular object type filtering for pg-to-pg schema snapshots and DDL replication 🛡️ Transformation rules are now validated against unique indexes before a run starts, instead of failing mid-load 🔌 Target connection pool limits are configurable 🪝 Webhook delivery retries transient failures and no longer silently drops still-failing events; adds idempotency headers 🐛 Fixed a DDL parsing bug that silently dropped RENAME COLUMN / DROP COLUMN schema changes 🛂 New preflight check for CREATEROLE when a snapshot restores roles :dependabot: Dependency updates

What's Changed

New features

Bug fixes

Documentation

Dependency updates

Details

Prometheus scrape endpoint

The setting instrumentation.metrics.prometheus.enabled exposes a /metrics endpoint on the existing health server. Metrics can now be scraped directly, with no collector in between:

:::yaml
instrumentation:
  metrics:
    prometheus:
      enabled: true # Defaults to false
      endpoint: "/metrics" # Defaults to /metrics

The endpoint returns 404 when disabled.

Object type filtering

Both the schema snapshot and DDL replication for pg-to-pg pipelines can now be restricted to a subset of object categories (tables, sequences, types, indexes, functions, views, triggers, etc.) via include_object_types (allowlist) or exclude_object_types (denylist), independently for snapshot and replication. A DDL statement that touches several object types (e.g. CREATE TABLE with a primary key) is only skipped when every object it touches is excluded.

Transformation rules are validated against unique indexes.

Anonymization is lossy by design: masking with type: id keeps a 6-character prefix, so every value sharing that prefix collapses to the same masked value. Applied to a column covered by a unique index, this previously surfaced as duplicate key value violates unique constraint hours into a data load. Every transformer is now classified as preserved (distinct inputs stay distinct), not_guaranteed (random or hashed output, collisions possible) or lossy (collides by construction).

validate rules and pipeline startup now read pg_index for the tables in scope and check the configured rules against unique indexes, primary keys and unique constraints. With a Postgres target, a lossy transformer on a covered column fails at parse time with transformation rules break a unique index; with other targets (Kafka, Elasticsearch/OpenSearch, webhooks) the same finding is a warning, since there is no unique index to violate. A not_guaranteed transformer always warns. Set allow_uniqueness_loss: true on a column rule to keep a lossy transformer anyway. A custom mask configured to mask zero characters (mask_begin equal to mask_end, or unmask_begin: 0) is now rejected at construction rather than silently passing values through unmasked. Use noop to pass a column through on purpose.

Configure target side connection count

target.postgres.max_connections (PGSTREAM_POSTGRES_WRITER_MAX_CONNECTIONS) now controls the writer pool size, defaulting to 50 and honoring pool_max_conns from the target URL when set explicitly. Previously this setting also sized the schema observer's pool, so a target capped at 90 connections to stay under a 100-connection server limit could still open up to 180. The schema observer is now sized separately, at min(writer pool, 16). So the process now opens at most the configured writer limit plus 16.

Webhook delivery

A failed webhook POST is now retried with configurable backoff (network errors, 429, 5xx); other non-2xx responses are treated as permanent and not retried. A delivery that is still failing after retries is logged and dropped so one broken subscriber can't block delivery to everyone else, and at-least-once semantics apply on restart. New X-Pgstream-LSN / Idempotency-Key headers let subscribers dedupe redelivered events (omitted for snapshot events, which share a zero LSN). DISABLE_RETRIES now actually disables retries.

New Contributors

Full Changelog: https://github.com/xataio/pgstream/compare/v1.3.1...v1.4.0

Source: README.md, updated 2026-08-12