Postgres, replicated from the WAL.
Stream every insert, update and delete from your primary. Basalt takes a consistent snapshot first, then follows the WAL with no gaps.
Stream every insert, update and delete from your primary. Basalt takes a consistent snapshot first, then follows the WAL with no gaps.
Basalt creates a publication and a logical replication slot using pgoutput. It snapshots existing rows at a fixed LSN, then applies changes in commit order and confirms the LSN only after each write is durable.
Grant a role with REPLICATION and pick the tables to publish. Basalt creates the slot, checks wal_level, and starts the snapshot.
# replicate orders and customers from the primary basalt source add shop --postgres prod-db --tables orders,customers
Write plain SQL over the source. Basalt keeps the view current with every record and tracks lineage back to the topic, partition and offset.
CREATE MATERIALIZED VIEW revenue_by_min AS SELECT date_trunc('minute', ts) AS minute, currency, sum(amount) AS revenue, count(*) AS payments FROM payments WHERE status = 'captured' GROUP BY 1, 2;
Every view is an endpoint the moment it exists. Call it over REST, connect with any Postgres client, or use the SDK from your app.
curl https://api.basalt.dev/v1/views/revenue_by_min?limit=5 \ -H "Authorization: Bearer $BASALT_TOKEN"
Backfill runs at a fixed LSN, so the snapshot and the stream meet with no gaps or repeats.
ALTER TABLE adds and drops flow through. Views pick up new columns without a restart.
Basalt alerts before retained WAL grows past your limit and never leaves an orphaned slot.
With REPLICA IDENTITY FULL, updates carry the old row for diffs and audit views.