Skip to content
AbloAblo
Esc
navigateopen⌘Jpreview
On this page

v0.46.0

Provider branches isolate environments; schemas isolate projects

Several Ablo projects can now share one physical Postgres database safely when each owns a separate schema. ablo connect apply --schema mail binds the authenticated project branch to (database, mail) and derives an independent slot, publication, replication role, and writer role. Publications enumerate schema-qualified mapped tables and the idempotency ledger lives in the selected schema. A provider branch’s distinct direct URL remains the environment boundary for Neon, Supabase, and similar hosts.

Registration enforces one owner per (database, schema) globally, without revealing another organization’s coordinates, and refuses a new binding when max_replication_slots has no capacity. Runtime replication, rotate, resnapshot, disconnect, and scan use the binding’s stored/derived footprint; legacy manual setups remain single-binding.

New clients can pin their intended project and branch with projectId / ABLO_PROJECT_ID and branchId / ABLO_BRANCH_ID. ablo dev writes both immutable coordinates beside its branch-bound key, and ready() compares them with the key’s server-resolved target before opening the sync connection. A mail deployment carrying a slides key now fails with project_scope_denied; a same-project key for the wrong environment fails with branch_scope_denied.

Pre-existing rows arrive on their own

Connecting a database that already holds data no longer leaves those rows invisible until something touches them. Ablo snapshots the pre-existing rows automatically, ablo connect check refuses to report ready until that snapshot completes, and ablo status --json exposes the progress as initialSnapshot.status: loading, retrying with the underlying error, or complete. Keep an existing read fallback in place until the status reads complete. Row-touch backfill scripts are unnecessary; the snapshot is the engine’s job.

The snapshot reader now detects row-level security that would filter its ordinary SELECT even though WAL carries every published row. New setup plans give the read-only replication role BYPASSRLS (with SELECT still restricted to published tables), and readiness refuses to call an RLS-filtered snapshot safe. Existing connections can run ablo connect resnapshot after repairing the role; it recreates only the slot and keeps the DataSource and credentials. The same completion guard rejects an empty or partial snapshot mapping: if a pushed model’s table is absent from the publication, completion stays pending until coverage is repaired and a fresh snapshot is requested. Snapshot and WAL mapping now use the DataSource’s configured Postgres schema as part of relation identity, so an identically named table in another schema cannot be loaded into the model or falsely satisfy publication coverage.

Was this page helpful?