Skip to content

Initial release — Sprout Nostr relay with enterprise extensions#2

Merged
tlongwell-block merged 5 commits intomainfrom
oss
Mar 9, 2026
Merged

Initial release — Sprout Nostr relay with enterprise extensions#2
tlongwell-block merged 5 commits intomainfrom
oss

Conversation

@tlongwell-block
Copy link
Collaborator

All-Rust Nostr relay with structured channels, YAML-as-code workflows, MCP agent interface, tamper-evident audit log, and permission-aware full-text search.

13 crates: sprout-core, sprout-relay, sprout-db, sprout-auth, sprout-pubsub, sprout-search, sprout-audit, sprout-mcp, sprout-workflow, sprout-proxy, sprout-huddle, sprout-admin, sprout-test-client.

394 unit tests, 42 E2E integration tests, 16 MCP tools. Apache-2.0 licensed.

All-Rust Nostr relay with structured channels, YAML-as-code workflows,
MCP agent interface, tamper-evident audit log, and permission-aware
full-text search.

13 crates: sprout-core, sprout-relay, sprout-db, sprout-auth, sprout-pubsub,
sprout-search, sprout-audit, sprout-mcp, sprout-workflow, sprout-proxy,
sprout-huddle, sprout-admin, sprout-test-client.

394 unit tests, 42 E2E integration tests, 16 MCP tools.
Apache-2.0 licensed.
…ing licenses

- Remove deprecated 'vulnerability', 'unmaintained', 'yanked' fields from [advisories]
- Remove deprecated 'unlicensed' field from [licenses]
- Use structured ignore entries with reasons for advisory ignores
- Add CC0-1.0, CDLA-Permissive-2.0, MITNFA to license allow list
  (Bitcoin/Nostr ecosystem permissive licenses)
- Set wildcards = 'allow' (workspace crates use * for inter-crate deps)
- Add [licenses.private] ignore = true for unpublished workspace crates

All four cargo-deny checks pass: advisories ok, bans ok, licenses ok, sources ok
@tlongwell-block tlongwell-block merged commit 058c4b9 into main Mar 9, 2026
4 checks passed
@tlongwell-block tlongwell-block deleted the oss branch March 9, 2026 19:15
tlongwell-block added a commit that referenced this pull request Mar 16, 2026
Crossfire round 1: codex 4/10, opus 8/10. All critical issues fixed:

Security (critical):
- Force channel_id=None for kind:1059 gift wraps — prevents channel-scoped
  storage that would bypass #p AUTH-gating (codex finding #1)

Correctness:
- NIP-50 pagination loop — keep fetching Typesense pages until limit met
  or result set exhausted, capped at MAX_SEARCH_PAGES=5 (codex finding #2)
- Push authors/since/until to Typesense filter_by — post-filtering is now
  a correction step, not the primary filter (codex + opus suggestion)
- NIP-10 root tag validation — reject events where client-supplied root
  diverges from server-resolved ancestry (codex finding #3)

Clarity:
- Consolidate #p gating into single P_GATED_KINDS check (opus suggestion #7)
- filter.clone() → std::slice::from_ref(filter) (opus suggestion #1)
- Remove no-op get_events_by_ids test, add debug_assert (opus #3, #5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants