Architecture Decision Record: Offline Broadcast
Title: Record: Offline Broadcast
status
In progress
Updated on 15-06-2025
contributors
-
Main contributor(s): fmar
-
Reviewer(s): fmar, leo, nogringo
-
Final decision made by: fmar, leo, nogringo
Context and Problem Statement
NDK does not remember events broadcasted when offline. As a user, I want to be able to draft something in a remote location (e.g. plane) without thinking about Nostr relay constraints.
Main Proposal
Requirements:
-
relay specific
-
gossip
-
Consider done %
-
different modes, specific: relay broadcast must succeed
-
eviction policy (keep in cache, delete old ones)
-
Streamlined reject handling (retry, dismiss, paymentRequired, POW, blocked, etc.)
-
Gossip: % of relays is ok
Refactor the Broadcast use case into several concerns.
- cache with state information
PriorityBroadcast: 0
PolicyBroadcast: all ok
PolicyEviction: replace
event1: broadcast: {
relay 1 ok
relay 2 failed, timeout
}
- cache of deleted events
- Broadcast monitor (checks for broadcast state, delegates work, runs periodically)
- broadcast (stateless, broadcasts and returns results with comprehensive err handeling)
To model the constraints on each event, we are implementing a BroadcastPolicy, EvictionPolicy and priority broadcast.
Depending on the use case, an event must be accepted by one or multiple relays or just be accepted by a few.
These policies are checked and executed by the broadcast monitor depending on the current conditions.
Broadcast just executes a given policy/strategy given by the broadcast monitor and reports back.
BroadcastPolicys
- consider done %
- all ok
- todo
EvictionPolicys
- todo
Consequences
The main difficulty is the remote signer setup. As a workaround, we store unsigned events in cache (so they are queriable) and check with the broadcast monitor whether we can sign them before broadcasting.
Impact Radius
Accounts: edit, set up acc
Blossom/Files: publish blossom servers
Cashu: Not impacted rn
Connectivity: Not impacted
Domain verification: Not impacted
Follows: edit, setup
Gift Wrap publish
Lists: publish, edit
Metadata: publish, edit
Nwc: rpc method, offline zaps?
Relay sets publish, edit
Requests: Not impacted
User relay lists publish, edit
Wallets not impacted
Zaps offline zap? (how to get invoice)
Alternative proposals
Monolithc archetecture with a broadcast manager that encapsulates most of the retry logic attached to a state/cache class.
Final Notes
Proposal Accepted. https://github.com/relaystr/ndk/pull/679