Lamppost

Author a yard-sale item. It is signed by your own signer, its photo goes to Blossom, its offer is minted on your own node over CLINK, and the listing goes to public relays. Nothing here has a server of ours behind it.

1 · Your signer

Nothing in this app ever sees your key. It asks your signer to sign, and your signer decides.

2 · Your node optional

No node — items will publish as cash-only, with no Buy button.

Run node spike/authorize-manage.ts once, on the machine with your node, and paste the line it writes. This pointer addresses your account, so it stays in this browser — it is never published and never sent anywhere but your own node.

3 · Your sale

This is the masthead at the top of your storefront, and it is one signed event that every item points at. Publish it once, then again whenever the details change or you want a new item listed in order.

No nostr event has a field for a sale’s date or its opening hours — not NIP-99, not the collection spec. This line is where they live, and it prints on the flyer under the masthead.

Your storefront turns this into a geo: link, which your buyer’s phone hands to whatever map app it already has — no map is loaded from anybody’s server, and nothing of ours learns that they looked. “Use my location” reads the browser’s own geolocation and rounds it to about 76 metres. Leave it empty and the neighbourhood is just text.

4 · The item

Sats only. There is no currency conversion anywhere in this app — that would need a price oracle, and an oracle is somebody else’s server. Price something in pesos by leaving the node field empty: it lists, it just has no Buy button.

Resized in your browser to 1200, 480 and 160px. The original is never uploaded.

5 · Your sale so far

Read straight off the public relays with no credential at all — the same events any visitor sees, which is why this list can exist in a page that holds no key.

What is not here is what each sale was worth. CLINK Manage’s only resource is the offer — there is no invoice or settlement resource anywhere in CLINK — and the node’s own call for it, GetUserOfferInvoices, rides a request kind a signer holding your key on your phone cannot construct. So a browser that never touches your key cannot read your sales, and that is the cost of the custody claim rather than a missing feature. Run node spike/sales-report.ts on the machine with your node for amounts, timestamps and refund pointers.

7 · Publish the sale as a website

Your storefront is a handful of static files. They go to Blossom servers as blobs, and a signed manifest on the relays says which blob is which path. That manifest is the whole site: no host, no DNS, no certificate, no account. It is served at your own npub, which is how the page knows whose sale to read.

Any NIP-5A host will serve it — the gateway is only where you point people. Changing it changes the URL printed on the flyer’s tear-off tabs, so set it before you deploy.

Gateways cache for an hour and serve the previous version until it lapses, while the relays and Blossom update in seconds. Do not redeploy on the day of the sale.