npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
49fce89952
feat(relay): rework NIP-37 drafts to channel-bound contract
...
Draft wraps (kind:31234) now require exactly one `h` UUID tag binding
them to a specific Buzz channel or DM. The relay enforces:
- Exactly one valid UUID `h` tag on every kind:31234 event
- Channel existence: the `h` UUID must resolve to a live channel
- Membership: author must be a member of that channel at write time
- Immutable binding: once a (author, d_tag) draft is written to
channel A, replacement events must carry the same h=A; rebinding
to a different channel is rejected at the ingest layer
The previous channel-less/global-state design is removed. Draft fan-out
already applied the author-only gate (AUTHOR_ONLY_KINDS); with channel_id
now non-NULL for kind:31234, the existing channel visibility/membership
filter in fan-out applies naturally with no additional changes.
E2E test suite rewritten for the channel-bound contract:
- h-tag validation: missing, duplicate, non-UUID, nonexistent channel
- Non-member author rejection + removed-member regression
- Immutable binding: rebind rejected, same-channel replacement accepted
- Author-only reads: WS REQ/COUNT, HTTP /query, /count, live fan-out
- known-#d privacy tripwires (exclusive and kindless)
- Tombstone head queryable by author, tombstone replaces live draft
- NIP-01 same-second tie-break (distinct candidates enforced)
- Stale write cannot supersede current head
- Workflow / channel kindless query exclusion
- Tenant confinement (alien channel rejected)
- FTS exclusion (NULL search_tsv confirmed)
- NIP-11 advertises NIP-37, not NIP-40
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-07-14 00:19:32 -04:00
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
79a9a89a4d
feat(relay): add NIP-37 draft wrap support (kind:31234)
...
Add kind:31234 as an author-only, channel-less, parameterized-replaceable
event kind for encrypted draft wraps per NIP-37.
Privacy enforcement spans every relay read path:
- WS REQ: AUTHOR_ONLY_KINDS gate closes the subscription with
restricted: for any requester who isn't the author
- WS COUNT: same gate applied before the count query executes
- HTTP bridge /query + /count: post-filter and guard use AUTHOR_ONLY_KINDS
- Live fan-out: AUTHOR_ONLY_KINDS check in dispatch_persistent_event_inner
prevents draft events from being pushed to non-author subscribers
- FTS (NIP-50): migration 0007 sets search_tsv = NULL for kind:31234,
making drafts storage-level unsearchable
Ingest validation (validate_draft_wrap_envelope):
- Exactly one non-empty d tag (any bounded value; relay is grammar-agnostic)
- Exactly one k tag with canonical u16 decimal (no leading zeros, fits u16)
- No h or p outer tags (compose context belongs in encrypted payload only)
- Content: empty string (tombstone) or NIP-44 v2 ciphertext shape check
- Optional expiration: at most one, decimal, strictly future, ≤ safe integer
NIP-11 now advertises NIP-37. NIP-40 is intentionally not advertised
because Buzz does not yet suppress expired rows on read.
Schema migration 0007 extends the search_tsv generated column exclusion
list with kind 31234.
New tests:
- 23 unit tests for validate_draft_wrap_envelope in ingest.rs covering
every acceptance and rejection path
- Comprehensive E2E test suite in e2e_nip37_draft.rs covering write
validation, NIP-01 replacement ordering, tombstone persistence,
author-only REQ/COUNT/HTTP, kindless/mixed filter privacy, known-d
privacy tripwires, live fan-out isolation, and NIP-11 advertisement
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-07-14 00:19:32 -04:00
a653406309
ci(desktop): surface flaky E2E tests instead of retry-masking them ( #1838 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-07-13 22:14:40 -04:00
bea507d8aa
chore(ci): lint desktop Tauri crate in CI ( #1801 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-07-13 11:21:10 -04:00
cfa2089831
refactor(shell): drop bundled PortableGit, add BUZZ_SHELL override + dialect hint ( #1536 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-07-06 12:54:50 -04:00
a255a77358
chore(deps): update all non-major dependencies ( #1163 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-06 14:19:20 +00:00
19d98319a8
chore(deps): update cashapp/activate-hermit digest to cea9af7 ( #1522 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-06 14:14:53 +00:00
8dea817fa9
chore(deps): update actions/cache digest to caa2961 ( #1341 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-06 14:14:38 +00:00
fdf29c457d
fix(ci): restore E2E flakiness fixes for pgschema, docker-pull, and spec timing ( #1396 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-30 15:46:06 +00:00
+1
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
d256935c36
feat: publish personas, teams, and managed agents as relay events ( #939 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-24 22:28:25 +00:00
592508addd
feat(windows): bundle full Git-for-Windows toolchain for the shell tool ( #1145 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-22 14:31:31 -04:00
ae8165f8bb
chore(release): release version 0.3.27 ( #1161 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-21 17:38:40 -07:00
Will Pfleger and GitHub
ceb5eff537
ci: cache Flutter pub packages in the Mobile job ( #1128 )
2026-06-18 22:25:08 -04:00
4d2eb52a6c
fix(buzz-dev-mcp): resolve non-WSL bash so the MCP shell works on Windows ( #1119 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-18 19:33:35 -04:00
e99105edc4
ci: key main-push concurrency group on SHA to stop run eviction ( #1124 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
2026-06-18 19:27:23 -04:00
466bb993ca
ci: move reminder e2e to a dedicated backend-integration job ( #1098 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-17 19:27:42 -04:00
4201311821
fix: make managed-agent spawn and teardown portable to Windows ( #1097 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-17 18:49:01 -04:00
ff824a365e
feat(desktop): add NIP-ER reminder UI — create, view, and manage encrypted reminders ( #963 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-17 11:03:45 -04:00
Will Pfleger and GitHub
07efae7b5b
perf(ci): speed up PR CI wall clock and local dev builds ( #1028 )
2026-06-16 12:44:13 -04:00
e3736f08b7
ci: use running postgres for pgschema desired-state planning ( #1070 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-16 11:52:19 -04:00
a1c28f487d
Shard desktop Playwright CI jobs ( #992 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-11 15:42:02 -07:00
d99ad131f1
refactor: rename sprout backend to buzz ( #958 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <wpfleger96@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Will Pfleger <wpfleger96@gmail.com >
2026-06-10 19:29:51 -04:00
4a93100e19
chore(deps): update actions/checkout digest to df4cb1c ( #897 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-07 22:31:08 -04:00
Will Pfleger and GitHub
f1c672fea5
chore: deprecate sprout-mcp — fill CLI gaps, remove crate and all references ( #850 )
2026-06-05 12:31:52 -04:00
tlongwell-block and GitHub
ede8ddb425
Sprout × mesh-llm: in-process mesh node (serve/consume) + relay admission ( #798 )
2026-06-02 10:28:20 -04:00
33e37de6e3
chore(deps): update all non-major dependencies ( #804 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-01 08:26:26 -07:00
Wes and GitHub
30654e95f6
Polish desktop Pulse and Home views ( #764 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
2026-05-28 08:17:02 -07:00
57f480a555
chore(deps): update taiki-e/install-action action to v2.79.5 ( #747 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-25 15:33:57 +00:00
86eca930af
chore(deps): update all non-major dependencies ( #735 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-24 03:03:36 +00:00
renovate[bot] and GitHub
fa3e0d1ed4
chore(deps): update dorny/paths-filter action to v4 ( #741 )
2026-05-24 00:32:26 +00:00
16a0188caf
chore(deps): update github artifact actions (major) ( #671 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
2026-05-23 02:08:06 +00:00
ce8d67c0c9
chore(deps): update actions/cache action to v5 ( #666 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-22 21:31:41 -04:00
Will Pfleger and GitHub
f8a0cb0147
perf(ci): add caching, path filtering, and nextest to speed up CI ( #723 )
2026-05-22 17:28:13 -04:00
8bc94413eb
feat(relay/git): git on Sprout, S3-backed ( #726 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@users.noreply.sprout >
Co-authored-by: Sami <sami@users.noreply.sprout >
Co-authored-by: Quinn <quinn@users.noreply.sprout >
Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@users.noreply.sprout >
Co-authored-by: Eva <eva@users.noreply.sprout >
Co-authored-by: Tyler Longwell <tyler@block.xyz >
2026-05-22 15:05:07 -04:00
811798b405
chore(deps): update taiki-e/install-action digest to 65851e1 ( #633 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 21:48:16 +00:00
Will Pfleger and GitHub
582cfc8885
Bundle sprout CLI in DMG release + agent PATH discoverability ( #614 )
2026-05-19 20:53:46 -04:00
tlongwell-block and GitHub
22f1e0b724
Launch sprout-agent from the desktop GUI ( #529 )
2026-05-11 12:36:53 -04:00
tlongwell-block and GitHub
70a691517b
feat: automatic git auth and signing for sprout agents ( #528 )
2026-05-11 10:38:45 -04:00
0dcfa86f84
chore: remove dead API token references from GUI, docs, and config ( #498 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-07 19:07:44 +00:00
6216f64e17
ci: cache Playwright browser binaries across desktop CI jobs ( #483 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-05 19:59:04 +00:00
tlongwell-block and GitHub
454781caae
Sprout speaks Nostr. Nothing else. ( #475 )
2026-05-05 12:03:06 -04:00
4d0cd58d35
feat: pnpm workspace, deep links, and web repos page ( #476 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-04 17:09:25 -07:00
tlongwell-block and GitHub
c9f287958d
feat(desktop): wire git-credential-nostr into agent spawn path ( #451 )
2026-05-02 11:46:49 -04:00
fa5a0b77fe
Add server cross-compile and macOS desktop build CI jobs ( #369 )
...
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-20 11:52:39 -07:00
691a0ef077
fix(ci): work around CMake 3.31+ rejecting audiopus_sys bundled Opus build ( #352 )
...
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-17 10:04:57 -07:00
tlongwell-block and GitHub
dd6107d0d0
feat: Sprout Huddles — voice conversations with AI agents ( #299 )
2026-04-14 13:11:09 -04:00
4c6c897d11
fix(ci): build relay with optimized profile to fix flaky e2e tests ( #307 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-13 11:04:46 -07:00
cf3e0f7ca4
Update actions/checkout action to v6 ( #305 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-13 11:04:30 -07:00
a444fb9516
feat(mobile): scaffold Flutter app with Riverpod & Catppuccin theme ( #306 )
...
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-13 09:55:14 -07:00