igneum/site/index.html
igneum-labs 8d758bfa38 site: showcase the miner app and the wallet on the home page
A section between the live scene and Your card: three real screenshots
(the shipped Mine page of 0.3.14, and the next release's Overview and
Cards pages from the app in development), light and dark variants,
three lines (one click, every card tuned, the chain on your screen),
the download list repeated, and the wallet in one card.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 21:52:17 +00:00

760 lines
72 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Igneum, the GPU-mined layer 1</title>
<meta name="description" content="A GPU-mined chain whose mining program rewrites itself every hour. Miners also prove the blocks. No premine, no stake, no fee to any team.">
<link rel="canonical" href="https://igneum.network/">
<meta name="theme-color" content="#0C0C0E" media="(prefers-color-scheme: dark)">
<meta name="theme-color" content="#F4F1EC" media="(prefers-color-scheme: light)">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Igneum">
<meta property="og:title" content="Igneum, the GPU-mined layer 1">
<meta property="og:description" content="A GPU-mined chain whose mining program rewrites itself every hour. Miners also prove the blocks. No premine, no stake, no fee to any team.">
<meta property="og:url" content="https://igneum.network/">
<meta property="og:image" content="https://igneum.network/og.png?v=3">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Igneum, the GPU-mined layer 1">
<meta name="twitter:description" content="A GPU-mined chain whose mining program rewrites itself every hour. Miners also prove the blocks. No premine, no stake, no fee to any team.">
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
<link rel="icon" href="/favicon.ico" sizes="48x48">
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Organization","name":"Igneum","url":"https://igneum.network/","logo":"https://igneum.network/icon-512.png","sameAs":["https://github.com/igneum-network"]}
</script>
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
<!-- head:start -->
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/site.css">
<style>
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
</style>
<script>
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
</script>
<!-- head:end -->
<style>
/* home page block (docs/plans/site-ui-3.md section 3); the tokens, type and components are in /site.css */
.hero{padding:calc(var(--sec) * .7) 0 var(--s-6)}
.hero-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:var(--s-6);align-items:start}
.hero-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:var(--s-6);align-items:start}
.hero .wrap{text-align:center}.hero .eyebrow{justify-content:center}.hero h1{font-size:var(--t-hero);font-weight:900;line-height:.98;letter-spacing:-.02em;margin:var(--s-3) auto var(--s-4);max-width:14ch}.hero .lead{margin:0 auto var(--s-5);text-align:center}.hero .cta{justify-content:center;margin-bottom:var(--s-5)}
.bleed{width:100%;padding:0 var(--gutter);margin-bottom:var(--s-6)}.bleed .card.viz{max-width:none}.bleed .scene canvas{height:min(56vh,520px);min-height:320px}
.hero .tiles.facts{text-align:left}.hero .netstrip{text-align:left}
.hero .lead{margin-bottom:var(--s-5)}
.hero .cta{align-items:center}
.hero .fine{font-size:var(--t-base);color:var(--ash);margin:var(--s-4) 0 0;max-width:62ch}
.verify .verify-head{display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);margin-bottom:var(--s-4)}
.verify .verify-head .eyebrow{margin:0}
.verify-row{display:flex;gap:var(--s-4);align-items:center;margin-bottom:var(--s-4)}
.verify .tick{width:44px;height:44px;border-radius:12px;background:var(--ember);display:grid;place-items:center;flex:none}
.verify .tick svg{stroke:var(--ember-ink)}
.verify h3{margin:0 0 4px}
.verify p{margin:0;color:var(--ash);font-size:var(--t-base)}
.verify-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-2)}
.verify .cell{background:var(--row);border:1px solid var(--line);border-radius:var(--r-row);padding:10px 12px;min-width:0}
.verify .cell .k{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ash)}
.verify .cell .v{font:500 14px/1.4 var(--f-mono);color:var(--bone);margin-top:2px;overflow-wrap:anywhere}
.verify .cell .v.hot{color:var(--molten-text)}
.facts{margin-top:var(--s-6)}
.shots{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.shot{margin:0;min-width:0}
.shot img{width:100%;height:auto;border-radius:var(--r-row);border:1px solid var(--line);display:block}
.shots .shot img{aspect-ratio:16/10;object-fit:cover;object-position:top}
.shot figcaption{font:400 var(--t-sm)/1.5 var(--f-mono);color:var(--ash);margin-top:var(--s-2)}
.shot .img-light{display:none}
@media (prefers-color-scheme:light){:root:not([data-theme="dark"]) .img-dark{display:none}:root:not([data-theme="dark"]) .img-light{display:block}}
:root[data-theme="light"] .img-dark{display:none}:root[data-theme="light"] .img-light{display:block}
.app-lines{list-style:none;padding:0;margin:var(--s-5) 0 0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-3)}
.app-lines li{background:var(--row);border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-4);min-width:0}
.app-lines li{color:var(--ink-2);font-size:var(--t-base);line-height:1.5}
.app-lines strong{color:var(--bone);display:block;margin-bottom:4px}
.app-dl{max-width:560px}
.wallet-card{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s-5);align-items:center;margin-top:var(--s-6)}
.wallet-card h3{margin:0 0 var(--s-2)}
.wallet-card p{color:var(--ink-2);font-size:var(--t-base);line-height:1.5;margin:0}
.wallet-card .dl-list{margin-bottom:0}
@media (max-width:900px){.shots,.wallet-card,.app-lines{grid-template-columns:1fr}}
.netstrip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s-3);margin-top:var(--s-4)}
.ns{background:var(--graphite);border:1px solid var(--line);border-radius:var(--r-row);padding:12px 14px;min-width:0}
.ns .k{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ash)}
.ns .v{font:700 clamp(20px,2.2vw,28px)/1.1 var(--f-display);color:var(--bone);margin-top:4px;letter-spacing:-.01em;overflow-wrap:anywhere;transition:color .4s}
.ns .v.tick,.cards .eta.tick{color:var(--molten-text)}
.ns .s{font:400 var(--t-sm)/1.4 var(--f-mono);color:var(--ash);margin-top:4px}
@media (max-width:700px){.netstrip{grid-template-columns:repeat(2,minmax(0,1fr))}}
.cards td:first-child{color:var(--bone);font-weight:600;white-space:nowrap}
.cards .eta{transition:color .4s}
.fair{margin:var(--s-5) 0 0;font-size:var(--t-lg);line-height:1.5;color:var(--ink-2);max-width:68ch}
.fair b{color:var(--bone)}
.scene canvas{height:min(56vh,520px);min-height:320px}
.facts .tile .k{text-wrap:pretty}
.scene-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--s-3) var(--s-5);margin-bottom:var(--s-3)}
.scene-head .state{margin:0}
.scene{position:relative}
.caption{margin:var(--s-3) 0 0;font-size:13px;line-height:1.5;color:var(--bone);min-height:1.5em}.caption.muted{color:var(--ash)}
.scene canvas{width:100%;height:360px;border-radius:var(--r-row);background:var(--row);border:1px solid var(--line);display:block}
.tip{position:absolute;left:0;top:0;pointer-events:none;background:var(--graphite);border:1px solid var(--line-2);border-radius:var(--r-row);padding:10px 12px;font:400 12px/1.5 var(--f-mono);color:var(--ink-2);display:flex;flex-direction:column;gap:2px;max-width:320px;box-shadow:0 14px 40px var(--shadow)}
.tip b{color:var(--bone);font-weight:500;overflow-wrap:anywhere}
.tip[hidden]{display:none}
.scene-foot{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--s-3) var(--s-5);align-items:center;margin-top:var(--s-4)}
.scene-foot .legend{margin:0}
.scene-foot .btn{min-height:36px;padding:6px 14px;font-size:14px}
.program pre{min-height:168px;color:var(--ink-2)}
.program .head{display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);margin-bottom:var(--s-3)}
.program .head .eyebrow{margin:0}
.program .next{font:500 var(--t-sm)/1.4 var(--f-mono);color:var(--molten-text)}
.feed{display:flex;flex-direction:column;border-top:1px solid var(--line)}
.feed div{display:flex;justify-content:space-between;gap:var(--s-3);padding:10px 0;border-bottom:1px solid var(--line);font:400 14px/1.4 var(--f-mono);color:var(--ink-2)}
.feed div span:last-child{color:var(--ash)}
.proofs .card{display:flex;flex-direction:column;gap:var(--s-3)}
.proofs .card p{margin:0;color:var(--ink-2);font-size:var(--t-base)}
.proofs .card .more{margin-top:auto;font-weight:500}
.cmp td:first-child{color:var(--ash);font-family:var(--f-mono);font-size:14px;white-space:nowrap}
.cmp th:last-child,.cmp td:last-child{color:var(--bone)}
.download{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s-6);align-items:center}
.download .shot img{border-radius:var(--r-row);border:1px solid var(--line)}
.download .shot figcaption{font-size:var(--t-sm);color:var(--ash);margin-top:var(--s-2);font-family:var(--f-mono)}
.dl-list{display:flex;flex-direction:column;gap:var(--s-2);margin:var(--s-4) 0}
.dl-list a{display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);padding:12px 16px;border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);color:var(--bone);font-weight:600}
.dl-list a:hover{text-decoration:none;border-color:var(--line-2);background:var(--hover)}
.dl-list a.primary{background:var(--ember);border-color:var(--ember);color:var(--ember-ink)}
.dl-list a.primary:hover{background:var(--ember-hi)}
.dl-list a span{font:400 var(--t-sm)/1.4 var(--f-mono);opacity:.85}
.notice{font-size:var(--t-base);color:var(--ink-2);margin:var(--s-3) 0 0}
.notice b{color:var(--bone);font-weight:600}
.pillars{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.pillar{display:flex;flex-direction:column;gap:var(--s-2)}
.pillar svg{stroke:var(--ember);margin-bottom:var(--s-2)}
.pillar p{color:var(--ink-2);margin:0;font-size:var(--t-base)}
.pillar a{font-weight:500;margin-top:auto}
.wallet-states{display:flex;flex-wrap:wrap;gap:var(--s-2);margin-bottom:var(--s-4)}
.wstate{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:var(--r-pill);padding:6px 12px 6px 8px;font:500 var(--t-sm)/1.4 var(--f-mono);color:var(--ink-2);background:var(--row)}
.wstate i{width:8px;height:8px;border-radius:50%;background:var(--ash);display:inline-block}
.wstate.block i{background:var(--molten)}
.wstate.final i{background:var(--ember)}
.wstate small{color:var(--ash);font-weight:400}
.phases{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-3)}
.phase{background:var(--graphite);border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-4);display:flex;flex-direction:column;gap:6px}
.phase .w{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ash)}
.phase .n{font:700 var(--t-base)/1.3 var(--f-display);color:var(--bone)}
.phase .g{font-size:14px;color:var(--ink-2)}
.phase.active{border-color:var(--ember-40)}
.phase.active .w{color:var(--ember-text)}
.phase.done .n{color:var(--ash)}
.log{display:flex;flex-direction:column;border-top:1px solid var(--line);margin-top:var(--s-4)}
.log>div{display:grid;grid-template-columns:110px 1fr;gap:var(--s-3);padding:10px 0;border-bottom:1px solid var(--line);font-size:var(--t-base);color:var(--ink-2)}
.log>div .d{font:500 var(--t-sm)/1.6 var(--f-mono);color:var(--ash)}
.log>div.more{display:none}
.log.open>div.more{display:grid}
.log-toggle{margin-top:var(--s-3);align-self:flex-start;background:none;border:1px solid var(--line);border-radius:var(--r-btn);color:var(--bone);font:600 14px/1.2 var(--f-sans);padding:8px 14px;cursor:pointer}
.now{display:inline-flex;align-items:center;gap:8px;font:500 var(--t-sm)/1.4 var(--f-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--ash)}
.split2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s-6);align-items:center}
.bar{height:14px;border-radius:7px;overflow:hidden;display:flex;background:var(--row);border:1px solid var(--line)}
.bar div{height:100%}
.band{background:var(--ember);color:var(--ember-ink);padding:var(--s-6) 0;margin-top:var(--sec)}
.band .wrap{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--s-4)}
.band h2,.band p{color:var(--ember-ink);margin:0}
.band p{opacity:.85;margin-top:6px;max-width:60ch}
.band .btn{background:var(--ember-ink);color:var(--ember);border-color:var(--ember-ink)}
.band .btn:hover{background:var(--ember-ink);opacity:.9}
.band+.foot{margin-top:0}
@media (max-width:900px){.hero-grid,.download,.split2{grid-template-columns:1fr}.pillars,.phases{grid-template-columns:1fr}.scene canvas{height:280px}}
@media (max-width:560px){.verify-grid{grid-template-columns:1fr}.log>div{grid-template-columns:1fr;gap:2px}.scene canvas{height:240px}}
</style>
</head>
<body>
<!-- nav:start -->
<a class="skip" href="#main">Skip to content</a>
<nav class="nav" aria-label="Main">
<div class="wrap">
<a href="/" class="brand" aria-label="Igneum home">
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
<span class="word">IGNEUM</span>
</a>
<div class="links" id="nav-links">
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
<a href="/live" data-nav="live">Live devnet</a>
<a href="/bench" data-nav="bench">Engineering log</a>
<a href="/miner" data-nav="miner">Miner</a>
<a href="/wallet" data-nav="wallet">Wallet</a>
<a href="/evidence" data-nav="evidence">Evidence</a>
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
</div>
<a href="/miner#get" class="btn primary small cta">Download the miner</a>
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Menu"><span class="bars"></span></button>
<div class="nav-sheet" id="nav-sheet">
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
<a href="/live" data-nav="live">Live devnet</a>
<a href="/bench" data-nav="bench">Engineering log</a>
<a href="/miner" data-nav="miner">Miner</a>
<a href="/wallet" data-nav="wallet">Wallet</a>
<a href="/evidence" data-nav="evidence">Evidence</a>
<a href="/explorer">Explorer</a>
<a href="/ledger">Ledger</a>
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
<a href="/miner#get" class="btn primary">Download the miner</a>
</div>
</div>
</nav>
<script>
(function(){
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');document.documentElement.style.overflow=o?'hidden':'';}
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
})();
</script>
<!-- nav:end -->
<main id="main">
<header class="hero" id="top">
<div class="wrap">
<div class="eyebrow ember">GPUs are back · for good</div>
<h1>Mined by GPUs.<br>Proven by fire.</h1>
<p class="lead">A proof-of-work chain for graphics cards, whose miners prove the blocks.</p>
<div class="cta">
<a href="#get" class="btn primary">Download the miner</a>
<a href="/litepaper" class="btn">Read the litepaper</a>
</div>
</div>
<div class="bleed">
<div class="card viz" id="viz-card">
<div class="scene-head">
<div class="state" id="viz-label"><span class="dot off"></span><span id="viz-word">connecting to the devnet observer</span></div>
<div class="viz-stats mono"><span>chain block <b id="c-blocks">pending</b></span><span>shards proven <b id="c-proven">pending</b></span><span>last lock <b id="c-locked">pending</b></span><span>vote keys in 10 min <b id="c-miners">pending</b></span><span>hash rate <b id="c-hash">pending</b></span><span>blocks / s <b id="c-bps">pending</b></span></div>
</div>
<div class="scene">
<canvas id="steps" aria-label="The live devnet, step by step: every square is a real block moving left as time passes; its outline, quarter cells, fill and ring show mined, shards being proven, proven and locked checkpoint"></canvas>
</div>
<p class="caption mono" id="steps-caption" aria-live="polite">Connecting to the devnet observer.</p>
<div class="scene-foot">
<div class="legend" id="legend-live">
<span><i class="sw" style="border:2px solid var(--line-2)"></i>mined, pending</span>
<span><i class="sw" style="border:2px solid var(--ember)"></i>mined, included</span>
<span><i class="sw" style="border:2px solid var(--line-2);opacity:.45"></i>excluded</span>
<span><i class="sw" style="border:2px solid var(--molten);background:linear-gradient(90deg,var(--molten) 50%,transparent 50%)"></i>shards being proven</span>
<span><i class="sw" style="background:var(--ember)"></i>proven</span>
<span><i class="sw" style="border:3px solid var(--ember);border-radius:50%;background:transparent"></i>locked checkpoint</span>
</div>
<div class="cta"><a href="/live" class="btn">The live page</a></div>
</div>
<p class="note" id="viz-note">One node is read every 2 s. Every square is a real block, released at a calm pace so each step can be seen; the counters read the chain. Chain block is the EVM block number. Shards proven is every shard paid on the chain so far. Last lock is the latest checkpoint the finality rule locked.</p>
</div>
</div>
<div class="wrap">
<div class="tiles facts" aria-label="Four facts">
<div class="tile"><div class="v">1 / s</div><div class="k">blocks, rising to 10</div></div>
<div class="tile"><div class="v">~60 s</div><div class="k">to a proof at launch, the target. First GPU proof of a block: 1.4 s on an RTX 5090, 4 Oct 2026</div></div>
<div class="tile"><div class="v">0</div><div class="k">premine</div></div>
<div class="tile"><div class="v">4B</div><div class="k">IGN hard cap, ever</div></div>
</div>
<p class="note">100% of emission goes to miners and provers; the protocol carries no fee.</p>
<div class="netstrip" id="netstrip" aria-label="The network right now">
<div class="ns"><div class="k">Network hash rate</div><div class="v" id="n-hash">pending</div><div class="s">one node, read every 2 s</div></div>
<div class="ns"><div class="k">Blocks, last 10 min</div><div class="v" id="n-blocks10">pending</div><div class="s">target 1 a second</div></div>
<div class="ns"><div class="k">Latest block</div><div class="v"><span id="n-last">pending</span></div><div class="s" id="n-last-s">from the chain tip</div></div>
<div class="ns"><div class="k">Shards proven and paid</div><div class="v" id="n-paid">pending</div><div class="s" id="n-paid-s">on the chain so far</div></div>
</div>
</div>
</header>
<section id="prove" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow">The chain, now</div>
<h2>How the chain proves itself</h2>
<p>Blocks every second, proven in shards, locked every 30 seconds. First live lock 4 Oct 2026: checkpoint 242, 77.4% of all weight, two hours after genesis.</p>
</div>
<div class="grid c2" style="margin-top:var(--s-4)">
<div class="card program">
<div class="head"><div class="eyebrow">This hour's program</div><div class="next">next in <span id="countdown">59:59</span></div></div>
<pre id="program" aria-label="A sample of the current hour's mining program"></pre>
<p class="note">A new program every hour: a chip wired for one program is useless. A programmable chip is met by the latency-shadow work and the price per joule, not by surprise. First live swap 4 Oct 2026: Apple, NVIDIA and AMD kept hashing through it, 0 rejected blocks.</p>
</div>
<div class="card">
<div class="eyebrow">Proofs sold to other chains</div>
<div class="feed">
<div><span>rollup · batch proof</span><span>at testnet</span></div>
<div><span>bridge · state proof</span><span>at testnet</span></div>
<div><span>rollup · fault proof</span><span>at testnet</span></div>
<div><span>IGN burned from jobs</span><span>phase two</span></div>
</div>
<p class="note">The same cards sell proofs to rollups and bridges. Jobs are paid on the customer's chain at launch; settlement in IGN with a 10% burn follows the proof bridge in phase two. Live rows arrive with the public testnet. The public testnet is weeks away: three seed nodes and the public RPC are up, and it opens when the go checklist closes.</p>
</div>
</div>
<p class="note"><a href="/litepaper#proving">Read more in the litepaper</a></p>
</div>
</section>
<section id="app" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow"><span data-product="full">Igneum Ember</span> · the app</div>
<h2>The app you mine with</h2>
<p>Your rate, what it costs a day and the chain itself, drawn live with your own blocks marked. Here it is, on a real rig.</p>
</div>
<div class="shots">
<figure class="shot">
<img src="/img/miner-dashboard.webp" width="2880" height="1800" class="img-dark" alt="The Mine page of Igneum Miner 0.3.14 on a three-card rig: 169 MH/s at 532 W, 84 blocks this run, and one row per card with its rate, watts, MH per watt, temperature, tune line and Tune button" loading="lazy" decoding="async">
<img src="/img/miner-dashboard-light.webp" width="2880" height="1800" class="img-light" alt="The Mine page of Igneum Miner 0.3.14 in light mode" loading="lazy" decoding="async">
<figcaption>Shipping now: the Mine page of 0.3.14 on the three-card Windows rig, live devnet.</figcaption>
</figure>
<figure class="shot">
<img src="/img/app-overview-dark.webp" width="1440" height="1259" class="img-dark" alt="The Overview page of the next release: 511 MH/s, 629 W, £4.23 a day of electricity, 6,784 blocks this run; the chain drawn live, one lane per miner, this rig's blocks marked you, and locked checkpoints; the node line and the activity log" loading="lazy" decoding="async">
<img src="/img/app-overview-light.webp" width="1440" height="1259" class="img-light" alt="The Overview page of the next release in light mode" loading="lazy" decoding="async">
<figcaption>Next release: the Overview, with the chain live on your screen and your blocks marked. From the app in development.</figcaption>
</figure>
<figure class="shot">
<img src="/img/app-cards-dark.webp" width="1440" height="1381" class="img-dark" alt="The Cards page of the next release: Ember Tune with Efficiency, Balanced and Maximum goals and the watts it saves; one row per card with its rate, watts, hashes per watt, cost a day and temperature; the RTX 5090's details open with its power cap, goal, Retune and the tune curve of hash rate against power" loading="lazy" decoding="async">
<img src="/img/app-cards-light.webp" width="1440" height="908" class="img-light" alt="The Cards page of the next release in light mode" loading="lazy" decoding="async">
<figcaption>Next release: the Cards page, every card tuned by Ember, cap and curve per card. From the app in development.</figcaption>
</figure>
</div>
<ul class="app-lines">
<li><strong>One click.</strong> The node, the miner, the prover and a wallet, installed together. Start, and the card mines.</li>
<li><strong>Every card tuned.</strong> Ember Tune walks each card through its power steps and keeps the point with the most hashes per watt.</li>
<li><strong>The chain on your screen.</strong> Every block as it lands, yours marked, shards proven, checkpoints locked. The same picture as the top of this page.</li>
</ul>
<div class="dl-list app-dl">
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary">Windows <span data-dl-meta="miner-windows">v0.3.15 · 62.7 MB</span></a>
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg">macOS <span data-dl-meta="miner-mac">v0.3.15 · 41.9 MB</span></a>
<a href="/miner#get">Linux · HiveOS <span>on the miner page</span></a>
</div>
<div class="card wallet-card">
<figure class="shot">
<img src="/img/wallet-home.webp" width="2240" height="1560" alt="The Igneum Wallet window: a balance in IGN, an example address with Send and Receive, node and finality panels, and a history of block rewards" loading="lazy" decoding="async">
</figure>
<div>
<div class="eyebrow">Igneum Wallet</div>
<h3>A wallet that checks finality itself</h3>
<p>Holds the key the miner makes for you, shows every reward and payout, and checks each one with the node's own code: pending, in a block, locked under a checkpoint it verified. macOS now, Windows next. MetaMask export too.</p>
<div class="dl-list"><a data-dl="wallet-mac" href="https://dl.igneum.network/public/igneum-wallet-mac.dmg">macOS <span data-dl-meta="wallet-mac">v0.1.4 · 19.6 MB</span></a><a href="/wallet">The wallet page <span>how it checks</span></a></div>
</div>
</div>
</div>
</section>
<section id="earn" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow">Your card</div>
<h2>What your card does here</h2>
<p>Measured rates from the bench table, and the time a card alone takes to find a block at the network's hash rate right now. In a pool you are paid your share of every block instead.</p>
</div>
<div class="tbl"><table class="cards">
<thead><tr><th>Card</th><th class="num">Hash rate</th><th class="num">Watts</th><th class="num">A block alone, right now</th><th>Measured</th></tr></thead>
<tbody id="cards">
<tr data-mhs="127.7"><td>NVIDIA RTX 5090</td><td class="num">127.7 MH/s</td><td class="num">227 W</td><td class="num eta">pending</td><td>6 Oct 2026, Ember Tune on the three-card Windows rig, 0.15% of rate traded for 84 W</td></tr>
<tr data-mhs="28.8"><td>NVIDIA RTX 4070</td><td class="num">28.8 MH/s</td><td class="num">76 W</td><td class="num eta">pending</td><td>6 Oct 2026, Ember Tune on the same rig, no rate lost for 30 W</td></tr>
<tr data-mhs="17.8"><td>AMD RX 9070 XT</td><td class="num">17.8 MH/s</td><td class="num">not logged</td><td class="num eta">pending</td><td>5 Oct 2026, the eGPU entry of the engineering log, the app's rate</td></tr>
<tr data-mhs="26.7"><td>Apple M5 Max</td><td class="num">26.7 MH/s</td><td class="num">not logged</td><td class="num eta">pending</td><td>4 Oct 2026, the first live hourly swap</td></tr>
<tr><td>NVIDIA RTX 4090</td><td class="num">not yet measured</td><td class="num"></td><td class="num"></td><td>Run the app and your row joins <a href="/miners">the bench table</a></td></tr>
<tr><td>AMD RX 7900 XTX</td><td class="num">not yet measured</td><td class="num"></td><td class="num"></td><td>Run the app and your row joins <a href="/miners">the bench table</a></td></tr>
</tbody>
</table></div>
<p class="note" id="cards-note">The time to a block is the network hash rate divided by the card's rate, recomputed on every reading; it is an expectation, not a promise. Every row names its engineering log entry; nothing here is estimated.</p>
<p class="fair"><b>Graphics cards only.</b> A new mining program every hour, so no chip is built for it. Your card proves the blocks as well as mining them. Every block pays 80% to its miner and 20% to the provers of that block; nothing to anyone else.</p>
</div>
</section>
<section id="check" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow">For the sceptic</div>
<h2>Three things to check</h2>
<p>Igneum states its limits first. Each of these is measured, published and open to anyone who wants to break it.</p>
</div>
<div class="card verify" style="margin-bottom:var(--s-4)">
<div class="verify-head">
<div class="eyebrow">This tab · light client</div>
<div class="state" data-lc="badge"><span class="dot off"></span><span data-lc="badge-text">PREVIEW</span></div>
</div>
<div class="verify-row">
<div class="tick"><svg viewBox="0 0 24 24" width="26" height="26" fill="none" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7"></path></svg></div>
<div>
<h3>Browser checks Igneum</h3>
<p data-lc="line">A checkpoint certificate, verified in this tab. Voter list from the node.</p>
</div>
</div>
<div class="verify-grid">
<div class="cell"><div class="k">Block proof</div><div class="v" data-lc="proof" title="No execution proof is on the chain yet. The first off-chain GPU proof of a block was 4 October 2026">not yet</div></div>
<div class="cell"><div class="k">Checkpoint</div><div class="v" data-lc="checkpoint">checking</div></div>
<div class="cell"><div class="k">Proof system</div><div class="v" data-lc="system">BLS aggregate, version 1</div></div>
<div class="cell"><div class="k">Verified in this tab</div><div class="v hot" data-lc="tab">checking</div></div>
</div>
<script type="module" src="/verify/verify.js"></script>
</div>
<p class="note" style="margin:0 0 var(--s-5)">Every card mines; today's app proves on a 24 GB NVIDIA card and mines and proves on 32 GB. Measured on 6 October 2026 on eleven rented cards with the patched server: every NVIDIA card from 8 GB proves, 10 GB and up mine and prove (<a href="/bench#prover-tiers-on-real-cards-the-rented-fleet-6-october-2026-branch-gpu-fleet">the log</a>); ships when the packaging row lands. AMD and Apple cards mine. The chip model is public: <a href="/bench#counter-asic-2-0-the-numbers">the numbers</a>.</p>
<div class="grid c3 proofs">
<div class="card">
<div class="eyebrow">Chip economics</div>
<h3>The chip model is public</h3>
<p>In our public model the strongest chip reaches 5x to 9x per joule against an RTX 5090 today, about 2x once the lever now in its gates ships. The model, its inputs and what it does not cover are in the engineering log.</p>
<a class="more" href="/bench#counter-asic-2-0-the-numbers">The numbers</a>
</div>
<div class="card">
<div class="eyebrow">Monero's technique, applied to GPUs</div>
<h3>A program that keeps changing</h3>
<p>The random program that has kept chips off Monero since 2019 (approximate), rebuilt for graphics cards. The program keeps changing on a schedule fixed at genesis; nobody touches it.</p>
<div class="tbl" style="margin-top:var(--s-2)"><table class="cmp">
<thead><tr><th>Property</th><th>RandomX</th><th>Igneum</th></tr></thead>
<tbody>
<tr><td>Who mines</td><td>CPUs</td><td>GPUs</td></tr>
<tr><td>Program changes</td><td>Every hash</td><td>Every hour</td></tr>
<tr><td>Memory</td><td>2 GB, fixed</td><td>2 GB, growing (the proposed schedule, fixed at the testnet genesis: 2 GB, doubling at years 4, 12 and 28)</td></tr>
<tr><td>Verified by</td><td>Any CPU</td><td>Any CPU</td></tr>
</tbody>
</table></div>
<a class="more" href="/litepaper#randomx">Igneum vs RandomX</a>
</div>
<div class="card">
<div class="eyebrow">Every criticism</div>
<h3>What Igneum does not claim</h3>
<p>Proof lag, chip economics, the market size, and the one rule external review will try hardest to break: the litepaper states the limits, and the ledger carries every criticism, answered or conceded.</p>
<a class="more" href="/litepaper#limits">The limits</a>
<a class="more" href="/ledger">The ledger</a>
</div>
</div>
<p class="note">Built on the shoulders: Kaspa's GHOSTDAG and node, Monero's RandomX idea, Chia's class-group VDF, Ethereum's EVM, Succinct's SP1, BLS12-381 and Bitcoin's address format. What changed, why, and how it is measured: <a href="/litepaper#shoulders">the provenance section of the litepaper</a>.</p>
</div>
</section>
<section id="get" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow"><span data-product="full">Igneum Ember</span> · one click</div>
<h2 id="mine">Install. Start. The card mines.</h2>
<p><span data-product="full">Igneum Ember</span> finds your GPU, makes a wallet for you and runs the node, the miner and the prover as one app. The card mines; a 24 GB NVIDIA card proves as well.</p>
</div>
<div class="download">
<div>
<div class="dl-list">
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary">Windows <span data-dl-meta="miner-windows">v0.3.15 · 62.7 MB</span></a>
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg">macOS <span data-dl-meta="miner-mac">v0.3.15 · 41.9 MB</span></a>
<a href="/miner#get">Linux · HiveOS <span>on the miner page</span></a>
</div>
<p class="notice" data-devnet-notice><b>Devnet.</b> Coins have no value and the chain may be reset.</p>
<p class="notice" data-testnet-notice>Public testnet: not yet open; the devnet build is here for people who want to look.</p>
<p class="notice"><a href="https://discord.gg/beCy8G5ZR" rel="noopener">Join the Discord</a>: the miners, the releases and the bench numbers as they land. The public testnet is weeks away: three seed nodes and the public RPC are up, and it opens when the go checklist closes.</p>
<p class="notice"><a href="/miner">Read more about the miner</a>. The protocol carries no fee. The <span data-product="name">Ember</span> software takes an optional 1% dev fee, like other GPU miners, off with one flag. Download only from this domain. Nobody from Igneum will ask for your seed.</p>
<div class="grid c2" style="margin-top:var(--s-5)">
<div><h3 style="font-size:var(--t-base)">NVIDIA, AMD, Apple silicon</h3><p class="note" style="margin-top:4px">Found by itself. One worker per card, several identities each.</p></div>
<div><h3 style="font-size:var(--t-base)">A new program every hour, no pause</h3><p class="note" style="margin-top:4px">Compiled ahead and swapped in 0.01 ms on the live devnet, 0 rejected blocks.</p></div>
<div><h3 style="font-size:var(--t-base)">Signed updates at a safe moment</h3><p class="note" style="margin-top:4px">The card keeps mining through the download. The old version comes back if the new one fails to start.</p></div>
<div><h3 style="font-size:var(--t-base)">Four pages: Mine, Earnings, Prove, Settings</h3><p class="note" style="margin-top:4px">Every card is one row: rate, watts, MH per watt, pounds a day at your electricity price, a Tune button. The node is one line.</p></div>
<div><h3 style="font-size:var(--t-base)">Ember Tune, measured</h3><p class="note" style="margin-top:4px">An RTX 5090 from 311 W to 227 W for 0.15% of its rate; an RTX 4070 from 106 W to 76 W for none (the Windows rig, 6 Oct 2026). Every number in the bench table.</p></div>
</div>
</div>
<figure class="shot" style="margin:0">
<img src="/img/miner-dashboard.webp" width="2880" height="1800" alt="The Mine page of Igneum Miner 0.3.14 on a three-card PC: 169 MH/s at 532 W, one row per card with its rate, watts, MH per watt, temperature, tune line, Tune button and switch" loading="lazy" decoding="async">
<figcaption><span data-product="caption">Igneum Ember (the app window still says Igneum Miner)</span> 0.3.14 on a Windows rig with an RTX 5090, RTX 4070 and RX 9070 XT, live devnet, 6 Oct 2026.</figcaption>
</figure>
</div>
<details id="testnet-terms" style="margin-top:var(--s-6)">
<summary>What you agree to when you run the testnet miner</summary>
<div class="grid c3">
<p><b>No value.</b> Testnet IGN cannot be sold, bought or redeemed, now or at mainnet. There is no airdrop, no points scheme and no promise tied to testnet balances. Mainnet starts from an empty genesis.</p>
<p><b>Resets.</b> The chain restarts from a fresh genesis when a consensus rule changes. Every reset is announced at least seven days ahead on this page and in the app. Balances, contracts and history do not carry over. The devnet that runs today resets without notice.</p>
<p><b>What the app sends home.</b> The app version, a random machine id made at install, your operating system, the node version, the hash rate, and the app, node and miner logs (which name the address the card mines to). They go to the project's log intake, a service Igneum runs on Vercel, and are read by the maintainers to find faults. Never your seed phrase, never a key, never a file you did not make with the app. Nothing is sold or shared.</p>
</div>
<p class="note">Wallet set-up for MetaMask: <a href="/metamask">chain id, RPC and the one-click button</a>. The miner software takes an optional 1% fee, off with one flag; the protocol carries no fee to anyone.</p>
</details>
</div>
</section>
<section id="build" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow">How it works</div>
<h2>One chain, three jobs</h2>
</div>
<div class="pillars">
<div class="pillar">
<svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="2"></rect><path d="M7 9h4M7 13h2M15 9v4M18 9v4M9 21h6"></path></svg>
<h3>Mine</h3>
<p>Any 4 GB card at launch, 8 GB from about year 4 under the proposed schedule, fixed at the testnet genesis: 2 GB, doubling at years 4, 12 and 28, approximate. 80% of each block to its finder.</p>
<a href="#get">About the miner</a>
</div>
<div class="pillar">
<svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7l8-4z"></path><path d="M9 12l2 2 4-4"></path></svg>
<h3>Prove</h3>
<p>The same card proves shards and sells proofs to other chains.</p>
<a href="#prove">How proving pays</a>
</div>
<div class="pillar">
<svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16"></path></svg>
<h3>Build</h3>
<p>Ethereum bytecode, with the differences documented. Proofs of any computation from the miners' cards, verified by the chain itself. 20% of priority fees to the contracts that ran, stated at the fee levels that exist.</p>
<a href="/litepaper#builders-ask">Deploy on Igneum</a>
</div>
</div>
<p class="note"><a href="/litepaper#building">Read more in the litepaper</a></p>
</div>
</section>
<section id="wallet" class="sec">
<div class="wrap">
<div class="split2">
<div>
<div class="eyebrow">Igneum Wallet · desktop</div>
<h2>Your coins, your wallet</h2>
<p class="lead" style="margin-top:var(--s-3)">Igneum Wallet holds the key the miner makes for you and verifies finality itself. MetaMask works too.</p>
<div class="wallet-states" aria-label="The three states a transfer can be in">
<span class="wstate"><i></i>pending <small>waiting for a block</small></span>
<span class="wstate block"><i></i>in a block <small>carried, not yet covered</small></span>
<span class="wstate final"><i></i>final, checkpoint 5 <small>under a checkpoint this wallet verified</small></span>
</div>
<div class="grid c1" style="gap:var(--s-3)">
<div><h3 style="font-size:var(--t-base)">Sealed on your machine</h3><p class="note" style="margin-top:4px">24 words, three typed back, a password. Argon2id and XChaCha20-Poly1305. Nothing leaves.</p></div>
<div><h3 style="font-size:var(--t-base)">Rewards in one history</h3><p class="note" style="margin-top:4px">Block rewards, proving payouts and transfers. Send with the fee shown. Receive by a QR drawn locally.</p></div>
<div><h3 style="font-size:var(--t-base)">Reads your own node</h3><p class="note" style="margin-top:4px">When the miner is installed, the wallet uses its node. Nobody else sees your balance.</p></div>
</div>
<div class="cta" style="margin-top:var(--s-5)">
<a href="/wallet" class="btn">Read more about the wallet</a>
<a href="/wallet#metamask" class="btn">MetaMask export</a>
</div>
<p class="note">macOS first, Windows next. Public testnet first. Download only from this domain. Nobody from Igneum will ask for your seed.</p>
</div>
<figure class="shot" style="margin:0">
<img src="/img/wallet-home.webp" width="2240" height="1560" alt="The wallet window: a balance in IGN, an example address with Send and Receive, node and finality panels, and a history of block rewards" loading="lazy" decoding="async" style="border-radius:var(--r-row);border:1px solid var(--line)">
<figcaption class="note" style="font-family:var(--f-mono);font-size:var(--t-sm)">Igneum Wallet on a private test network, 5 Oct 2026. The address is an example.</figcaption>
</figure>
</div>
</div>
</section>
<section id="journey" class="sec">
<div class="wrap">
<div class="sec-head">
<div class="eyebrow">The journey</div>
<h2>Where Igneum is right now</h2>
<div class="now" style="margin-top:var(--s-3)"><span class="dot live"></span><span id="stage-label">loading</span></div>
<p>Six phases, four public gates, each a measurement published pass or fail. No calendar dates: each phase closes at its gate.</p>
</div>
<div class="phases" id="phases"></div>
<p class="note">The log below is the engineering log's dated entries, newest first. Day one was 3 October 2026; several entries can share a date because the work is logged as it is run.</p>
<div class="log" id="log"></div>
<p class="note"><a href="/litepaper#roadmap">Read more in the litepaper</a></p>
</div>
</section>
<section id="economics" class="sec">
<div class="wrap">
<div class="split2">
<div>
<div class="eyebrow">Economics</div>
<h2>Every coin, mined</h2>
<p class="lead" style="margin-top:var(--s-3)">Hard cap of 4 billion IGN, halving every two years for ever.</p>
<div class="bar" id="bar" aria-label="Emission split"><div style="width:80%;background:var(--ember)"></div><div style="width:20%;background:var(--molten)"></div></div>
<div class="legend" style="margin-top:var(--s-3)">
<span><i class="sw" style="background:var(--ember)"></i>80% miners</span>
<span><i class="sw" style="background:var(--molten)"></i>20% provers</span>
<span><i class="sw" style="border:1px solid var(--line-2)"></i>0% anyone else in the protocol</span>
</div>
</div>
<div class="tiles" style="grid-template-columns:repeat(2,minmax(0,1fr))">
<div class="tile"><div class="v">0</div><div class="k">premine</div></div>
<div class="tile"><div class="v">0</div><div class="k">stake, anywhere</div></div>
<div class="tile"><div class="v">0</div><div class="k">admin keys in consensus</div></div>
<div class="tile"><div class="v">90%</div><div class="k">of blocks must signal to upgrade</div></div>
</div>
</div>
<p class="note" style="margin-top:var(--s-5)">No premine, no stake, no fee to any team in the protocol. Base fee burned. The one payment to the project is the Ember software's optional 1% dev fee, off with one flag. On the devnet today the coinbase's 20% output is burned under the tag igneum-proving-pool-v0, and provers are paid from a separate escrow in the execution state credited with the same 20%.</p>
<p class="note"><a href="/litepaper#economics">Read more in the litepaper</a></p>
</div>
</section>
<div class="band">
<div class="wrap">
<div>
<h2>Read what Igneum does not claim.</h2>
<p>The litepaper states the limits first. Proof lag, chip economics, the market size, and the one rule external review will try hardest to break.</p>
</div>
<a href="/litepaper#limits" class="btn">The litepaper</a>
</div>
</div>
</main>
<!-- footer:start -->
<footer class="foot">
<div class="wrap">
<div class="foot-grid">
<div class="foot-brand">
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
<p>Mined by GPUs. Proven by fire.</p>
</div>
<nav class="foot-col" aria-label="Read">
<div class="eyebrow">Read</div>
<a href="/litepaper">Litepaper</a>
<a href="/litepaper#limits">What Igneum does not claim</a>
<a href="/litepaper#randomx">Igneum vs RandomX</a>
<a href="/litepaper#shoulders">Built on the shoulders</a>
<a href="/bench">Engineering log</a>
<a href="/evidence">Evidence</a>
<a href="/ledger">Ledger: every criticism</a>
</nav>
<nav class="foot-col" aria-label="Run">
<div class="eyebrow">Run</div>
<a href="/miner">The miner</a>
<a href="/wallet">The wallet</a>
<a href="/miners">GPU bench table</a>
<a href="/miner#fee">The dev fee</a>
<a href="/faucet">Testnet faucet</a>
</nav>
<nav class="foot-col" aria-label="Follow">
<div class="eyebrow">Follow</div>
<a href="/live">Live devnet</a>
<a href="/explorer">Explorer</a>
<a href="/litepaper#roadmap">Journey</a>
<a href="/metamask">Add Igneum to MetaMask</a>
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
<a href="/miner#get">Miner downloads: devnet build</a>
<a href="mailto:hello@igneum.network">Report a flaw: hello@igneum.network</a>
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">Or open an issue on the spec</a>
</nav>
</div>
<div class="foot-base">
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre · <a href="mailto:hello@igneum.network">hello@igneum.network</a></span>
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
<span class="mono">igneum.network</span>
</div>
</div>
</footer>
<script>
(function(){
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
paint();
})();
</script>
<!-- footer:end -->
<!-- journey:start -->
<script type="application/json" id="journey-data">{"updated":"2026-10-06","stage":"phase-3","phases":[{"id":"phase-1","name":"Specification","when":"Under way; closes when the specification is out for external review","status":"active","line":"Mining generator, shard proving, finality rules, written for external review"},{"id":"phase-2","name":"Prove the proving","when":"Under way; closes at its gate","status":"active","line":"Mining program proven on Apple, NVIDIA and AMD; shard proving benchmark on consumer cards still to run","gate":"A fixed published workload, job received to accepted proof on a declared consumer card, sustained with no growing backlog, reproduced by three independent operators"},{"id":"phase-3","name":"Devnet","when":"Live since 3 October 2026; closes at its gate","status":"active","line":"BlockDAG node mining on the new program, GPU miners on three vendors, EVM execution in build","gate":"1 block a second held with proofs under 60 s behind the tip"},{"id":"phase-4","name":"Finality and job market","when":"Closes when the finality design passes external review and one rollup signs for the testnet","status":"next","line":"Sustained-mining finality, external proving jobs, miner client with auto-switching","gate":"Finality design passes external review and one rollup signs for testnet"},{"id":"phase-5","name":"Public testnet","when":"Weeks away: when the go checklist closes","status":"next","line":"Three seed nodes and the public RPC are up; the one-click miner app on Windows, macOS and Linux, HiveOS, pools, the first rollup as a proving customer, no coin yet","gate":"1,000 independent miners run 30 days and rollup proofs are delivered on time"},{"id":"phase-6","name":"Mainnet fair launch","when":"After the testnet has passed its gate: 1,000 independent miners for 30 days and rollup proofs on time","status":"next","line":"Genesis with no premine, 30-day ramp. No listing is arranged, promised or sought by the project"}],"log":[{"date":"2026-10-06","text":"16:01Z: Ember run 6 on the three-card Windows rig","short":"16:01Z: Ember run 6 on the three-card Windows rig"},{"date":"2026-10-06","text":"Counter ASIC 3.0 item 2: the per-day derivation","short":"Counter ASIC 3.0 item 2"},{"date":"2026-10-06","text":"Counter ASIC 3.0 item 8: program work in the latency shadow","short":"Counter ASIC 3.0 item 8"},{"date":"2026-10-06","text":"Counter ASIC 3.0 item 6: the reserve families' step costs","short":"Counter ASIC 3.0 item 6"},{"date":"2026-10-06","text":"Counter ASIC 3.0 gate run, the hash side","short":"Counter ASIC 3.0 gate run, the hash side"},{"date":"2026-10-06","text":"16:01Z: Ember run 6 on the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT)","short":"16:01Z: Ember run 6 on the three-card Windows rig (RTX 5090, RTX 4070"},{"date":"2026-10-06","text":"00:4xZ, the empty `/api/state` reply","short":"00:4xZ, the empty `/api/state` reply"},{"date":"2026-10-06","text":"07:12Z to 07:17Z, the host's chain mode with --save-shards records and --prev, on the Apple M5 Max's CPU","short":"07:12Z to 07:17Z, the host's chain mode with --save-shards records…"},{"date":"2026-10-06","text":"07:52Z to 08:24Z, the segment-aligned prover beside the miner on the RTX 5090 Windows rig's RTX 5090","short":"07:52Z to 08:24Z, the segment-aligned prover beside the miner on the…"},{"date":"2026-10-06","text":"08:26Z to 08:35Z, the fast-time harness on the fresh-record rule","short":"08:26Z to 08:35Z, the fast-time harness on the fresh-record rule"},{"date":"2026-10-06","text":"12:25 to 13:20Z, the finality route: why 26 fresh nodes lost the seed every checkpoint","short":"12:25 to 13:20Z, the finality route: why 26 fresh nodes lost the…"},{"date":"2026-10-05","text":"Ember Tune: the two-knob efficiency tune, the fleet prior, and what the three-card Windows rig could measure tonight","short":"Ember Tune: the two-knob efficiency tune, the fleet prior"},{"date":"2026-10-05","text":"The SP1 CPU prover on the three-card Windows rig beside the miners, and the backend survey: no zkVM proves on AMD","short":"The SP1 CPU prover on the three-card Windows rig beside the miners,…"},{"date":"2026-10-05","text":"The 9070 XT on the eGPU: why 17.9 MH/s, and what moved","short":"The 9070 XT on the eGPU"},{"date":"2026-10-05","text":"Ember Tune: the two-knob efficiency tune, the fleet prior, and what the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT) could measure tonight","short":"Ember Tune: the two-knob efficiency tune, the fleet prior"},{"date":"2026-10-05","text":"Read width of the lottery hash: 4, 16 and 64-byte loads, a per-load mix, a written scratch; three cards","short":"Read width of the lottery hash"},{"date":"2026-10-05","text":"The hot table on the M5 Max: a second table sized to GPU cache beside the 1 GiB dataset","short":"The hot table on the M5 Max"},{"date":"2026-10-05","text":"Mixer x4 and the cache growth rule: the class v3 dataset construction, with the x8 candidate","short":"Mixer x4 and the cache growth rule"},{"date":"2026-10-05","text":"The SP1 CPU prover on the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT) beside the miners, and the backend survey: no zkVM proves on AMD","short":"The SP1 CPU prover on the three-card Windows rig (RTX 5090, RTX…"},{"date":"2026-10-05","text":"Proving v1: segment records, the chain rule, the unproven rule; what was measured tonight","short":"Proving v1: segment records, the chain rule"},{"date":"2026-10-05","text":"Dp4a-class throughput on the M5 Max: the dot4 emulation against the ALU chain","short":"Dp4a-class throughput on the M5 Max"},{"date":"2026-10-05","text":"Layer 3 scratch soundness","short":"Layer 3 scratch soundness"},{"date":"2026-10-05","text":"Epoch length as an era parameter : the Apple M5 Max's compile-ahead per program","short":"Epoch length as an era parameter"},{"date":"2026-10-05","text":"Aggregation cost on the RTX 5090: what a per-block aggregation spends and what each lever gives","short":"Aggregation cost on the RTX 5090"},{"date":"2026-10-05","text":"The C4 fix: certificate-driven reorg","short":"The C4 fix: certificate-driven reorg"},{"date":"2026-10-05","text":"EVM transaction relay: three nodes in a chain, every transaction sent to one end included by the other two miners","short":"EVM transaction relay"},{"date":"2026-10-05","text":"The prover carries both fee tables and the height switch: one pinned guest on either side of DAA 210,000","short":"The prover carries both fee tables and the height switch"},{"date":"2026-10-05","text":"FUD ledger sweep round 6","short":"FUD ledger sweep round 6"},{"date":"2026-10-05","text":"Live devnet: real transactions, the first non-empty shard proven and paid, and the exporter's block structure fixed","short":"Live devnet: real transactions, the first non-empty shard proven and…"},{"date":"2026-10-05","text":"The program id split: why the Apple M5 Max rejected the RTX 5090 Windows rig's proofs, and the verifier at 114 s","short":"The program id split"},{"date":"2026-10-05","text":"Live devnet: the first shards proven, verified and paid","short":"Live devnet: the first shards proven, verified and paid"},{"date":"2026-10-04","text":"One-click Windows workers: what the Apple M5 Max could measure","short":"One-click Windows workers"},{"date":"2026-10-04","text":"First finality lock on the live devnet: checkpoint 242 at 77.4% of all weight, two hours after genesis","short":"First live finality lock: 77.4% of weight, 17 voters"},{"date":"2026-10-04","text":"The gfx1036 worker fault and what the Apple M5 Max could and could not reproduce","short":"The gfx1036 worker fault and what the Apple M5 Max could and could…"},{"date":"2026-10-04","text":"A node 60 s behind the clock is silently dead","short":"A node 60 s behind the clock is silently dead"},{"date":"2026-10-04","text":"First machine on the Igneum Miner app: the RTX 5090 Windows rig's RTX 5090 at 118 MH/s, via Setup.exe","short":"First machine on the one-click app: a 5090 at 118 MH/s"},{"date":"2026-10-04","text":"Difficulty rule v2: the live oscillation, its cause, the DAG replay, the fix behind a height switch","short":"Difficulty rule v2"},{"date":"2026-10-04","text":"The observer stored nothing for 78 minutes, then 7,022 blocks in two minutes","short":"The observer stored nothing for 78 minutes, then 7,022 blocks in two…"},{"date":"2026-10-04","text":"The RTX 5090 Windows rig at the 14:20 boundary: a worker stuck on the previous epoch","short":"The RTX 5090 Windows rig at the 14"},{"date":"2026-10-04","text":"Shard proving on the RTX 5090: a full shard compressed in 10.9 s, a two-shard block aggregated in 2.2 s, all verified","short":"Shard layer on the RTX 5090: a full shard proven in 10.9 s, a block aggregated in 2.2 s"}]}</script>
<!-- journey:end -->
<script src="/scenes/feed.js"></script>
<script src="/live-steps.js"></script>
<script>
(function(){
var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var fmtN=function(v){return v===null||v===undefined?'pending':Number(v).toLocaleString('en-GB');};
function fmtHash(h){if(h===null||h===undefined||!(h>0))return 'pending';return h>=1e9?(h/1e9).toFixed(1)+' GH/s':(h/1e6).toFixed(1)+' MH/s';}
// the live scene: the shared module reads /api/live; the counters read the chain, never the window (chain block,
// shards paid on the chain, the latest locked checkpoint); the state word and the note say what the feed is doing
var label=document.getElementById('viz-label'),word=document.getElementById('viz-word'),dot=label?label.querySelector('.dot'):null,note=document.getElementById('viz-note');
var cb=document.getElementById('c-blocks'),cp=document.getElementById('c-proven'),cl=document.getElementById('c-locked'),cm=document.getElementById('c-miners'),ch=document.getElementById('c-hash');
function setWord(state,reason){
if(!word||!dot)return;
var w=state==='live'?'live devnet':state==='stale'?reason:state==='failed'?'live feed unavailable':'connecting to the devnet observer';
word.innerHTML=state==='live'?'<a href="/live">live devnet</a>':w;
dot.className='dot '+(state==='live'?'live':state==='failed'?'bad':'off');
label.className='state '+(state==='live'?'live':state==='failed'?'bad':'');
if(state!=='live'&&note){note.textContent=(state==='failed'?'The live feed is unavailable, so the scene holds its last blocks and the counters read pending.':state==='stale'?w.charAt(0).toUpperCase()+w.slice(1)+'. The scene holds the last stored blocks; the counters are the last the observer wrote.':'Connecting to the devnet observer.')+' The live page shows the last stored state.';}
}
// the network right now: the strip under the facts and the card picker's time to a block, from the same reply
var lastTs=null,netHash=null;
function flash(id,text){var el=document.getElementById(id);if(!el)return;if(el.textContent!==text){el.textContent=text;el.classList.add('tick');setTimeout(function(){el.classList.remove('tick');},700);}}
function fmtDur(sec){if(!(sec>0))return 'pending';if(sec<90)return Math.round(sec)+' s';if(sec<5400)return Math.round(sec/60)+' min';if(sec<172800)return (sec/3600).toFixed(1)+' h';return Math.round(sec/86400)+' days';}
function network(d){var s=d.state;netHash=s.hashes_per_second_estimate;
flash('n-hash',fmtHash(netHash));
var bpm=s.blocks_per_minute||[],last10=bpm.slice(-10).reduce(function(a,p){return a+(p[1]||0);},0);flash('n-blocks10',bpm.length?fmtN(last10):'pending');
var nb=d.blocks[d.blocks.length-1];lastTs=nb?nb.ts:null;if(nb){document.getElementById('n-last-s').textContent=(nb.number!==null&&nb.number!==undefined?'block '+fmtN(nb.number):'block '+nb.hash.slice(0,8))+(nb.chain?', on the selected chain':', '+(nb.color==='blue'?'included':nb.color==='red'?'excluded':'pending'));}
var pv=d.proving;flash('n-paid',!pv||!pv.supported?'no proving layer':!pv.active?'not active':fmtN(pv.paid_shards_total));document.getElementById('n-paid-s').textContent=pv&&pv.active?fmtN(pv.shards_paid_10m||0)+' in the last 10 min':'on the chain so far';
var bps=document.getElementById('c-bps');if(bps)bps.textContent=s.blocks_per_second_60s!==null&&s.blocks_per_second_60s!==undefined?Number(s.blocks_per_second_60s).toFixed(2):'pending';
document.querySelectorAll('#cards tr[data-mhs]').forEach(function(tr){var r=parseFloat(tr.getAttribute('data-mhs'))*1e6,el=tr.querySelector('.eta');if(!el)return;var t=netHash>0?fmtDur(netHash/r):'pending';if(el.textContent!==t){el.textContent=t;el.classList.add('tick');setTimeout(function(){el.classList.remove('tick');},700);}});}
setInterval(function(){var el=document.getElementById('n-last');if(!el||lastTs===null)return;var age=Math.max(0,Math.round((Date.now()-lastTs)/1000));el.textContent=age+' s ago';},1000);
function onData(d){network(d);
var s=d.state,pv=d.proving,fn=d.finality;
cb.textContent=fmtN(s.height);
cp.textContent=!pv||!pv.supported?'no proving layer':!pv.active?'not active':fmtN(pv.paid_shards_total);
cl.textContent=!fn||!fn.supported?'no finality':!fn.active?'finality paused'+(fn.latest_locked_index?', last #'+fmtN(fn.latest_locked_index):''):fn.latest_locked_index!==null&&fn.latest_locked_index!==undefined?'#'+fmtN(fn.latest_locked_index):'none yet';
cm.textContent=fmtN(s.miners_10m!==null&&s.miners_10m!==undefined?s.miners_10m:(d.miners||[]).length);
ch.textContent=fmtHash(s.hashes_per_second_estimate);
if(note&&!s.stale){var lag=pv&&pv.active&&pv.median_proof_lag_s?Math.round(pv.median_proof_lag_s):null;
note.textContent='One node is read every 2 s. Chain block is the EVM block number. Shards proven is every shard paid on the chain so far'+(pv&&pv.active?' ('+fmtN(pv.shards_paid_10m||0)+' in the last 10 minutes'+(lag?', landing a median '+lag+' s behind the tip, so the newest blocks on screen are still pending':'')+')':'')+'. Last lock is the latest checkpoint the finality rule locked. A card runs several vote keys. Every square is a real block released at a calm pace so each step can be seen; the caption follows the newest block that changed step.';}
}
// the step view: the shared feed polls /api/live (300 s window so late proofs still reach the caption) and pushes to the scene
var stepsCanvas=document.getElementById('steps');
if(stepsCanvas&&window.IgneumFeed&&window.IgneumSteps){var steps=IgneumSteps.mount(stepsCanvas,{caption:document.getElementById('steps-caption')});
IgneumFeed.start({window:300,subs:[steps],onState:setWord,onData:onData});}
// hourly program ticker
var ops=['rotl','rotr','xor','add','sub','mul','mulhi','mad','or'];
function hex(){return '0x'+Math.floor(Math.random()*0xFFFFFFFF).toString(16).toUpperCase().padStart(8,'0');}
function reg(){return 'r'+Math.floor(Math.random()*8);}
function line(){var o=ops[Math.floor(Math.random()*ops.length)];var r=Math.random();
if(r<0.25)return reg()+' ^= load(ds, '+reg()+' & MASK)';
if(r<0.35)return reg()+' = shfl_xor('+reg()+', '+[1,2,4,8,16][Math.floor(Math.random()*5)]+')';
if(o==='mad')return reg()+' = mad('+reg()+', '+reg()+' | 1, '+reg()+')';
if(o==='rotl'||o==='rotr')return reg()+' = '+o+'('+reg()+', '+Math.floor(Math.random()*31+1)+')';
if(o==='mulhi')return reg()+' = mulhi('+reg()+', '+hex()+')';
return reg()+' = '+reg()+' '+({xor:'^',add:'+',sub:'-',mul:'*',or:'|'})[o]+' '+(Math.random()<0.5?reg():hex());}
var pre=document.getElementById('program');
function program(){var ls=['// seed from a locked checkpoint, through a 10 minute delay'];for(var i=0;i<5;i++)ls.push(line());ls.push('// 64 instructions x 8 iterations, regenerated every hour');return ls;}
function type(ls){pre.textContent='';var i=0,j=0,out='';function t(){if(i>=ls.length)return;if(j<=ls[i].length){out=ls.slice(0,i).join('\n')+(i?'\n':'')+ls[i].slice(0,j);pre.textContent=out;j++;setTimeout(t,reduce?0:14);}else{i++;j=0;t();}}t();}
type(program());
if(!reduce)setInterval(function(){type(program());},16000);
var cd=document.getElementById('countdown');
function countdown(){var n=new Date();var s=3599-(n.getMinutes()*60+n.getSeconds());cd.textContent=String(Math.floor(s/60)).padStart(2,'0')+':'+String(s%60).padStart(2,'0');}
countdown();setInterval(countdown,1000);
// journey: the build inlines journey.json into #journey-data, so the phases and the log render in the same pass as the
// page (no fetch, no layout shift); the fetch is the fallback for an unbuilt copy
var MON=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
function day(iso){var m=/^(\d{4})-(\d{2})-(\d{2})$/.exec(iso||'');return m?(+m[3])+' '+MON[+m[2]-1]+' '+m[1]:(iso||'');}
function journey(j){
var ph=document.getElementById('phases'),lg=document.getElementById('log'),lab=document.getElementById('stage-label');
var active=j.phases.filter(function(p){return p.status==='active';});
var names=active.map(function(p){return p.name;}),list=names.length>1?names.slice(0,-1).join(', ')+' and '+names[names.length-1]:names.join('');
lab.textContent='now · '+list+' · updated '+day(j.updated);
j.phases.forEach(function(p,i){var d=document.createElement('div');d.className='phase '+p.status;d.innerHTML='<div class="w">'+p.when+'</div><div class="n">'+(i+1)+'. '+p.name+'</div>'+(p.gate?'<div class="g">Gate: '+p.gate+'</div>':'<div class="g">'+p.line+'</div>');ph.appendChild(d);});
var SHOW=8,last='';
j.log.forEach(function(e,i){var d=document.createElement('div');if(i>=SHOW)d.className='more';var same=e.date===last;last=e.date;
d.innerHTML='<span class="d"'+(same?' aria-hidden="true"':'')+'>'+(same?'':day(e.date))+'</span><span>'+(e.short||e.text)+'</span>';lg.appendChild(d);});
if(j.log.length>SHOW){var t=document.createElement('button');t.type='button';t.className='log-toggle';t.setAttribute('aria-expanded','false');t.textContent='Show all '+j.log.length+' entries';
t.onclick=function(){var open=lg.classList.toggle('open');t.setAttribute('aria-expanded',open?'true':'false');t.textContent=open?'Show the latest '+SHOW:'Show all '+j.log.length+' entries';};lg.appendChild(t);}
}
var inline=document.getElementById('journey-data'),data=null;
try{if(inline&&inline.textContent.trim())data=JSON.parse(inline.textContent);}catch(e){data=null;}
if(data)journey(data);
else fetch('/journey.json').then(function(r){return r.json();}).then(journey).catch(function(){document.getElementById('stage-label').textContent='phase 3 · devnet';});
})();
</script>
</body>
</html>