Fraunces/Ubuntu font picker is gone. theme.js used to persist the choice in localStorage and paint a pill in the corner; now it just sets data-font-cmp="ubuntu" on <html> so every page that already carries the html[data-font-cmp="ubuntu"] rules in its stylesheet switches to Ubuntu — the Bitcoin Cash brand face — on load. Same one-line runtime on both sirius-x and hephaestus.x theme.js. Mobile bottom nav rail was rgba(11,14,20,.52) with no blur, so whatever body text was scrolled behind it bled straight through the half-transparent bar — first sentence of How it works ended up visually merged with the sidebar icons on hephaestus.x, section headings ran under the Sirius.x rail. Bumped to rgba(...,.94) and added backdrop-filter:blur(12px); content underneath is now covered instead of showing through. Same tweak on all six Sirius.X pages plus Hephaestus.X home.
596 lines
36 KiB
HTML
596 lines
36 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Sirius.X — the home for names on Bitcoin Cash</title>
|
||
<meta name="description" content="Sirius.X is the operator-run entry point for BCNR: register a top-level domain, register a name under one, look up records, verify anything against the chain. Backed by Sia storage, mirrored on the operator's VPS, name published on the chain.">
|
||
<!-- sirius.x branding: SVG favicon at 16/32/any size (the star + dark rounded
|
||
square scales cleanly); OpenGraph + Twitter Card so shared links preview
|
||
with the right title, description, and mark. -->
|
||
<link rel="icon" href="./assets/favicon.svg" type="image/svg+xml">
|
||
<link rel="mask-icon" href="./assets/favicon.svg" color="#d6ff3d">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:site_name" content="Sirius.X">
|
||
<meta property="og:title" content="Sirius.X — the home for names on Bitcoin Cash">
|
||
<meta property="og:description" content="Register a top-level domain, register a name under one, look up records, verify anything against the chain. Backed by Sia + VPS + on-chain.">
|
||
<meta property="og:url" content="https://silentmode.st/sirius-x/">
|
||
<meta property="og:image" content="https://silentmode.st/sirius-x/brand/banner.svg">
|
||
<meta name="twitter:card" content="summary">
|
||
<meta name="twitter:title" content="Sirius.X — the home for names on Bitcoin Cash">
|
||
<meta name="twitter:description" content="Register a TLD or a name, look up records, verify against the chain. Your keys, your names.">
|
||
<!-- Silent Mode family fonts (Fraunces editorial + DM Sans body + JetBrains
|
||
Mono for code/hashes) plus Ubuntu as the Bitcoin Cash brand alt. Toggle
|
||
between Fraunces and Ubuntu lives in the top nav (see js/theme.js). -->
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600;9..144,700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
|
||
<style>
|
||
:root{
|
||
/* Deviant "signal" sky palette — shared with silentmode.st/deviant/. */
|
||
--bg:#050810; --panel:#141a24; --panel2:#0a0f1c; --line:rgba(255,255,255,.06);
|
||
--sky-mid:#0a0f1c; --sky-rim:#131a2a;
|
||
--ink:#f1f4fa; --mut:#b8c2d4; --dim:#6a7488; --acid:#d6ff3d;
|
||
/* #0AC18E = Bitcoin Cash brand green — used for chain-native badges */
|
||
--chain-native:#0AC18E;
|
||
--chain:#d6ff3d; --sia:#b39ddb; --srv:#4fd1a5; --ok:#4fd1a5; --taken:#f6768a;
|
||
--warn:#ffc75f;
|
||
--serif:'Fraunces',Georgia,serif;
|
||
--sans:'DM Sans','Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
|
||
--mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
|
||
}
|
||
*{box-sizing:border-box}
|
||
html{scroll-behavior:smooth}
|
||
body{margin:0;
|
||
background:radial-gradient(ellipse 1200px 600px at 50% -5%,var(--sky-rim) 0%,transparent 60%),
|
||
radial-gradient(ellipse 900px 500px at 100% 100%,var(--sky-mid) 0%,transparent 55%),
|
||
radial-gradient(ellipse 900px 500px at 0% 100%,#0c1424 0%,transparent 55%),
|
||
var(--bg);
|
||
background-attachment:fixed;
|
||
color:var(--ink);font:16px/1.6 var(--sans);min-height:100vh;
|
||
font-feature-settings:"ss01","ss02"}
|
||
h1,h2,h3{font-family:var(--serif);font-feature-settings:"ss01","ss02"}
|
||
code,.mono{font-family:var(--mono)}
|
||
/* Ubuntu reader-alt — swap when <html data-font-cmp="ubuntu"> */
|
||
html[data-font-cmp="ubuntu"] body,
|
||
html[data-font-cmp="ubuntu"] h1, html[data-font-cmp="ubuntu"] h2, html[data-font-cmp="ubuntu"] h3,
|
||
html[data-font-cmp="ubuntu"] p, html[data-font-cmp="ubuntu"] a, html[data-font-cmp="ubuntu"] button,
|
||
html[data-font-cmp="ubuntu"] span, html[data-font-cmp="ubuntu"] div,
|
||
html[data-font-cmp="ubuntu"] label, html[data-font-cmp="ubuntu"] input, html[data-font-cmp="ubuntu"] li{
|
||
font-family:'Ubuntu',system-ui,sans-serif !important
|
||
}
|
||
html[data-font-cmp="ubuntu"] code, html[data-font-cmp="ubuntu"] .mono{
|
||
font-family:var(--mono) !important
|
||
}
|
||
/* Font picker pill (lives inside .topnav) */
|
||
.font-picker{display:inline-flex;align-items:center;gap:2px;padding:2px;margin:0 10px;
|
||
background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:999px;
|
||
font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase}
|
||
.font-picker button{background:transparent;border:none;color:var(--dim);
|
||
padding:4px 10px;border-radius:999px;cursor:pointer;font-family:inherit;font-size:inherit;
|
||
letter-spacing:inherit;text-transform:inherit;transition:color .12s}
|
||
.font-picker button:hover{color:var(--ink)}
|
||
.font-picker button.active{background:var(--acid);color:var(--bg);font-weight:600}
|
||
/* .font-picker-float positioning is injected by js/theme.js */
|
||
a{color:var(--acid)}
|
||
.wrap{max-width:980px;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)}
|
||
.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)}
|
||
/* Sign-in link sits on the right so it reads as an account action, not a nav item */
|
||
.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)}
|
||
|
||
/* Adaptive side nav: overlay on top of centred content, semi-transparent.
|
||
Text on wide, icons on medium, bottom bar on mobile — same shape as
|
||
Theseus.X so both sites read as one family. */
|
||
:root{--sn-w:200px}
|
||
.sidenav{position:fixed;top:56px;left:0;bottom:0;width:var(--sn-w);z-index:15;
|
||
background:transparent;padding:32px 12px 22px 18px;
|
||
overflow-y:auto;pointer-events:none;transition:width .15s ease}
|
||
.sidenav a{display:flex;align-items:center;gap:14px;color:var(--mut);text-decoration:none;
|
||
padding:9px 12px;border-radius:10px;
|
||
font-size:14.5px;font-weight:500;opacity:.35;pointer-events:auto;
|
||
transition:opacity .12s,color .12s,background .12s,backdrop-filter .12s}
|
||
.sidenav a .ic{flex:none;width:22px;font-size:18px;line-height:1;text-align:center;
|
||
display:none;justify-content:center;align-items:center}
|
||
.sidenav a .lb{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.sidenav a:hover{opacity:1;color:var(--ink);background:rgba(11,14,20,.72);backdrop-filter:blur(8px)}
|
||
.sidenav a.active{opacity:.85;color:var(--acid)}
|
||
.sidenav a.active:hover{opacity:1}
|
||
section,#search-input{scroll-margin-top:70px}
|
||
@media (max-width:1180px){
|
||
:root{--sn-w:64px}
|
||
.sidenav{padding:22px 6px}
|
||
.sidenav a{justify-content:center;padding:12px 4px;gap:0}
|
||
.sidenav a .ic{display:inline-flex}
|
||
.sidenav a .lb{display:none}
|
||
}
|
||
/* Content stays centred on the viewport; the sidenav is a pointer-events:none
|
||
overlay at opacity 0.35, so text peeking underneath the semi-transparent
|
||
rail is by design — not something to pad away. */
|
||
@media (max-width:720px){
|
||
:root{--sn-w:0}
|
||
body{padding-bottom:64px}
|
||
.sidenav{top:auto;bottom:0;left:0;right:0;width:100%;height:auto;
|
||
padding:4px;flex-direction:row;background:rgba(11,14,20,.94);backdrop-filter:blur(12px);
|
||
display:flex;justify-content:space-around;overflow-x:auto;
|
||
/* Hide horizontal scrollbar chrome; icons still swipe/scroll when they overflow. */
|
||
scrollbar-width:none;-ms-overflow-style:none}
|
||
.sidenav::-webkit-scrollbar{display:none;width:0;height:0}
|
||
.sidenav a{flex:1;min-width:44px;padding:8px 4px;justify-content:center;gap:0;opacity:.5;font-size:15px}
|
||
.sidenav a .ic{display:inline-flex}
|
||
.sidenav a .lb{display:none}
|
||
}
|
||
|
||
header.hero{text-align:center;padding:5rem 1.2rem 1rem}
|
||
.mark{font-size:56px;line-height:1}
|
||
h1{font-size:clamp(2rem,5.5vw,2.9rem);margin:.4rem 0 .3rem}
|
||
h1 .g{color:var(--acid)}
|
||
.tag{color:var(--mut);font-size:1.05rem;max-width:660px;margin:0 auto}
|
||
.cta{margin-top:1.8rem;display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
|
||
.btn{display:inline-block;text-decoration:none;padding:11px 20px;border-radius:10px;background:#4b7bec;color:#fff;font-size:14px;border:none;cursor:pointer;font-family:inherit;transition:filter .1s}
|
||
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
|
||
.btn.acid{background:var(--acid);color:#0b0e14;font-weight:600}
|
||
.btn:hover{filter:brightness(1.12)}
|
||
section{padding:2.6rem 0;border-top:1px solid var(--line);margin-top:2.5rem}
|
||
section:first-of-type{border-top:none;margin-top:1.5rem}
|
||
h2{font-size:1.5rem;margin:0 0 .4rem}
|
||
h3{font-size:1.1rem;margin:0 0 .35rem}
|
||
.lede{color:var(--mut);margin:0 0 1.6rem;max-width:720px}
|
||
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}
|
||
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:18px 20px}
|
||
.card h3{margin:0 0 .5rem;display:flex;align-items:center;gap:8px}
|
||
.card h3 .g{color:var(--acid)}
|
||
.card h3 .lbl{display:inline-flex;align-items:center;gap:6px}
|
||
.card h3 svg.brandmk{width:20px;height:20px;flex:none;vertical-align:middle}
|
||
.card p{margin:0;color:var(--mut);font-size:14px}
|
||
.card .cta{margin-top:14px;justify-content:flex-start}
|
||
.dot{width:9px;height:9px;border-radius:50%;display:inline-block}
|
||
.d-chain{background:var(--chain)} .d-sia{background:var(--sia)} .d-srv{background:var(--srv)}
|
||
.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.4rem}
|
||
.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}
|
||
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}
|
||
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}
|
||
.pill{display:inline-block;font-size:11px;padding:2px 8px;border-radius:999px;background:rgba(255,255,255,.07);color:var(--dim);margin-left:8px;vertical-align:middle;font-weight:500}
|
||
.pill.soon{background:rgba(214,255,61,.13);color:var(--acid)}
|
||
.pill.live{background:rgba(79,209,165,.15);color:var(--ok)}
|
||
.pill.spec{background:rgba(179,157,219,.18);color:var(--sia)}
|
||
.verify dt{color:var(--mut);font-size:12.5px;text-transform:uppercase;letter-spacing:.3px;margin-top:12px}
|
||
.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:2.4rem 0 3.5rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
|
||
</style>
|
||
<script src="./js/i18n.js?v=20260921c"></script>
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="topnav">
|
||
<a class="brand" href="./"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg>Sirius<span class="g">.X</span></a>
|
||
<a href="./tld.html">🌐 TLD</a>
|
||
<!-- Trailing slash required: market/ is a subdirectory, dropping the slash
|
||
forces Angie via market.html (English redirect stub) before /market/. -->
|
||
<a href="./market/">🛒 Market</a>
|
||
<a href="./theseus"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></a>
|
||
<a href="./portal.html" class="portal">🔑 Sign in</a>
|
||
</nav>
|
||
|
||
<aside class="sidenav" aria-label="On this page">
|
||
<a href="#search-input" title="Register a name" ><span class="ic" aria-hidden="true">✏️</span><span class="lb">Register</span></a>
|
||
<a href="#try" title="Try it" ><span class="ic" aria-hidden="true">⚡</span><span class="lb">Try it</span></a>
|
||
<a href="#docs" title="Documentation" ><span class="ic" aria-hidden="true">📚</span><span class="lb">Docs</span></a>
|
||
<a href="#request-tld" title="Propose a new TLD" ><span class="ic" aria-hidden="true">🌐</span><span class="lb">Propose TLD</span></a>
|
||
<a href="#pantheon" title="The pantheon" ><span class="ic" aria-hidden="true">🏛</span><span class="lb">Pantheon</span></a>
|
||
<a href="#roadmap" title="What's coming" ><span class="ic" aria-hidden="true">🗺</span><span class="lb">Roadmap</span></a>
|
||
<a href="#verify" title="Verify against chain"><span class="ic" aria-hidden="true">🔐</span><span class="lb">Verify</span></a>
|
||
</aside>
|
||
|
||
<header class="hero">
|
||
<div class="mark"><svg width="56" height="56" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg></div>
|
||
<h1>Names on the <span class="g">chain</span>.</h1>
|
||
<p class="tag">Sirius.X is the entry point for BCNR — Bitcoin Cash Name Registry.
|
||
Register a top-level domain, register a name under one, look up records,
|
||
verify anything against the chain.</p>
|
||
|
||
<div style="margin:1.6rem auto 0;max-width:640px;padding:0 1rem">
|
||
<input id="search-input" type="search"
|
||
placeholder="type a name — e.g. hello"
|
||
spellcheck="false" autocomplete="off"
|
||
style="width:100%;padding:14px 18px;border-radius:12px;border:1px solid #ffffff22;background:#141a24;color:var(--ink);font-size:17px;outline:none;font-family:inherit"
|
||
aria-label="Search a name across every BCNR TLD">
|
||
<div id="search-hint" style="margin-top:8px;font-size:12.5px;color:var(--mut);text-align:center">
|
||
One search checks the label across every TLD in the registry. Available names appear first.
|
||
</div>
|
||
<div id="search-results" style="margin-top:14px;display:grid;gap:8px;text-align:left"></div>
|
||
</div>
|
||
|
||
<div class="cta" style="margin-top:1.4rem">
|
||
<a class="btn ghost" href="#try">Or browse what you can do →</a>
|
||
<a class="btn ghost" href="./docs">Read the docs</a>
|
||
</div>
|
||
</header>
|
||
|
||
<style>
|
||
/* Inline search card styling: mirrors register.html's .card look. */
|
||
#search-results .row-card{display:grid;grid-template-columns:1fr auto auto auto;gap:12px;align-items:center;
|
||
background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:11px 16px;min-height:48px}
|
||
#search-results .row-card.checking{opacity:.55}
|
||
#search-results .row-card .n{font-family:ui-monospace,monospace;font-size:15px;overflow-wrap:anywhere}
|
||
#search-results .row-card .btn{padding:6px 12px;font-size:12.5px}
|
||
#search-results .row-card .price{
|
||
color:var(--acid);font-family:ui-monospace,monospace;font-size:14px;font-weight:600;
|
||
padding:2px 8px;border-radius:6px;background:rgba(214,255,61,.10);white-space:nowrap
|
||
}
|
||
#search-results .badge{font-size:11px;padding:2px 10px;border-radius:999px;font-weight:600;white-space:nowrap}
|
||
#search-results .b-ok{background:rgba(79,209,165,.15);color:var(--ok)}
|
||
#search-results .b-taken{background:rgba(246,118,138,.15);color:var(--taken)}
|
||
#search-results .b-check{background:rgba(139,152,169,.14);color:var(--mut)}
|
||
@media (max-width:520px){
|
||
#search-results .row-card{grid-template-columns:1fr auto;gap:8px}
|
||
#search-results .row-card .btn{justify-self:start}
|
||
}
|
||
</style>
|
||
|
||
<script>
|
||
// Inline name search — same UX as register.html but no wallet dependencies.
|
||
// Hits POST-friendly /api/labels/<label> (one call, returns every taken
|
||
// match across every TLD from the gateway's cached index) and cross-checks
|
||
// against the client-side TLDS list. Register buttons hand the label off
|
||
// to register.html?q= for the full mint flow.
|
||
(function () {
|
||
// Fallback list, used until /api/tlds answers (js/pricing.js loads it).
|
||
// The live list drops TLDs their owners switched off and carries the
|
||
// owner-set prices, so it wins whenever it is available.
|
||
let TLDS = [
|
||
"bch","p2p","bit","nav","test","x","asm","neo","gt","sc",
|
||
"sia","dex","cex","nt","dea","hub","os","vpn",
|
||
];
|
||
// .com is held off the public registry (2026-08-29) regardless of what
|
||
// the API says — the operator holds it; nobody buys names under it yet.
|
||
const NEVER_SELL = new Set(["com"]);
|
||
async function liveTlds() {
|
||
const sp = window.siriusPricing;
|
||
if (!sp) return TLDS;
|
||
await sp.tldReady();
|
||
const live = sp.visibleTlds();
|
||
if (live && live.length) TLDS = live.filter((t) => !NEVER_SELL.has(t) && sp.tldSellable(t).ok);
|
||
return TLDS;
|
||
}
|
||
const $ = (id) => document.getElementById(id);
|
||
const esc = (s) => String(s).replace(/[&<>"']/g, (c) => ({"&":"&","<":"<",">":">",'"':""","'":"'"}[c]));
|
||
const clean = (v) => v.toLowerCase().replace(/[^a-z0-9-]/g, "").slice(0, 32);
|
||
let lastReq = 0, timer = null;
|
||
|
||
function row(full, state) {
|
||
const badge = state === "ok" ? '<span class="badge b-ok">available</span>'
|
||
: state === "taken" ? '<span class="badge b-taken">taken</span>'
|
||
: '<span class="badge b-check">checking…</span>';
|
||
// Label price (rendered only for available names). Tier logic lives in
|
||
// pricing.js so landing / tld.html / the mint modal all agree.
|
||
let price = "";
|
||
if (state === "ok" && window.siriusPricing) {
|
||
const [label, tld] = full.split(".");
|
||
const p = window.siriusPricing.priceForName(label, tld);
|
||
const why = p.ownerSet ? `price set by the .${tld} owner` : p.tier;
|
||
price = `<span class="price" title="${esc(why)}">${esc(window.siriusPricing.formatUsd(p.usd))}</span>`;
|
||
}
|
||
const btn = state === "ok"
|
||
? `<button class="btn acid" data-register="${esc(full)}">Register →</button>`
|
||
: state === "taken"
|
||
? `<a class="btn ghost" href="https://navigate.st/bns/${encodeURIComponent(full)}" target="_blank" rel="noopener">view →</a>`
|
||
: "<span></span>";
|
||
return `<div class="row-card ${state === "checking" ? "checking" : ""}"><span class="n">${esc(full)}</span>${badge}${price}${btn}</div>`;
|
||
}
|
||
|
||
async function search(label) {
|
||
const my = ++lastReq;
|
||
const out = $("search-results");
|
||
// Immediate feedback: paint one 'checking' row per TLD so the user
|
||
// sees something is happening in the ~300ms before results land.
|
||
out.innerHTML = TLDS.map((t) => row(`${label}.${t}`, "checking")).join("");
|
||
let taken = new Set();
|
||
try {
|
||
const [r] = await Promise.all([
|
||
fetch(`https://silentmode.st/api/labels/${encodeURIComponent(label)}`),
|
||
liveTlds(), // owner prices + on/off state, same round-trip
|
||
]);
|
||
if (r.ok) {
|
||
const j = await r.json();
|
||
for (const m of (j.matches || [])) taken.add(m.name);
|
||
}
|
||
} catch { /* fall through: everything shows as "checking" then flips to error-free available; a gateway blip shouldn't block the user */ }
|
||
if (my !== lastReq) return; // superseded by newer keystroke
|
||
const rows = TLDS
|
||
.map((t) => ({ full: `${label}.${t}`, state: taken.has(`${label}.${t}`) ? "taken" : "ok" }))
|
||
.sort((a, b) => (a.state === "ok" ? 0 : 1) - (b.state === "ok" ? 0 : 1));
|
||
out.innerHTML = rows.map((x) => row(x.full, x.state)).join("");
|
||
// Wire Register buttons — hand the chosen name off to the shared mint
|
||
// flow (js/register-flow.js exposes window.siriusRegisterName).
|
||
out.querySelectorAll("[data-register]").forEach((b) => {
|
||
b.onclick = () => {
|
||
const name = b.getAttribute("data-register");
|
||
if (typeof window.siriusRegisterName === "function") {
|
||
window.siriusRegisterName(name);
|
||
} else {
|
||
// Module still loading — retry once it settles.
|
||
b.textContent = "loading…"; b.disabled = true;
|
||
const t = setInterval(() => {
|
||
if (typeof window.siriusRegisterName === "function") {
|
||
clearInterval(t); b.disabled = false; b.textContent = "Register →";
|
||
window.siriusRegisterName(name);
|
||
}
|
||
}, 100);
|
||
}
|
||
};
|
||
});
|
||
}
|
||
|
||
$("search-input").addEventListener("input", () => {
|
||
clearTimeout(timer);
|
||
const v = clean($("search-input").value);
|
||
$("search-input").value = v;
|
||
if (!v) { $("search-results").innerHTML = ""; return; }
|
||
timer = setTimeout(() => search(v), 200);
|
||
});
|
||
$("search-input").addEventListener("keydown", (e) => {
|
||
if (e.key === "Enter") {
|
||
clearTimeout(timer);
|
||
const v = clean($("search-input").value);
|
||
if (v) search(v);
|
||
}
|
||
});
|
||
})();
|
||
</script>
|
||
|
||
<div class="wrap">
|
||
|
||
<section id="try">
|
||
<h2>Try it</h2>
|
||
<p class="lede">Three things you can do right now. The registrar and TLD-registry UIs live at
|
||
silentmode.st today; Sirius.X is the canonical home and will consolidate them here.</p>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span> Register a name</h3>
|
||
<p>Pick a label, search across every TLD in the registry at once, mint the name
|
||
certificate straight into your own wallet. Renewals are per-TLD policy set by
|
||
the owner — the price the TLD sets is what you pay.</p>
|
||
<div class="cta"><a class="btn acid" href="#search-input">Search a name →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span> Register a TLD</h3>
|
||
<p>A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry
|
||
operator for every second-level name under it, set the price yourself, and earn 90 % of the
|
||
fee on every name registered under it. Renewals are per-TLD policy that you control.</p>
|
||
<div class="cta">
|
||
<a class="btn acid" href="./tld.html">Search a TLD →</a>
|
||
<a class="btn ghost" href="./admin">Operator admin →</a>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-sia"></span> Look up & verify</h3>
|
||
<p>Resolve any BCNR name, compare records across mirrors, and check the TLD registry snapshot
|
||
against the chain. Everything is publicly verifiable.</p>
|
||
<div class="cta"><a class="btn ghost" href="#verify">How to verify →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-srv"></span> 🔑 Sign in — your names portal</h3>
|
||
<p>Import your seed phrase or connect a wallet (Cashonize / Paytaca via WizardConnect) to see
|
||
every name you own, review records, and update them. Your keys never leave your browser.</p>
|
||
<div class="cta"><a class="btn acid" href="./portal.html">Open the portal →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span> 🧭 Theseus Navigator</h3>
|
||
<p>The browser that speaks BCNR natively. Open <code>hello.bch</code> in the address bar —
|
||
it just resolves. TLS verified against on-chain fingerprints, no OS trust-store install.</p>
|
||
<div class="cta"><a class="btn ghost" href="./theseus">Download →</a></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="docs">
|
||
<h2>Documentation</h2>
|
||
<p class="lede">The full docs — TLD registry model, record types, resolver & gateway paths,
|
||
mainnet pricing, verification, and the operator runbook pointer — live on their own page so
|
||
they can grow without cluttering the landing.</p>
|
||
<div class="cta" style="justify-content:flex-start;margin-top:1rem">
|
||
<a class="btn acid" href="./docs">📚 Open the docs →</a>
|
||
<a class="btn ghost" href="https://silentmode.st/tlds/">Current TLD list</a>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="request-tld">
|
||
<h2>Propose a new TLD</h2>
|
||
<p class="lede">The per-TLD registry means minting a TLD is a real, paid action — not a namespace
|
||
land-grab. During the alpha, all TLD mints are operator-signed. To propose a TLD, get in touch
|
||
via the channels below. The design (mainnet) adds an on-chain covenant with countersignature +
|
||
tiered USD price floors: 1-char $100k, 2-char $50k, 3-char $15k, 4-char $5k, 5–8-char $1k,
|
||
9+-char $250; one-time payment (not annual). See the design doc for the full model.</p>
|
||
<div class="note warn"><b>ICANN-adjacent TLDs are not open for public mint.</b> A TLD registry is
|
||
only useful if it does not immediately collapse into an ICANN-shadow — the mainnet covenant
|
||
enforces this; on chipnet the operator's countersignature is the gate.</div>
|
||
</section>
|
||
|
||
<section id="pantheon">
|
||
<h2>The pantheon</h2>
|
||
<p class="lede">Sirius.x is one of seven sibling <b>.x</b> names — the Silent Mode pantheon.
|
||
Each project is its own on-chain certificate; each site is reachable through any BCNR
|
||
resolver, plus the silentmode.st gateway for browsers without one.</p>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span><span class="lbl">⛓️ Silentmode<span class="g">.X</span></span></h3>
|
||
<p>The project umbrella. Redirects to <code>silentmode.st</code> where every pillar
|
||
has its own landing page + download hub.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://silentmode.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span><span class="lbl"><svg class="brandmk" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg>Sirius<span class="g">.X</span></span><span class="pill">you're here</span></h3>
|
||
<p>Names on Bitcoin Cash — register, resolve, verify, manage. This site.</p>
|
||
<div class="cta"><a class="btn ghost" href="./">Home →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-chain"></span><span class="lbl"><svg class="brandmk" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></span></h3>
|
||
<p>The browser that speaks BCNR natively — Chromium build with the resolver baked in,
|
||
no OS-level daemon or root-store install.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://theseus.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-srv"></span><span class="lbl">⚒️ Hephaestus<span class="g">.X</span></span></h3>
|
||
<p>The forge. Forgejo instance for the ecosystem's git repos, backed by BCH wallet
|
||
auth. Sirius's own source lives here.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://hephaestus.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-sia"></span><span class="lbl">🔮 Prometheus<span class="g">.X</span></span></h3>
|
||
<p>Fire from the chain. The project's foresight / experimentation layer.
|
||
Redirects to <code>silentmode.st/prometheus/</code> today.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://prometheus.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-sia"></span><span class="lbl">☀️ Helios<span class="g">.X</span></span></h3>
|
||
<p>The public gaze. Analytics, dashboards, transparency reports.
|
||
Redirects to <code>silentmode.st/helios/</code> today.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://helios.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
<div class="card">
|
||
<h3><span class="dot d-srv"></span><span class="lbl">✉️ Hermes<span class="g">.X</span></span></h3>
|
||
<p>Messenger. Nostr-based messaging bound to a BCNR name via the <code>np</code>
|
||
+ <code>nr</code> records. Redirects to <code>silentmode.st/hermes/</code>.</p>
|
||
<div class="cta"><a class="btn ghost" href="https://hermes.x/" rel="noopener">Open →</a></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="roadmap">
|
||
<h2>What's coming</h2>
|
||
<p class="lede">The wallet portal, Sirius Studio, signed off-chain records, and the name marketplace all shipped over the past weeks. Here's what's still on the roadmap.</p>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h3>Sirius Press <span class="pill soon">planned</span></h3>
|
||
<p>A WordPress fork with the email requirement stripped from account and publish paths, and wallet-signature login in its place. For BCNR name owners who want a dynamic backend without giving up sovereignty — self-host on any VPS and point your name's <code>p</code> or <code>ip</code> record at it.</p>
|
||
</div>
|
||
<div class="card">
|
||
<h3>Wallet-signed comments <span class="pill spec">spec ready</span></h3>
|
||
<p>Any BCH wallet can post; the name owner moderates; comments live in the name's own Sia bucket next to <code>_records.json</code>. No email, no accounts, no CAPTCHA — the wallet signature is the identity. Drops into any page as one script tag.</p>
|
||
</div>
|
||
<div class="card">
|
||
<h3>Studio: templates & content collections <span class="pill soon">in progress</span></h3>
|
||
<p>Twelve new starter templates (portfolio, blog, restaurant, event, resume, agency, coming-soon and more), ten new drop-in section blocks, a card gallery picker, and a client-side CMS bolt-on for blog-shaped content — all persisting to the name's Sia bucket.</p>
|
||
</div>
|
||
<div class="card">
|
||
<h3>Mainnet migration <span class="pill soon">planned</span></h3>
|
||
<p>Chipnet today, mainnet later. The USD-pegged listing covenant, the TLD registry beacon, and every record type moves to mainnet with fee tiers by label length. The shape stays the same; only the network changes.</p>
|
||
</div>
|
||
<div class="card">
|
||
<h3>Decentralized git remote <span class="pill live">MVP live</span></h3>
|
||
<p>Silent Mode's own code lives at <a href="https://code.silentmode.st/silentmode" rel="noopener">code.silentmode.st</a> — a Forgejo forge with wallet-address logins. The Sia mirror for full offline reproducibility of every release is the next track.</p>
|
||
<pre style="margin-top:.8rem;font-size:12px">git clone https://silentmode.st/sirius-x/repo/silent-mode.git</pre>
|
||
<p style="margin-top:.5rem;font-size:12.5px">One-shot snapshot as a
|
||
downloadable git bundle (works when dumb-HTTP is blocked):</p>
|
||
<pre style="font-size:12px">curl -O https://silentmode.st/sirius-x/repo/silent-mode.bundle
|
||
git clone silent-mode.bundle silent-mode</pre>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="verify">
|
||
<h2>Verify this page against the chain</h2>
|
||
<p class="lede">You do not have to trust that <code>sirius.x</code> is served by anyone specific.
|
||
The name's certificate is on the Bitcoin Cash chain; the records point to Sia; every path is
|
||
independently checkable.</p>
|
||
|
||
<h3>1. Confirm the certificate exists 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>2. Fetch the TLD-registry snapshot from Nostr</h3>
|
||
<p class="lede">The operator-signed snapshot of the TLD list is published as a Nostr replaceable
|
||
event. Any relay carries it; the event's content field carries the current snapshot root.</p>
|
||
<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>3. Reach this site via more than one route</h3>
|
||
<p class="lede">The same content should be served from at least two independent paths. If one
|
||
mirror is unavailable, the others still work. If two mirrors disagree, the on-chain record is
|
||
the tiebreaker.</p>
|
||
<ul style="color:var(--mut);font-size:14px;margin:.6rem 0 0;padding-left:1.2rem">
|
||
<li>Via any BCNR resolver: <code>https://sirius.x/</code> (requires the local root CA)</li>
|
||
<li>Via the public gateway: <code>https://navigate.st/bns/sirius.x</code></li>
|
||
<li>Via silentmode.st mirror: <code>https://silentmode.st/bns/sirius.x</code></li>
|
||
<li>Direct from Sia (content-addressed): the <code>s3</code> record on <code>sirius.x</code>
|
||
names the exact bucket key</li>
|
||
</ul>
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<footer id="site-footer"></footer>
|
||
|
||
<!-- Shared mint flow — modal + wallet steps used to live in register.html.
|
||
The module injects its own modal into <body> and exposes
|
||
window.siriusRegisterName(fullName) for the search-result buttons. -->
|
||
<script type="importmap">
|
||
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js?v=20260920usd" } }
|
||
</script>
|
||
<script type="module" src="./js/register-flow.js?v=20260920usd"></script>
|
||
|
||
<script src="./js/pricing.js?v=20260920bits"></script>
|
||
<script src="./js/session.js?v=20260917dash"></script>
|
||
<script src="./js/pin-escrow.js?v=20260909pin"></script>
|
||
<script defer src="./js/theme.js?v=20260921mob"></script>
|
||
<script defer src="./js/site-footer.js?v=20260917market"></script>
|
||
<script defer src="./js/profile-menu.js?v=20260921mob"></script>
|
||
<script>
|
||
// Sidenav scroll-spy: highlight the section currently in view.
|
||
// Uses scroll-position tracking so short sections at the end of the page
|
||
// still activate their link when the reader scrolls to them.
|
||
(() => {
|
||
const links = document.querySelectorAll(".sidenav a[href^='#']");
|
||
if (!links.length) return;
|
||
const entries = [];
|
||
links.forEach((a) => { const el = document.querySelector(a.getAttribute("href")); if (el) entries.push({ el, link: a }); });
|
||
if (!entries.length) return;
|
||
const setActive = (link) => { links.forEach((l) => l.classList.remove("active")); link.classList.add("active"); };
|
||
const update = () => {
|
||
const doc = document.documentElement;
|
||
const scrollBottom = window.scrollY + window.innerHeight;
|
||
if (scrollBottom >= (doc.scrollHeight - 4)) { setActive(entries[entries.length - 1].link); return; }
|
||
const line = window.scrollY + window.innerHeight * 0.35;
|
||
let active = entries[0].link;
|
||
for (const e of entries) {
|
||
if (e.el.getBoundingClientRect().top + window.scrollY <= line) active = e.link;
|
||
else break;
|
||
}
|
||
setActive(active);
|
||
};
|
||
window.addEventListener("scroll", update, { passive: true });
|
||
window.addEventListener("resize", update);
|
||
update();
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|