diff --git a/site/404.html b/site/404.html index 1f28fc551..c2084f155 100644 --- a/site/404.html +++ b/site/404.html @@ -36,7 +36,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -44,7 +44,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -52,7 +52,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -109,24 +109,24 @@ p{margin:0;color:var(--ink-2);max-width:52ch} Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner @@ -160,13 +160,20 @@ p{margin:0;color:var(--ink-2);max-width:52ch} Engineering log Evidence +
diff --git a/site/bench.html b/site/bench.html index 44ba5b539..e04708f8b 100644 --- a/site/bench.html +++ b/site/bench.html @@ -54,7 +54,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -62,7 +62,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -70,7 +70,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -148,24 +148,24 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform: Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
@@ -504,13 +504,20 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform: Engineering log Evidence +
diff --git a/site/build.mjs b/site/build.mjs index 5816080b2..adee7767d 100644 --- a/site/build.mjs +++ b/site/build.mjs @@ -226,11 +226,13 @@ if (existsSync(join(docs, 'bench-log.md'))) { for (const m of src.matchAll(/^##+\s+(\d{1,2}\s+\w+\s+\d{4})[,:]?\s*(.*)$/gm)) { const d = new Date(m[1] + ' 12:00:00 UTC'); if (isNaN(d)) continue; const iso = d.toISOString().slice(0, 10); - const text = m[2].replace(/\(.*?\)/g, '').replace(/\s+/g, ' ').trim(); + // "(night), ledger M30: ..." loses its bracket and then its leading comma + const text = m[2].replace(/\(.*?\)/g, '').replace(/^\s*[,:;]\s*/, '').replace(/\s+/g, ' ').trim(); if (text) { const t = text.charAt(0).toUpperCase() + text.slice(1); entries.push({ date: iso, text: t, short: shortTitle(t) }); } } const jp = join(here, 'journey.json'); const j = JSON.parse(readFileSync(jp, 'utf8')); + for (const e of j.log) { const t = e.text.replace(/^\s*[,:;]\s*/, ''); e.text = t.charAt(0).toUpperCase() + t.slice(1); } // entries stored before the leading-comma fix const seen = new Set(j.log.map(e => e.date + '|' + e.text)); for (const e of entries.reverse()) { const k = e.date + '|' + e.text; if (!seen.has(k)) { j.log.unshift(e); seen.add(k); } } for (const e of j.log) e.short = shortTitle(e.text); @@ -244,7 +246,24 @@ if (existsSync(join(docs, 'bench-log.md'))) { // The hand-written pages: shared head, nav (with the active link marked) and footer injected in place; the homepage also // gets journey.json inlined so the phases and the log render without a fetch and without a layout shift. const journey = JSON.parse(readFileSync(join(here, 'journey.json'), 'utf8')); -const PAGES = [['index.html', ''], ['litepaper.html', 'litepaper'], ['live.html', 'live'], ['evidence.html', 'evidence'], ['wallet.html', ''], ['404.html', '']]; +// The miner's product name lives HERE and nowhere else (the project lead, 5 October 2026: Ember). Pages carry +// … and the build stamps every span from this table, so a rename is one +// edit. `full` is the first mention on a page and the headings where the brand matters, `name` every mention after that, +// `app` what the bundle, the installer and the window title still say (renaming them touches the over-the-air path), +// `caption` the line under a screenshot of the app window; drop the caption text once the app itself is relabelled. +const PRODUCT = { + full: 'Igneum Ember', + name: 'Ember', + app: 'Igneum Miner', + caption: 'Igneum Ember (the app is still labelled Igneum Miner until 0.3.6)', +}; +function stampProduct(html, file) { + return html.replace(/[^<]*<\/span>/g, (m, k) => { + if (!(k in PRODUCT)) throw new Error(`${file}: unknown data-product="${k}"`); + return `${esc(PRODUCT[k])}`; + }); +} +const PAGES = [['index.html', ''], ['litepaper.html', 'litepaper'], ['live.html', 'live'], ['evidence.html', 'evidence'], ['miner.html', 'miner'], ['wallet.html', 'wallet'], ['metamask.html', ''], ['404.html', '']]; for (const [file, active] of PAGES) { const p = join(here, file); if (!existsSync(p)) throw new Error(`missing page ${file}`); @@ -252,6 +271,7 @@ for (const [file, active] of PAGES) { html = inject(html, 'head', HEAD, file); html = inject(html, 'nav', navFor(active), file); html = inject(html, 'footer', FOOT, file); + html = stampProduct(html, file); if (file === 'index.html') html = inject(html, 'journey', ``, file); writeFileSync(p, html); built.push(file); @@ -275,13 +295,13 @@ for (const [file, active] of PAGES) { '

How a row gets here

', '

Every row names the engineering log entry or the job it came from. "Measured by the team" means our own hardware and our own log. "Reported by the fleet" means a machine we do not own, read from the status lines its miner uploads.

', '

MH per watt needs the card\'s power draw during the run. The app reads it on NVIDIA cards through the driver. Rows get the figure when a run records it.

', - '

There is no other Igneum miner to compare with yet, so this table compares cards, not miners.

', + '

There is no other Igneum miner to compare with yet, so this table compares cards, not miners. The app that produces these rows: the miner page.

', `

Rows: ${rows.length}. Source file: site/miner-bench.json in the repository.

`, ].join('\n')); const toc = [{ lvl: 2, t: 'The table', id: 'table' }, { lvl: 2, t: 'How a row gets here', id: 'how' }]; writeFileSync(join(here, 'miners.html'), page('Igneum GPU bench table', 'Measured Igneum hash rates per GPU: card, generator version, best MH/s, MH per watt where measured, miner version, date and the log entry each number came from.', body, toc, 'Measured hash rates per card on the Igneum lottery hash, with the generator version, the miner version, the date and the log entry behind each number.', - { path: '/miners', heading: 'GPU bench table', active: 'miners' })); + { path: '/miners', heading: 'GPU bench table', active: 'miner' })); built.push('miners.html (' + rows.length + ' rows)'); } console.log('built: ' + built.join(', ')); diff --git a/site/evidence.html b/site/evidence.html index 97f28d667..1931301c7 100644 --- a/site/evidence.html +++ b/site/evidence.html @@ -54,7 +54,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -62,7 +62,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -70,7 +70,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -151,24 +151,24 @@ code{font-family:var(--f-mono);font-size:.92em;background:var(--obsidian);paddin Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
@@ -249,13 +249,20 @@ code{font-family:var(--f-mono);font-size:.92em;background:var(--obsidian);paddin Engineering log Evidence +
diff --git a/site/img/miner-dashboard.webp b/site/img/miner-dashboard.webp new file mode 100644 index 000000000..ade0dafcf Binary files /dev/null and b/site/img/miner-dashboard.webp differ diff --git a/site/img/wallet-final.webp b/site/img/wallet-final.webp new file mode 100644 index 000000000..3e99f50f0 Binary files /dev/null and b/site/img/wallet-final.webp differ diff --git a/site/img/wallet-home.webp b/site/img/wallet-home.webp new file mode 100644 index 000000000..aed154d64 Binary files /dev/null and b/site/img/wallet-home.webp differ diff --git a/site/index.html b/site/index.html index 4325f993e..e5921a015 100644 --- a/site/index.html +++ b/site/index.html @@ -58,7 +58,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -66,7 +66,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -74,7 +74,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -234,6 +234,30 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var( .light .eyebrow{color:#7A776F} .light .job p{color:#3D3B37} +/* product summaries: a framed screenshot beside the copy, mirrored for the wallet */ +.split{display:grid;gap:var(--gap);grid-template-columns:1fr;align-items:center} +@media (min-width:980px){.split{grid-template-columns:1.1fr .9fr;gap:32px 56px}.split.rev{grid-template-columns:.9fr 1.1fr}} +.split-copy{min-width:0} +.shot{position:relative;min-width:0} +.shot::before{content:'';position:absolute;inset:12% -6% -8% -6%;background:radial-gradient(closest-side,rgba(242,84,27,.22),rgba(242,84,27,0));filter:blur(12px);pointer-events:none} +.frame{position:relative;border:1px solid var(--line-2);border-radius:16px;background:#0C0C0E;box-shadow:0 30px 80px rgba(0,0,0,.55);overflow:hidden;color:var(--bone)} +.light .frame{box-shadow:0 30px 80px rgba(12,12,14,.28)} +.frame .bar{height:32px;display:flex;align-items:center;gap:7px;padding:0 14px;border-bottom:1px solid var(--line);background:#121215} +.frame .bar i{width:10px;height:10px;border-radius:50%;background:#2A2A30;display:block} +.frame .bar b{margin-left:auto;font:500 11px/1 var(--f-mono);letter-spacing:.12em;color:var(--ash);text-transform:uppercase} +.frame img{display:block;width:100%;height:auto} +.frame figcaption{padding:10px 14px;font-size:13px;color:var(--ash);border-top:1px solid var(--line);background:#0C0C0E} +.pills{display:flex;flex-direction:column;gap:10px} +.pill{display:flex;flex-direction:column;gap:2px;padding:12px 16px;border:1px solid var(--line);border-radius:var(--tile-r);background:var(--graphite);font-size:15px} +.pill b{font-weight:600}.pill span{font-size:14px;color:var(--ash);line-height:1.4} +.light .pill{background:#fff;border-color:#E4E0D8}.light .pill span{color:#55534F} +.states{display:flex;flex-wrap:wrap;gap:10px} +.state{display:flex;flex-direction:column;gap:6px;flex:1 1 150px;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--tile-r);background:var(--graphite);font-size:13px;color:var(--ash)} +.spill{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;white-space:nowrap;font-family:var(--f-mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;padding:5px 9px;border-radius:999px;border:1px solid var(--line-2);color:var(--ash)} +.spill i{width:7px;height:7px;border-radius:50%;background:var(--ash);display:inline-block} +.state.block .spill{border-color:rgba(255,179,92,.5);color:var(--molten)}.state.block .spill i{background:var(--molten)} +.state.final .spill{border-color:var(--ember);background:var(--ember);color:var(--ember-ink)}.state.final .spill i{background:var(--ember-ink)} + /* journey */ .journey{display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr))} .phase{border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);display:flex;flex-direction:column;gap:6px;position:relative;transition:border-color .2s ease;min-width:0} @@ -286,24 +310,24 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var( Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
@@ -456,20 +480,30 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var(
-

Three ways a card gets paid

-

One client switches the card between hashing and proving by itself.

+

One click. The card mines and proves.

+

Igneum Ember finds your GPU, makes a wallet for you and runs the node, the miner and the prover as one app.

-
-
01

Block reward

80% of emission to the miner who wins the block.

-
02

Proving the chain

20% of emission plus a share of every block's gas.

-
03

Proving for others

Rollups and bridges pay for proofs in their own money.

-
-
- Windows - macOS - Linux - HiveOS -

One click: install, press start, the card mines and proves to a wallet it makes for you. Public testnet first.
The protocol carries no fee. The Igneum Miner 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.

+
+
+
+
Igneum Miner
+ The miner dashboard: hash rate, blocks found, node synced, a countdown to the next program, the block chart, the Apple M5 Max card mining, node and finality panels +
Igneum Ember (the app is still labelled Igneum Miner until 0.3.6) on an Apple M5 Max, live devnet, 5 Oct 2026.
+
+
+
+
+
NVIDIA, AMD, Apple siliconFound by itself. One worker per card, several identities each.
+
A new program every hour, no pauseCompiled ahead and swapped in 0.01 ms on the live devnet, 0 rejected blocks.
+
Signed updates at a safe momentThe card keeps mining through the download. The old version comes back if the new one fails to start.
+
Tunes itself, in publicKernel variants raced every hour, hash per watt swept, every number in the bench table.
+
+ +

The protocol carries no fee. The Ember 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.

+
Testnet terms
@@ -485,9 +519,43 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var(

What the app sends home. 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.

-

Wallet set-up for MetaMask: chain id, RPC and the one-click button. The miner software takes an optional 1% fee, off with one flag; the protocol carries no fee to anyone.

+

Wallet set-up for MetaMask: chain id, RPC and the one-click button. The miner software takes an optional 1% fee, off with one flag; the protocol carries no fee to anyone.

+
+ +
+ +
+
+
+

Your coins, your wallet

+

Igneum Wallet holds the key the miner makes for you and verifies finality itself. MetaMask works too.

+
+
+
+
+
pendingwaiting for a block
+
in a blockcarried, not yet covered
+
final · cp 5under a checkpoint this wallet verified
+
+
+
Sealed on your machine24 words, three typed back, a password. Argon2id and XChaCha20-Poly1305. Nothing leaves.
+
Rewards in one historyBlock rewards, proving payouts and transfers. Send with the fee shown. Receive by a QR drawn locally.
+
Reads your own nodeWhen the miner is installed, the wallet uses its node. Nobody else sees your balance.
+
+ +

macOS first, Windows next. Public testnet first. Download only from this domain. Nobody from Igneum will ask for your seed.

+
+
+
+
Igneum Wallet
+ The wallet window: a balance in IGN, an example address with Send and Receive, node and finality panels, and a history of block rewards +
Igneum Wallet on a private test network, 5 Oct 2026. The address is an example.
+
+
- Read more in the litepaper
@@ -561,13 +629,20 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var( Engineering log Evidence +
@@ -579,7 +654,7 @@ pre{margin:0;font-family:var(--f-mono);font-size:13px;line-height:1.6;color:var( - + @@ -251,14 +254,14 @@ body.all .pager{display:none}
-
Litepaper · version 0.1
+
Litepaper · version 0.2

Mined by GPUs.
Proven by fire.

A proof-of-work chain whose miners also prove every block, run Ethereum's apps, and built so no chip can ever take your place.
- Published 3 October 2026 + Published 3 October 2026 · updated 5 October 2026 Coin IGN · cap 4,000,000,000 - Status pre-specification, pre-testnet + Status devnet live, pre-testnet This is not an offer to sell anything
@@ -277,6 +280,8 @@ body.all .pager{display:none}
  • Building on Igneum
  • Economics
  • For miners
  • +
  • Ember, the miner
  • +
  • The wallet
  • Governance
  • Roadmap
  • Questions miners ask
  • @@ -379,6 +384,22 @@ body.all .pager{display:none}
    Five layers plus the external proving market. A block flows down the column; outside demand feeds the same miners from the side.
    +

    Live on the devnet, 5 October 2026

    +

    The devnet has run since 3 October 2026 on several machines, with cards from all three GPU vendors. Coins on it have no value and the chain may be reset. What is on it today:

    +
    + + + + + + + + + + +
    LayerStateSince
    Mining lotteryA new program every hour on Apple, NVIDIA and AMD cards, compiled ahead, no pause and no rejected block at the boundary4 Oct 2026, first live swap
    BlocksAbout one a secondgenesis, 3 Oct 2026
    DifficultyRule v2, a 600-second reference window, switched on by height under the running chain with no fork and no restart of the chainDAA 33,000, 4 Oct 2026
    FinalityRule v2: a checkpoint every 30 s of chain, locked at two thirds of all 30-day weight. First live lock: checkpoint 242 at 77.4% of all weight, 17 vote keys4 Oct 2026
    Provingv0 active: shards are assigned to miners' keys, proven on their cards, and the records are carried in blocksDAA 84,100, 5 Oct 2026
    EmberThe one-click miner on the fleet, version 0.3.5; 0.3.6 staged4 Oct 2026, first install
    WalletIgneum Wallet 0.1.1 on macOS5 Oct 2026
    +

    Measured: engineering log, "first hourly program swap on the live devnet", "difficulty rule v2 activated on the live devnet at DAA 33,000", "first finality lock on the live devnet" (4 October 2026); the 0.3.6 release plan (5 October 2026). The block rate is the devnet record in the evidence table, row 7.

    +

    Two caveats, stated here before anyone else states them. On 5 October the verifier that checks a proof record before a producer pays it ran on one node; the other nodes stored proofs and did not pay them, and 0.3.6 ships the verifier with the app. And the devnet is the project's own machines plus two outside laptops. Nothing here has been reproduced by anyone outside the project yet; the evidence page says so row by row.

    @@ -424,7 +445,7 @@ body.all .pager{display:none}

    How a block gets proven

    Blocks carry transactions only and make no claim about state. Every node executes the ordered transactions natively at once, so users see their transaction land in about a second. The execution is then split into shards of a fixed proving cost. Shards are assigned by lot to eight provers for ten seconds, then open to anyone; there is no bond. Provers run them on consumer cards, and the shard proofs are folded by recursive aggregation into one proof for the block. That proof lands on-chain within about a minute at launch. Because the proof computes the state from the ordered sequence, a block with a wrong state cannot exist. Invalid transactions are skipped by rule, the way Kaspa skips conflicting spends.

    The proving budget

    -

    Gas prices execution. Proving cost is a different number, so Igneum meters it separately: every transaction pays in both dimensions, and each block has a proving-cost budget set in consensus from measured prover throughput. A transaction that is cheap to run and expensive to prove pays for what it costs the provers. Shard size will be set so a 12 GB card proves one shard in about 20 seconds. That number is the first gate on the roadmap and is not measured yet. The first proofs exist: on 4 October 2026 an RTX 5090 proved a small two-transaction block in 1.4 seconds (2.7 seconds compressed), verified in 0.22 and 0.038 seconds, and a laptop CPU proved a three-shard block end to end in 19 minutes; a shard at the provisional size is the next run, and nothing is proven on the chain itself yet. Once the gate is measured, the budget rises by schedule as hardware improves. The proof system is hash-based, which is what runs on consumer cards, and sits behind a versioned interface, so Igneum can adopt a better proof system when one exists by a miner-signalled release, and runs for ever on the current one if none is adopted.

    +

    Gas prices execution. Proving cost is a different number, so Igneum meters it separately: every transaction pays in both dimensions, and each block has a proving-cost budget set in consensus from measured prover throughput. A transaction that is cheap to run and expensive to prove pays for what it costs the provers. Shard size will be set so a 12 GB card proves one shard in about 20 seconds. That number is the first gate on the roadmap and is not measured yet. The first proofs exist: on 4 October 2026 an RTX 5090 proved a small two-transaction block in 1.4 seconds (2.7 seconds compressed), verified in 0.22 and 0.038 seconds, and a laptop CPU proved a three-shard block end to end in 19 minutes. Later that day the same card proved a full shard at the provisional size, 6.75 million prover gas, which executed in 60.8 million cycles: core proof 8.3 seconds, compressed proof 10.9 seconds, verified in 0.040 seconds; a four-shard block took 44.5 seconds of GPU stages end to end. Since 5 October 2026 shards are assigned and proven on the live devnet. The gate asks for a mid-range card, and an RTX 5090 is not one, so the gate stands open. Once the gate is measured, the budget rises by schedule as hardware improves. The proof system is hash-based, which is what runs on consumer cards, and sits behind a versioned interface, so Igneum can adopt a better proof system when one exists by a miner-signalled release, and runs for ever on the current one if none is adopted.

    Proving for everyone else

    The same miners accept proving jobs from other chains. Rollups post a job, a miner wins it, proves it, and is paid. The job market is permissionless. Jobs taken through Igneum's own market are paid in IGN and 10% of each fee is burned. The Igneum miner client also bids on other proving networks, where jobs are paid in those networks' currencies, and takes the best price. The proving market is small today. Igneum does not depend on it. No other proof-of-work chain has a seat in it.

    @@ -535,13 +556,79 @@ body.all .pager{display:none}

    The dataset starts at 2 GB and grows by half a gigabyte a year, so a 4 GB card mines for about four years and an 8 GB card for more than a decade, approximate. 12 GB or more proves full shards. NVIDIA and AMD both work, because the mining program is generated for the architecture both share and the proof system is hash-based. Apple's chips are GPUs with unified memory, so Macs mine too. There is no CPU mining lane, on purpose, because CPU mining is what botnets farm. Nodes, wallets and exchanges need no GPU at all.

    What a miner's hour looks like

    The card hashes the lottery continuously. When the client sees a shard or an external job it can win, it switches the card to proving for a few seconds, posts the proof, and goes back to hashing. The client does the switching and the miner sees one balance.

    -

    The protocol carries no fee: no dev fund, no cut to any team. The Igneum Miner software takes an optional 1% dev fee, the way other GPU miners do. One block template in 100 is requested with the dev address instead of yours, by a counter, not a random draw, so it is exactly 1 in 100 and anyone can check it from the source or from the chain. One flag turns it off (--dev-fee 0, a switch in the app, a line in the HiveOS config). The miner prints the fee and the address when it starts. Any other client is welcome.

    +

    The protocol carries no fee: no dev fund, no cut to any team. Ember, the miner software, takes an optional 1% dev fee, the way other GPU miners do. One block template in 100 is requested with the dev address instead of yours, by a counter, not a random draw, so it is exactly 1 in 100 and anyone can check it from the source or from the chain. One flag turns it off (--dev-fee 0, a switch in the app, a line in the HiveOS config). The miner prints the fee and the address when it starts. Any other client is welcome.

    One click, for everyone else

    -

    Farm operators get HiveOS support on day one. Everyone else gets the Igneum app: install it on Windows, macOS or Linux, press one button, and the card is mining and proving to a wallet the app made for you, with earnings shown in IGN and in your currency, and mining paused while you game. It is the same client with a face on it. The app shows you the seed phrase and has you confirm it before mining starts. The address it makes is an ordinary Ethereum account: MetaMask holds it today (chain id, RPC and the one-click button) and the Igneum Wallet, with the Apps tab and the explorer built in, follows. The app updates only when you accept a release signed by the key published in the genesis block, and is downloaded only from this domain or the repository with its hash shown beside the button. Nobody from Igneum will ever ask for your seed. Mining never runs in a browser, because browser compute is slow and browser mining has meant malware since Coinhive. The browser is for the dashboard, and for verifying the chain.

    +

    Farm operators get a HiveOS package. Everyone else gets Igneum Ember: install it on Windows, macOS or Linux, press one button, and the card is mining and proving to a key the app made for you, with earnings shown in IGN and in your currency, and mining paused while you game. It is the same client with a face on it. The app shows you the key and has you save it before mining starts, offers a hardware wallet for your earnings, updates itself from releases signed by the project's release key with a switch to turn that off, and is downloaded only from this domain or the repository with its hash shown beside the button. The next section says what is shipped and what is still a design. Nobody from Igneum will ever ask for your seed. Mining never runs in a browser, because browser compute is slow and browser mining has meant malware since Coinhive. The browser is for the dashboard, and for verifying the chain.

    Fair launch, announced

    Launch date and miner software published a month ahead. Pools live on testnet. HiveOS support on day one. The founders mine from genesis like everyone else, with disclosed addresses and the same software. Nobody has coins before block one.

    +
    +

    Ember, the miner

    +

    Igneum Ember is the one-click miner. It runs the node, mines the hourly program, proves shards and keeps your key, on Windows, macOS and Linux.

    +

    Ember is a supervisor with a face. It starts a node, waits until it is synced, starts one miner per card, reads every line they print into the dashboard, and restarts what fails. It has run the devnet's cards since 4 October 2026. Everything in the first table is in the shipped app. The second table is the six levers set on 4 October 2026 to make it the fastest miner for this chain, each with its state and what has been measured.

    +

    What it does

    +
    + + + + + + + + + + + + +
    FeatureWhat happens
    One clickInstall, press Start. Ember runs its own node, syncs it, and starts one miner per card. Windows, macOS and Linux. Farms get a HiveOS custom-miner package with the same binaries
    Any cardNVIDIA, AMD and Apple silicon are detected with their real names. CUDA on NVIDIA, OpenCL on AMD and Intel, Metal on Apple. No toolchain on the machine: the GPU program is compiled at run time from the pack the node hands over
    A key made for youA payout key is made on your machine and kept in a file only your user can read. Ember shows it once and has you save it before mining starts. Paste your own address instead if you have one
    Hashing and proving in one clientThe same app mines the lottery and proves the shards the chain assigns to its keys, on the same card. Proving is a switch in Settings. The tile shows assigned, proving, submitted and paid
    Several identities per cardEach card carries as many vote keys as you choose, so a large card holds the finality weight its blocks earn. The HiveOS config suggests 8 on a large card and 2 on a small one
    Signed updatesEmber checks a signed manifest hourly, downloads the release, checks its hash, and installs it at a quiet moment: node synced, no hour boundary within 3 minutes, no worker starting. Machines take turns, one minute of the hour each. A release that fails to start twice is rolled back. One switch turns the automatic install off
    Signed remote jobsThe project's own machines take jobs signed by the release key and addressed to named machines: a benchmark, a build, a restart. A job runs once per id and never on a machine it does not name. A switch in Settings turns them off
    WatchdogA miner that prints nothing for 90 s, or reports zero for 60 s while the node is synced, is restarted. A worker that reports work it did not do, or returns a hash the CPU re-check rejects, is restarted by the miner itself. A node that stops answering is restarted
    DashboardPer card: rate, accepted and rejected blocks, temperature, draw, MH per watt, the kernel variant in use, the proving state, and every event. Served on this machine only, behind a per-launch token
    +

    Source: the app's engine, detection, keys, prover, updater, jobs and watchdog modules (app/igneum-app/src), the HiveOS package (packaging/hive). Design, not yet measured on a real card: the watchdog rules and the fault guards, which were measured against a fake worker only (engineering log, "miner fault guards and the app watchdog", 4 October 2026).

    +

    Six levers

    +
    + + + + + + + + + +
    LeverWhat it doesState, 5 Oct 2026Measured
    1. Compiler race every hourAt every hourly program the worker compiles up to 17 variants of the kernel (unroll, load path, register budget, threads per block), checks each bit for bit against the base kernel, times each for 2 s with mining paused, and keeps the fastest for the hour. The hash never changesShipped in the Metal and CUDA workers+17.3% on the genesis seed and +21.2% on the hourly seed, Apple M5 Max, Metal, 14 variants, under load, ratios only. The RTX 5090 race is built and not yet run
    2. Per-card auto-tune from the fleetEvery race writes a record to the fleet log. The best variant per card model is aggregated and sent back to every machine inside the signed update manifest, so a new card starts from the fleet's best and keeps racingShipped. The fleet is small, so no table yetNo fleet table yet
    3. Hash per wattSteps an NVIDIA card's power cap from 100% to 50% of its default in 10% steps, holds each for 60 s, and keeps the best MH per watt. The tile shows live MH per watt. The sweep never restarts the worker, so the hour's program is never lostIn the app for NVIDIA cards. AMD and Apple: not supportedThe first sweep on a card is pending. The RTX 5090 drew 290 W at p95 under a 460 W cap, so the cap did not bind
    4. Template latencyThe miner subscribes to new templates instead of polling, the node builds the next template ahead, and the workers switch without draining the batch. Target under 50 ms from a new block to the card working on it, solo against the local nodeIn 0.3.6Switched p50 46 to 52 ms, p90 118 to 130 ms, 3-node fast-time network, CPU miners, 0 rejected
    5. Never lose a secondThe next hour's program is compiled ahead and swapped in place. The watchdog, the restarts, the CPU re-check of every found hash and per-worker health on every tile keep the card hashingShippedSwap 0.01 ms on the Mac and 0.00 ms on the RTX 5090, 0 rejected, live devnet. Fake-worker guards: trip 0.0 s, worker back in 2.0 s; a silent worker restarted at 60 s
    6. Prove it in publicEvery measured rate, with the card, the miner version, the date and the log entry it came from, on one pageLiveThe bench table
    +

    Measured: engineering log, "miner performance: variant racing" (lever 1), "first hourly program swap on the live devnet" and "miner fault guards and the app watchdog" (lever 5), 4 October 2026; the 0.3.6 release plan, the miner-latency gate (lever 4), 5 October 2026; the efficiency-sweep plan, the RTX 5090 log of 4 October 2026 (lever 3). Levers 2 and 3 are shipped code with no fleet measurement yet.

    +

    The software's fee, not the protocol's

    +

    The protocol is fee-free: no dev fund, no fee to any team, foundation or fund. Ember takes a 1% software dev fee, the norm for GPU miners. One block template in 100 is requested with the dev address instead of yours, by a counter, never a random draw, so it is exactly 1 in 100 and anyone can check it from the source or from the chain. A fee block still carries your vote key, so it still adds to your finality weight. Ember prints the fee and the address when it starts, shows it in Settings next to a switch, and --dev-fee 0 turns it off, as does DEV_FEE=0 in a HiveOS flight sheet. Any other client is welcome.

    +

    Measured: engineering log, "the software dev fee measured on a test network", 4 October 2026: 9 fee blocks in 785 from two fee-paying miners, 0 from the control at --dev-fee 0, the chain and the miners' counters equal.

    +

    What Ember does not claim

    + +
    + +
    +

    The wallet

    +

    Igneum Wallet is a desktop wallet, macOS first. It holds the key, signs, reads your own node, and checks finality with the node's own code.

    +
    + + + + + + + + + + + + + +
    FeatureWhat happens
    Create or import24 words on the Ethereum derivation path, so the same words open the same account in MetaMask. Or import the raw key Ember made for you
    The vaultThe key is sealed on your disk with XChaCha20-Poly1305 under a key derived from your password by Argon2id (64 MiB, 3 passes). The password is never written anywhere. Nothing leaves the machine
    SendThe fee is shown before you confirm
    ReceiveA QR code drawn on your machine, with no image service and no call across the network
    HistoryBlock rewards, proving payouts and transfers in one list
    Final means finalThe wallet fetches the finality certificate from the blocks that carried it and verifies the BLS signatures itself with the node's own finality code. Every entry shows pending, in a block, or final with its checkpoint index. A failed execution is never shown as final
    MetaMaskThe network parameters export in one click
    Your nodeThe wallet reads Ember's node on this machine when it is there, so nobody else sees your balance. Without it, a public endpoint serves balances and sending, and a bundled node can be started by the wallet. Finality is verified only against a node's own interface; on a public endpoint entries stay "in a block"
    UpdatesSigned over-the-air updates, installed by themselves when no send is in flight, with rollback when the new version does not start
    NextTouch ID and Windows Hello to unlock. In progress, not live. Windows build: next
    +

    Source: Igneum Wallet 0.1.1, 5 October 2026 (app/igneum-wallet: the vault, HD key, finality, QR and updater modules and the README). Verified: the over-the-air path end to end on one Mac against a test manifest. Not yet run: the Windows path, the rollback paths, a Developer ID signature.

    +
    +

    Governance

    Igneum is governed by the people who power it, and by nobody else.

    @@ -561,14 +648,28 @@ body.all .pager{display:none} PhaseWhenWhatGate to pass 1. SpecificationOct to Nov 2026Mining generator, shard proving, finality rules, written for external review - 2. Prove the provingNov 2026 to Jan 2027Mining program prototype on GPU and CPU, shard proving benchmark on consumer cardsA mid-range GPU proves a shard in under 20 s and a CPU verifies a hash in 10 ms - 3. DevnetStarted 3 Oct 2026, 20 nodes by Mar 2027BlockDAG node with the new mining program and EVM execution, 20 nodes1 block a second held with proofs under 60 s behind the tip + 2. Prove the provingNov 2026 to Jan 2027Mining program prototype on GPU and CPU, shard proving benchmark on consumer cards. So far: an RTX 5090 proves a shard in 10.9 s compressed; a CPU verifies a warp in 0.41 to 0.58 ms. A mid-range card has not been measuredA mid-range GPU proves a shard in under 20 s and a CPU verifies a hash in 10 ms + 3. DevnetStarted 3 Oct 2026, 20 nodes by Mar 2027BlockDAG node with the new mining program and EVM execution, 20 nodes. Live now: 1 block a second, difficulty v2, finality v2 locks, proving v0, Ember on every machine. Not yet measured on the live chain: the proof lag behind the tip1 block a second held with proofs under 60 s behind the tip 4. Finality and job marketApr to Jul 2027Sustained-mining finality, external proving jobs, miner client with auto-switchingFinality design passes external review and one rollup signs for testnet 5. Public testnetAug to Oct 2027One-click miner app on Windows, macOS and Linux, HiveOS, pools, the first rollup as a proving customer, no coin yet1,000 independent miners run 30 days and rollup proofs are delivered on time 6. Mainnet fair launchNov 2027Genesis with no premine, 30-day ramp, exchange listings after

    Phase two decides everything. If consumer GPUs cannot prove shards fast enough, Igneum says so and does not launch on promises.

    +

    What ships next: Ember 0.3.6

    +

    The proving activation of 5 October 2026 set the next release. Each item is in the 0.3.6 plan; none is on the fleet yet.

    +
    + + + + + + + + + +
    ItemWhy
    Ember's node runs the proof verifierOn 5 October no node on the network ran one, so a producer stored proofs and never paid them. The app now points its node at the shipped prover host
    The Windows package ships the prover hostA PC needed a 20-minute setup by hand before it could prove
    The proving tile shows the verifier stateA node that relays proofs but never pays them says so, on the tile and on the live page
    Template latencyLever 4 above: subscribe, pre-warm, switch without draining. Switched p50 46 to 52 ms on the gate run
    Instant jobsA job published to the fleet reached a machine up to 10 minutes later. The app now holds an outbound connection and fetches the moment a job is published, 3 to 6 s expected, not yet measured
    Testnet parameters behind a height switchThe testnet identity and the fee floors adopted on 5 October 2026, so the devnet is never forked by a node update
    +

    Source: the 0.3.6 release plan, 5 October 2026. The latency number is the plan's gate run on a 3-node fast-time network with CPU miners; the instant-jobs latency is an estimate until the first measured row.

    @@ -580,7 +681,7 @@ body.all .pager{display:none}

    Who are you?

    The founders mine from genesis with disclosed addresses and the same software as everyone else, and hold no coins before block one. The team page is published at public testnet, with the people, the mining addresses and the code history.

    Where is the miner?

    -

    Benchmark in January 2027. Miner client with the devnet in spring. One-click app on Windows, macOS and Linux at public testnet in August 2027. All of it before any coin exists. Nothing is asked of a miner before they can run something.

    +

    On the devnet now. Igneum Ember runs on Windows, macOS and Linux, a HiveOS package exists, and the devnet's coins have no value. The public benchmark with a leaderboard by card model is January 2027. Pools and the public testnet are August 2027. All of it before any coin exists. Nothing is asked of a miner before they can run something. The Ember section says what is shipped and what is still owed.

    Will my card still pay in a bear market?

    Block reward and in-chain proving move with the price. Proving for other chains is priced in the customer's money, and it is a small market today. What Igneum can promise is that its miners have the lowest cost in that market, because the card is already running on domestic power, so they are the last to switch off. That is an edge and nothing more.

    @@ -651,13 +752,20 @@ body.all .pager{display:none} Engineering log Evidence +
    diff --git a/site/live.html b/site/live.html index 16767ac42..45e8a0fbf 100644 --- a/site/live.html +++ b/site/live.html @@ -54,7 +54,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -62,7 +62,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -70,7 +70,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -191,24 +191,24 @@ main{padding-bottom:var(--sec)} Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
    @@ -238,9 +238,9 @@ main{padding-bottom:var(--sec)}
    -
    blockschainincluded, paidpendingexcludedjust arrivedselected chainone lane per miner, colour from its id; hover or tap a block
    +
    blockschainincluded, paidpendingexcludedjust arrivedselected chainone lane per miner, colour from its id; hover a block, or tap it to keep its details up
    finalityfinallocked checkpointproposedreads "paused" whenever under two thirds of the weight is signing
    -
    provingshard plannedprovingverified, prover colourpaidwhere proofs land behind the tiphover or tap a cell
    +
    provingshard plannedprovingverified, prover colourpaidwhere proofs land behind the tiphover a cell, or tap it to keep its details up
    @@ -285,13 +285,20 @@ main{padding-bottom:var(--sec)} Engineering log Evidence +
    @@ -326,7 +333,10 @@ main{padding-bottom:var(--sec)} var pxPerSec=40,targetPx=40,bps=0,live=false,serverNow=0,serverAt=0,frozenAt=null,note=''; // ?window=N (30 to 300 s): a fixed long view for diagnosis, the API returns the same span; the default stays the adaptive scale var fixedWindow=Math.max(0,Math.min(300,Number(new URLSearchParams(location.search).get('window'))||0));if(fixedWindow&&fixedWindow<30)fixedWindow=30; - var running=false,needSize=true,inView=true,ptrX=-1,ptrY=-1,pin=null,laneLast=[],laneRun=[],lagNote=''; + var running=false,needSize=true,inView=true,ptrX=-1,ptrY=-1,laneLast=[],laneRun=[],lagNote=''; + // pin: a tapped or clicked block (i = -1) or shard cell (i = shard index). It stays until a tap or click lands elsewhere, + // Escape, or the block leaves the strip (then pinFade holds it for a 200 ms fade). Hover never touches it. + var pin=null,pinFade=null,PIN_FADE=200,closeRect=null,panelRect=null,down=null,TAP_SLOP=10; var TOP=20,BOT=12; // 12 hues that sit beside ember on obsidian; the index comes from the short id, so a miner (or a prover) keeps its colour across reloads var PAL=['#5CB8FF','#3FD39A','#F5C542','#C49BFF','#FF7AA8','#8FD15F','#FFB08A','#6F8CFF','#D9E25A','#FF8FD6','#4FD8D8','#E0A96D']; @@ -394,20 +404,41 @@ main{padding-bottom:var(--sec)} function link(a,b){var d=Math.max(S*0.6,Math.min(48,Math.abs(b.px-a.px)*0.5));x.moveTo(a.px,a.py);x.bezierCurveTo(a.px+d,a.py,b.px-d,b.py,b.px,b.py);} // shard cells: a column under each chain block, shard 0 at the top; sizes from the zoom level, never wider than the block function cellGeom(n){var avail=PROV_H-12,gap=2,ch=Math.min(narrow?7:9,Math.floor((avail-(n-1)*gap)/Math.max(1,n))),cw=Math.max(3,Math.min(narrow?10:12,Math.round(S*0.7),Math.round(pxPerSec*0.85)));return {ch:ch,cw:cw,gap:gap,top:BH+FIN_H+6+Math.max(0,Math.floor((avail-(n*ch+(n-1)*gap))/2))};} - function hit(){ - // returns {b, i}: a block (i = -1) in the blocks strip, or a shard cell (i = shard index) in the proving strip - var qx=ptrX,qy=ptrY; - if(pin){var p=byHash[pin.h];return p&&p.on?{b:p,i:pin.i}:null;} + function hitAt(qx,qy,touch){ + // returns {b, i}: a block (i = -1) in the blocks strip, or a shard cell (i = shard index) in the proving strip. + // A finger is wider than a pointer: a touch gets a larger radius, the nearest target still wins; hover is unchanged if(qx<0)return null; - if(qy=BH+FIN_H&&provOn()){var bb=null,bdx=1e9; for(i=0;iMath.max(g.cw,S*0.5))return null; - var row=Math.floor((qy-g.top)/(g.ch+g.gap));if(row<0||row>=bb.shards.length)return null;return {b:bb,i:row};} + if(!bb)return null;var g=cellGeom(bb.shards.length),ns=bb.shards.length;if(bdx>Math.max(g.cw,S*0.5)*(touch?1.8:1))return null; + var row=Math.floor((qy-g.top)/(g.ch+g.gap)); + if(touch&&(row<0||row>=ns)&&qy>=g.top-8&&qy<=g.top+ns*(g.ch+g.gap)+8)row=Math.max(0,Math.min(ns-1,row)); + if(row<0||row>=ns)return null;return {b:bb,i:row};} return null; } + function hover(){return ptrX<0?null:hitAt(ptrX,ptrY,false);} + // the pinned target while its block is still drawn; null once it has scrolled out of the strip + function pinned(){if(!pin)return null;var p=byHash[pin.h];return p&&p.on?{b:p,i:pin.i}:null;} + function same(a,b){return !!(a&&b&&a.b===b.b&&a.i===b.i);} + function inRect(r,qx,qy){return !!(r&&qx>=r[0]&&qx=r[1]&&qyG-S*2)link(prev,b);prev=b;} x.stroke(); - // hovered block: all of its parent edges, bright - var hv=hit(),hb=hv?hv.b:null; - if(hb&&hv.i<0){x.strokeStyle='rgba(255,179,92,0.9)';x.lineWidth=1.5;x.beginPath();for(i=0;i=PIN_FADE)pinFade=null; + // hovered block (pointer devices only) and pinned block: all of their parent edges, bright + var hv=hover(),hb=hv?hv.b:null,pb=pv?pv.b:null; + if(pb&&pv.i<0){x.strokeStyle='rgba(255,179,92,0.7)';x.lineWidth=1.5;x.beginPath();for(i=0;i0?'rgba(255,179,92,0.95)':(b.color==='red'?'rgba(154,154,158,0.6)':'rgba(154,154,158,0.85)');x.lineWidth=1.5;rrect(b.px-h,b.py-h,S,S,r);x.stroke(); if(b.color==='red'){x.strokeStyle='rgba(154,154,158,0.9)';x.lineWidth=1.5;x.beginPath();x.moveTo(b.px-h*0.5,b.py+h*0.5);x.lineTo(b.px+h*0.5,b.py-h*0.5);x.stroke();}} if(fl>0&&b.chain){x.strokeStyle='rgba(255,179,92,'+fl+')';x.lineWidth=2;rrect(b.px-h-3,b.py-h-3,S+6,S+6,r+2);x.stroke();} - if(hb===b){x.strokeStyle='#F4F1EC';x.lineWidth=1.5;rrect(b.px-h-3,b.py-h-3,S+6,S+6,r+2);x.stroke();}} + if(hb===b&&b!==pb){x.strokeStyle='#F4F1EC';x.lineWidth=1.5;rrect(b.px-h-3,b.py-h-3,S+6,S+6,r+2);x.stroke();} + // the pinned block: a molten ring with a glow, so the reader can find it as the strip moves + if(pb===b){x.save();x.shadowColor='rgba(255,179,92,0.8)';x.shadowBlur=8;x.strokeStyle='#FFB35C';x.lineWidth=2;rrect(b.px-h-5,b.py-h-5,S+10,S+10,r+3);x.stroke();x.restore();}} x.font='500 10px IBM Plex Mono, monospace'; // the chain tip carries its short id; nothing else is labelled unless hovered or pinned if(tip){var lt=tip.hash.slice(0,8),lw=x.measureText(lt).width,lh=11,pad=3; @@ -509,20 +547,35 @@ main{padding-bottom:var(--sec)} if(st==='paid'){x.strokeStyle='#0C0C0E';x.lineWidth=1.5;x.beginPath();x.moveTo(cx0+ng.cw*0.25,cy0+ng.ch*0.55);x.lineTo(cx0+ng.cw*0.45,cy0+ng.ch*0.8);x.lineTo(cx0+ng.cw*0.78,cy0+ng.ch*0.25);x.stroke();}} else if(st==='proving'){x.fillStyle='rgba(255,179,92,0.25)';rrect(cx0,cy0,ng.cw,ng.ch,2);x.fill();x.strokeStyle='rgba(255,179,92,0.9)';x.lineWidth=1;rrect(cx0+0.5,cy0+0.5,ng.cw-1,ng.ch-1,2);x.stroke();} else{x.strokeStyle='rgba(154,154,158,0.55)';x.lineWidth=1;rrect(cx0+0.5,cy0+0.5,ng.cw-1,ng.ch-1,2);x.stroke();} - if(hb===b&&hv.i===si){x.strokeStyle='#F4F1EC';x.lineWidth=1;rrect(cx0-1.5,cy0-1.5,ng.cw+3,ng.ch+3,3);x.stroke();}}} + if(pb===b&&pv.i===si){x.save();x.shadowColor='rgba(255,179,92,0.8)';x.shadowBlur=6;x.strokeStyle='#FFB35C';x.lineWidth=1.5;rrect(cx0-2.5,cy0-2.5,ng.cw+5,ng.ch+5,3);x.stroke();x.restore();} + else if(hb===b&&hv.i===si){x.strokeStyle='#F4F1EC';x.lineWidth=1;rrect(cx0-1.5,cy0-1.5,ng.cw+3,ng.ch+3,3);x.stroke();}}} } x.textBaseline='alphabetic';x.restore(); - // tooltips on the canvas, no DOM: a block, or one shard cell - x.save();x.beginPath();x.rect(G,0,W-G,H);x.clip();x.font='500 10px IBM Plex Mono, monospace'; - if(hb){var l1,l2,l3,ay,tcol=miners[hb.miner]?miners[hb.miner].col:'#3A3A42'; - if(hv.i<0){l1=hb.hash.slice(0,8)+' '+(hb.locked?'locked':hb.chain?'chain':hb.color==='blue'?'included, paid':hb.color==='red'?'excluded':'pending')+(hb.chain&&hb.shards.length?(hb.proven?', proven':', '+hb.shards.length+(hb.shards.length===1?' shard':' shards')):'');l2='blue '+compact(hb.blue_score)+' daa '+compact(hb.daa);l3=hb.parents.length+(hb.parents.length===1?' parent':' parents')+' '+hb.miner;ay=hb.py;} - else{var sd=hb.shards[hv.i];l1=hb.hash.slice(0,8)+' shard '+(hv.i+1)+' of '+hb.shards.length+' '+sd.state;l2='prover '+(sd.prover||'none yet')+' lag '+(sd.lag!==null&&sd.lag!==undefined?sd.lag+' s':'n/a');l3=(sd.payout!==null&&sd.payout!==undefined?sd.payout+' IGN':'unpaid')+(sd.pgas?' '+compact(sd.pgas)+' pgas':'');ay=BH+FIN_H+PROV_H/2;if(sd.prover)tcol=colour(sd.prover);} - var tw=Math.max(x.measureText(l1).width,x.measureText(l2).width,x.measureText(l3).width)+20,th=52,tx=hb.px+h+10,tty=ay-th/2; - if(tx+tw>W-4)tx=hb.px-h-10-tw;if(txW-4)tx=show.b.px-h-10-tw;if(tx=0&&inRect(closeRect,ptrX,ptrY))?'pointer':'';if(c.style.cursor!==cur)c.style.cursor=cur; // gutter: lane labels in the miner's colour, strip names, over anything that scrolled under it x.fillStyle='#0C0C0E';x.fillRect(0,0,G,H);x.strokeStyle='rgba(42,42,48,0.9)';x.lineWidth=1;x.beginPath();x.moveTo(G-0.5,0);x.lineTo(G-0.5,H);x.stroke(); x.textAlign='left';x.font='500 '+(narrow?10:11)+'px IBM Plex Mono, monospace'; @@ -539,7 +592,7 @@ main{padding-bottom:var(--sec)} // ?perf=1 exposes window.__igneumPerf = {frames, drawMs, since} so the draw cost can be read from the console. var PERF=/[?&]perf=1/.test(location.search)?(window.__igneumPerf={frames:0,drawMs:0,since:performance.now()}):null,lastDraw=0; function frame(now){if(!running)return; - if(ptrX>=0||pin||now-lastDraw>=31){lastDraw=now;var t0=PERF?performance.now():0;draw(now);if(PERF){PERF.frames++;PERF.drawMs+=performance.now()-t0;}} + if(ptrX>=0||pin||pinFade||now-lastDraw>=31){lastDraw=now;var t0=PERF?performance.now():0;draw(now);if(PERF){PERF.frames++;PERF.drawMs+=performance.now()-t0;}} requestAnimationFrame(frame);} function start(){if(running||reduce)return;if(document.hidden||!inView)return;running=true;requestAnimationFrame(frame);} function stop(){running=false;} @@ -548,9 +601,18 @@ main{padding-bottom:var(--sec)} if('IntersectionObserver' in window){new IntersectionObserver(function(es){inView=es[0].isIntersecting;if(inView)start();else stop();},{threshold:0}).observe(c);} if('ResizeObserver' in window){new ResizeObserver(function(){needSize=true;kick();}).observe(c);} else window.addEventListener('resize',function(){needSize=true;kick();}); - c.addEventListener('pointermove',function(e){if(e.pointerType==='touch')return;ptrX=e.offsetX;ptrY=e.offsetY;pin=null;if(reduce)kick();}); + // hover: pointer devices only, never a touch; it reads the strip and leaves the pin alone + c.addEventListener('pointermove',function(e){if(e.pointerType==='touch')return;ptrX=e.offsetX;ptrY=e.offsetY;if(reduce)kick();}); c.addEventListener('pointerleave',function(){ptrX=-1;ptrY=-1;if(reduce)kick();}); - c.addEventListener('pointerdown',function(e){if(e.pointerType!=='touch')return;ptrX=e.offsetX;ptrY=e.offsetY;var old=pin;pin=null;var t2=hit();pin=t2&&!(old&&old.h===t2.b.hash&&old.i===t2.i)?{h:t2.b.hash,i:t2.i}:null;ptrX=-1;ptrY=-1;if(reduce)kick();}); + // tap or click: one pointer, down to up, under 10 px of travel, so a scroll on a phone never pins. Pointer events only; + // the canvas ignores click, so a touch tap fires once (its synthetic click is dropped below) + c.addEventListener('pointerdown',function(e){if(e.button&&e.button!==0)return;down=down?null:{id:e.pointerId,x:e.offsetX,y:e.offsetY};}); + c.addEventListener('pointerup',function(e){if(!down||down.id!==e.pointerId){down=null;return;} + var dx=e.offsetX-down.x,dy=e.offsetY-down.y;down=null;if(dx*dx+dy*dy>TAP_SLOP*TAP_SLOP)return;tap(e.offsetX,e.offsetY,e.pointerType==='touch');}); + c.addEventListener('pointercancel',function(){down=null;}); + // anywhere else on the page clears the pin; Escape too + document.addEventListener('click',function(e){if(e.target!==c)clearPin();}); + document.addEventListener('keydown',function(e){if(e.key==='Escape')clearPin();}); start(); // ---------- sparkline ---------- diff --git a/site/metamask.html b/site/metamask.html new file mode 100644 index 000000000..d7bb1b9e4 --- /dev/null +++ b/site/metamask.html @@ -0,0 +1,295 @@ + + + + + +Add Igneum to MetaMask + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    Wallets · chain id · RPC
    +

    Add Igneum to MetaMask

    +
    +

    Igneum runs the Ethereum virtual machine, so MetaMask and every other Ethereum wallet work unchanged. The wallet needs four things: the chain id, an RPC URL, the symbol IGN and 18 decimals. The button below sends them to the wallet with the standard wallet_addEthereumChain request; the wallet shows them to you and asks before adding anything. Nothing on this page asks for a seed phrase or a key. Nobody from Igneum will ask for your seed.

    + +
    +
    + Public testnet · coming +

    Igneum testnet

    +

    The network the one-click miner app joins at public testnet. Coins on it have no value and the chain resets with notice (testnet terms).

    +
    +
    Network name
    Igneum Testnet
    +
    Chain id
    4462 (0x116e)
    +
    RPC URL
    https://rpc.testnet.igneum.network (published with the testnet)
    +
    Symbol
    IGN
    +
    Decimals
    18
    +
    Explorer
    published with the testnet
    +
    + +

    The button switches on when the public RPC is live.

    +
    +
    + Devnet · live now +

    Igneum devnet, through your own node

    +

    The Igneum Miner app runs a full node on your machine and serves the Ethereum RPC on it. Point the wallet at that node. The devnet is a developer network: it resets without notice and its coins have no value.

    +
    +
    Network name
    Igneum Devnet (local node)
    +
    Chain id
    4463 (0x116f)
    +
    RPC URL
    http://127.0.0.1:26790
    +
    Symbol
    IGN
    +
    Decimals
    18
    +
    Explorer
    none yet
    +
    + +

    +
    +
    + +

    Add it by hand

    +

    If the wallet has no one-click support, or you prefer to type: MetaMask, Settings, Networks, Add a network manually. Enter the values from the card above. Any wallet that supports custom EVM networks takes the same four fields.

    +
      +
    1. Network name: Igneum Testnet (or Igneum Devnet for your own node).
    2. +
    3. RPC URL: the one on the card.
    4. +
    5. Chain id: 4462 for the testnet, 4463 for the devnet.
    6. +
    7. Currency symbol: IGN. Decimals: 18.
    8. +
    + +

    For builders

    +

    The same request from your own page or app, so your users land on the right chain:

    +
    await window.ethereum.request({
    +  method: 'wallet_addEthereumChain',
    +  params: [{
    +    chainId: '0x116e',                      // 4462, the Igneum testnet (0x116f = 4463, the devnet)
    +    chainName: 'Igneum Testnet',
    +    nativeCurrency: { name: 'Igneum', symbol: 'IGN', decimals: 18 },
    +    rpcUrls: ['https://rpc.testnet.igneum.network'],
    +    blockExplorerUrls: []
    +  }]
    +});
    +

    Igneum signs transactions with the Ethereum rules (EIP-155, EIP-1559 and legacy envelopes). A transaction signed for another chain id is refused. Gas has two dimensions on Igneum, execution and proving, and the node folds the second into the price it quotes, so eth_gasPrice and eth_estimateGas work as they do on Ethereum. The litepaper has the differences.

    + +

    The app and the Igneum Wallet

    +

    The Igneum Miner app makes an address for your earnings and shows you its seed phrase once. That address is an ordinary Ethereum account: import the seed into MetaMask and the balance is there. An Igneum Wallet with the Apps tab and the explorer built in is in the roadmap; until it ships, MetaMask is the wallet.

    + +

    Chain ids 4461 (mainnet), 4462 (testnet) and 4463 (devnet) are fixed in the node. The testnet RPC URL above is a placeholder until the testnet opens; this page is updated the day it does.

    +
    + + + + + + diff --git a/site/miner.html b/site/miner.html new file mode 100644 index 000000000..04dc8433f --- /dev/null +++ b/site/miner.html @@ -0,0 +1,527 @@ + + + + + +The Igneum miner app + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    Igneum Ember · one click
    +

    Install. Start. The card mines and proves.

    +

    Ember finds your GPU, makes a wallet for you and runs the node, the miner and the prover as one app. Every hour it compiles the next program while the current one mines, so the card never stops.

    + +
    + WindowsmacOSLinuxHiveOSNVIDIA · AMD · Apple silicon +
    +
    +
    +
    +
    Igneum Miner
    + The miner dashboard: hash rate, blocks found, node synced, a countdown to the next program, the block chart, the Apple M5 Max card mining, node and finality panels +
    Igneum Ember (the app is still labelled Igneum Miner until 0.3.6) on an Apple M5 Max, live devnet, 5 Oct 2026.
    +
    +
    +
    +
    + +
    +
    +
    +

    Hash, prove, get paid

    +

    One client. The card hashes the lottery, proves the shards the chain assigns to it, and every block pays one address.

    +
    +
    +
    + +
    01 · HASH
    The card hashes
    +

    A new random program every hour. 80% of each block to the card that finds it.

    +
    +
    + +
    02 · PROVE
    The same card proves
    +

    The client switches to the shards the chain assigns to its keys, posts the proof, and goes back to hashing.

    +
    +
    + +
    03 · GET PAID
    One address, in IGN
    +

    Block rewards and proving payouts land on the address the app made for you. The wallet shows them.

    +
    +
    +
    +
    + +
    +
    +
    +

    Every feature, one line each

    +

    What the app does today on the live devnet, and what is built but not yet measured on a card. Each number links to its engineering log entry.

    +
    + +
    +
    01 · One click

    Install, press Start

    Five steps from download to the first block on a friend's laptop: drag to Applications, open, Get started, Make me an address, Start mining.

    +
    +
    The card mines and proves

    One button starts the node, waits for sync, starts one miner per card and the prover. Quit stops them in order.

    +
    Finds your GPU by itself

    NVIDIA through the driver, AMD and Intel through OpenCL, Apple silicon through Metal. Real card names, one worker per card.

    +
    A wallet made for you

    A payout key made on your machine and locked to your user, with a backup step before mining starts. Or paste an address you already hold.

    +
    Earnings in IGN

    Every block this machine finds pays one address in IGN. The dashboard counts them per run, per hour and for life. The wallet shows the balance.

    +
    Windows, macOS, Linux

    An installer on Windows, a disk image on macOS, a package on Linux. No toolchain, no driver work: the GPU workers are prebuilt.

    +
    HiveOS package

    A custom miner for farms: the Linux miner, node and both GPU workers with the four Hive hooks. Hive itself is untested: report what breaks.

    +
    First outside machine

    An Apple silicon laptop, no instructions beyond the five steps: 33 accepted blocks in 7 minutes, 0 rejected, 21.0 MH/s average.

    log · 4 Oct 2026
    +
    First card on the app

    An RTX 5090 on Windows from the installer: 117 to 119 MH/s, 34 accepted blocks in the first minute, CPU re-check OK on every share.

    log · 4 Oct 2026
    +
    +
    + +
    +
    02 · One client

    Hashing and proving, switched by the client

    The lottery and the proving are kept apart on purpose. The client runs both and the miner sees one balance.

    +
    +
    Hashing and proving in one client

    Proving is a switch. On, the client proves the shards the chain assigns to this machine's keys, submits the record to its own node and goes back to hashing. The tile shows assigned, proving, submitted, paid.

    +
    Several identities per card

    Identities take turns on the card and each one votes and pays separately. 8 suits a big card, 2 a small one, 1 an integrated GPU.

    +
    Hourly program, no pause

    The node announces the next seed early. The worker compiles the next program in the background and swaps at the boundary while the current one mines.

    log · 4 Oct 2026
    +
    + The first live swap, 4 Oct 2026, three vendors +
    + + + + + + +
    CardCompile, ahead of timeSwap at the boundaryRate before / afterRejected
    Apple M5 Max, Metal82 ms0.01 ms26.7 / 26.7 MH/s0
    RTX 5090, CUDA1,285 ms0.00 ms121.8 / 123.4 MH/s0
    AMD Radeon integrated, OpenCLpreparedno restart2.74 / 2.74 MH/s0
    + log · 4 Oct 2026, live devnet v4, epoch boundary at DAA 3,600 +
    +
    +
    + +
    +
    03 · Updates

    Signed, over the air, at a safe moment

    Every app updates itself. This is also how a consensus upgrade reaches every node before its activation height.

    +
    +
    Signed over the air

    The manifest is signed with an Ed25519 key compiled into the app. The app verifies the bytes before it reads them, then checks the download's size and hash.

    +
    Installed at a safe moment

    Node synced, no hourly boundary within 3 minutes, no worker starting. Machines take turns, each in its own minute of the hour, and never while the network lost over 30% of its identities in 10 minutes.

    +
    Mining continues through an update

    The download and the staging run while the card mines. The swap itself takes seconds. If the new version fails to start twice, the previous one comes back by itself.

    +
    Urgent when it has to be

    At once when a consensus activation is within 1,800 blocks or the version is below the minimum supported, or when you click Install now.

    +
    +
    + +
    +
    04 · Faster, by measurement

    The fleet tunes itself

    Nothing here changes the hash. Every variant is the same program in a different shape for the compiler, checked bit for bit before it is timed.

    +
    +
    Variant racing every hour

    At every hourly prepare the worker compiles the program in several shapes (unroll, load path, register budget, threads per group), times each for 2 seconds and keeps the fastest for the hour. Base keeps its place unless beaten.

    log · 4 Oct 2026
    +
    Measured on Apple silicon

    On the M5 Max, 256-thread groups ran 17.3% and 21.2% faster than base on two programs, under load from other work. The NVIDIA race is built and has not yet run on a GPU.

    log · 4 Oct 2026, ratios under contention
    +
    Fleet tuning manifest

    Every race is one record in the app log. The fleet's best variant per card model goes back out inside the signed update manifest, so a card starts from the known best and keeps racing.

    +
    Efficiency mode

    Hash per watt, the number miners compare. The app steps an NVIDIA card's power cap from 100% to 50%, holds each step for 60 seconds on the live kernel and leaves the cap at the best MH per watt. Built and unit-tested; not yet run on a card.

    +
    Latency work

    A block built on a stale tip earns less. The miner is moving from polling to a template subscription and shorter jobs, so a new tip reaches the card in milliseconds. In progress, no number published yet.

    +
    Remote signed jobs, opt in

    Our own fleet only. A switch, "Allow remote jobs from Igneum (signed)", with the key's fingerprint beside it. Off aborts the running job and stops polling. Jobs run at most once each and only on the machines they name.

    +
    +
    + +
    +
    05 · Reliability

    Watchdog, restart, clock

    Measured against a worker that misbehaves on command: these are recoveries in seconds, not hash rates.

    +
    +
    Watchdog per card

    No status line for 90 seconds, or a hash rate of 0 for 60 seconds while synced: the miner is restarted once. If it recurs, that card is marked faulted with the reason and the other cards keep mining.

    log · 4 Oct 2026
    +
    Watchdog per node

    A node that answers nothing for 120 seconds is restarted by the app, with a growing delay when it repeats. Measured: silent node to mining again in 160.0 s.

    log · 4 Oct 2026
    +
    Restart in order

    Miners first, then the node, on quit and on update. What crashes comes back. A worker that restarts itself is left alone, so nothing is restarted twice.

    +
    Clock check

    A clock 60 seconds slow kept a node silently dead for 12 minutes. Now the app reads block times and an HTTPS Date header: over 5 seconds a warning, over 10 seconds Start is blocked and a Sync clock button appears.

    log · 4 Oct 2026
    +
    + Recoveries measured, 4 Oct 2026 +
    + + + + + + + +
    What the worker didWhat the app didBack to mining
    Reported 0 hashesRestarted the miner once after the 60 s rule91.0 s
    The same again inside five minutesMarked the card faulted, no further restart; Resume cleared it75.4 s to faulted
    The miner process stoppedKilled and restarted it after the 90 s rule101.4 s
    The node process stoppedRestarted the node, which synced; mining resumed160.0 s
    + log · 4 Oct 2026, a fake worker on a private test network, no real GPU +
    +
    +
    + +
    +
    06 · Published

    The log and the bench table

    Every number on this page has a row. Prototype numbers say so.

    +
    +
    Engineering log

    Every benchmark and test the project has made, with the hardware and the commands. Newest at the bottom.

    /bench
    +
    GPU bench table

    One row per card, generator version and miner version: best MH/s, MH per watt where measured, the date and the log entry behind each number.

    /miners
    +
    Your rows, from your machine

    The app uploads its status lines once a minute under a per-install id. Rows marked "reported by the fleet" come from machines we do not own.

    +
    +
    +
    +
    + +
    +
    +
    +

    Why Igneum Ember stays ahead

    +

    Six levers, set on 4 October 2026. Each one is an idea in one line and a measured state. Nothing here claims fastest: the bench table says that, or it does not.

    +
    +
    + + + + + + + + + +
    LeverThe ideaMeasured state
    1 · Race the compiler every hourFor each new program, five to ten kernel variants are compiled, benched for two seconds each, and the winner is kept for the hour.Measured on the Mac's Metal worker: the winning variant +17.3% on the genesis seed and +21.2% on the hourly seed over the base compile, under load from other work. The RTX 5090 race is prepared and not yet run. Log, 4 Oct 2026
    2 · Auto-tune that learns from the fleetApps report the race per card and program class. The best settings come back down through the signed update manifest as defaults, so the miner gets faster for everyone as the fleet grows.Shipped. The fleet is still small, so no fleet table yet.
    3 · Hash per watt, not hashA sweep per card finds the power point with the best MH per watt and holds it. Miners pay for electricity; that is the number they compare.Shipped for NVIDIA cards through the power cap. Not yet run on a card; the first sweep on a 5090 is the owed measurement. Clocks are the next lever.
    4 · Template latencySolo against the local node, a new template within 50 ms of a new tip, because a late block on a BlockDAG goes red and earns nothing.Approximate, from the 0.3.6 release plan and not yet in the engineering log: switched p50 46 to 52 ms on a three-node CPU run, 5 Oct 2026. Ships in 0.3.6.
    5 · Never lose a secondZero-loss hourly program swaps, fault guards, automatic restart, a CPU re-check of every found hash, per-worker health.Shipped. Swap 0.01 ms on Metal and 0.00 ms on CUDA with 0 rejected blocks; recoveries in the table above. Log, 4 Oct 2026
    6 · Prove it in publicThe bench table per card, fed from the job channel. We claim fastest only when the table says so.Live at /miners, one row per card, generator version and miner version, each with its log entry.
    +

    The dev fee is the software's 1%, visible and switchable. The protocol carries no fee. The fee, in full view.

    +
    +
    + +
    +
    +
    +

    The fee, in full view

    +

    The protocol carries no fee: no dev fund, no fee to any team, foundation or fund. The software fee is the miner app's, like every other GPU miner's, and one flag turns it off.

    +
    +
    +
    +

    The Ember software takes a visible, switchable 1% dev fee, the norm for GPU miners. One block template in 100 is requested with the dev payout address instead of yours. The choice is a template counter, never a random draw, so it is exactly 1 in 100 and anyone can audit it from the source or from the chain. A fee block still adds to your finality weight; the only thing that moves is who the execution layer pays for that one block.

    +
    + + + + + + +
    WhereOff with
    The app, Settingsthe switch beside the rewards address
    The command line--dev-fee 0
    HiveOS, extra configDEV_FEE=0
    +

    Measured on a test network, 4 Oct 2026: 9 fee blocks in the 785 blocks of two fee-paying miners (1.146%); the control miner at --dev-fee 0 paid none; the miners' counters and both nodes agree. The log entry.

    +
    +
    +
    +
    Settings, as the app shows it
    +
    Dev fee 1% (1 block in 100)
    +

    The miner software's fee, the same way every GPU miner takes one. The protocol takes none. This switch turns it off.

    +
    +
    +
    What the miner prints at start
    +
    dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off
    +
    dev fee off (--dev-fee 0); the default is 1% (1 block in 100) to 0x<address>
    +

    Each fee block is logged as it is accepted. igneum-miner payouts lists blocks per payout address over every block the node holds, with the dev address tagged.

    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Get the miner

    +

    Public testnet first. Until then the devnet runs on machines we invite. Download only from this domain. Nobody from Igneum will ask for your seed.

    +
    + +

    Any 4 GB card. The dataset starts at 2 GB and grows by half a gigabyte a year, approximate. Updates arrive signed; the app installs them itself. The wallet reads this machine's node when the miner is installed.

    + Read more in the litepaper +
    +
    +
    + +
    +
    +
    +

    Every number here has a row.

    +

    The engineering log holds the commands and the hardware behind each one. The bench table compares cards, not miners, because there is no other Igneum miner yet.

    +
    + +
    +
    + + + + + + + diff --git a/site/miners.html b/site/miners.html index fb89e1604..6eb716956 100644 --- a/site/miners.html +++ b/site/miners.html @@ -54,7 +54,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -62,7 +62,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -70,7 +70,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -148,24 +148,24 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform: Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
    @@ -183,7 +183,7 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:

    How a row gets here

    Every row names the engineering log entry or the job it came from. "Measured by the team" means our own hardware and our own log. "Reported by the fleet" means a machine we do not own, read from the status lines its miner uploads.

    MH per watt needs the card's power draw during the run. The app reads it on NVIDIA cards through the driver. Rows get the figure when a run records it.

    -

    There is no other Igneum miner to compare with yet, so this table compares cards, not miners.

    +

    There is no other Igneum miner to compare with yet, so this table compares cards, not miners. The app that produces these rows: the miner page.

    Rows: 6. Source file: site/miner-bench.json in the repository.

    Generated from the repository at build time. Times are UTC. Machine names are model names.

    @@ -205,13 +205,20 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform: Engineering log Evidence +
    diff --git a/site/partials/footer.html b/site/partials/footer.html index 446219f23..ca543a255 100644 --- a/site/partials/footer.html +++ b/site/partials/footer.html @@ -14,13 +14,20 @@ Engineering log Evidence +
    diff --git a/site/partials/head.html b/site/partials/head.html index b5719fbd2..96bc5a4f5 100644 --- a/site/partials/head.html +++ b/site/partials/head.html @@ -23,7 +23,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -31,7 +31,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -39,7 +39,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} diff --git a/site/partials/nav.html b/site/partials/nav.html index 4facac8f4..ab842c297 100644 --- a/site/partials/nav.html +++ b/site/partials/nav.html @@ -10,23 +10,23 @@ Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner
    diff --git a/site/sitemap.xml b/site/sitemap.xml index 4f6bb89cb..dff7730d9 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -7,4 +7,5 @@ https://igneum.network/evidence2026-10-04weekly0.6 https://igneum.network/miners2026-10-04weekly0.6 https://igneum.network/wallet2026-10-05monthly0.6 + https://igneum.network/metamask2026-10-05monthly0.4 diff --git a/site/wallet.html b/site/wallet.html index 8c0e6e788..e548faecd 100644 --- a/site/wallet.html +++ b/site/wallet.html @@ -3,22 +3,22 @@ -Add Igneum to MetaMask - +Igneum Wallet + - - + + - - + + @@ -54,7 +54,7 @@ p,li,dd,figcaption{text-wrap:pretty} a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px;border-radius:6px} .skip{position:absolute;left:12px;top:-80px;z-index:50;background:var(--ui-accent);color:var(--ui-accent-ink);padding:10px 14px;border-radius:10px;font:600 15px/1.2 var(--f-sans);text-decoration:none} .skip:focus{top:12px} -/* nav: one bar on every page, the mark in its black square, five links and the miner button, a menu under 901 px */ +/* nav: one bar on every page, the mark in its black square, seven links and the miner button, a menu under 941 px (the eight items need 688 px beside the brand at 15 px, so the bar fits from 941 px up without a wrapped label) */ .nav{position:sticky;top:0;z-index:20;background:var(--ui-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--ui-line);color:var(--ui-ink)} .nav .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:var(--nav-h)} .nav a{color:inherit;text-decoration:none} @@ -62,7 +62,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .brand .mark{display:block;flex:0 0 auto} .brand .word{font-family:var(--f-display);font-weight:900;font-size:20px;letter-spacing:.06em;line-height:1} .nav .links{display:flex;align-items:center;gap:clamp(14px,2vw,26px);font-size:15px;font-weight:500} -.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease} +.nav .links a{color:var(--ui-ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap;transition:color .15s ease,border-color .15s ease} .nav .links a:hover,.nav .brand:hover{color:var(--ui-hot);text-decoration:none} .nav .brand:hover{color:var(--ui-ink)} .nav .links a[aria-current="page"]{color:var(--ui-ink);border-bottom-color:var(--ui-accent)} @@ -70,7 +70,7 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi .nav .links a.cta:hover{background:var(--ui-hover);border-color:var(--ui-hover);color:var(--ui-accent-ink);transform:translateY(-1px)} .burger{display:none;background:none;border:1px solid var(--ui-line-2);color:var(--ui-ink);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:0 0 auto} .burger .x{display:none}.burger[aria-expanded="true"] .x{display:block}.burger[aria-expanded="true"] .bars{display:none} -@media (max-width:900px){ +@media (max-width:940px){ .nav .links{display:none;position:absolute;left:0;right:0;top:100%;background:var(--ui-menu);border-bottom:1px solid var(--ui-line);box-shadow:0 24px 40px rgba(0,0,0,.35);padding:10px var(--gutter,16px) 18px;flex-direction:column;align-items:stretch;gap:2px} .nav .links a{padding:13px 10px;border-radius:10px;border-bottom:0;font-size:16px} .nav .links a[aria-current="page"]{background:var(--ui-tint)} @@ -95,37 +95,103 @@ a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visi @@ -142,95 +208,183 @@ pre{margin:0 0 16px;padding:16px 18px;background:var(--graphite);border-radius:v Litepaper Live devnet Engineering log - Miners - Wallet + Miner + Wallet Evidence GitHub - Get the miner + Get the miner -
    -
    -
    Wallets · chain id · RPC
    -

    Add Igneum to MetaMask

    -
    -

    Igneum runs the Ethereum virtual machine, so MetaMask and every other Ethereum wallet work unchanged. The wallet needs four things: the chain id, an RPC URL, the symbol IGN and 18 decimals. The button below sends them to the wallet with the standard wallet_addEthereumChain request; the wallet shows them to you and asks before adding anything. Nothing on this page asks for a seed phrase or a key. Nobody from Igneum will ask for your seed.

    -
    -
    - Public testnet · coming -

    Igneum testnet

    -

    The network the one-click miner app joins at public testnet. Coins on it have no value and the chain resets with notice (testnet terms).

    -
    -
    Network name
    Igneum Testnet
    -
    Chain id
    4462 (0x116e)
    -
    RPC URL
    https://rpc.testnet.igneum.network (published with the testnet)
    -
    Symbol
    IGN
    -
    Decimals
    18
    -
    Explorer
    published with the testnet
    -
    - -

    The button switches on when the public RPC is live.

    +
    +
    +
    +
    +
    Igneum Wallet · desktop
    +

    Your coins. Final means final.

    +

    A desktop wallet that holds the key the miner made for you, or one you make here from 24 words. It sends, receives and reads your history, and it verifies every finality certificate itself with the node's own code. No confirmation counts, no trusting the node.

    + +
    macOS firstWindows nextMetaMask export
    +
    +
    +
    +
    Igneum Wallet
    + The wallet window: a balance in IGN, an example address with Send and Receive, node and finality panels, and a history of block rewards +
    Igneum Wallet on a private test network, 5 Oct 2026. The address is an example.
    +
    +
    -
    - Devnet · live now -

    Igneum devnet, through your own node

    -

    The Igneum Miner app runs a full node on your machine and serves the Ethereum RPC on it. Point the wallet at that node. The devnet is a developer network: it resets without notice and its coins have no value.

    -
    -
    Network name
    Igneum Devnet (local node)
    -
    Chain id
    4463 (0x116f)
    -
    RPC URL
    http://127.0.0.1:26790
    -
    Symbol
    IGN
    -
    Decimals
    18
    -
    Explorer
    none yet
    -
    - -

    +
    + +
    +
    +
    +

    Three states, checked here

    +

    Every transfer in the history is pending, in a block, or final. The third one is the wallet's own verdict.

    +
    +
    +
    pending
    Waiting for a block

    Signed on this machine and handed to the node. Nothing has carried it yet.

    +
    in a block
    Chain block 8

    A block carries it and the chain's height passed it. It can still be reorganised until a checkpoint covers it.

    +
    final · cp 5
    Under a verified checkpoint

    Its block sits under a 30-second checkpoint whose certificate this wallet verified: the voter list, the aggregate BLS signature, two thirds of all weight.

    +
    +
    +
    +
    Transaction
    + A sent transfer of 1.5 IGN shown as final under checkpoint 5, certificate verified by this wallet, with amount, example addresses, fee paid, hash, block and the verified checkpoint at chain height +
    The transfer from the test run: 1.5 IGN, final under checkpoint 5, certificate verified by the wallet. Addresses are examples.
    +
    +
    +
    +
    What the wallet checks before it says final
    +
      +
    1. The certificate as a block carried it: the finality section of the blocks after the checkpoint.
    2. +
    3. The canonical voter list: every key above dust and not stripped, sorted by key hash, as many as the certificate says.
    4. +
    5. The aggregate signature over the checkpoint, by the keys the bitmap names.
    6. +
    7. The rule: signed weight at least two thirds of the active weight and of the total weight. Then the transfer's block must sit under the checkpoint on the chain.
    8. +
    +

    The same steps the browser verifier on the home page runs, with the node's own finality code compiled into the wallet. The node's own "locked" field is never read.

    +
    -
    + -

    Add it by hand

    -

    If the wallet has no one-click support, or you prefer to type: MetaMask, Settings, Networks, Add a network manually. Enter the values from the card above. Any wallet that supports custom EVM networks takes the same four fields.

    -
      -
    1. Network name: Igneum Testnet (or Igneum Devnet for your own node).
    2. -
    3. RPC URL: the one on the card.
    4. -
    5. Chain id: 4462 for the testnet, 4463 for the devnet.
    6. -
    7. Currency symbol: IGN. Decimals: 18.
    8. -
    +
    +
    +
    +

    Every feature, one line each

    +

    Version 1, built on the miner's bones: the same local server, the same signed update manifest, the same key code.

    +
    -

    For builders

    -

    The same request from your own page or app, so your users land on the right chain:

    -
    await window.ethereum.request({
    -  method: 'wallet_addEthereumChain',
    -  params: [{
    -    chainId: '0x116e',                      // 4462, the Igneum testnet (0x116f = 4463, the devnet)
    -    chainName: 'Igneum Testnet',
    -    nativeCurrency: { name: 'Igneum', symbol: 'IGN', decimals: 18 },
    -    rpcUrls: ['https://rpc.testnet.igneum.network'],
    -    blockExplorerUrls: []
    -  }]
    -});
    -

    Igneum signs transactions with the Ethereum rules (EIP-155, EIP-1559 and legacy envelopes). A transaction signed for another chain id is refused. Gas has two dimensions on Igneum, execution and proving, and the node folds the second into the price it quotes, so eth_gasPrice and eth_estimateGas work as they do on Ethereum. The litepaper has the differences.

    +
    +
    01 · Your key

    Create or import, sealed on your disk

    The password is never written anywhere. The plaintext only ever exists in the engine's memory and is zeroed when the wallet locks.

    +
    +
    Create: 24 words

    256 bits of entropy from the operating system, as 24 English words. The wallet asks for three of them typed back before it goes on.

    +
    Import

    Your 24 words, a raw private key, or the miner's own payout key file. One click brings the key the miner pays to into the wallet.

    +
    Sealed with a password

    Argon2id (64 MiB, 3 passes) turns the password into a key; XChaCha20-Poly1305 seals the secret under it. The vault is one file in your user folder.

    +
    The Ethereum path

    Keys follow BIP-39 and BIP-44 at the Ethereum path, so the same 24 words open the same account in MetaMask.

    +
    +
    -

    The app and the Igneum Wallet

    -

    The Igneum Miner app makes an address for your earnings and shows you its seed phrase once. That address is an ordinary Ethereum account: import the seed into MetaMask and the balance is there. An Igneum Wallet with the Apps tab and the explorer built in is in the roadmap; until it ships, MetaMask is the wallet.

    +
    +
    02 · Send, receive, history

    Everything on one screen

    Signing happens in the engine, in Rust. Nothing on the window side ever holds the key.

    +
    +
    Balance

    Read from your node every few seconds, in IGN, with the block it was read at.

    +
    Send with the fee shown

    An EIP-1559 transfer. The review shows the amount, the fee at most as base fee plus tip, and what leaves the wallet at most. The zero address and more than the balance are refused.

    +
    Receive by QR

    The code is drawn on your machine as SVG. No image service, no call across the network.

    +
    History with rewards

    Transfers in and out, block rewards from the execution records, one per blue block, and proving payouts when a block carries a proof record.

    +
    Finality per transaction

    Pending, in a block, or final with the checkpoint index, verified here. How it checks.

    +
    Lock

    One button locks the wallet and zeroes the key in memory. The password opens it again.

    +
    +
    -

    Chain ids 4461 (mainnet), 4462 (testnet) and 4463 (devnet) are fixed in the node. The testnet RPC URL above is a placeholder until the testnet opens; this page is updated the day it does.

    +
    +
    03 · Your node

    Reads the miner's node first

    When the miner is installed, the wallet uses its node on this machine. Nobody else sees your balance.

    +
    +
    1 · The miner app's node

    Found on this machine and used as it is. Nothing is started.

    +
    2 · A public RPC

    Balances, sending and history work without a local node. Finality verification needs a node, so transfers stay "in a block" until one is there, and the wallet says so.

    +
    3 · The bundled node

    The wallet starts its own copy of the node on its own ports, no mining, and stops it when the wallet quits.

    +
    Updates, signed

    The same Ed25519 key as the miner's manifest, checked an hour apart. The download is checked against the manifest's hash before Install now opens it.

    +
    +
    + +
    +
    04 · MetaMask

    Export and add the network

    For people who already live in MetaMask. The key leaves this app only when you copy it.

    +
    +
    Add to MetaMask

    One click adds the Igneum network with its chain id and RPC. Copy network settings puts the same values on the clipboard.

    +
    Export the key

    Behind the password, behind a warning: a copied key can be stolen from the clipboard, a screenshot or a notes app. Paste it straight into MetaMask and clear the clipboard.

    +
    Desktop first

    macOS now, as a disk image. The Windows host is written and untested. No browser extension and no phone app yet.

    +
    +
    +
    +
    + +
    +
    +
    +

    The first run, timed

    +

    A private test network, 5 Oct 2026: one node, one CPU miner paying to wallet A, wallet A sending to wallet B. The log entry ships with the wallet.

    +
    +
    + + + + + + + + + + + + +
    StepFrom the node's startWhat was seen
    Wallet A created, 24 words, three typed back0.3 san address
    Wallet B: a wrong word refused, then created0.4 to 0.5 s"word 1 is not right"
    A's balance from block rewards3.5 s10.14 IGN at block 4
    Zero address, 999,999,999 IGN, a short address4.5 sall three refused by the quote
    Quote for 1.5 IGN to B4.6 sgas 25,380; base fee 1 gwei; tip 1 gwei; fee at most 0.00007614 IGN
    In a block5.6 schain block 8
    First locked checkpoint on the networkabout 170 sindex 5
    Final in wallet A175.2 sunder checkpoint 5, certificate verified by the wallet: 1 of 1 voters, 100% of total weight
    B's view of the same transfer175 s1.5 IGN, final
    +

    Send to final: 170.6 s, all of it the network's first lock on a fresh chain. On the live devnet checkpoints lock every 30 seconds once the weight window is full. 13 unit tests cover the words, the path, the vault, the signing and the finality state machine.

    +
    +
    + +
    +
    +
    +

    Get the wallet

    +

    Public testnet first. Download only from this domain. Nobody from Igneum will ask for your seed.

    +
    + +

    The wallet reads this machine's node when the miner is installed. Without it, a public RPC for balances and sending, or the bundled node for everything.

    + Read more in the litepaper +
    +
    + +
    +
    +
    +

    The miner pays this wallet.

    +

    Install the miner, press Start, and the address it makes is the one this wallet imports with one click.

    +
    + The miner +
    +
    +