[READ-ONLY] Mirror of https://github.com/flo-bit/contrail. atproto backend in a bottle flo-bit.dev/contrail/
0

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #55 from flo-bit/changeset-release/main

Version Packages

authored by

Tom Scanlan and committed by
GitHub
(Jun 12, 2026, 3:58 PM EDT) 79d4da05 33fa877c

+84 -27
-7
.changeset/ingest-quiet-stream-hang.md
··· 1 - --- 2 - "@atmo-dev/contrail-appview": patch 3 - --- 4 - 5 - fix(ingest): stop the ingest cycle hanging on a quiet or all-filtered Jetstream 6 - 7 - Race `iterator.next()` against the safety timeout and check the exit conditions before each event, so a low-traffic stream no longer blocks until the caller's hard timeout kills the cycle with the batch and cursor unwritten.
-12
.changeset/sinks-seam.md
··· 1 - --- 2 - "@atmo-dev/contrail-base": minor 3 - "@atmo-dev/contrail-appview": minor 4 - --- 5 - 6 - Add a first-class `sinks` config option: write-only, post-commit observers of applied records. 7 - 8 - A `Sink` builds derived state (a search index, an audit log, a webhook fan-out) from every record contrail ingests. Each configured sink's `onRecords(events, { phase })` fires inside `applyEvents()` after the DB commit, on **both** the live and backfill paths, receiving one deduplicated `RecordEvent` per record. Failures are isolated — a throwing sink is logged via the configured logger and never blocks ingestion. 9 - 10 - Unlike `realtime.pubsub`, a sink is not a subscriber: it serves no reads, requires no ticket secret, and must see backfilled records (where realtime is intentionally silent). Public records only — space-scoped records publish via the publishing adapter and never reach the fan-out. 11 - 12 - Purely additive: `realtime` and all existing behavior are unchanged. Runs identically on D1 and Postgres (it is an in-process call after commit, not a database-log consumer).
+23
packages/contrail-appview/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-appview 2 2 3 + ## 0.12.0 4 + 5 + ### Minor Changes 6 + 7 + - 6b34d87: Add a first-class `sinks` config option: write-only, post-commit observers of applied records. 8 + 9 + A `Sink` builds derived state (a search index, an audit log, a webhook fan-out) from every record contrail ingests. Each configured sink's `onRecords(events, { phase })` fires inside `applyEvents()` after the DB commit, on **both** the live and backfill paths, receiving one deduplicated `RecordEvent` per record. Failures are isolated — a throwing sink is logged via the configured logger and never blocks ingestion. 10 + 11 + Unlike `realtime.pubsub`, a sink is not a subscriber: it serves no reads, requires no ticket secret, and must see backfilled records (where realtime is intentionally silent). Public records only — space-scoped records publish via the publishing adapter and never reach the fan-out. 12 + 13 + Purely additive: `realtime` and all existing behavior are unchanged. Runs identically on D1 and Postgres (it is an in-process call after commit, not a database-log consumer). 14 + 15 + ### Patch Changes 16 + 17 + - 91278c6: fix(ingest): stop the ingest cycle hanging on a quiet or all-filtered Jetstream 18 + 19 + Race `iterator.next()` against the safety timeout and check the exit conditions before each event, so a low-traffic stream no longer blocks until the caller's hard timeout kills the cycle with the batch and cursor unwritten. 20 + 21 + - Updated dependencies [6b34d87] 22 + - @atmo-dev/contrail-base@0.12.0 23 + - @atmo-dev/contrail-authority@0.12.0 24 + - @atmo-dev/contrail-record-host@0.12.0 25 + 3 26 ## 0.11.0 4 27 5 28 ### Minor Changes
+1 -1
packages/contrail-appview/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-appview", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Public-records appview for contrail — jetstream ingestion, backfill, query layer, feeds, labels, profiles, per-collection XRPC routes.", 5 5 "type": "module", 6 6 "sideEffects": false,
+7
packages/contrail-authority/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-authority 2 2 3 + ## 0.12.0 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [6b34d87] 8 + - @atmo-dev/contrail-base@0.12.0 9 + 3 10 ## 0.11.0 4 11 5 12 ### Patch Changes
+1 -1
packages/contrail-authority/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-authority", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Default space-authority implementation for contrail — member list, invites, app policy, credential issuance. Contrail's binary-membership ACL flavor; for ladder-style access levels see @atmo-dev/contrail-community.", 5 5 "type": "module", 6 6 "sideEffects": false,
+12
packages/contrail-base/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-base 2 2 3 + ## 0.12.0 4 + 5 + ### Minor Changes 6 + 7 + - 6b34d87: Add a first-class `sinks` config option: write-only, post-commit observers of applied records. 8 + 9 + A `Sink` builds derived state (a search index, an audit log, a webhook fan-out) from every record contrail ingests. Each configured sink's `onRecords(events, { phase })` fires inside `applyEvents()` after the DB commit, on **both** the live and backfill paths, receiving one deduplicated `RecordEvent` per record. Failures are isolated — a throwing sink is logged via the configured logger and never blocks ingestion. 10 + 11 + Unlike `realtime.pubsub`, a sink is not a subscriber: it serves no reads, requires no ticket secret, and must see backfilled records (where realtime is intentionally silent). Public records only — space-scoped records publish via the publishing adapter and never reach the fan-out. 12 + 13 + Purely additive: `realtime` and all existing behavior are unchanged. Runs identically on D1 and Postgres (it is an in-process call after commit, not a database-log consumer). 14 + 3 15 ## 0.11.0 4 16 5 17 ## 0.10.0
+1 -1
packages/contrail-base/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-base", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Shared infrastructure for the contrail family of packages — interfaces (SpaceAuthority, RecordHost, CommunityIntegration), credential primitives, binding resolvers, realtime infra, schema scaffolding. No routes, no tables of its own.", 5 5 "type": "module", 6 6 "sideEffects": false,
+8
packages/contrail-community/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-community 2 2 3 + ## 0.12.0 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [6b34d87] 8 + - @atmo-dev/contrail-base@0.12.0 9 + - @atmo-dev/contrail@0.12.0 10 + 3 11 ## 0.11.0 4 12 5 13 ### Patch Changes
+1 -1
packages/contrail-community/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-community", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Community module for contrail — community-owned spaces with tiered access levels (member → moderator → admin), invite tokens, DID provisioning, and the access-level reconciler that keeps spaces_members in sync.", 5 5 "type": "module", 6 6 "sideEffects": false,
+7
packages/contrail-record-host/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-record-host 2 2 3 + ## 0.12.0 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [6b34d87] 8 + - @atmo-dev/contrail-base@0.12.0 9 + 3 10 ## 0.11.0 4 11 5 12 ### Patch Changes
+1 -1
packages/contrail-record-host/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-record-host", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Default record-host implementation for contrail — stores records and blobs for permissioned spaces, enforces local enrollment as the host's consent layer.", 5 5 "type": "module", 6 6 "sideEffects": false,
+11
packages/contrail/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail 2 2 3 + ## 0.12.0 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [91278c6] 8 + - Updated dependencies [6b34d87] 9 + - @atmo-dev/contrail-appview@0.12.0 10 + - @atmo-dev/contrail-base@0.12.0 11 + - @atmo-dev/contrail-authority@0.12.0 12 + - @atmo-dev/contrail-record-host@0.12.0 13 + 3 14 ## 0.11.0 4 15 5 16 ### Patch Changes
+1 -1
packages/contrail/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Index AT Protocol records with typed XRPC endpoints. Cloudflare Workers + D1, SvelteKit, Node.js.", 5 5 "type": "module", 6 6 "sideEffects": false,
+6
packages/lexicons/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-lexicons 2 2 3 + ## 0.4.13 4 + 5 + ### Patch Changes 6 + 7 + - @atmo-dev/contrail@0.12.0 8 + 3 9 ## 0.4.12 4 10 5 11 ### Patch Changes
+1 -1
packages/lexicons/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-lexicons", 3 - "version": "0.4.12", 3 + "version": "0.4.13", 4 4 "description": "Generate atproto lexicon JSON (and optionally TypeScript types via @atcute/lex-cli) from a Contrail config.", 5 5 "type": "module", 6 6 "files": [
+2
packages/sync/CHANGELOG.md
··· 1 1 # @atmo-dev/contrail-sync 2 2 3 + ## 0.12.0 4 + 3 5 ## 0.11.0 4 6 5 7 ## 0.10.0
+1 -1
packages/sync/package.json
··· 1 1 { 2 2 "name": "@atmo-dev/contrail-sync", 3 - "version": "0.11.0", 3 + "version": "0.12.0", 4 4 "description": "Client-side reactive watch-store over contrail's watchRecords endpoints. SSE + WebSocket transports, optimistic updates, optional IndexedDB cache.", 5 5 "type": "module", 6 6 "sideEffects": false,