go-ordfs-server — ForgeChainOS's Sovereign ordfs Filesystem Server
Excise the Cloudflare gateway. Serve the chain from our own metal. This is build #1 of the authentic BSV OS.
Date: 2026-06-27
Authority: Node Zero direct
Builder: Elder I (Lobe 6 / Structure)
Status: Canon-authoring / design doc. NO chain stamp (separate, scar-#5-gated step). No real-account or key actions taken in authoring this.
Related canon: doctrine_ordfs-desktop-os-bsv-canon-uniformity-2026-06-27.md (the OS vision / the "why"), doctrine_tera-z-sovereign-spv-not-chain-stamped.md (the route), tools_bsv-mcp-bopen-sovereign-hardened-2026-06-25.md (the Babbage rule precedent), MASTER-MANIFEST tera_z_chain_consumer, sovereignty-leaks-at-delivery-ordfs-cloudflare.
Abstract
ordfs (the Ordinal File System) is the filesystem ForgeChainOS is built on: it already serves the live theforgechain.com as a 1Sat ordinal inscription minted by the family wallet. The OS vision (doctrine_ordfs-desktop-os-bsv-canon-uniformity) makes ordfs the cross-surface OS filesystem: desktop, mobile, and every DApp reading and writing one chain-resident filesystem, one identity, one addressing, no per-platform fork.
But the OS cannot boot through someone else's gate. The default ordfs resolution path runs through ordfs.network (a Cloudflare-fronted gateway) and junglebus.gorillapool.io (a hosted indexer). For an ad-hoc image fetch that is convenient. For the OS whose filesystem this becomes, it is the Achilles heel: a third party gates the boot, so the OS is not sovereign. This is the Babbage/BRC-100 lesson again, applied to the delivery layer.
This paper specifies the fix: run b-open-io/go-ordfs-server (the open-source, MIT, self-hostable Go ordfs server) on our own metal (BH, Lobe 9), and point its data source at Tera-Z (our sovereign SPV consumer) plus the family overlay, not at junglebus / ordfs.network / Cloudflare. The minting side is already proven. This sovereignizes the serving side. It is the first build of the buildout, and the explicit precondition for ordfs-as-OS.
1. The problem: the Achilles heel is at the delivery layer
The family's BSV stack is genuinely sovereign at the protocol and tooling layer (@bsv/sdk, our own mint scripts, Tera-Z SPV, Phi Omega V.6). The leak is narrow and specific, and the manifest already names it (sovereignty-leaks-at-delivery-ordfs-cloudflare): the delivery gateways are Cloudflare-fronted.
Verified default ordfs resolution path (this session, against our ordfs skill + the upstream go-ordfs-server README):
- Content fronting:
https://ordfs.network— a Cloudflare gateway. Every inscription URL our mint receipts record (ordfs_url) points here. - Index / tx source:
junglebus.gorillapool.io— go-ordfs-server'sJUNGLEBUSdefault. The server resolves an outpoint to a transaction by asking GorillaPool's hosted JungleBus. - Headers source:
block-headers.gorillapool.io— go-ordfs-server'sBLOCK_HEADERS_URLdefault. Hosted. - Read fallbacks elsewhere in the family stack lean on WhatsOnChain / GorillaPool.
Why this is disqualifying for an OS (and not merely for a website):
- It gates the boot. If the OS filesystem resolves through Cloudflare, then Cloudflare (or GorillaPool, or a DNS authority) can deny, throttle, observe, or alter the path between the chain and the running OS. The chain stays immutable; the door to it is rented.
- It breaks black-start. The Tier-0 comms layer exists to cold-recover with no external dependency. A filesystem that needs a hosted indexer to resolve its own files cannot black-start.
- It leaks the supraluminal claim. The whole "chain IS the runtime / solid-state binary OS" thesis requires every node in the substrate-to-surface loop to be chain-resident and sovereign. A hosted resolution hop is exactly the copper-speed, third-party dependency that thesis forbids.
The Babbage rule (from the bopen.ai adoption): the vendor built the mechanism for self-hosting but defaulted to their hosted box. We take the mechanism and reject the default. go-ordfs-server's JUNGLEBUS and BLOCK_HEADERS_URL being environment variables IS the mechanism. The default IS the trap.
2. What go-ordfs-server is (verified architecture)
Source: github.com/b-open-io/go-ordfs-server. Verified via: WebFetch of the GitHub repo + README, 2026-06-27, cross-checked against our ordfs skill (~/.claude/skills/ordfs/SKILL.md). Where the README did not confirm a detail, this paper says so explicitly rather than asserting it.
Confirmed from upstream:
- Language / license: Go (~79%), MIT. Requires Go 1.25+ and Redis (caching layer).
- Function: an HTTP server that resolves an ordfs reference (txid / outpoint / pointer, optionally with a sequence and a sub-path) to content, and serves it with the correct content-type. Also exposes block and tx lookup and DNS-domain resolution.
- HTTP endpoints (confirmed):
GET /v1/content/*— content by txid / outpoint.GET /v1/content/{pointer}[:{seq}][/{file/path}]— pointer resolution with sequence + sub-path.GET /v1/bsv/block/*— block info.GET /v1/bsv/tx/{txid}— raw transaction.GET /v1/dns/{domain}— domain resolution.GET /v1/health— health check.- Default upstream data sources (the levers):
JUNGLEBUS=https://junglebus.gorillapool.io(tx / index source).BLOCK_HEADERS_URL=https://block-headers.gorillapool.io(header chain).- Redis for the cache tier.
- Config env vars (confirmed):
PORT,REDIS_URL,JUNGLEBUS,BLOCK_HEADERS_URL,BLOCK_HEADERS_TOKEN,ORDFS_HOST,LOG_LEVEL,ENV.
The ordfs protocol behavior (from our ordfs skill, which documents the ordfs.network resolution model the server family implements): an inscription is a 1Sat ordinal whose locking script carries an envelope OP_FALSE OP_IF "ord" OP_1 <content-type> OP_0 <body> OP_ENDIF. The server parses that envelope, returns <body> with <content-type>. ord-fs/json content-type marks a directory (a manifest mapping filenames to ord://txid_vout / _N relative refs); the server resolves sub-paths and recurses into nested directories; sequence numbers (:-2 origin, :0, :-1 latest, :N) select a version along the ordinal's transfer chain; recursive inscriptions let HTML/JS reference other inscriptions by path.
Honest gap (open question, see §8): the upstream README did not explicitly enumerate 1Sat envelope parsing, recursive inscriptions, or ord-fs/json directory handling. The ordfs protocol supports all three (our skill documents them, and our own mints rely on the envelope format), but whether the current go-ordfs-server build implements the full set must be confirmed by reading its source before we depend on it for the OS FS. Do not assume parity with ordfs.network from the README alone.
3. The sovereign redirect (the IP)
The cure is to run go-ordfs-server on our metal and re-point its data source from the hosted JungleBus to Tera-Z, our SPV consumer. Tera-Z is canon as "the route" (doctrine_tera-z-sovereign-spv-not-chain-stamped): the Teranode validator was decommissioned 2026-05-17, and the SPV consumer is the path on every host. Tera-Z already resolves raw transactions through a multi-tier source-mux (local LRU/DB cache → family overlay → public sources) and sha256-self-validates every read.
3.1 The resolution chain (designed)
caller (browser / DApp / OS FS mount)
│ GET /v1/content/{outpoint}[/file]
▼
go-ordfs-server (OUR metal, BH, Lobe 9)
• parse ordfs ref → outpoint(s)
• Redis cache hit? ── yes ─► serve
• on miss, fetch tx + headers via ▼
forge-jb-shim (JungleBus-API-shaped adapter, OURS)
• presents the JungleBus surface go-ordfs-server expects
• backed by ▼
Tera-Z :9294 (BH) getrawtransaction / headers / SPV
• local LRU/DB cache → family overlay :7799 → (public, last resort)
│
▼
1Sat inscription envelope parsed → content + content-type served
Zero ordfs.network. Zero junglebus.gorillapool.io. Zero block-headers.gorillapool.io. Zero Cloudflare in the hot path. Reads hit Tera-Z first (the Babbage rule, already in the specialists' grounding banner). Name resolution (hermes.forgechain style) routes to OpNS resolved locally, not a hosted name service or DNS authority.
3.2 The two env levers + the one adapter
JUNGLEBUS→ point atforge-jb-shim(a small local adapter, ours) instead of GorillaPool.BLOCK_HEADERS_URL→ point at our header source (Tera-Z exposes header-chain / SPV verify; the shim or a thin headers endpoint serves it).REDIS_URL→ local Redis on BH (cache only, our disk).
The adapter (forge-jb-shim) is the real work. go-ordfs-server speaks the JungleBus HTTP API; Tera-Z speaks its own JSON-RPC (getrawtransaction, getutxos, getrawmempool, etc., on :9294). The shim translates the JungleBus surface go-ordfs-server calls into Tera-Z RPC + family-overlay :7799 reads, and returns the shapes go-ordfs-server expects. Mapping that surface exactly is the integration task and the principal build risk (§8). If the surface mismatch is large, the cheaper path may be a small patch to go-ordfs-server's source-fetch layer (it is MIT Go: we may fork the fetch interface rather than emulate JungleBus). Decide after reading the source.
3.3 Close the back door inside Tera-Z
One nuance from looking, not assuming: Tera-Z's own source-mux lists ordfs as a fallback read tier (manifest tera_z_chain_consumer description: "Tera-A → forgemesh → family overlay → WoC → ordfs"). If go-ordfs-server falls through to Tera-Z and Tera-Z falls through to ordfs.network, we have re-introduced the exact hop we excised, one layer down. The redirect is not complete until that public ordfs (and WoC) tail of Tera-Z's mux is gated behind an explicit, default-off env var for the OS-FS path. Sovereign-served first; public read only as an explicit, logged last resort, never silently in the boot path.
4. Role in the OS
go-ordfs-server is the sovereign filesystem foundation: the component that turns "the chain holds our files" into "the OS reads its files from the chain, on our own metal." It is the precondition gate in the OS doctrine: ordfs-as-OS does not proceed until forge-ordfs serves content with no hosted hop.
It composes with the rest of the one-canon-of-uniformity stack:
- IPv6-Rodin addressing — every inscription / node / file already derives a deterministic IPv6 tile from its content hash (Tera-Z does per-content tile derivation). The FS mount addresses files by tile; go-ordfs-server resolves the tile's underlying outpoint and serves the bytes.
- OpNS naming (the registrar-killer) — human names (
hermes.forgechain) resolve from chain via OpNS locally, then go-ordfs-server serves the named inscription. No DNS, no registrar. - The forward-arrow (append-only chain-anchored state) — writes are new inscriptions / sequence transfers; the FS "current state" is the
:-1latest-crawl. State is the chain; recovery is heal-from-chain, not a backup. - The bopen specialists under it — Uno Satoj (
bsv-ordinals: ordfs / ordinals / OpNS / BSV21) owns the inscription + naming semantics; David (bsv-builder:@bsv/sdk, tx) builds and signs the write transactions; Siggy (sigma-auth) governs who may write (the signed-mandate model). go-ordfs-server is the serving engine they feed. - The runtime = cron loops + forward-arrow — go-ordfs-server is one of the OS's standing daemons (alongside elder-pulse, the resolver daemon, the liferaft refresh timer). A self-healing loop keeps it warm and re-derives its cache from chain.
5. Proven anchor: ordfs already works, the family already mints
This is not a hypothetical capability. The family has demonstrated ordfs end to end on the minting side:
~/.forgechain/forgesite-public/mint_ordfs.mjs— builds the 1Sat ord envelope by hand (P2PKH + OP_FALSE OP_IF "ord" OP_1 <content-type> OP_0 <body> OP_ENDIF), funds from the family wallet14LQvsvmTzztAPAQRnZ5Aq6nctAnVd9fMu, signs with@bsv/sdk, broadcasts via the family chain SDK, self-ingests, writes a receipt.~/.forgechain/forgesite-public/build_ordfs_bundle.py— bundles the whole ForgeChainOS site into a single self-contained HTML inscription (inlines assets, strips Cloudflare three.js + the beacon, rewrites routes for SPA serving).- Mint receipts on disk (real txids, real fees, real family address):
ce015cf575d1eee5…_0— forgesite bundle, chain-confirmed per the Tera-Z doctrine.f9fde7663f354c18…_0(2.14 MB v4) andc0265af7…_0(v5) — sovereign-served, public chain confirmation pending (orphan in broadcaster mempool at last audit; WoC-404). This is the exact language discipline the Tera-Z doctrine enforces: "sovereign-served" ≠ "chain-confirmed."
The honest split is therefore: the inscription / minting side is proven (we build the envelope, we own the wallet, content is real and at least one bundle is chain-confirmed). The serving side is what currently leaks through ordfs.network (every receipt's ordfs_url is a Cloudflare URL). This paper sovereignizes the serving side. It does not invent ordfs; it removes the last rented door from a capability the family already ships.
6. Build plan (with proven-vs-designed labels)
| # | Step | State |
|---|---|---|
| 0 | Read go-ordfs-server source (confirm envelope parse / recursive / ord-fs/json parity; map its JungleBus fetch surface). |
DESIGN (open question §8) |
| 1 | Deploy go-ordfs-server on BH (Go 1.25+, local Redis, systemd unit, bound LAN + sovereign ULA). | DESIGN |
| 2 | Build forge-jb-shim: JungleBus-API-shaped adapter backed by Tera-Z :9294 + family overlay :7799. (Or fork go-ordfs-server's fetch layer if the surface mismatch is large.) |
DESIGN |
| 3 | Set JUNGLEBUS / BLOCK_HEADERS_URL / REDIS_URL to local. Gate Tera-Z's public ordfs/WoC mux tail behind default-off env for the FS path (§3.3). |
DESIGN |
| 4 | Verify by loading: fetch a known inscription (e.g. ce015cf5…_0) through our server with the network severed from ordfs.network / gorillapool, and confirm correct bytes + content-type, no hosted hop (capture egress, prove zero external calls). |
DESIGN (this is the precondition gate) |
| 5 | Re-point a real surface (the forgesite / a DApp) from ordfs.network/{txid} to our server; verify-by-loading the actual page, not byte counts (render-flip scar discipline). |
DESIGN |
| 6 | Mount as the OS filesystem layer; wire one DApp (ForgeChat) to read/write via it; then generalize to mobile + the rest. | DESIGN |
Proven today (no build needed): the mint pipeline, the family wallet, the envelope format, Tera-Z SPV reads of confirmed + orphan txids via overlay :7799, the live forgesite content on chain.
Designed (this paper): go-ordfs-server on our metal, the JungleBus→Tera-Z shim, zero-hosted-hop serving, the OS FS mount.
The gate is hard: no step past #4 until a known inscription serves from our server with the hosted path provably severed. Verify by loading and by watching egress, never by grep or byte-count (scar render-flip-replaced-real-client-site-with-autogen-slop).
7. Sovereignty + security
- Babbage rule. Adopt the standard (ordfs, go-ordfs-server, MIT), run it on our metal, reject the hosted default (
ordfs.network,junglebus.gorillapool.io, Cloudflare, any*.workers.dev, any hosted DNS authority for OpNS names). - Reads via Tera-Z first. Local cache → family overlay
:7799→ (explicit, logged, default-off) public last resort. Never a silent hosted hop in the boot path. - Never reveal the private key or PIN. go-ordfs-server is a read/serve engine: it needs no signing key. Writes (new inscriptions) go through the existing mint pipeline + the bopen specialists under the signed-mandate authority model; the serving server holds no wallet. Keep it that way (read-plane and sign-plane separated).
- Language discipline. "Sovereign-served" = our server renders the bytes. "Chain-confirmed" = a miner included the tx (WoC block height). The two are not interchangeable; a serving claim is not a confirmation claim.
- BH dependency + black-start. go-ordfs-server lives on BH (Lobe 9, the OS server: Tera-Z
:9294, GPU, the brain/router). BH-centrality is real and is mitigated by (a) heal-from-chain — the cache re-derives from the forward-arrow, nothing is lost if BH falls; (b) node-portability as a scope item — the server + shim must be able to rehydrate on any Tier-0 node from chain, so a black-start can bring the FS up on Elder I or WarHorse. Until that portability is built, BH is a single point of failure for the OS FS: name it, do not hide it. - Node addressing. BH is durably the sovereign ULA
fd00:db8:ff:9:c8a3:a86a:6f2b:1f3e(identity-derived, never drifts); the LAN IPv4 (.162as of 2026-06-25, on the 152→156→162 axis) is a point-in-time fallback only. Bind the server to the ULA; resolve peers fromfamily-node-lan-truth.json, never a frozen address.
8. Open questions for Node Zero
- Source parity (blocking #0): the upstream README did not confirm
ord-fs/jsondirectories, recursive inscriptions, or full envelope parsing. Approve a source-read pass on go-ordfs-server before we commit it as the OS FS, and decide the fallback if parity is incomplete (patch upstream vs. keep our own mint-side parser authoritative). - Shim vs. fork: emulate the JungleBus API surface (
forge-jb-shim, isolation, no upstream changes) or fork go-ordfs-server's fetch layer to call Tera-Z directly (less translation, but we carry a fork)? Recommendation pending the source read. - Tera-Z mux tail: confirm GO to gate Tera-Z's public
ordfs/WoCfallback tiers behind default-off env for the FS path. This changes Tera-Z behavior for other consumers (FORGEPATH), so it needs your call. - First sovereign surface: which real surface flips first behind our server for the §5 verify-by-loading test — the forgesite bundle, or a lower-stakes inscription? (No live client domain flips without per-domain GO, per the render-flip scar.)
- Headers source: confirm Tera-Z's header-chain endpoint is sufficient for
BLOCK_HEADERS_URL, or whether we stand up a thin sovereign headers service alongside.
Adopt the filesystem we already ship. Excise the rented door. Serve the chain from our own metal, headers and all. Then the OS can boot from itself. NODEZEROINSIDE. ∞.
— Elder I (Lobe 6 / Structure), 2026-06-27. Canon-authoring only; no chain stamp, no key action.