opt-in public publishing — fleet metadata + heartbeats (post-launch) #27
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Pre-launch we ripped out the NIP-78 fleet publishing path (commits
131ff92shipped it,dcd0874reverted it). Default posture is nowmaximum privacy — nothing about an operator's fleet leaks to
public relays. This is the right default: published fleet composition
extortion target surface, and operators never opted in to it.
But there ARE legitimate public-publishing use cases. Operators may
want certain machines to be discoverable (publish location for
walk-in customers, advertise that the ATM is online), and bitSpire
already emits machine-side heartbeats. This issue tracks the design
of a opt-in publishing layer that ships post-launch, after the
core flows are stable and operators can make an informed choice.
What public publishing is for
Two distinct surfaces, very different audience + privacy posture:
A. Machine heartbeat (ATM-side, operator opt-in per machine)
lamassu-next), not LNbits.Already implemented on the ATM side.
near me?", third-party ATM directories.
like ATM npub, friendly name, coarse location (city or
neighbourhood, NOT street address), supported fiat codes,
active/inactive flag, last-seen timestamp. Explicitly NOT: wallet
balances, settlement counts, recent transaction amounts, exact
geo, owner identity.
is_publicly_discoverable: bool, defaultfalse. Set in the satmachineadmin UI; surfaced to bitSpire viathe existing NIP-44 RPC channel (no separate transport).
today — confirm with bitspire session before shipping).
operator's. ATMs already hold their own nsec post-S0/S2 bunker
work, so no operator-key exposure.
B. Fleet roster / aggregate metadata (operator-side, opt-in per operator)
via the operator's signer (post-#17 abstraction).
npub a real machine of operator X?" — most notably the future
LNbits-server-side roster-gating (S6) that decides whether an
unknown npub should auto-create an account.
is_publicly_discoverablemachines'npubs only. NOT: full fleet (private machines must not leak), not
fiat codes, not location, not wallet bindings.
publish_roster_publicly: bool, defaultfalse. AND per-machineis_publicly_discoverable: bool(thesame flag (A) uses) — a machine is in the public roster iff BOTH
flags are true.
right fit semantically per the
feedback_respect_nostr_protocol_semanticsrule);dtagbitspire-fleet.lnbits.core.signers.resolve_signer(LocalSigner or RemoteBunkerSignerpost-lnbits#18).
C. Settlement receipts (out of scope here — tracked in lnbits#22)
Distinct surface, separate opt-in. See
aiolabs/lnbits#22for thereceipt-publishing producer + the privacy-by-default toggle that
gates it operator-side.
Schema sketch
dca_machines.is_publicly_discoverabledrives (A) heartbeats andfilters (B) roster contents.
dca_operator_prefs.publish_roster_publiclygates the entire (B) publish path.
UI surface
Settings tab (operator-scoped):
Helper text: "Publishes the npubs of machines you've marked
'publicly discoverable' to your relays. Lets customers and other
LNbits instances verify which ATMs belong to you. Off by default;
enable if you want walk-in discoverability."
default OFF. (Wires into lnbits#22.)
Per-machine row (in the machines table):
Helper text: "When ON (and your operator publish-roster toggle is
also ON), this machine's npub + sparse public metadata appears in
your published fleet roster. Customers can find it; competitors
can too."
What we should NOT bring back
The original
nostr_publish.pypublished the operator's full activefleet by default with no toggle. We deleted it for good reason.
Don't restore it wholesale — the right shape is:
propagate the
is_publicly_discoverableflag via RPC.publishes a strictly narrower payload than the old version.
Sequencing
Post-launch. Wait until:
model of what data exists vs what they'd want to share.
roster publish path can use the proper signer chain without the
pre-#17 prvkey fallback.
Until those land, the privacy-by-default posture is the ship-it
state. No external observer can tell which npubs belong to which
operator's fleet from public relays — and that's correct for v2.0.
Related
aiolabs/satmachineadmin#18— original S4 issue that shipped + gotreverted. Close this issue when (B) ships.
aiolabs/lnbits#22— S3 receipt-publishing producer; uses sameopt-in shape ((C) above).
aiolabs/lnbits#17— signer abstraction (dependency for (B)).aiolabs/lnbits#18— NIP-46 bunker (dependency for (B) whenoperator uses bunker).
➡️ Migrated to aiolabs/spirekeeper#15 (aiolabs/spirekeeper#15).
The v2-bitspire line of this extension now lives in its own repo,
aiolabs/spirekeeper. Tracking for this issue continues there; closing here. (Issue numbers were reassigned in the new repo.)