> ## Documentation Index
> Fetch the complete documentation index at: https://xata.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# v1.1.0

> pgstream v1.1.0 release notes

**Release Date:** June 16th, 2026

pgstream v1.1.0 is a minor release focused on configuration ergonomics and operability. YAML configuration accepts environment variables, byte-size settings accept human-readable units, logs can be emitted as JSON, and the process exposes `/health` and `/ready` endpoints. It also adds a `stdout` target for debugging pipelines, an optional null-byte sanitizer, `ltree` and `cube` type support, custom TLS for search stores, and an `--upgrade` flag that migrates a v0.9.x installation to v1.x. No migration is required when upgrading from v1.0.x.

## Environment Variables in YAML Configuration

[PR #790](https://github.com/xataio/pgstream/pull/790), contributed by [@mvanhorn](https://github.com/mvanhorn).

Any `${VAR}` reference in a YAML configuration file — including the transformation rules file — is replaced with the value of that environment variable before the configuration is parsed. Credentials no longer have to be committed alongside the rest of the configuration:

```yaml theme={null} theme={null}
source:
  postgres:
    url: "postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:5432/mydatabase"
```

Only the braced form is expanded, and a variable that is not set expands to an empty string.

## Human-Readable Byte Sizes

[PR #823](https://github.com/xataio/pgstream/pull/823), by [@kvch](https://github.com/kvch).

Byte-size settings — batch sizes, auto-tuning bounds — accept a unit suffix instead of a raw byte count. Units are case-insensitive and binary (`1MiB` is 1048576 bytes). Plain integers keep working:

```yaml theme={null} theme={null}
target:
  postgres:
    batch:
      max_bytes: 80MiB
      auto_tune:
        min_batch_bytes: 1MiB
```

## Configurable Log Format

[PR #880](https://github.com/xataio/pgstream/pull/880), by [@kvch](https://github.com/kvch).

`--log-format` selects between the human-readable `console` output (the default) and structured `json` for log collectors. It can also be set with `PGSTREAM_LOG_FORMAT` or `logging.format.type`. A companion `--no-color` flag disables ANSI codes in console output.

## Health and Readiness Endpoints

[PR #882](https://github.com/xataio/pgstream/pull/882), by [@kvch](https://github.com/kvch).

The `run` and `snapshot` commands can start a small HTTP server exposing `/health` (liveness, always `200`) and `/ready` (readiness, which pings the source database when one is configured). Responses are JSON. This makes pgstream deployable behind Kubernetes probes without a sidecar:

```yaml theme={null} theme={null}
health:
  enabled: true
  address: ":9910"
```

The server is disabled by default and listens on `localhost:9910` unless an address is given.

## New `stdout` Target

[PR #883](https://github.com/xataio/pgstream/pull/883), by [@kvch](https://github.com/kvch).

A `stdout` target writes WAL events as NDJSON — one JSON object per line — so a pipeline, its filters and its transformation rules can be validated without provisioning a real target:

```yaml theme={null} theme={null}
target:
  stdout: {}
```

## Null-Byte Sanitizer

[PR #871](https://github.com/xataio/pgstream/pull/871), contributed by [@AasheeshLikePanner](https://github.com/AasheeshLikePanner).

Postgres `text` values may contain null bytes (`0x00`) that other targets reject. An optional processor strips them from string column values:

```yaml theme={null} theme={null}
modifiers:
  sanitize:
    strip_null_char_bytes: true
```

The processor is off by default, so pipelines that carry null bytes deliberately are unaffected.

## New Type Support

* **`ltree`** ([PR #834](https://github.com/xataio/pgstream/pull/834)) and **`cube`** ([PR #831](https://github.com/xataio/pgstream/pull/831)), by [@kvch](https://github.com/kvch). Both types are now replicated instead of failing on an unknown type.
* **`pgvector`** ([PR #809](https://github.com/xataio/pgstream/pull/809)), contributed by [@rieg-ec](https://github.com/rieg-ec). The pgvector types are registered on the connection, so vector columns replicate without a custom codec.

## Custom TLS for Search Stores

[PR #832](https://github.com/xataio/pgstream/pull/832), by [@kvch](https://github.com/kvch).

Elasticsearch and OpenSearch targets accept explicit TLS settings — CA certificate, client certificate and key — instead of relying on the system trust store, which is what self-managed clusters with a private CA need.

## `--upgrade` Flag for v0.9.x Installations

[PR #788](https://github.com/xataio/pgstream/pull/788), by [@tsg](https://github.com/tsg).

Moving from the 0.9 line to 1.x required a manual `destroy`/`init` cycle. `pgstream init --upgrade` now cleans up the v0.9 objects left behind by the schema-log architecture and re-initializes in one step. See the [v1.0.0 release notes](/docs/opensource/pgstream/docs/releases/v1.0.0) for what changes between the two lines.

## Bug Fixes

* **Precision loss on large integers and `bigint`** ([PR #833](https://github.com/xataio/pgstream/pull/833)). Values beyond the exact range of a float64 were rounded in transit; they are now carried without loss.
* **Composite primary keys in WAL metadata** ([PR #805](https://github.com/xataio/pgstream/pull/805)), contributed by [@blurskye](https://github.com/blurskye). All columns of a composite key are recorded, instead of only the first.
* **Constraints restored before snapshot conflict updates** ([PR #806](https://github.com/xataio/pgstream/pull/806)), contributed by [@blurskye](https://github.com/blurskye). An `ON CONFLICT` update needs the constraint it targets to exist, so constraint restore now happens first.
* **Transformer panics with multiple workers** ([PR #884](https://github.com/xataio/pgstream/pull/884)). Greenmask's generators keep state that is not safe for concurrent use; transformers now take an instance per execution, so snapshots with more than one worker no longer panic.
* **All error messages are collected before shutdown** ([PR #841](https://github.com/xataio/pgstream/pull/841)). A failing pipeline reported the first error only; the rest are now surfaced too.
* **`includeGlobalDBObjects` with `schema: all`** ([PR #760](https://github.com/xataio/pgstream/pull/760)), by [@tsg](https://github.com/tsg).
* **CVEs in `jackc/pgx`** ([PR #810](https://github.com/xataio/pgstream/pull/810)), contributed by [@fiws](https://github.com/fiws). pgx is updated to v5.9.2.

## New Contributors

* [@mvanhorn](https://github.com/mvanhorn) in [PR #790](https://github.com/xataio/pgstream/pull/790)
* [@SAY-5](https://github.com/SAY-5) in [PR #802](https://github.com/xataio/pgstream/pull/802)
* [@blurskye](https://github.com/blurskye) in [PR #805](https://github.com/xataio/pgstream/pull/805)
* [@rieg-ec](https://github.com/rieg-ec) in [PR #809](https://github.com/xataio/pgstream/pull/809)
* [@fiws](https://github.com/fiws) in [PR #810](https://github.com/xataio/pgstream/pull/810)
* [@AasheeshLikePanner](https://github.com/AasheeshLikePanner) in [PR #871](https://github.com/xataio/pgstream/pull/871)

## Upgrade

No configuration changes are required when upgrading from v1.0.x. Replace the binary and restart pgstream. Existing configurations keep working: environment-variable expansion, human-readable sizes, the sanitizer and the health server are all opt-in.

Users still on the 0.9 line can migrate with `pgstream init --upgrade`, which removes the v0.9 objects and re-initializes for v1.x.

## Support

* Issues: [https://github.com/xataio/pgstream/issues](https://github.com/xataio/pgstream/issues)
* Documentation: [https://github.com/xataio/pgstream/tree/main/docs](https://github.com/xataio/pgstream/tree/main/docs)
* Discussions: [https://github.com/xataio/pgstream/discussions](https://github.com/xataio/pgstream/discussions)
