npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7
1ab6d760dc
feat(relay): add per-user storage metrics from audit log
...
Add logical-attribution storage observability, grouped by
(community_id, actor_pubkey): a partial index on audit_log for
media_uploaded actions, per-user/per-community/fleet byte and object
gauges in the usage poller, and a real-time upload-bytes counter in
the media handler.
Dedupe by (community_id, actor_pubkey, object_id) in a subquery so
idempotent re-uploads of the same blob are charged once, not once per
audit row. Fail safe on malformed historical detail->>'size' values
(non-numeric, negative, out-of-range, or exceeding bigint bounds)
by validating with a digits-only regex and a lexicographic bound check
against i64::MAX, then attributing 0 bytes instead of aborting the
whole poller query. The bound check uses ltrim + length comparison
and works on all PostgreSQL versions without requiring pg_input_is_valid
(PG 16+).
Storage aggregation is overflow-safe end to end: the per-user SUM
accumulates in numeric (SUM(bigint) returns numeric for wider precision)
and is clamped into [0, i64::MAX] before the final cast to bigint,
so an extreme historical aggregate degrades to a saturated reading
instead of erroring the whole query. Rust-side community/fleet rollups
use saturating addition for the same reason — individually valid
per-user values can still overflow i64 in aggregate, and these are
observability gauges, not a billing ledger.
The concurrent index build (migration 0021) is retry-safe via two
layers: a startup repair guard drops any indisvalid=false leftover
from a failed prior build, and IF NOT EXISTS skips creation when a
valid unrecorded index already exists from a bookkeeping race. Both
the repair guard and migrator run under a session-scoped advisory
lock on a single pinned connection — pg_advisory_lock is session-scoped,
so lock/guards/migrator/unlock must all execute on the same PG session;
if unlock fails, dropping the connection closes the session and releases
the lock automatically. The repair probe is schema-scoped (joins
pg_namespace, restricts to current_schema()) so a same-named invalid
index in another schema cannot interfere.
Named *_objects rather than *_uploads to stay distinct from the new
real-time buzz_media_upload_bytes_total event counter added in the
media handler. Per-user cardinality (two custom series per
community,pubkey pair) is intentional; BUZZ_USAGE_METRICS_PER_COMMUNITY=off
remains the emergency kill switch.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-07-16 15:08:59 -05:00
Tyler
6c2d667575
Apply optional relay join policy across join flows ( #1894 )
...
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: klopez4212 <klopez4212@gmail.com >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-07-16 13:59:53 -04:00
Michael Neale
54638ff4bb
mesh: upgrade runtime, enforce membership, add shared compute provider ( #1656 )
2026-07-15 10:10:29 -04:00
Tyler
bffbc5f22c
feat(push): deliver accepted relay events as wakes ( #1866 )
...
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
2026-07-14 16:13:04 -04:00
Tyler
08ad38a07f
fix(db): resolve duplicate migration version ( #1863 )
...
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
2026-07-14 18:46:12 +00:00
Wes
af190c93e1
Add private product feedback sidecar ( #1857 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-07-14 10:41:48 -07:00
Kalvin C
2b15a72675
feat(relay): add durable community archival ( #1834 )
...
Signed-off-by: npub16ynjrn8tm9gxg4kpgfgj24eup8met48z58m9g0cvmpq9msjht0lq7r96r6 <d12721ccebd9506456c1425125573c09f795d4e2a1f6543f0cd8405dc2575bfe@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1ks3yhswfl2z70myka7wltdg39qpvqhspt2w3l2ajtaee8tmz5qkqrvl4et <b4224bc1c9fa85e7ec96ef9df5b5112802c05e015a9d1fabb25f7393af62a02c@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1dccv64krpcpse5cmkzfeh998cftungyatw3djt8jwdw6g43f7fyqzzmrf7 <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub16ynjrn8tm9gxg4kpgfgj24eup8met48z58m9g0cvmpq9msjht0lq7r96r6 <d12721ccebd9506456c1425125573c09f795d4e2a1f6543f0cd8405dc2575bfe@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1ks3yhswfl2z70myka7wltdg39qpvqhspt2w3l2ajtaee8tmz5qkqrvl4et <b4224bc1c9fa85e7ec96ef9df5b5112802c05e015a9d1fabb25f7393af62a02c@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1dccv64krpcpse5cmkzfeh998cftungyatw3djt8jwdw6g43f7fyqzzmrf7 <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@sprout-oss.stage.blox.sqprod.co >
2026-07-14 16:02:12 +00:00
Tyler
1c006822e4
feat(push): add public APNs gateway ( #1770 )
...
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
2026-07-14 11:17:21 -04:00
Tyler
1b4703021d
Bound NIP-RS retention and search indexing ( #1771 )
...
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co >
2026-07-13 17:58:20 -04:00
Tyler
863aeb79f3
Community moderation Phase 1: reports, bans/timeouts, audit, tombstones, relay-DM notices ( #1616 )
...
Signed-off-by: Tyler Longwell <tlongwell@block.xyz >
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
Co-authored-by: npub17jjz49l9jjmhhk7cac63j8yt9z555n9cw8vk7v5jz4vzw4ppld5qgj57cc <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1cc3ha7z055mu0rwwu7806t2wt8mj3pvu0uv5mfp2c50dahaqhczshdalg6 <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1jmc9dt2lyvzu3h0kxlwxt5zg4fxp9476awyxw6gwxn72g6cw7exqs64whm <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-07-08 13:36:46 -04:00
Will Pfleger
71265ca361
feat(nips,relay,acp): NIP-AM durable encrypted agent turn metrics (kind 44200) ( #1441 )
...
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
2026-07-06 16:35:10 +00:00
Tyler
33886e3dec
perf: GIN index for e-tag containment + delta profile fetch (scroll-back ~2.1s/page) ( #1514 )
...
Signed-off-by: Tyler Longwell <tlongwell@block.xyz >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
2026-07-04 22:20:51 -04:00
Wes
5bfd5ca270
feat: per-community workspace icon set by admins, served via NIP-11 ( #1463 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
2026-07-02 11:58:42 -07:00
Tyler
e5aa4a2132
feat(git): move repo-name registry to Postgres + relax RWM chart gate (HA relay) ( #1432 )
...
Signed-off-by: Tyler Longwell <tlongwell@block.xyz >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
2026-07-01 14:50:18 -04:00
Tyler
14fba21e57
Multi-tenant Buzz relay: community_id as a server-resolved key (comprehensive rewrite) ( #1321 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Signed-off-by: npub1jh9wn95s0472h86ahapupaf7m6kx4v9sx2n0atj2hltcfer8k06s5n3pyf <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: Tyler Longwell <tlongwell@block.xyz >
Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub17jjz49l9jjmhhk7cac63j8yt9z555n9cw8vk7v5jz4vzw4ppld5qgj57cc <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Sami <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Quinn <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
Co-authored-by: Sami <sami@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
2026-06-29 12:39:02 -04:00
Will Pfleger
26563968cb
feat(relay): add NIP-ER push scheduler with cross-pod delivery ( #957 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-17 10:43:22 -04:00
tlongwell-block
2300248d3b
Add automatic database migrations ( #988 )
...
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
2026-06-16 08:39:19 -04:00
tlongwell-block
3cabe94c2b
feat: relay membership with NIP-43 compliance ( #448 )
2026-05-01 19:11:32 -04:00
Alec Thomas
6093fc6066
feat: migrate from MySQL to Postgres with pgschema ( #114 )
...
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
Co-authored-by: Tyler Longwell <tlongwell@squareup.com >
2026-03-19 12:35:22 -04:00
tlongwell-block
124047ef88
feat: NIP-29 native compatibility — standard nostr clients can chat on Sprout ( #63 )
2026-03-14 10:51:20 -04:00
tlongwell-block
c85a2226a5
fix: harden emoji reactions + feat: configurable ACP event subscriptions ( #59 )
2026-03-13 21:25:50 -04:00
tlongwell-block
6a5fcbb0c2
feat: reliability and security hardening ( #53 )
2026-03-13 15:33:22 -04:00
Wes
d9f8132263
Add end-to-end emoji reactions ( #57 )
2026-03-13 11:29:12 -07:00
tlongwell-block
f84da74d3f
feat: self-service token minting via NIP-98 HTTP Auth ( #37 )
2026-03-12 10:11:56 -04:00
tlongwell-block
154abf3da9
feat: agent channel protection — policy-based control over who can add agents to channels ( #34 )
2026-03-11 19:20:44 -04:00
Bradley Axen
3fb469917d
Remove IF NOT EXISTS from migrations and drop mysql CLI fallback ( #19 )
2026-03-10 14:46:15 -07:00
tlongwell-block
1fc9373a74
fix: resolve 10 E2E bugs + add desktop Playwright tests ( #21 )
...
Co-authored-by: Wes <wesb@block.xyz >
2026-03-10 14:44:39 -07:00
tlongwell-block
3e7c9d900a
feat: Channel management, messaging, threads, DMs, reactions, and NIP-29 support ( #16 )
2026-03-10 14:47:51 -04:00
tlongwell-block
058c4b92a9
Initial release — Sprout Nostr relay with enterprise extensions ( #2 )
2026-03-09 15:15:25 -04:00