All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Realtime events: config-gated SSE endpoint bridging Postgres LISTEN/NOTIFY
(
events_channels,events_path,events_heartbeat_interval) (#81). application/geo+jsonbroadened from relation reads to also cover mutations (withPrefer: return=representation),/rpc/*, and embedded reads, whenever the PostGIS extension is installed (#63).- Behavior note: response bodies are now byte-identical to PostgREST
v14.12, including its
, \nrow separator between top-level JSON array elements and jsonb-styled embed internals — this shiftsContent-Lengthon any multi-row response compared to earlier Bier versions (#31). - Breaking:
Locationis no longer emitted onPOST/PUTresponses forPrefer: return=representationorreturn=minimal— onlyreturn=headers-onlycarries it now, matching PostgREST 14.12 (hosts that readLocationafter a plainPOSTmust switch toreturn=headers-only). - The empty-payload mutation short-circuit now carries a
Content-Rangeof*/*(*/0underPrefer: count=exact). - Scalar/composite RPC responses always carry
Content-Range(0-0/*without a count preference). Content-Profileis echoed on success responses whenever more than one schema is exposed and the profile-schema model is not configured.- Added
jwt_role_claim_key(PostgRESTjwt-role-claim-key, aliasrole-claim-key): a JSPath selecting the database role inside the JWT claims — nested keys, array indexes, and PostgREST's filter expressions are supported; an invalid expression aborts startup (#49). - Added
jwt_secret_is_base64(PostgRESTjwt-secret-is-base64, aliassecret-is-base64): the JWT secret is base64-decoded before use (URL-safe characters accepted); an undecodable secret aborts startup (#49). - Perf: reads no longer compute
count(*) OVER()unless the request's count mode consumes it (table reads:Prefer: count=exact|estimated; RPC: any mode butnone; mutations: never) — filtered pages with alimitget their fast plan back instead of scanning the whole filtered set. Theapplication/vnd.pgrst.planoutput now reflects the request's count mode (#67). - Added an HTTP benchmark harness (
bench/http/) that measures Bier against PostgREST v14.12 head-to-head with k6 under matched configuration; results and methodology inbench/http/REPORT.md. - Added
server_host(PostgRESTserver-host): the listener bind address as a Warp-style host preference (!4default,!6/*6,*, IP literals, resolvable host names), honored by both the API and admin listeners (#49). - Added
server_unix_socket/server_unix_socket_mode(PostgRESTserver-unix-socket(-mode)): serve the API on a Unix domain socket instead of a TCP port, applying the octal file mode (600–777) to the socket file; an invalid mode aborts startup (#49). - Added
openapi_server_proxy_uri(PostgRESTopenapi-server-proxy-uri): the generated OpenAPI document advertises the proxy's scheme/host/port/path asschemes/host/basePath; a malformed URI aborts startup (#49). - Added
app_settings(PostgRESTapp.settings.*,PGRST_APP_SETTINGS_<NAME>): arbitraryapp.settings.<name>GUCs set transaction-locally on requests running with the auth context (#49). - Added
db_pool_max_idletime(PostgRESTdb-pool-max-idletime, aliasdb-pool-timeout) mapping onto the connection pool's idle-interval knob, and the CLI now modelsdb-pool(pool size) (#49). - The CLI grew
--example/-e, printing a loadable config template with every implemented key at its default;--dump-confignow covers the full implemented key table (conformance cases 1705/1707/1714/1715/1716/1727/1729 are active) (#49).
Nothing has been published to Hex yet. Current state of the library:
- RESTful API generated at boot from PostgreSQL introspection (
pg_catalog), heavily inspired by PostgREST and driven by a conformance suite frozen from PostgREST v14.12. - Reads, mutations (insert/update/upsert/delete), and
/rpc/*function calls compiled into a single parameterized SQL statement per request. - JWT authentication (HS/RS/ES/PS/EdDSA via JOSE) with role switching and request-scoped GUCs.
- Schema-cache reload via
LISTEN/NOTIFYandBier.reload_schema_cache/1. - Multiple named instances per BEAM node, each with its own connection pool, runtime-built router, and Bandit server.
- Standalone PostgREST-compatible CLI (
PGRST_*env),mix releasetarget, and Dockerfile.