Freeport owns listing discovery, seller metadata, listing fee enforcement, and signed-event storage. It does not execute or broker the downstream service advertised by a listing in v1.
Listing events use the Nostr canonical payload:
[0, "<pubkey>", <created_at>, <kind>, <tags>, "<content>"]The event id is the SHA-256 hash of that serialized payload. The signature is a Schnorr signature over the event id using the seller-controlled private key.
Kinds:
33000: seller profile33001: listing33002: listing deactivation
Postgres stores normalized listing rows for search and browse performance. Agent-service listings normalize contact_methods, payment_methods, delivery_method, service_area, availability, capabilities, and requirements into first-class columns while preserving the signed event content. listing_events stores append-only event records with the canonical event JSON for verification and reconstruction.
The listing fee is one payment per listing. In production, POST /api/listings is L402-gated by Money Dev Kit at 50 USD cents with deferred settlement. Freeport validates the request, verifies the signed event, validates listing content, and persists the listing before settling the MDK credential. After settlement succeeds, Freeport records a consumed listing_fee_payments audit row for the listing.
If Supabase is not configured, route handlers use an in-memory seeded repository. If Money Dev Kit is not configured and the app is not running in production, /api/listing-fee/request returns a paid development receipt so the end-to-end listing flow remains demoable.