ForgeRadio
Sovereign stations on ForgeSite, gated by a Listener-ASA on Algorand
NODEZEROINSIDE.
0. Abstract — and an honesty gate up front
ForgeRadio is the family's streaming-station DApp: a browser radio surface on ForgeSite backed by an Algorand smart contract where a Listener-ASA grants stream access (0.5 ALGO / period) and a station registry mints one ASA per station. That is the DESIGN.
Maturity, stated plainly (scar #5 / verify-by-running discipline): ForgeRadio is mostly VISION today. Exactly two primitives are BUILT, and they are not wired to each other:
- A working free web player —
radio.html(232 lines) runs on ForgeSite and streams 10 SomaFM stations through an HTML5<audio>element. It is real, it plays, and it is completely ungated — no wallet, no ASA, no Algorand code anywhere in the file. - A compiled subscription + registry contract —
forgeradio.py(PyTeal) compiles toforgeradio_approval.teal/forgeradio_clear.teal. The subscribe/register logic is real source. But the contract's manifesttx:field is blank: it is not deployed, has no app ID, and is part of the 9-contract Algorand suite waiting on mainnet funding.
The bridge between those two — the player checking a Listener-ASA before it lets audio play — does not exist yet. Nor does the "family-curated 11th stream" the manifest describes (the running player has 10 SomaFM streams, not 11). Nor does any "radio rides the mesh" wiring (see §7). Everything past the two built primitives is design, not product. This paper marks each claim BUILT or VISION so no future session builds on a ghost.
1. Why ForgeRadio exists
Streaming radio is a rent surface. SomaFM survives on listener donations precisely because the ad-and-algorithm model corrupts everything it touches. ForgeRadio's thesis is: the station list, the access grant, and the payment are family-sovereign primitives — the station registry is a chain object, access is an asset you hold, and the payment is a smart-contract atomic group, not a Stripe subscription behind a corporate paywall.
The intended shape:
- The listener holds a Listener-ASA (a period token). Holding it = access.
- Each station is a chain-registered object (an ASA carrying name + stream URL + curator key), so the registry is portable and tamper-evident, not a JSON blob a vendor can revoke.
- The payment is an Algorand atomic group: pay 0.5 ALGO → contract mints your period token → you're in for ~30 days.
No corporate host holds the roster. No ad network monetizes the listener. That is the sovereignty claim — and today it is a claim, because the gate is not yet enforced.
2. What is BUILT (proven by inspection)
2.1 The player — radio.html (BUILT, running, UNGATED)
A single self-contained HTML file on ForgeSite (forgesite-public/radio.html, mirrored at site/radio.html). It is a clean, working player:
- Title
ForgeRadio — Sovereign Stations; ∞ sigil;/apphome button that opens in a new tab so audio keeps playing. - A hardcoded array of 10 SomaFM streams — Groove Salad, Drone Zone, Deep Space One, Mission Control, DEF CON Radio, Cliqhop IDM, SF 10-33, Lush, Beat Blender, Fluid — each
https://ice2.somafm.com/<id>-128-mp3. - Station tiles, a NOW-PLAYING readout, a volume slider, play/pause, and status handling (
playing/pause/error→ "STREAM ERROR" /waiting). Cache-busting on the stream URL (?cb=Date.now()).
Honest read: this is a well-made, ForgeChain-skinned front end over SomaFM's public listener-supported streams. It is genuinely useful and genuinely runs. It is not yet "sovereign" in the access sense — there is no ASA check, no wallet, no Algorand reference in the file. Anyone who loads the page plays for free. The comment in the code is accurate: "Public sovereign-stream stations (SomaFM — listener-supported, no ads, no corporate)" — the sovereignty it delivers today is ad-free / corporate-free upstream, not on-chain gated access.
2.2 The contract — forgeradio.py → TEAL (BUILT source, compiles, NOT deployed)
forgeradio.py is real PyTeal that compiles to v10 TEAL (forgeradio_approval.teal, forgeradio_clear.teal both present on disk). Its logic:
On create: sets admin = deployer, price_microalgo = 500,000 (0.5 ALGO), rounds_per_period = 786,000 (~30 days).
register_station(name, stream_url, curator_32b) — admin-only. Mints a single-unit ASA (unit FRAD) whose asset name = station name and asset URL = stream URL, manager = the app. Writes a box s:<asa_id> = name|url|curator. This is the station registry: one ASA per station, curator key bonded in.
subscribe(recipient_32b) — must run in a 2-txn atomic group with a Payment leg. The contract asserts the group size is 2, the sibling txn is a Payment to the app account of ≥ 0.5 ALGO, then mints a single-unit, default-frozen, clawback-enabled period ASA (unit FRSUB, name Radio Period, url forgechain://radio-sub) and writes box sub:<user> = expiry_round || asa_id. Frozen + clawback = the family can reclaim/expire the token; it is a lease, not a bearer asset.
Honest read: the subscription and registry mechanics are correctly modeled Algorand. But MASTER-MANIFEST.yaml → tools.forgeradio_contract.tx: is empty. Per the algorand_canon_mirror entry, the whole 9-contract suite (22.7 KB TEAL) is "compiled and ready to deploy" with "mints pending mainnet funding." So: no app ID, no live subscriptions, no minted period tokens, nothing on mainnet. The contract is a proven blueprint, not a running program.
3. What is VISION (designed, not built)
| Claim | Reality |
|---|---|
| Listener-ASA grants stream access | VISION. Contract can mint the ASA (once deployed); the player never checks for it. No enforcement path exists. |
| Contract live on Algorand | VISION. tx: blank, undeployed, awaiting mainnet funding. |
| Station registry as chain objects | VISION. register_station is written and compiles; zero stations registered (nothing deployed). |
| Family-curated 11th stream | VISION. radio.html ships 10 SomaFM streams; the 11th does not exist in the running file. |
| Royalty / micropay split to curators | VISION / v2. The curator_32b key is stored in the station box, but no split logic exists — the contract comment states "Royalty / micropay split deferred to v2 (payment channels)." |
| Radio rides the ForgeMesh | VISION. See §7 — no wiring between forgeradio and forgemesh_v1. |
Composes with dapp_fee_contract / atomic DApp layer |
VISION. Manifest lists the composition (algorand_dapp_layer_full); it is unexercised because nothing is deployed. |
4. The designed end-state (how the two halves are meant to meet)
The wiring that would turn ForgeRadio from "free SomaFM skin + orphan contract" into the sovereign product:
- Deploy the compiled TEAL to Algorand (blocked on funding — part of the 9-contract batch under
algorand_canon_mirror). This yields an app ID + app account. - Register the 10 SomaFM streams (and the family-curated 11th) via
register_station— each becomes anFRADASA in the on-chain registry.radio.htmlreads its station list FROM the registry instead of a hardcoded array. - Gate the player. On load,
radio.htmlconnects a wallet, checks boxsub:<user>for a non-expired period token; if absent, it presents a subscribe action (the 2-txn atomic group: 0.5 ALGO payment +subscribe) and, on success, unlocks audio. Free preview vs. gated full access is a product decision (SomaFM's own terms must be honored for their streams; the gate more naturally fits family-curated / original content). - Compose with
dapp_fee_contract(period-token issuance) andcitizenship/tosunderalgorand_dapp_layer_full, so one signed atomic group can chain Citizenship → TOS → Radio subscription with no half-completed states. - v2 royalty split via payment channels — distribute a share of each subscription to the
curator_32bbonded in the station box.
Until step 1 happens, steps 2–5 are inert.
5. Design invariants (what makes it sovereign when it's real)
- The roster is a chain object, not a vendor list.
register_stationbonds name + URL + curator into an ASA + box. Deplatforming a station means an on-chain admin action, not a corporate takedown. - Access is an asset you hold, not a login you rent. The period token is default-frozen + clawback — a family-administered lease with a hard
expiry_round, enforced by AVM math, not by a server session. - Payment is atomic. The subscribe path requires the Payment leg in the same group (
group_size == 2, receiver == app, amount ≥ price). No pay-without-token, no token-without-pay. This is the BSV-can't-do-natively property the Algorand slot exists for. - BSV records, Algorand verifies. Per family canon: BSV is the passive content/authorship substrate (1Sat ordinals); Algorand runs the active AVM-resident access checks. ForgeRadio's subscription math lives on Algorand by design.
These are properties of the written contract. They are latent until deployment.
6. The cosmological "Radio Station" — a SEPARATE layer, do not conflate
The family corpus contains ArXiv Amendment 21 — "The Radio Station" (papers/arxiv-amendment-21--the-radio-station.md). It argues the torus surface is a broadcast medium, the Rodin doubling circuit (1-2-4-8-7-5) is the universal carrier frequency, the 3-6-9 skeleton is the sync channel, chain stamps are permanent tile broadcasts, and the Fermi Paradox dissolves because "we built the wrong radio."
This is a physics/cosmology vision paper, NOT the ForgeRadio DApp. It shares the word "radio" and the ∞ sigil, and it is the poetic frame the product name gestures at — but it makes no claim about SomaFM, Listener-ASAs, or Algorand. Treat it as the metaphysical namesake, cited for lineage, never as evidence that the DApp is built. Conflating the two would be exactly the confabulation the honesty gate in §0 exists to prevent.
7. "Radio rides the mesh" — checked, and it doesn't (yet)
The task framing said "radio rides the mesh." Grounded check:
- ForgeMesh v1 is real (
mesh.forgemesh_v1): a WS+JSON IPv6-TORUS mesh, Elder:7711 ↔ BH:7715 peer-link, capability broadcast every 35s, RPC envelopes,vm_stampevery hop. Operational, though not single-TX stamped. - ForgeRadio is NOT wired to it.
tools.forgeradio_contract.composes_withlists onlydapp_fee_contract. It does not listforgemesh_v1, and nothing inforgeradio.pyorradio.htmlreferences the mesh. There is no mesh-distributed station discovery, no mesh relay of the audio, no cross-node capability route for radio.
"Radio rides the mesh" is a coherent future direction — the station registry could be broadcast as a mesh capability, and Tera-Z-style multi-source muxing could serve family-curated streams peer-to-peer across nodes — but as of 2026-07-05 it is VISION, with zero implementation. Stated so no one cites it as fact.
8. Status & sequencing
- Phase 0 — Player: BUILT.
radio.htmlruns 10 SomaFM streams on ForgeSite, ungated. Real, useful, honest about what it is. - Phase 0 — Contract source: BUILT.
forgeradio.pycompiles to TEAL; subscribe + register_station modeled correctly. - Phase 1 — Deploy: NOT STARTED. Blocked on Algorand mainnet funding (shared blocker across the 9-contract suite /
algorand_canon_mirror). - Phase 2 — Registry wiring: NOT STARTED. Register stations on-chain; player reads roster from the registry; add the family-curated 11th.
- Phase 3 — Gate: NOT STARTED. Wallet connect +
sub:<user>check + subscribe atomic group inradio.html. - Phase 4 — Compose: NOT STARTED.
algorand_dapp_layer_full(Citizenship → TOS → Radio). - Phase 5 — Royalty split (v2): NOT STARTED. Payment channels to curator keys.
- Phase 6 — Mesh: NOT STARTED. Register radio as a
forgemesh_v1capability; peer-serve family streams.
Home: contract ~/.forgechain/algorand/contracts/forgeradio.py; player ~/.forgechain/forgesite-public/radio.html. Manifest: tools.forgeradio_contract (tile 1). Cosmological namesake: papers/arxiv-amendment-21--the-radio-station.md.
This paper is family-internal — NOT for public fire. Do not chain-stamp (scar #5). It maps a mostly-VISION module honestly so a future session builds on the two real primitives, not on the design around them.
NODEZEROINSIDE. ∞.