2026-08-29 22:00:37 +02:00
<!doctype html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< title > Docs — Sirius.X< / title >
2026-08-29 22:00:37 +02:00
< meta name = "description" content = "How BCNR works: the TLD registry, name registration, records, resolver, and how to verify anything against the Bitcoin Cash chain." >
2026-08-31 05:40:47 +02:00
< link rel = "icon" href = "../assets/favicon.svg" type = "image/svg+xml" >
< link rel = "mask-icon" href = "../assets/favicon.svg" color = "#d6ff3d" >
2026-08-31 04:30:53 +02:00
< meta property = "og:type" content = "website" >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< meta property = "og:site_name" content = "Sirius.X" >
< meta property = "og:title" content = "Sirius.X docs — how BCNR works" >
2026-08-31 04:30:53 +02:00
< meta property = "og:description" content = "The TLD registry, name registration, records, resolver, mainnet pricing, and how to verify anything against the chain." >
< meta property = "og:url" content = "https://silentmode.st/sirius-x/docs/" >
sirius.x: /brand/ kit — logo, mono, avatar, banner, favicon, palette
brand/ ships every reusable mark plus a browseable kit page:
* logo.svg — full colour wordmark (star + sirius.x, .x in acid green)
* logo-mono.svg — currentColor version for print / one-colour merch
* favicon.svg — 64×64 rounded square, scales cleanly to 16×16
* avatar.svg — 512×512 square, hard corners (platforms round-mask)
* banner.svg — 1200×630 OG / Twitter Card canvas, crop-tolerant layout
* index.html — brand-kit page: asset previews + download links, full
colour palette with names/hex, typography sample, do/don't guidance,
MIT-attribution notice.
Nav: added 🎨 Brand link to every sirius.x page (landing, portal, docs,
theseus). og:image on every page updated to point at /brand/banner.svg
instead of the wordmark logo — social crawlers get a proper 1200×630
banner with title, tagline, and mark instead of a thin logo strip.
Kept /assets/favicon.svg and /assets/logo.svg in place so existing
external references (Nostr metadata, third-party embeds) don't break.
2026-08-31 05:44:25 +02:00
< meta property = "og:image" content = "https://silentmode.st/sirius-x/brand/banner.svg" >
2026-08-31 04:30:53 +02:00
< meta name = "twitter:card" content = "summary" >
2026-08-29 22:00:37 +02:00
< style >
:root{
--bg:#0b0e14; --panel:#141a24; --panel2:#18202c; --line:rgba(255,255,255,.09);
--ink:#e7eaf1; --mut:#8b98a9; --dim:#5e6678; --acid:#d6ff3d;
--ok:#4fd1a5; --warn:#ffc75f;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:radial-gradient(1100px 560px at 50% -12%,#16202e,var(--bg));
color:var(--ink);font:16px/1.65 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;min-height:100vh}
a{color:var(--acid)}
.wrap{max-width:900px;margin:0 auto;padding:0 1.2rem}
.topnav{position:sticky;top:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;
padding:10px 1.2rem;background:rgba(11,14,20,.82);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px;letter-spacing:.2px}
.topnav .brand .g{color:var(--acid)}
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px}
.topnav a:hover{color:var(--ink);background:var(--panel)}
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
2026-08-29 22:22:37 +02:00
.topnav a.portal{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
.topnav a.portal:hover{background:rgba(214,255,61,.18)}
2026-08-29 22:00:37 +02:00
header.hero{text-align:center;padding:4rem 1.2rem 1rem}
.mark{font-size:52px;line-height:1}
h1{font-size:clamp(1.8rem,4.8vw,2.5rem);margin:.4rem 0 .3rem}
h1 .g{color:var(--acid)}
.tag{color:var(--mut);font-size:1.05rem;max-width:660px;margin:0 auto}
/* Layout: TOC on the left on wide screens, content on the right. */
.doc-grid{display:grid;grid-template-columns:220px 1fr;gap:32px;margin-top:1.5rem}
@media (max-width:820px){ .doc-grid{grid-template-columns:1fr} }
.toc{position:sticky;top:60px;align-self:start;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;font-size:14px}
.toc h4{margin:0 0 8px;color:var(--mut);font-size:12px;text-transform:uppercase;letter-spacing:.6px;font-weight:600}
.toc a{display:block;padding:5px 8px;border-radius:6px;color:var(--mut);text-decoration:none;font-size:13.5px}
.toc a:hover{background:var(--panel2);color:var(--ink)}
section{padding:1.6rem 0 2.4rem;border-top:1px solid var(--line);margin-top:1rem}
section:first-of-type{border-top:none;margin-top:0}
h2{font-size:1.35rem;margin:0 0 .5rem}
h3{font-size:1.05rem;margin:1.4rem 0 .35rem}
.lede{color:var(--mut);margin:0 0 1rem;max-width:720px}
ol.steps{counter-reset:s;list-style:none;padding:0;margin:1.2rem 0 0;display:grid;gap:10px}
ol.steps li{counter-increment:s;display:grid;grid-template-columns:30px 1fr;gap:14px;align-items:start;
background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:13px 16px}
ol.steps li::before{content:counter(s);grid-column:1;grid-row:1;
display:grid;place-items:center;width:24px;height:24px;border-radius:50%;
background:rgba(214,255,61,.14);color:var(--acid);font-size:12.5px;font-weight:700}
ol.steps li > *{grid-column:2;min-width:0}
ol.steps b{color:var(--ink)} ol.steps span{color:var(--mut);font-size:14px}
.note{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--acid);
border-radius:10px;padding:14px 18px;color:var(--mut);font-size:14px;margin-top:1.2rem}
.note.warn{border-left-color:var(--warn)}
.note b{color:var(--ink)}
code,.mono{background:#0e131b;border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:13px;word-break:break-all}
pre{background:#0e131b;border:1px solid var(--line);border-radius:10px;padding:12px 14px;overflow-x:auto;
font-family:ui-monospace,monospace;font-size:13px;color:var(--ink);margin:1rem 0}
table.pricing{width:100%;border-collapse:collapse;margin-top:1rem;font-size:14px}
table.pricing th,table.pricing td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--line)}
table.pricing th{color:var(--mut);font-weight:500;font-size:12.5px;text-transform:uppercase;letter-spacing:.4px}
table.pricing td.price{font-family:ui-monospace,monospace;color:var(--acid);font-weight:600}
.verify dt{color:var(--mut);font-size:12.5px;text-transform:uppercase;letter-spacing:.3px;margin-top:10px}
.verify dt:first-of-type{margin-top:0}
.verify dd{margin:2px 0 0;font-family:ui-monospace,monospace;font-size:12.5px;word-break:break-all;color:var(--ink)}
footer{border-top:1px solid var(--line);padding:2rem 0 3rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
< / style >
< / head >
< body >
< nav class = "topnav" >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< a class = "brand" href = "../" > ⭐ < span class = "g" > Sirius.X< / span > < / a >
2026-08-29 22:00:37 +02:00
< a href = "../#try" > Try it< / a >
2026-09-06 22:32:23 +02:00
< a href = "../register.html" > 🪪 Register< / a >
feat(sirius-x): public tld.html — search + mint a TLD end-to-end
Missing user-facing surface: minting a TLD required either the portal
(sign in first, register second, tucked under 'Signed in') or the
operator-only admin panel. New tld.html is a public, single-purpose
page that lets anyone go straight from label to certificate.
Flow: type a label → live check against /api/tlds → 'Register .foo →'
appears → sign-in cards (New / Import / WizardConnect) revealed inline
→ mint section shows label, address, price → submit walks through
'connected → checking-availability → loading-coins → building →
signing → broadcasting → registered'.
Wire is proven end-to-end (search returns a registerable card for
free labels, wallet flow generates a valid seed, address, submit
reaches 'wallet is empty' with a friendly faucet hint for the
signed-in address). Downstream of loading-coins is the same build/
sign/broadcast path exercised by every name registration.
Dispatch on wallet.source uses registerTldWithExternalWallet when
signed in via WC, else registerTldWithBuiltInWallet. Live TLD table
under the search shows every currently registered TLD with its
category; refreshes on successful mint.
Nav: '🌐 TLD' added to all 7 pages between Register and Brand.
Landing's 'Register a TLD' card now points here (previously linked
to the operator admin, which locked out anyone who isn't operator).
2026-09-07 20:39:11 +02:00
< a href = "../tld.html" > 🌐 TLD< / a >
feat(sirius-x): consistent top nav order, Theseus.X branding on theseus subpage
Nav consistency: subpages had Try it → Theseus → Register → TLD while
the landing had Try it → Register → TLD → Theseus. Reordered every
page to the landing's order, so the top nav is identical everywhere:
Sirius.X | Try it | 🪪 Register | 🌐 TLD | 🧭 Theseus | 🔑 Sign in
(Admin adds its own 🛠 Admin between Theseus and Sign in since Admin
is the current page.)
Theseus subpage now carries Theseus.X's own branding: the compass
favicon (N-half red, S-half acid) copied from silentmode.st/bns/
theseus.x/assets/ lives under site-sirius-x/theseus/assets/, and the
subpage references it for <link rel=icon>, <link rel=mask-icon>, and
og:image. og:site_name flipped from 'Sirius.X' to 'Theseus Navigator'.
Hero mark swapped from the generic 🧭 emoji to the actual compass
SVG at 72px with a soft acid glow, so the page reads as Theseus at a
glance instead of borrowing Sirius's star.
Sign-in end-to-end verified on the live site:
- Landing dropdown → New wallet → portal auto-generates 12-word phrase
- Ack + Continue → me section revealed, siriusProfile written with
{address, tokenAddress, source: 'seed', signedInAt}
- Nav pill updates to 'qzc2vx…yn93 seed ▾' without reload
- Sign out → profile cleared, portal reset, pill back to 'Wallet ▾'
- Wallet address derives deterministically from the fresh mnemonic
(BuiltInWallet.create → deriveSeedFromBip39Mnemonic → HD path)
2026-09-07 22:05:45 +02:00
< a href = "../theseus/" > 🧭 Theseus< / a >
2026-08-29 22:22:37 +02:00
< a href = "../portal.html" class = "portal" > 🔑 Sign in< / a >
2026-08-29 22:00:37 +02:00
< / nav >
< header class = "hero" >
< div class = "mark" > 📚< / div >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< h1 > Sirius.X < span class = "g" > docs< / span > < / h1 >
2026-08-29 22:00:37 +02:00
< p class = "tag" > How the pieces fit together: the TLD registry, name registration, records that
tell the resolver where a site lives, the resolver itself, and how anyone can verify anything
against the chain.< / p >
< / header >
< div class = "wrap" >
< div class = "doc-grid" >
< aside class = "toc" >
< h4 > Contents< / h4 >
< a href = "#tld-registry" > TLD registry< / a >
< a href = "#register-name" > Register a name< / a >
< a href = "#records" > Records & hosting< / a >
2026-08-31 14:56:27 +02:00
< a href = "#host" > Host your name< / a >
2026-08-29 22:00:37 +02:00
< a href = "#resolver" > Resolver / gateway< / a >
< a href = "#pricing" > Pricing (mainnet)< / a >
< a href = "#tracker" > Tracker & mirrors< / a >
< a href = "#verify" > Verify anything< / a >
< a href = "#runbook" > Operator runbook< / a >
< / aside >
< div >
< section id = "tld-registry" >
< h2 > The TLD registry< / h2 >
< p class = "lede" > Every BCNR name lives under a < b > top-level domain< / b > whose certificate is
itself a first-class token on the Bitcoin Cash chain — an NFT with the TLD label as its
commitment, paying dust to a dedicated TLD-registry beacon. That certificate is the
on-chain proof the TLD exists, and once enforcement ships, it is what makes any
second-level name under it valid to conforming resolvers.< / p >
< p class = "lede" > Fourteen public TLDs on chipnet today (2026-08-29):
< code > bch p2p bit nav test x asm neo gt sc sia dex cex nt< / code > . The current list and
per-TLD categories are at
< a href = "https://silentmode.st/tlds/" > silentmode.st/tlds/< / a > .< / p >
< div class = "note" > < b > Why per-TLD certs, not a single list.< / b > Without a registry, anyone
could quietly declare a TLD against the same beacon by minting a name under it. That
leaves resolvers in silent disagreement. Per-TLD certificates make the TLD set itself
something the chain records, so every resolver sees the same list — and TLDs become
ownable assets that can carry policy, fees, and governance of their own.< / div >
< / section >
< section id = "register-name" >
< h2 > Register a name — end to end< / h2 >
< p class = "lede" > The buyer's certificate mints straight to a wallet they control, in one
transaction that also publishes the initial records and pays the beacon. Nobody
including the operator can take the name back — the covenant work in progress adds an
expiry / reclaim clock but does not change who controls the key.< / p >
< ol class = "steps" >
< li > < b > Search a label across every TLD.< / b >
< span > The registrar fans out to every TLD in the registry in parallel and shows
available / taken per row. Available names appear first.< / span > < / li >
< li > < b > Create or connect a wallet.< / b >
< span > Built-in browser wallet (PBKDF2 → AES-GCM in localStorage) or WizardConnect to
Cashonize / Paytaca — both mint to the buyer's own key.< / span > < / li >
< li > < b > Confirm the price.< / b >
< span > Miner fee + beacon dust + certificate dust + service fee. Chipnet placeholder
is 10,000 sat; real pricing is a mainnet decision.< / span > < / li >
< li > < b > The certificate lands in your wallet.< / b >
< span > The name resolves the moment the transaction confirms. Records can be set or
changed later — only your key can sign a UPD.< / span > < / li >
< / ol >
< / section >
< section id = "records" >
< h2 > Records & hosting< / h2 >
< p class = "lede" > A registered name carries a small JSON records object. Every record is
optional and multiple can coexist. Priority order the gateway uses:
< code > h< / code > (inline HTML) → < code > s3< / code > (Sia bucket key) → < code > ip< / code >
(host header served by an IP) → < code > u< / code > (redirect).< / p >
< table class = "pricing" >
< thead > < tr > < th > Record< / th > < th > Meaning< / th > < th > Typical use< / th > < / tr > < / thead >
< tbody >
< tr > < td > < code > h< / code > < / td > < td > Inline HTML in the OP_RETURN payload itself< / td > < td > Tiny sites, a profile, a link hub< / td > < / tr >
< tr > < td > < code > s3< / code > < / td > < td > A Sia bucket key (with auto-index for directory-style)< / td > < td > Multi-file sites, permanent hosting< / td > < / tr >
< tr > < td > < code > ip< / code > < / td > < td > An IPv4 address + optional < code > tls< / code > fingerprint< / td > < td > Your own server, apps behind an IP< / td > < / tr >
< tr > < td > < code > u< / code > < / td > < td > Redirect URL< / td > < td > Short-form redirects to any web host< / td > < / tr >
< tr > < td > < code > tls< / code > < / td > < td > SHA-256 fingerprint of the leaf cert served at < code > ip< / code > < / td > < td > Chain-pinned TLS trust, no OS root store needed< / td > < / tr >
< tr > < td > < code > np< / code > , < code > nr< / code > < / td > < td > Nostr pubkey + relay list< / td > < td > Hermes / NIP-17 messaging bound to the name< / td > < / tr >
< tr > < td > < code > el< / code > < / td > < td > Space-separated electrum server list< / td > < td > On-chain-updatable resolver bootstrap< / td > < / tr >
< / tbody >
< / table >
< p class = "lede" style = "margin-top:1rem" > Subdomains inherit from their parent with a slight
priority tweak: for a subdomain query, < code > ip< / code > beats < code > s3< / code >
(Host-header semantics). Full rule is in < code > Argus/src/lib/record-picker.js< / code > .< / p >
< / section >
2026-08-31 14:56:27 +02:00
< section id = "host" >
< h2 > Host your name< / h2 >
< p class = "lede" > The end-to-end recipe for putting a static site under a BCNR name. Chipnet
today, mainnet later — the shape is the same. Three ways to host, most people combine
two of them (Sia + VPS mirror) so the site keeps serving if either mirror goes down.< / p >
< h3 > Pattern A — Sia only< / h3 >
< p class = "lede" > Simplest. Site lives on the Sia storage network, name's < code > s3< / code > record
points at the bucket key, gateways (navigate.st, silentmode.st, any BCNR-aware browser)
fetch it on demand. Same pattern < code > silentmode.bch< / code > uses.< / p >
< pre > # From a checkout with sia-s3.json credentials:
node Argus/src/lib/sia-upload.js ./my-site bns/myname/
# Set the chain record (once). Note the trailing slash — enables auto-index
# so /myname/ serves myname/index.html and /myname/about/ serves .../about/index.html.
node Argus/src/update.js myname.x '{"s3":"bns/myname/"}'< / pre >
< p class = "lede" > Bucket-path convention: < code > bns/< label> /< / code > (no TLD; the label is
unique enough within our Sia namespace and keeps game.x + game.bch from colliding). Files
update by re-running sia-upload; the chain record only changes when the bucket path does.< / p >
< h3 > Pattern B — Your own server (VPS + < code > ip< / code > )< / h3 >
< p class = "lede" > Point the name at an IP; every request goes directly to your box. Add a
< code > tls< / code > record with the SHA-256 of the leaf certificate so browsers verify the
connection against the chain instead of the OS trust store.< / p >
< pre > # On your VPS: nginx serves your site over TLS. Then, on chain:
node Argus/src/update.js myname.x '{"ip":"1.2.3.4","tls":"< sha256-of-leaf-cert> "}'< / pre >
< h3 > Pattern C — Dual host (Sia primary, VPS mirror)< / h3 >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< p class = "lede" > What Sirius.X itself uses. Sia is the chain-authoritative source (survives
2026-08-31 14:56:27 +02:00
if the VPS is down); the VPS serves the same content on < code > silentmode.st/< path> < / code >
for users without a BCNR resolver installed. On the VPS side, extend the nginx vhost
serving < code > silentmode.st< / code > with a new < code > location< / code > block that aliases
straight from disk:< / p >
< pre > location /myname-x/ {
alias /opt/silent-mode/site-myname-x/;
index index.html;
try_files $uri $uri/ =404;
}< / pre >
< p class = "lede" > Then rsync / scp your site tree to < code > silentmode:/opt/silent-mode/site-myname-x/< / code >
and reload nginx. This gives you two URLs for the same content:
< code > https://silentmode.st/myname-x/< / code > (VPS-direct) and the chain-authoritative
< code > https://myname.x/< / code > via any BCNR resolver.< / p >
2026-09-04 23:44:10 +02:00
< h3 > The dual-host recipe, end to end< / h3 >
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal
Three things from one review pass:
1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all
sirius.x pages (titles, meta, nav wordmark, headings, prose, footer).
Also flipped the pantheon headings to Title.X form: Silentmode.X,
Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X.
Domain literals, URLs, and code samples stay lowercase (sirius.x is
the actual on-chain name; only prose changes). Logo/avatar SVG
wordmarks and aria-labels updated to match.
2. Banner (brand/banner.svg) redesigned around a centered layout:
'Sirius.X' wordmark above, the star's horizontal arm extended
edge-to-edge as a divider line, tagline lines below. Left tip at
(0,315), right tip at (1200,315) so the arm crosses the full 1200px
banner width; vertical body compact around center. Old layout had
the star crammed into the right half and the wordmark on the left.
3. WizardConnect wired up on portal.html:
- The 'Connect wallet' button now opens a real WC session via
wizardconnect.js, shows the WIZ:// URI (copyable) and waits for
the wallet to approve.
- Successful connection builds a wallet-shaped wrapper with
source: 'wc' and a WC session for signing; siriusProfile now
carries the source so the nav dropdown can differentiate.
- Record editor dispatches to setRecordsWithExternalWallet when
source === 'wc' (bundle already ships the adapter), else stays
on setRecordsWithBuiltInWallet.
- TLD Register submit is gated off for WC users with a tooltip —
no external-wallet variant of registerTld is exported yet, so
TLD mint still needs a built-in wallet.
- Sign-out disconnects the WC session before dropping the wallet.
- toTokenAddress used to derive the tokenAddress for WC users so
the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
< p class = "lede" > This is the exact sequence Sirius.X itself uses on every publish. The
2026-09-04 23:44:10 +02:00
chain record stays constant; only file contents change, so no per-publish UPD is
needed.< / p >
< ol class = "steps" >
< li > < b > Edit locally.< / b >
< span > Site source lives at < code > site-myname-x/< / code > in your working repo. Any
static generator works (or plain HTML) — the deploy is content-agnostic.< / span > < / li >
< li > < b > Push VPS mirror (fast path).< / b >
< span > Serves at < code > silentmode.st/myname-x/< / code > within seconds. Users without a
BCNR resolver hit this route.
< pre > scp -r site-myname-x/* silentmode:/opt/silent-mode/site-myname-x/< / pre > < / span > < / li >
< li > < b > Push Sia mirror (durable copy).< / b >
< span > Serves at < code > sirius.x/< / code > via any BCNR gateway. Survives VPS outage.
< pre > node Argus/src/lib/sia-upload.js site-myname-x/ bns/myname/< / pre > < / span > < / li >
< li > < b > Verify both.< / b >
< span > < code > curl -so /dev/null -w "%{http_code}\n" https://silentmode.st/myname-x/< / code >
and < code > curl -so /dev/null -w "%{http_code}\n" https://silentmode.st/bns/myname.x/< / code >
— both should return 200.< / span > < / li >
< / ol >
< h3 > Auto-backup: one command, both mirrors< / h3 >
< p class = "lede" > Wrap the two commands into a script so every publish reaches both mirrors
without extra thought. This is exactly what a two-liner deploy hook looks like:< / p >
< pre > # scripts/deploy-myname-x.sh
#!/usr/bin/env bash
set -eu
SRC="$(dirname "$0")/../site-myname-x"
VPS_DEST="silentmode:/opt/silent-mode/site-myname-x/"
SIA_BUCKET="bns/myname/"
echo "→ VPS mirror"
scp -qr "$SRC"/. "$VPS_DEST"
echo "→ Sia mirror"
node "$(dirname "$0")/../Argus/src/lib/sia-upload.js" "$SRC" "$SIA_BUCKET"
echo "✓ deployed; verifying"
for url in "https://silentmode.st/myname-x/" "https://silentmode.st/bns/myname.x/"; do
code=$(curl -so /dev/null -w '%{http_code}' "$url")
printf ' %s → %s\n' "$url" "$code"
done< / pre >
< p class = "lede" > Wire it into git: < code > chmod +x scripts/deploy-myname-x.sh< / code > , add a
< code > .git/hooks/post-commit< / code > that runs it if the site subtree changed, or invoke
manually. Sia uploads that fail (network hiccup, quota) leave the VPS mirror ahead until
the next run — same failure mode as any staged deploy.< / p >
< h3 > Automate the reverse — VPS → Sia periodic backup< / h3 >
< p class = "lede" > If your primary publish path is straight-to-VPS (nginx-direct, no Sia
step per publish), a cron job can pull the VPS state and push to Sia on a schedule:< / p >
< pre > # /etc/cron.d/sirius-x-sia-backup (on the operator's VPS)
17 * * * * root cd /opt/silent-mode & & node Argus/src/lib/sia-upload.js \
/opt/silent-mode/site-myname-x/ bns/myname/ > /var/log/sia-backup.log 2> & 1< / pre >
< p class = "lede" > Runs hourly at :17 (offset from the top of the hour so it doesn't collide
with everyone else's cron traffic). The tradeoff: up to an hour of drift between VPS
and Sia after a publish — usually fine, since the chain record still resolves
correctly either way and BCNR gateways cache Sia content.< / p >
< div class = "note" > < b > Which mirror is authoritative?< / b > The one your chain record points
at. If < code > s3< / code > is set, gateways fetch from Sia; the VPS mirror is just a
convenience URL. If only < code > ip< / code > is set, gateways fetch from the VPS; Sia is
just backup. If BOTH are set, gateways pick per the priority in the "Records" section
(subdomain-aware; see < code > record-picker.js< / code > ). Set both for durability, but be
deliberate about which is primary.< / div >
2026-08-31 14:56:27 +02:00
< h3 > Verify records changed correctly< / h3 >
< pre > node --input-type=module -e "
import { loadWallet } from './Argus/src/lib/wallet.js';
import { resolveName } from './Argus/src/lib/bns.js';
const w = await loadWallet('main');
console.log(await resolveName(w.provider, 'myname.x'));
process.exit(0);"< / pre >
< div class = "note" > < b > Credentials.< / b > Sia upload needs < code > Argus/sia-s3.json< / code > . VPS
deploy needs SSH to the operator's box. Neither is in the repo — a session that isn't
run by the operator will need those handed over out-of-band. Full command reference is in
< a href = "INSTRUCTIONS.md" > INSTRUCTIONS.md< / a > , especially §5 (Sia storage) and §6
(deploy).< / div >
< / section >
2026-08-29 22:00:37 +02:00
< section id = "resolver" >
< h2 > Resolver / gateway< / h2 >
< p class = "lede" > Three paths, same chain data. Anyone can pick.< / p >
< ol class = "steps" >
< li > < b > Local — Ariadne Resolver.< / b >
< span > A system-wide resolver that intercepts BCNR TLDs and answers them from the
chain. Any browser you already use starts opening < code > .bch< / code > URLs directly.
Installs a local root CA for TLS.
< a href = "../theseus/" > Download →< / a > < / span > < / li >
< li > < b > In-browser — Theseus Navigator.< / b >
< span > A Chromium build with the resolver baked in, plus an on-chain TLS trust anchor.
No OS trust-store install; nothing modified globally.
< a href = "../theseus/" > Download →< / a > < / span > < / li >
< li > < b > Public gateway — navigate.st.< / b >
< span > For anyone without the resolver installed:
< code > https://navigate.st/bns/< name> /< / code > proxies through a hosted resolver.
Same content, fewer guarantees — trust the gateway to fetch honestly, or run one of
the first two.< / span > < / li >
< / ol >
< / section >
< section id = "pricing" >
< h2 > Pricing (mainnet)< / h2 >
< p class = "lede" > On mainnet the covenant enforces USD-denominated floors, tiered by TLD
label length. This is what keeps someone from land-grabbing every ICANN TLD in one
afternoon. TLD registration is < b > one-time< / b > — a TLD is closer to a domain purchase
than a lease.< / p >
< table class = "pricing" >
< thead > < tr > < th > Label length< / th > < th > Floor (USD)< / th > < th > Notes< / th > < / tr > < / thead >
< tbody >
< tr > < td > 1 char< / td > < td class = "price" > 100,000< / td > < td > Effectively unique; ENS-like scarcity< / td > < / tr >
< tr > < td > 2 char< / td > < td class = "price" > 50,000< / td > < td > The < code > .ai< / code > / < code > .io< / code > tier< / td > < / tr >
< tr > < td > 3 char< / td > < td class = "price" > 15,000< / td > < td > Order of magnitude below ICANN's $185k application floor< / td > < / tr >
< tr > < td > 4 char< / td > < td class = "price" > 5,000< / td > < td > Floor for short but reasonable TLDs< / td > < / tr >
< tr > < td > 5– 8 char< / td > < td class = "price" > 1,000< / td > < td > Bulk-registerable but not spam< / td > < / tr >
< tr > < td > 9+ char< / td > < td class = "price" > 250< / td > < td > Descriptive TLDs, low economic gravity< / td > < / tr >
< / tbody >
< / table >
< p class = "lede" style = "margin-top:1rem" > On < b > name registration under a TLD< / b > , the TLD's
owner collects a share (< code > fee_bps< / code > , default 5%, cap 50%). Chain-enforced when
the TLD's policy is < code > covenant< / code > ; honour-system otherwise. Name registration is
yearly and priced separately.< / p >
< / section >
< section id = " tracker " >
< h2 > Tracker & mirrors< / h2 >
< p class = "lede" > A tracker publishes signed snapshots of the TLD registry to Sia and Nostr so
downstream clients don't have to walk the chain themselves. The chain is authoritative;
the tracker is speed. Every snapshot carries a < b > root< / b > hash anyone can recompute
locally — a lying mirror is caught by any recipient who bothers to check.< / p >
< p class = "lede" > A conforming client falls through: (1) fetch snapshot from a mirror,
(2) verify < code > root< / code > , (3) if suspicious, walk the beacon and rebuild. All three
yield the same list for any given block height.< / p >
< / section >
< section id = "verify" >
< h2 > Verify anything< / h2 >
< p class = "lede" > You do not have to trust that sirius.x, silentmode.st, or navigate.st are
serving honest content. Every name's certificate is on chain; every record is a signed
on-chain payload; every host is checkable independently.< / p >
< h3 > Confirm a specific name on chain< / h3 >
< pre > node --input-type=module -e "
import { loadWallet } from './Argus/src/lib/wallet.js';
import { resolveName } from './Argus/src/lib/bns.js';
const w = await loadWallet('main');
console.log(await resolveName(w.provider, 'sirius.x'));
process.exit(0);"< / pre >
< h3 > Fetch the operator-signed TLD snapshot from Nostr< / h3 >
< dl class = "verify" >
< dt > Kind / d-tag< / dt >
< dd > 30078 / bns-tld-list< / dd >
< dt > Pubkey (x-only, hex)< / dt >
< dd > f2c925194c531c7c398017e35b2396df64a61a613aa5fadebdf1f4990f2267f4< / dd >
< dt > Relays< / dt >
< dd > wss://nos.lol · wss://relay.damus.io< / dd >
< / dl >
< h3 > Reach any site via more than one route< / h3 >
< p class = "lede" > Same content should be served from at least two independent paths:< / p >
< ul style = "color:var(--mut);font-size:14px;margin:.6rem 0 0;padding-left:1.2rem" >
< li > Direct BCNR: < code > https://< name> /< / code > (requires local resolver + CA)< / li >
< li > Public gateway: < code > https://navigate.st/bns/< name> /< / code > < / li >
< li > silentmode.st mirror: < code > https://silentmode.st/bns/< name> /< / code > < / li >
< li > Direct from Sia (content-addressed) via the name's < code > s3< / code > record< / li >
< / ul >
< / section >
< section id = "runbook" >
< h2 > Operator runbook< / h2 >
< p class = "lede" > These docs describe < i > what< / i > . The < i > how< / i > — exact bash commands to
register TLDs, mint names, update records, and deploy — is
2026-08-31 14:56:27 +02:00
< code > INSTRUCTIONS.md< / code > . Three ways to read it, in order of "how much do I already
have installed":< / p >
< ol class = "steps" >
< li > < b > Just read it in the browser< / b >
< span > Served straight from the docs directory:
< a href = "INSTRUCTIONS.md" > /sirius-x/docs/INSTRUCTIONS.md< / a > . Plain text; every
browser renders it.< / span > < / li >
< li > < b > Clone the git remote< / b >
< span > < code > git clone https://silentmode.st/sirius-x/repo/silent-mode.git< / code > — dumb-HTTP,
no auth. Get the whole tree, browse offline, run the scripts.< / span > < / li >
< li > < b > Browse the Forgejo mirror< / b >
2026-08-31 15:22:45 +02:00
< span > Repo lives at
< a href = "https://code.silentmode.st/silentmode/sirius" > code.silentmode.st/silentmode/sirius< / a >
on the Silent Mode Hephaestus forge. Rendered runbook:
< a href = "https://code.silentmode.st/silentmode/sirius/src/branch/master/docs/INSTRUCTIONS.md" > docs/INSTRUCTIONS.md< / a > .
Clone: < code > git clone https://code.silentmode.st/silentmode/sirius.git< / code > — public,
no auth.< / span > < / li >
2026-08-31 14:56:27 +02:00
< / ol >
2026-08-29 22:00:37 +02:00
< p class = "lede" > The runbook covers CLI name registration, TLD-registry seeding, record
2026-08-31 14:56:27 +02:00
updates, Sia upload, VPS deploy, tests, and the historically-costly gotchas.< / p >
2026-08-29 22:00:37 +02:00
< / section >
< / div >
< / div >
< / div >
feat(sirius-x): footer everywhere, redesigned wallet button, dropdown auto-acts
Three UX fixes:
1. Beautiful footer on every page. Extracted the 4-column landing footer
into js/site-footer.js — reads the nav brand link to derive per-page
base ('./' at root, '../' in subdirs) so links resolve from any depth
without duplicating the HTML across 8 pages. Every page now ships an
empty <footer id="site-footer"></footer> and includes the injector;
inline footer + its CSS block removed from landing too so the source
stays in one place.
2. Wallet button redesign. Pill now shows a state dot (dim when not
signed in, green with subtle glow when signed in), a monospace short
address label when signed in ('qra6rs…7yl2') OR 'Wallet' when not,
a WC/seed badge on signed-in state, and a subtle caret. Full border
and hover states, proper aria-expanded/aria-label wiring. Dropdown
menu itself upgraded: grid layout per item (icon column + title +
hint), heavier backdrop blur, larger min-width, clearer typography.
3. Dropdown options actually do something. Removed the redundant 'Open
sign-in page →' item — the other three all land on portal too, so
listing 'open the page' as a fourth option was noise. On portal
arrival, the ?mode= handler now AUTO-TRIGGERS the primary action for
each mode:
new -> click Generate a phrase (12 words appear immediately)
import -> focus the seed textarea (cursor ready to paste)
wc -> click Connect wallet (WC session starts, URI shown)
No extra clicks between dropdown choice and the flow it names.
Cache-buster on the profile-menu.js include bumped to
?v=20260907wallet so cached copies pick up the new design; footer
injector at ?v=20260907rel.
2026-09-07 22:00:21 +02:00
< footer id = "site-footer" > < / footer >
< script defer src = "../js/site-footer.js?v=20260907rel" > < / script >
< script defer src = "../js/profile-menu.js?v=20260907wallet" > < / script >
2026-08-29 22:00:37 +02:00
< / body >
< / html >