Merge site-pages: /miner and /wallet pages, home summaries, Ember name in one place, real product screenshots
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
commit
bb7dc0e37c
17 changed files with 1230 additions and 146 deletions
|
|
@ -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}
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -160,12 +160,19 @@ p{margin:0;color:var(--ink-2);max-width:52ch}
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
|
|
@ -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:
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench" aria-current="page">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -504,12 +504,19 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
|
|
@ -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'], ['404.html', '']];
|
||||
// The miner's product name lives HERE and nowhere else (the project lead, 5 October 2026: Ember). Pages carry
|
||||
// <span data-product="full|name|app|caption">…</span> 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 data-product="([a-z]+)">[^<]*<\/span>/g, (m, k) => {
|
||||
if (!(k in PRODUCT)) throw new Error(`${file}: unknown data-product="${k}"`);
|
||||
return `<span data-product="${k}">${esc(PRODUCT[k])}</span>`;
|
||||
});
|
||||
}
|
||||
const PAGES = [['index.html', ''], ['litepaper.html', 'litepaper'], ['live.html', 'live'], ['evidence.html', 'evidence'], ['miner.html', 'miner'], ['wallet.html', 'wallet'], ['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', `<script type="application/json" id="journey-data">${JSON.stringify(journey).replace(/</g, '\\u003c')}</script>`, file);
|
||||
writeFileSync(p, html);
|
||||
built.push(file);
|
||||
|
|
@ -275,13 +295,13 @@ for (const [file, active] of PAGES) {
|
|||
'<h2 id="how">How a row gets here</h2>',
|
||||
'<p>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.</p>',
|
||||
'<p>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.</p>',
|
||||
'<p>There is no other Igneum miner to compare with yet, so this table compares cards, not miners.</p>',
|
||||
'<p>There is no other Igneum miner to compare with yet, so this table compares cards, not miners. The app that produces these rows: <a href="/miner">the miner page</a>.</p>',
|
||||
`<p>Rows: ${rows.length}. Source file: <code>site/miner-bench.json</code> in the repository.</p>`,
|
||||
].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(', '));
|
||||
|
|
|
|||
|
|
@ -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
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence" aria-current="page">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -249,12 +249,19 @@ code{font-family:var(--f-mono);font-size:.92em;background:var(--obsidian);paddin
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
BIN
site/img/miner-dashboard.webp
Normal file
BIN
site/img/miner-dashboard.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
BIN
site/img/wallet-final.webp
Normal file
BIN
site/img/wallet-final.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
BIN
site/img/wallet-home.webp
Normal file
BIN
site/img/wallet-home.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
125
site/index.html
125
site/index.html
File diff suppressed because one or more lines are too long
|
|
@ -52,18 +52,18 @@
|
|||
"log": [
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": ", ledger M30: the block and transaction floods grew the node by 256 MiB per epoch roll, fixed by sharing the PoW cache across the epochs of a day",
|
||||
"short": ", ledger M30: the block and transaction floods grew the node by 256…"
|
||||
"text": "Ledger M30: the block and transaction floods grew the node by 256 MiB per epoch roll, fixed by sharing the PoW cache across the epochs of a day",
|
||||
"short": "Ledger M30: the block and transaction floods grew the node by 256…"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": ", round-4 consensus items F23, F24, G12, X18 and M31: unit tests and fast-time 3-node runs against the control",
|
||||
"short": ", round-4 consensus items F23, F24, G12, X18 and M31"
|
||||
"text": "Round-4 consensus items F23, F24, G12, X18 and M31: unit tests and fast-time 3-node runs against the control",
|
||||
"short": "Round-4 consensus items F23, F24, G12, X18 and M31"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": ", the software dev fee measured on a test network: 9 fee blocks in 785, the chain and the miners' counters agree",
|
||||
"short": ", the software dev fee measured on a test network"
|
||||
"text": "The software dev fee measured on a test network: 9 fee blocks in 785, the chain and the miners' counters agree",
|
||||
"short": "The software dev fee measured on a test network"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
|
|
@ -77,8 +77,8 @@
|
|||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": ", finality rule v3: the frozen weight table and the certificate fold , simulator, unit tests, fast-time 3-node network with 300-ms links",
|
||||
"short": ", finality rule v3"
|
||||
"text": "Finality rule v3: the frozen weight table and the certificate fold , simulator, unit tests, fast-time 3-node network with 300-ms links",
|
||||
"short": "Finality rule v3"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
|
|
@ -210,45 +210,45 @@
|
|||
"text": "Devnet-v4 integration: nine branches merged, 3-node test network on the merged node, Windows cross-build",
|
||||
"short": "Devnet v4: nine branches merged into one node"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "RTX 5090 first run",
|
||||
"short": "RTX 5090 first run"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "AMD gfx1036 , AMD OpenCL 2.1 driver 3652.0",
|
||||
"short": "AMD integrated GPU runs the hash through OpenCL"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "First devnet blocks on the real lottery hash: CPU, then Metal GPU, three worker implementations",
|
||||
"short": "First devnet blocks on the real lottery hash"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "R3.26 / M15: PoW checked after the cheap checks, cache-build cap, attack before and after",
|
||||
"short": "Cache-build attack closed: 10.6 s of rebuilds to 14 ms"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Difficulty controller: devnet record, simulator, Igneum dual-lane rule, 3-node CPU test network",
|
||||
"short": "Igneum dual-lane difficulty rule built and simulated"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Weak-program census: 400,000 program runs through the CPU reference, the redundant-load finding, and the rules for M5 and M6",
|
||||
"short": "Census of 400,000 programs: redundant loads found"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Proving v0: first SP1 proof of an Igneum block, Apple M5 Max CPU, loaded machine",
|
||||
"short": "First SP1 proof of an Igneum block, on a laptop CPU"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "RTX 5090, memory-hard dataset",
|
||||
"short": "RTX 5090 on the memory-hard dataset"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "RTX 5090 through NVIDIA OpenCL",
|
||||
"short": "RTX 5090 through NVIDIA OpenCL"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Igneum-node devnet v0: 3-node igneum-devnet at 1 BPS with the 80/20 coinbase and vote_key_hash",
|
||||
"short": "Devnet v0: three nodes at one block per second"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Windows node package: igneumd cross-compiled for x86_64-pc-windows-gnu, two-peer sync test",
|
||||
"short": "Windows node package: cross-compiled, two-peer sync"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Igneum-node devnet v2: sustained-mining finality rule v2 on a four-miner test network, and as a follower of the live devnet",
|
||||
"short": "Finality rule v2 live on a four-miner test network"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Execution layer devnet v3: revm over the selected chain, 3-node simnet, viem smoke test",
|
||||
"short": "EVM execution layer: identical state on three nodes"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Per-identity hash rate \"decay\" on the RTX 5090: diagnosis and Metal reproduction",
|
||||
"short": "RTX 5090 hash-rate decay diagnosed: a miner bug, fixed"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-03",
|
||||
"text": "Proto-opencl: OpenCL path built and proven without AMD silicon",
|
||||
"short": "OpenCL worker built and proven without AMD silicon"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,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}
|
||||
|
|
@ -63,7 +63,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)}
|
||||
|
|
@ -71,7 +71,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)}
|
||||
|
|
@ -226,24 +226,24 @@ body.all .pager{display:none}
|
|||
<a href="/litepaper" data-nav="litepaper" aria-current="page">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -651,12 +651,19 @@ body.all .pager{display:none}
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
|
|
@ -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)}
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live" aria-current="page">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -285,12 +285,19 @@ main{padding-bottom:var(--sec)}
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
526
site/miner.html
Normal file
526
site/miner.html
Normal file
|
|
@ -0,0 +1,526 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>The Igneum miner app</title>
|
||||
<meta name="description" content="One click: install, start, the card mines and proves. Auto GPU detection on NVIDIA, AMD and Apple silicon, a wallet made for you, hourly program swaps with no pause, signed updates, a visible 1% software fee you can switch off.">
|
||||
<link rel="canonical" href="https://igneum.network/miner">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="The Igneum miner app">
|
||||
<meta property="og:description" content="One click: install, start, the card mines and proves. Auto GPU detection on NVIDIA, AMD and Apple silicon, a wallet made for you, hourly program swaps with no pause, signed updates, a visible 1% software fee you can switch off.">
|
||||
<meta property="og:url" content="https://igneum.network/miner">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="The Igneum miner app">
|
||||
<meta name="twitter:description" content="One click: install, start, the card mines and proves. Auto GPU detection, a wallet made for you, hourly program swaps with no pause, signed updates, a visible 1% software fee you can switch off.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<style>
|
||||
/* Shared by every page. Source: site/partials/head.html, injected by site/build.mjs between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
:root{--f-sans:'IBM Plex Sans','Plex Sans Fallback',system-ui,-apple-system,sans-serif;--f-display:'Unbounded','Unbounded Fallback',sans-serif;--f-mono:'IBM Plex Mono','Plex Mono Fallback',ui-monospace,Menlo,monospace;
|
||||
/* site chrome tokens (nav, footer, skip link). Dark by default; the litepaper sets light values and resets these in dark mode */
|
||||
--nav-h:68px;--ui-bg:rgba(12,12,14,.84);--ui-menu:#0C0C0E;--ui-ink:#F4F1EC;--ui-ink-2:#C9C7C2;--ui-ash:#9A9A9E;--ui-line:#2A2A30;--ui-line-2:#3A3A42;--ui-accent:#F2541B;--ui-accent-ink:#0C0C0E;--ui-hot:#FFB35C;--ui-hover:#FF6A2B;--ui-tint:rgba(242,84,27,.12)}
|
||||
html{-webkit-text-size-adjust:100%}
|
||||
h1,h2,h3{text-wrap:balance}
|
||||
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, 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}
|
||||
.brand{display:inline-flex;align-items:center;gap:10px;color:var(--ui-ink);text-decoration:none;flex:0 0 auto}
|
||||
.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;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)}
|
||||
.nav .links a.cta{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:8px 16px;border-radius:10px;font-weight:600;background:var(--ui-accent);color:var(--ui-accent-ink);border:1px solid var(--ui-accent);transition:background .15s ease,transform .15s ease}
|
||||
.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: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)}
|
||||
.nav .links a.cta{margin-top:8px;min-height:48px}
|
||||
.nav .links.open{display:flex}
|
||||
.burger{display:inline-flex}
|
||||
}
|
||||
/* footer, the same on every page */
|
||||
.foot{border-top:1px solid var(--ui-line);color:var(--ui-ink);margin-top:var(--sec,64px)}
|
||||
.foot .wrap{padding-block:48px 32px}
|
||||
.foot-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:32px}
|
||||
.foot-brand{display:flex;flex-direction:column;gap:12px;max-width:34ch}
|
||||
.foot-brand .brand{align-self:flex-start}.foot-brand .word{font-size:16px}
|
||||
.foot-brand p{color:var(--ui-ash);font-size:14px;margin:0}
|
||||
.foot-col{display:flex;flex-direction:column;gap:10px;font-size:15px}
|
||||
.foot-col .eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ui-ash);margin-bottom:4px}
|
||||
.foot-col a{color:var(--ui-ink-2);text-decoration:none;display:inline-flex;align-items:center;gap:6px;align-self:flex-start}
|
||||
.foot-col a:hover{color:var(--ui-hot);text-decoration:none}
|
||||
.foot-base{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;margin-top:36px;padding-top:20px;border-top:1px solid var(--ui-line);font-size:13px;color:var(--ui-ash)}
|
||||
.foot-base span{text-wrap:balance}.foot-base .mono{font-family:var(--f-mono)}
|
||||
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
|
||||
</style>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
:root{--obsidian:#0C0C0E;--graphite:#16161A;--line:#2A2A30;--line-2:#3A3A42;--ember:#F2541B;--molten:#FFB35C;--bone:#F4F1EC;--ash:#9A9A9E;--ink-2:#C9C7C2;--ember-ink:#0C0C0E;
|
||||
--max:1200px;--gutter:clamp(16px,4vw,32px);--sec:clamp(56px,8vw,96px);--head:clamp(40px,6vw,64px);
|
||||
--card-pad:clamp(18px,3vw,28px);--card-r:18px;--tile-pad:18px 20px;--tile-r:14px;--gap:24px;--gap-tile:12px;
|
||||
--fs-hero:clamp(32px,5.6vw,56px);--fs-h2:clamp(28px,4.2vw,44px);--fs-h3:clamp(18px,2vw,22px);--fs-tile:clamp(20px,2.2vw,26px)}
|
||||
*{box-sizing:border-box}
|
||||
html{scroll-behavior:smooth}
|
||||
:root{--sm:84px}@media (max-width:900px){:root{--sm:80px}}
|
||||
section,[id]{scroll-margin-top:var(--sm)}section[id]{scroll-margin-top:calc(var(--sm) - var(--sec))}
|
||||
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
||||
body{margin:0;background:var(--obsidian);color:var(--bone);font-family:var(--f-sans);font-size:17px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
|
||||
a{color:inherit;text-decoration:none}a:hover{color:var(--molten)}
|
||||
img,svg{max-width:100%}
|
||||
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gutter)}
|
||||
.mono{font-family:var(--f-mono)}
|
||||
.eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash)}
|
||||
.eyebrow.ember{color:var(--ember)}
|
||||
h1,h2,h3{font-family:var(--f-display);margin:0;line-height:1.08;text-wrap:balance}
|
||||
h1{font-weight:900;font-size:var(--fs-hero);letter-spacing:-.01em}
|
||||
h2{font-weight:700;font-size:var(--fs-h2)}
|
||||
h3{font-weight:700;font-size:var(--fs-h3)}
|
||||
p{margin:0}
|
||||
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:48px;padding:12px 22px;border-radius:10px;font-weight:600;font-size:16px;border:1px solid var(--line-2);color:var(--bone);background:transparent;cursor:pointer;transition:transform .15s ease,background .15s ease,border-color .15s ease}
|
||||
.btn:hover{transform:translateY(-1px);border-color:var(--ash);color:var(--bone)}
|
||||
.btn.primary{background:var(--ember);color:var(--ember-ink);border-color:var(--ember)}
|
||||
.btn.primary:hover{background:#FF6A2B;border-color:#FF6A2B;color:var(--ember-ink)}
|
||||
.card{background:var(--graphite);border:1px solid var(--line);border-radius:var(--card-r);padding:var(--card-pad);min-width:0}
|
||||
.grid{display:grid;gap:var(--gap);grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
|
||||
.reveal{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s ease}
|
||||
.reveal.in{opacity:1;transform:none}
|
||||
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}
|
||||
section{padding-block:var(--sec)}
|
||||
section+section{padding-top:0;scroll-margin-top:var(--sm)}
|
||||
.sec-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:32px}
|
||||
.sec-head p{font-size:16px;color:var(--ash);max-width:46ch}
|
||||
.pt{font-size:15px;color:var(--ash);max-width:64ch}
|
||||
.lp{display:inline-block;margin-top:24px;color:var(--ember);font-weight:600;font-size:15px}
|
||||
.cta{display:flex;flex-wrap:wrap;gap:12px}
|
||||
|
||||
/* hero: copy left, the dashboard in its frame right; one column under 980 px */
|
||||
.hero{position:relative;padding-block:clamp(48px,8vw,96px) clamp(40px,6vw,72px);overflow:hidden}
|
||||
.hero::before{content:'';position:absolute;inset:auto -10% -30% 40%;height:70%;background:radial-gradient(closest-side,rgba(242,84,27,.18),rgba(242,84,27,0));pointer-events:none}
|
||||
.hero .wrap{position:relative;display:grid;gap:36px;grid-template-columns:1fr;align-items:center}
|
||||
@media (min-width:980px){.hero .wrap{grid-template-columns:.9fr 1.1fr;gap:32px 56px}}
|
||||
.hero-copy{display:flex;flex-direction:column;gap:22px}
|
||||
.hero p.lead{font-size:clamp(17px,2vw,20px);color:var(--ink-2);max-width:52ch}
|
||||
.hero .os{display:flex;flex-wrap:wrap;gap:8px 18px;font-size:14px;color:var(--ash)}
|
||||
.hero .os span{display:inline-flex;align-items:center;gap:6px}
|
||||
|
||||
/* the device frame: a window bar, the screenshot, an ember glow behind */
|
||||
.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}
|
||||
.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)}
|
||||
|
||||
/* the three steps */
|
||||
.steps{display:grid;gap:var(--gap-tile);grid-template-columns:repeat(3,minmax(0,1fr));position:relative}
|
||||
.step{background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);display:flex;flex-direction:column;gap:10px;position:relative;min-width:0}
|
||||
.step .n{font-family:var(--f-mono);font-size:11px;letter-spacing:.14em;color:var(--ember)}
|
||||
.step .t{font-family:var(--f-display);font-weight:700;font-size:var(--fs-h3)}
|
||||
.step p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.step svg{width:40px;height:40px}
|
||||
.step::after{content:'';position:absolute;right:-9px;top:50%;width:14px;height:14px;border-top:2px solid var(--line-2);border-right:2px solid var(--line-2);transform:translateY(-50%) rotate(45deg);z-index:1}
|
||||
.step:last-child::after{display:none}
|
||||
@media (max-width:640px){.steps{grid-template-columns:1fr}.step::after{right:auto;left:50%;top:auto;bottom:-9px;transform:translateX(-50%) rotate(135deg)}}
|
||||
|
||||
/* feature groups: a heading row, then tiles with one line each */
|
||||
.group{display:grid;gap:var(--gap);grid-template-columns:1fr;margin-bottom:var(--sec)}
|
||||
@media (min-width:900px){.group{grid-template-columns:300px minmax(0,1fr);gap:48px}}
|
||||
.group:last-child{margin-bottom:0}
|
||||
.group .g-head{display:flex;flex-direction:column;gap:12px}
|
||||
.group .g-head p{font-size:15px;color:var(--ash)}
|
||||
.feats{display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
|
||||
.feat{background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);display:flex;flex-direction:column;gap:6px;min-width:0;transition:border-color .2s ease}
|
||||
.feat:hover{border-color:var(--line-2)}
|
||||
.feat b{font-weight:600;font-size:16px}
|
||||
.feat p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.feat .src{font-family:var(--f-mono);font-size:11px;color:var(--ember);margin-top:4px}
|
||||
.feat.wide{grid-column:1/-1}
|
||||
|
||||
/* the swap table and the measured table */
|
||||
.tbl{overflow-x:auto;border:1px solid var(--line);border-radius:var(--card-r);background:var(--graphite);-webkit-overflow-scrolling:touch}
|
||||
table{border-collapse:collapse;width:100%;min-width:560px;font-size:15px}
|
||||
th,td{padding:12px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
|
||||
th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash);font-weight:500;background:var(--obsidian)}
|
||||
tr:last-child td{border-bottom:0}
|
||||
td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
||||
td a{color:var(--ember)}
|
||||
.levers table{min-width:760px}.levers td:first-child{min-width:210px}.levers td:nth-child(2){min-width:260px}
|
||||
|
||||
/* the fee card: the switch as the app draws it, the start lines as the miner prints them */
|
||||
.fee{display:grid;gap:var(--gap);grid-template-columns:1fr}
|
||||
@media (min-width:900px){.fee{grid-template-columns:1.1fr .9fr;align-items:start}}
|
||||
.switch{display:inline-flex;align-items:center;gap:12px;font-size:15px}
|
||||
.switch .track{width:44px;height:26px;border-radius:13px;background:var(--ember);position:relative;flex:0 0 44px}
|
||||
.switch .track::after{content:'';position:absolute;top:3px;right:3px;width:20px;height:20px;border-radius:50%;background:var(--bone)}
|
||||
.switch.off .track{background:var(--line-2)}.switch.off .track::after{right:auto;left:3px}
|
||||
pre{margin:0;padding:14px 16px;background:var(--obsidian);border:1px solid var(--line);border-radius:12px;font-family:var(--f-mono);font-size:12.5px;line-height:1.55;color:var(--ink-2);white-space:pre-wrap;overflow-wrap:anywhere}
|
||||
pre b{color:var(--molten);font-weight:500}
|
||||
|
||||
.band{background:var(--ember);color:var(--ember-ink)}
|
||||
.band .wrap{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:24px;padding-block:56px}
|
||||
.band h2{font-weight:900;font-size:clamp(26px,3.5vw,36px)}
|
||||
.band p{font-size:16px;max-width:56ch}
|
||||
.btn.dark{background:var(--obsidian);color:var(--bone);border-color:var(--obsidian)}
|
||||
.btn.dark:hover{background:#222226;color:var(--bone)}
|
||||
.foot{margin-top:0}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="36" height="36" aria-hidden="true"><rect width="1024" height="1024" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-links" aria-label="Menu"><svg class="bars" viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"></path></svg><svg class="x" viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"></path></svg></button>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miner" data-nav="miner" aria-current="page">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
||||
<main id="main">
|
||||
<header class="hero" id="top">
|
||||
<div class="wrap">
|
||||
<div class="hero-copy">
|
||||
<div class="eyebrow ember"><span data-product="full">Igneum Ember</span> · one click</div>
|
||||
<h1>Install. Start. The card mines and proves.</h1>
|
||||
<p class="lead"><span data-product="name">Ember</span> 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.</p>
|
||||
<div class="cta">
|
||||
<a href="#get" class="btn primary">Get the miner</a>
|
||||
<a href="#features" class="btn">Every feature</a>
|
||||
</div>
|
||||
<div class="os">
|
||||
<span>Windows</span><span>macOS</span><span>Linux</span><span>HiveOS</span><span>NVIDIA · AMD · Apple silicon</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shot reveal">
|
||||
<figure class="frame" style="margin:0">
|
||||
<div class="bar"><i></i><i></i><i></i><b><span data-product="app">Igneum Miner</span></b></div>
|
||||
<img src="/img/miner-dashboard.webp" width="2360" height="1540" alt="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" fetchpriority="high" decoding="async">
|
||||
<figcaption><span data-product="caption">Igneum Ember (the app is still labelled Igneum Miner until 0.3.6)</span> on an Apple M5 Max, live devnet, 5 Oct 2026.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="how">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Hash, prove, get paid</h2>
|
||||
<p>One client. The card hashes the lottery, proves the shards the chain assigns to it, and every block pays one address.</p>
|
||||
</div>
|
||||
<div class="steps reveal">
|
||||
<div class="step">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="var(--ember)" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="2"></rect><path d="M7 9h4M7 13h2M15 9v4M18 9v4M9 21h6"></path></svg>
|
||||
<div class="n">01 · HASH</div><div class="t">The card hashes</div>
|
||||
<p>A new random program every hour. 80% of each block to the card that finds it.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="var(--ember)" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7l8-4z"></path><path d="M9 12l2 2 4-4"></path></svg>
|
||||
<div class="n">02 · PROVE</div><div class="t">The same card proves</div>
|
||||
<p>The client switches to the shards the chain assigns to its keys, posts the proof, and goes back to hashing.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="var(--ember)" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8"></circle><path d="M12 7v10M9.5 9.5h3.75a1.75 1.75 0 010 3.5h-2.5a1.75 1.75 0 000 3.5H14.5"></path></svg>
|
||||
<div class="n">03 · GET PAID</div><div class="t">One address, in IGN</div>
|
||||
<p>Block rewards and proving payouts land on the address the app made for you. The <a href="/wallet" style="color:var(--ember)">wallet</a> shows them.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="features">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Every feature, one line each</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="start">
|
||||
<div class="g-head"><div class="eyebrow ember">01 · One click</div><h3>Install, press Start</h3><p>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.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>The card mines and proves</b><p>One button starts the node, waits for sync, starts one miner per card and the prover. Quit stops them in order.</p></div>
|
||||
<div class="feat"><b>Finds your GPU by itself</b><p>NVIDIA through the driver, AMD and Intel through OpenCL, Apple silicon through Metal. Real card names, one worker per card.</p></div>
|
||||
<div class="feat"><b>A wallet made for you</b><p>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.</p></div>
|
||||
<div class="feat"><b>Earnings in IGN</b><p>Every block this machine finds pays one address in IGN. The dashboard counts them per run, per hour and for life. The <a href="/wallet" style="color:var(--ember)">wallet</a> shows the balance.</p></div>
|
||||
<div class="feat"><b>Windows, macOS, Linux</b><p>An installer on Windows, a disk image on macOS, a package on Linux. No toolchain, no driver work: the GPU workers are prebuilt.</p></div>
|
||||
<div class="feat"><b>HiveOS package</b><p>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.</p></div>
|
||||
<div class="feat"><b>First outside machine</b><p>An Apple silicon laptop, no instructions beyond the five steps: 33 accepted blocks in 7 minutes, 0 rejected, 21.0 MH/s average.</p><a class="src" href="/bench#4-october-2026-first-outside-machine-on-the-devnet-an-apple-silicon-laptop-through-the-igneum-miner-app">log · 4 Oct 2026</a></div>
|
||||
<div class="feat"><b>First card on the app</b><p>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.</p><a class="src" href="/bench#4-october-2026-first-machine-on-the-igneum-miner-app-pc-2-s-rtx-5090-at-118-mh-s-via-setup-exe">log · 4 Oct 2026</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="client">
|
||||
<div class="g-head"><div class="eyebrow ember">02 · One client</div><h3>Hashing and proving, switched by the client</h3><p>The lottery and the proving are kept apart on purpose. The client runs both and the miner sees one balance.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Hashing and proving in one client</b><p>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.</p></div>
|
||||
<div class="feat"><b>Several identities per card</b><p>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.</p></div>
|
||||
<div class="feat"><b>Hourly program, no pause</b><p>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.</p><a class="src" href="/bench#4-october-2026-first-hourly-program-swap-on-the-live-devnet-compile-ahead-no-pause-two-cards">log · 4 Oct 2026</a></div>
|
||||
<div class="feat wide">
|
||||
<b>The first live swap, 4 Oct 2026, three vendors</b>
|
||||
<div class="tbl" style="margin-top:8px"><table>
|
||||
<thead><tr><th>Card</th><th>Compile, ahead of time</th><th>Swap at the boundary</th><th>Rate before / after</th><th>Rejected</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Apple M5 Max, Metal</td><td class="num">82 ms</td><td class="num">0.01 ms</td><td class="num">26.7 / 26.7 MH/s</td><td class="num">0</td></tr>
|
||||
<tr><td>RTX 5090, CUDA</td><td class="num">1,285 ms</td><td class="num">0.00 ms</td><td class="num">121.8 / 123.4 MH/s</td><td class="num">0</td></tr>
|
||||
<tr><td>AMD Radeon integrated, OpenCL</td><td>prepared</td><td>no restart</td><td class="num">2.74 / 2.74 MH/s</td><td class="num">0</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<a class="src" href="/bench#4-october-2026-first-hourly-program-swap-on-the-live-devnet-compile-ahead-no-pause-two-cards">log · 4 Oct 2026, live devnet v4, epoch boundary at DAA 3,600</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="updates">
|
||||
<div class="g-head"><div class="eyebrow ember">03 · Updates</div><h3>Signed, over the air, at a safe moment</h3><p>Every app updates itself. This is also how a consensus upgrade reaches every node before its activation height.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Signed over the air</b><p>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.</p></div>
|
||||
<div class="feat"><b>Installed at a safe moment</b><p>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.</p></div>
|
||||
<div class="feat"><b>Mining continues through an update</b><p>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.</p></div>
|
||||
<div class="feat"><b>Urgent when it has to be</b><p>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.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="tuning">
|
||||
<div class="g-head"><div class="eyebrow ember">04 · Faster, by measurement</div><h3>The fleet tunes itself</h3><p>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.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Variant racing every hour</b><p>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.</p><a class="src" href="/bench#4-october-2026-miner-performance-variant-racing-metal-worker-on-the-m5-max-the-rtx-5090-job-is-ready-not-run">log · 4 Oct 2026</a></div>
|
||||
<div class="feat"><b>Measured on Apple silicon</b><p>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.</p><a class="src" href="/bench#4-october-2026-miner-performance-variant-racing-metal-worker-on-the-m5-max-the-rtx-5090-job-is-ready-not-run">log · 4 Oct 2026, ratios under contention</a></div>
|
||||
<div class="feat"><b>Fleet tuning manifest</b><p>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.</p></div>
|
||||
<div class="feat"><b>Efficiency mode</b><p>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.</p></div>
|
||||
<div class="feat"><b>Latency work</b><p>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.</p></div>
|
||||
<div class="feat"><b>Remote signed jobs, opt in</b><p>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.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="reliability">
|
||||
<div class="g-head"><div class="eyebrow ember">05 · Reliability</div><h3>Watchdog, restart, clock</h3><p>Measured against a worker that misbehaves on command: these are recoveries in seconds, not hash rates.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Watchdog per card</b><p>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.</p><a class="src" href="/bench#4-october-2026-miner-fault-guards-and-the-app-watchdog-measured-against-a-fake-worker-miner-community-lead-app-owner">log · 4 Oct 2026</a></div>
|
||||
<div class="feat"><b>Watchdog per node</b><p>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.</p><a class="src" href="/bench#4-october-2026-miner-fault-guards-and-the-app-watchdog-measured-against-a-fake-worker-miner-community-lead-app-owner">log · 4 Oct 2026</a></div>
|
||||
<div class="feat"><b>Restart in order</b><p>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.</p></div>
|
||||
<div class="feat"><b>Clock check</b><p>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.</p><a class="src" href="/bench#4-october-2026-a-node-60-s-behind-the-clock-is-silently-dead-pc-2-s-first-app-install">log · 4 Oct 2026</a></div>
|
||||
<div class="feat wide">
|
||||
<b>Recoveries measured, 4 Oct 2026</b>
|
||||
<div class="tbl" style="margin-top:8px"><table>
|
||||
<thead><tr><th>What the worker did</th><th>What the app did</th><th>Back to mining</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Reported 0 hashes</td><td>Restarted the miner once after the 60 s rule</td><td class="num">91.0 s</td></tr>
|
||||
<tr><td>The same again inside five minutes</td><td>Marked the card faulted, no further restart; Resume cleared it</td><td class="num">75.4 s to faulted</td></tr>
|
||||
<tr><td>The miner process stopped</td><td>Killed and restarted it after the 90 s rule</td><td class="num">101.4 s</td></tr>
|
||||
<tr><td>The node process stopped</td><td>Restarted the node, which synced; mining resumed</td><td class="num">160.0 s</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<a class="src" href="/bench#4-october-2026-miner-fault-guards-and-the-app-watchdog-measured-against-a-fake-worker-miner-community-lead-app-owner">log · 4 Oct 2026, a fake worker on a private test network, no real GPU</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="log">
|
||||
<div class="g-head"><div class="eyebrow ember">06 · Published</div><h3>The log and the bench table</h3><p>Every number on this page has a row. Prototype numbers say so.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Engineering log</b><p>Every benchmark and test the project has made, with the hardware and the commands. Newest at the bottom.</p><a class="src" href="/bench">/bench</a></div>
|
||||
<div class="feat"><b>GPU bench table</b><p>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.</p><a class="src" href="/miners">/miners</a></div>
|
||||
<div class="feat"><b>Your rows, from your machine</b><p>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.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="ahead">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Why <span data-product="full">Igneum Ember</span> stays ahead</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
<div class="tbl levers reveal"><table>
|
||||
<thead><tr><th>Lever</th><th>The idea</th><th>Measured state</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><b>1 · Race the compiler every hour</b></td><td>For each new program, five to ten kernel variants are compiled, benched for two seconds each, and the winner is kept for the hour.</td><td>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. <a href="/bench#4-october-2026-miner-performance-variant-racing-metal-worker-on-the-m5-max-the-rtx-5090-job-is-ready-not-run">Log, 4 Oct 2026</a></td></tr>
|
||||
<tr><td><b>2 · Auto-tune that learns from the fleet</b></td><td>Apps 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.</td><td>Shipped. The fleet is still small, so no fleet table yet.</td></tr>
|
||||
<tr><td><b>3 · Hash per watt, not hash</b></td><td>A 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.</td><td>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.</td></tr>
|
||||
<tr><td><b>4 · Template latency</b></td><td>Solo 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.</td><td>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.</td></tr>
|
||||
<tr><td><b>5 · Never lose a second</b></td><td>Zero-loss hourly program swaps, fault guards, automatic restart, a CPU re-check of every found hash, per-worker health.</td><td>Shipped. Swap 0.01 ms on Metal and 0.00 ms on CUDA with 0 rejected blocks; recoveries in the <a href="#reliability">table above</a>. <a href="/bench#4-october-2026-first-hourly-program-swap-on-the-live-devnet-compile-ahead-no-pause-two-cards">Log, 4 Oct 2026</a></td></tr>
|
||||
<tr><td><b>6 · Prove it in public</b></td><td>The bench table per card, fed from the job channel. We claim fastest only when the table says so.</td><td>Live at <a href="/miners">/miners</a>, one row per card, generator version and miner version, each with its log entry.</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p class="pt reveal" style="margin-top:16px">The dev fee is the software's 1%, visible and switchable. The protocol carries no fee. <a href="#fee" style="color:var(--ember)">The fee, in full view</a>.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="fee">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>The fee, in full view</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
<div class="fee reveal">
|
||||
<div class="card" style="display:flex;flex-direction:column;gap:16px">
|
||||
<p style="font-size:15px;color:var(--ink-2)">The <span data-product="name">Ember</span> 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.</p>
|
||||
<div class="tbl"><table style="min-width:0">
|
||||
<thead><tr><th>Where</th><th>Off with</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>The app, Settings</td><td>the switch beside the rewards address</td></tr>
|
||||
<tr><td>The command line</td><td class="mono">--dev-fee 0</td></tr>
|
||||
<tr><td>HiveOS, extra config</td><td class="mono">DEV_FEE=0</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p style="font-size:14px;color:var(--ash)">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 <span class="mono">--dev-fee 0</span> paid none; the miners' counters and both nodes agree. <a href="/bench#4-october-2026-evening-the-software-dev-fee-measured-on-a-test-network-9-fee-blocks-in-785-the-chain-and-the-miners-counters-agree" style="color:var(--ember)">The log entry</a>.</p>
|
||||
</div>
|
||||
<div style="display:flex;flex-direction:column;gap:14px">
|
||||
<div class="card" style="display:flex;flex-direction:column;gap:10px">
|
||||
<div class="eyebrow">Settings, as the app shows it</div>
|
||||
<div class="switch"><span class="track"></span><span>Dev fee 1% (1 block in 100)</span></div>
|
||||
<p style="font-size:14px;color:var(--ash)">The miner software's fee, the same way every GPU miner takes one. The protocol takes none. This switch turns it off.</p>
|
||||
</div>
|
||||
<div class="card" style="display:flex;flex-direction:column;gap:10px">
|
||||
<div class="eyebrow">What the miner prints at start</div>
|
||||
<pre>dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off</pre>
|
||||
<pre>dev fee off (--dev-fee 0); the default is 1% (1 block in 100) to 0x<address></pre>
|
||||
<p style="font-size:13px;color:var(--ash)">Each fee block is logged as it is accepted. <span class="mono">igneum-miner payouts</span> lists blocks per payout address over every block the node holds, with the dev address tagged.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Get the miner</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
<div class="cta reveal" style="align-items:center">
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg>Windows</a>
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg>macOS</a>
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M12 2c-2.4 0-4 1.9-4 4.6 0 1.2.2 2 0 2.8-.6 1.4-2.1 2.9-2.6 4.9-.3 1.1-.1 2 .3 2.6-.6.4-1.3 1-1.1 1.7.3 1 2.1 1.2 3.2 1.8.7.4 1.5.6 2.1.1.6.2 1.3.3 2.1.3s1.5-.1 2.1-.3c.6.5 1.4.3 2.1-.1 1.1-.6 2.9-.8 3.2-1.8.2-.7-.5-1.3-1.1-1.7.4-.6.6-1.5.3-2.6-.5-2-2-3.5-2.6-4.9-.2-.8 0-1.6 0-2.8C16 3.9 14.4 2 12 2zm-1.4 4.2c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zm2.8 0c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zM12 9.3c.9 0 1.9.5 1.9 1s-1 1.2-1.9 1.2-1.9-.7-1.9-1.2 1-1 1.9-1zm0 3.4c2.2 0 3.6 2.6 3.6 4.4 0 1.5-1.6 2.3-3.6 2.3s-3.6-.8-3.6-2.3c0-1.8 1.4-4.4 3.6-4.4z"/></svg>Linux</a>
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5l8.2 4.75v9.5L12 21.5l-8.2-4.75v-9.5z"/><path d="M12 7.5l4.3 2.5v5L12 17.5l-4.3-2.5v-5z"/></svg>HiveOS</a>
|
||||
</div>
|
||||
<p class="pt reveal" style="margin-top:20px">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 <a href="/wallet" style="color:var(--ember)">wallet</a> reads this machine's node when the miner is installed.</p>
|
||||
<a href="/litepaper#miners" class="lp reveal">Read more in the litepaper</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<div class="band">
|
||||
<div class="wrap">
|
||||
<div style="display:flex;flex-direction:column;gap:8px">
|
||||
<h2>Every number here has a row.</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
<div class="cta"><a href="/bench" class="btn dark">Engineering log</a><a href="/miners" class="btn dark">Bench table</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="30" height="30" aria-hidden="true"><rect width="1024" height="1024" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<span class="mono">igneum.network</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- footer:end -->
|
||||
<script>
|
||||
(function(){
|
||||
var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
|
||||
document.querySelectorAll('.reveal').forEach(function(el){io.observe(el);});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</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:
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners" aria-current="page">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner" aria-current="page">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
|
@ -183,7 +183,7 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
|||
<h2 id="how">How a row gets here</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>There is no other Igneum miner to compare with yet, so this table compares cards, not miners.</p>
|
||||
<p>There is no other Igneum miner to compare with yet, so this table compares cards, not miners. The app that produces these rows: <a href="/miner">the miner page</a>.</p>
|
||||
<p>Rows: 6. Source file: <code>site/miner-bench.json</code> in the repository.</p></article>
|
||||
</div>
|
||||
<p class="gen">Generated from the repository at build time. Times are UTC. Machine names are model names.</p>
|
||||
|
|
@ -205,12 +205,19 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
|
|
@ -14,12 +14,19 @@
|
|||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/#mine">Get the miner</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
|
|
|
|||
|
|
@ -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)}
|
||||
|
|
|
|||
|
|
@ -10,23 +10,23 @@
|
|||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miners" data-nav="miners">Miners</a>
|
||||
<a href="/#wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/#mine" class="cta">Get the miner</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 900 px
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
|
|
|
|||
434
site/wallet.html
Normal file
434
site/wallet.html
Normal file
|
|
@ -0,0 +1,434 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>Igneum Wallet</title>
|
||||
<meta name="description" content="A desktop wallet that checks finality itself. 24 words sealed on your machine, send with the fee shown, receive by a QR drawn locally, block rewards and proving payouts in one history, MetaMask export. Reads your own node when the miner is installed.">
|
||||
<link rel="canonical" href="https://igneum.network/wallet">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="Igneum Wallet">
|
||||
<meta property="og:description" content="A desktop wallet that checks finality itself. 24 words sealed on your machine, send with the fee shown, receive by a QR drawn locally, block rewards and proving payouts in one history, MetaMask export.">
|
||||
<meta property="og:url" content="https://igneum.network/wallet">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Igneum Wallet">
|
||||
<meta name="twitter:description" content="A desktop wallet that checks finality itself. 24 words sealed on your machine, send with the fee shown, receive by a QR drawn locally, rewards and payouts in one history, MetaMask export.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<style>
|
||||
/* Shared by every page. Source: site/partials/head.html, injected by site/build.mjs between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
:root{--f-sans:'IBM Plex Sans','Plex Sans Fallback',system-ui,-apple-system,sans-serif;--f-display:'Unbounded','Unbounded Fallback',sans-serif;--f-mono:'IBM Plex Mono','Plex Mono Fallback',ui-monospace,Menlo,monospace;
|
||||
/* site chrome tokens (nav, footer, skip link). Dark by default; the litepaper sets light values and resets these in dark mode */
|
||||
--nav-h:68px;--ui-bg:rgba(12,12,14,.84);--ui-menu:#0C0C0E;--ui-ink:#F4F1EC;--ui-ink-2:#C9C7C2;--ui-ash:#9A9A9E;--ui-line:#2A2A30;--ui-line-2:#3A3A42;--ui-accent:#F2541B;--ui-accent-ink:#0C0C0E;--ui-hot:#FFB35C;--ui-hover:#FF6A2B;--ui-tint:rgba(242,84,27,.12)}
|
||||
html{-webkit-text-size-adjust:100%}
|
||||
h1,h2,h3{text-wrap:balance}
|
||||
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, 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}
|
||||
.brand{display:inline-flex;align-items:center;gap:10px;color:var(--ui-ink);text-decoration:none;flex:0 0 auto}
|
||||
.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;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)}
|
||||
.nav .links a.cta{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:8px 16px;border-radius:10px;font-weight:600;background:var(--ui-accent);color:var(--ui-accent-ink);border:1px solid var(--ui-accent);transition:background .15s ease,transform .15s ease}
|
||||
.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: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)}
|
||||
.nav .links a.cta{margin-top:8px;min-height:48px}
|
||||
.nav .links.open{display:flex}
|
||||
.burger{display:inline-flex}
|
||||
}
|
||||
/* footer, the same on every page */
|
||||
.foot{border-top:1px solid var(--ui-line);color:var(--ui-ink);margin-top:var(--sec,64px)}
|
||||
.foot .wrap{padding-block:48px 32px}
|
||||
.foot-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:32px}
|
||||
.foot-brand{display:flex;flex-direction:column;gap:12px;max-width:34ch}
|
||||
.foot-brand .brand{align-self:flex-start}.foot-brand .word{font-size:16px}
|
||||
.foot-brand p{color:var(--ui-ash);font-size:14px;margin:0}
|
||||
.foot-col{display:flex;flex-direction:column;gap:10px;font-size:15px}
|
||||
.foot-col .eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ui-ash);margin-bottom:4px}
|
||||
.foot-col a{color:var(--ui-ink-2);text-decoration:none;display:inline-flex;align-items:center;gap:6px;align-self:flex-start}
|
||||
.foot-col a:hover{color:var(--ui-hot);text-decoration:none}
|
||||
.foot-base{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;margin-top:36px;padding-top:20px;border-top:1px solid var(--ui-line);font-size:13px;color:var(--ui-ash)}
|
||||
.foot-base span{text-wrap:balance}.foot-base .mono{font-family:var(--f-mono)}
|
||||
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
|
||||
</style>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
:root{--obsidian:#0C0C0E;--graphite:#16161A;--line:#2A2A30;--line-2:#3A3A42;--ember:#F2541B;--molten:#FFB35C;--bone:#F4F1EC;--ash:#9A9A9E;--ink-2:#C9C7C2;--ember-ink:#0C0C0E;
|
||||
--max:1200px;--gutter:clamp(16px,4vw,32px);--sec:clamp(56px,8vw,96px);--head:clamp(40px,6vw,64px);
|
||||
--card-pad:clamp(18px,3vw,28px);--card-r:18px;--tile-pad:18px 20px;--tile-r:14px;--gap:24px;--gap-tile:12px;
|
||||
--fs-hero:clamp(32px,5.6vw,56px);--fs-h2:clamp(28px,4.2vw,44px);--fs-h3:clamp(18px,2vw,22px);--fs-tile:clamp(20px,2.2vw,26px)}
|
||||
*{box-sizing:border-box}
|
||||
html{scroll-behavior:smooth}
|
||||
:root{--sm:84px}@media (max-width:900px){:root{--sm:80px}}
|
||||
section,[id]{scroll-margin-top:var(--sm)}section[id]{scroll-margin-top:calc(var(--sm) - var(--sec))}
|
||||
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
||||
body{margin:0;background:var(--obsidian);color:var(--bone);font-family:var(--f-sans);font-size:17px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
|
||||
a{color:inherit;text-decoration:none}a:hover{color:var(--molten)}
|
||||
img,svg{max-width:100%}
|
||||
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gutter)}
|
||||
.mono{font-family:var(--f-mono)}
|
||||
.eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash)}
|
||||
.eyebrow.ember{color:var(--ember)}
|
||||
h1,h2,h3{font-family:var(--f-display);margin:0;line-height:1.08;text-wrap:balance}
|
||||
h1{font-weight:900;font-size:var(--fs-hero);letter-spacing:-.01em}
|
||||
h2{font-weight:700;font-size:var(--fs-h2)}
|
||||
h3{font-weight:700;font-size:var(--fs-h3)}
|
||||
p{margin:0}
|
||||
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:48px;padding:12px 22px;border-radius:10px;font-weight:600;font-size:16px;border:1px solid var(--line-2);color:var(--bone);background:transparent;cursor:pointer;transition:transform .15s ease,background .15s ease,border-color .15s ease}
|
||||
.btn:hover{transform:translateY(-1px);border-color:var(--ash);color:var(--bone)}
|
||||
.btn.primary{background:var(--ember);color:var(--ember-ink);border-color:var(--ember)}
|
||||
.btn.primary:hover{background:#FF6A2B;border-color:#FF6A2B;color:var(--ember-ink)}
|
||||
.card{background:var(--graphite);border:1px solid var(--line);border-radius:var(--card-r);padding:var(--card-pad);min-width:0}
|
||||
.reveal{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s ease}
|
||||
.reveal.in{opacity:1;transform:none}
|
||||
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}
|
||||
section{padding-block:var(--sec)}
|
||||
section+section{padding-top:0;scroll-margin-top:var(--sm)}
|
||||
.sec-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:32px}
|
||||
.sec-head p{font-size:16px;color:var(--ash);max-width:46ch}
|
||||
.pt{font-size:15px;color:var(--ash);max-width:64ch}
|
||||
.lp{display:inline-block;margin-top:24px;color:var(--ember);font-weight:600;font-size:15px}
|
||||
.cta{display:flex;flex-wrap:wrap;gap:12px}
|
||||
|
||||
.hero{position:relative;padding-block:clamp(48px,8vw,96px) clamp(40px,6vw,72px);overflow:hidden}
|
||||
.hero::before{content:'';position:absolute;inset:auto -10% -30% 40%;height:70%;background:radial-gradient(closest-side,rgba(242,84,27,.18),rgba(242,84,27,0));pointer-events:none}
|
||||
.hero .wrap{position:relative;display:grid;gap:36px;grid-template-columns:1fr;align-items:center}
|
||||
@media (min-width:980px){.hero .wrap{grid-template-columns:.9fr 1.1fr;gap:32px 56px}}
|
||||
.hero-copy{display:flex;flex-direction:column;gap:22px}
|
||||
.hero p.lead{font-size:clamp(17px,2vw,20px);color:var(--ink-2);max-width:52ch}
|
||||
.hero .os{display:flex;flex-wrap:wrap;gap:8px 18px;font-size:14px;color:var(--ash)}
|
||||
|
||||
.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}
|
||||
.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)}
|
||||
|
||||
/* the three finality states */
|
||||
.states{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap-tile);position:relative}
|
||||
.state{border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);background:var(--graphite);display:flex;flex-direction:column;gap:8px;position:relative;min-width:0}
|
||||
.state .pill{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;padding:6px 10px;border-radius:999px;border:1px solid var(--line-2);color:var(--ash)}
|
||||
.state .pill i{width:8px;height:8px;border-radius:50%;background:var(--ash);display:inline-block}
|
||||
.state.block .pill{border-color:rgba(255,179,92,.5);color:var(--molten)}.state.block .pill i{background:var(--molten)}
|
||||
.state.final .pill{border-color:var(--ember);background:var(--ember);color:var(--ember-ink)}.state.final .pill i{background:var(--ember-ink)}
|
||||
.state .t{font-family:var(--f-display);font-weight:700;font-size:var(--fs-h3)}
|
||||
.state p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.state::after{content:'';position:absolute;right:-9px;top:50%;width:14px;height:14px;border-top:2px solid var(--line-2);border-right:2px solid var(--line-2);transform:translateY(-50%) rotate(45deg);z-index:1}
|
||||
.state:last-child::after{display:none}
|
||||
@media (max-width:640px){.states{grid-template-columns:1fr}.state::after{right:auto;left:50%;top:auto;bottom:-9px;transform:translateX(-50%) rotate(135deg)}}
|
||||
|
||||
.group{display:grid;gap:var(--gap);grid-template-columns:1fr;margin-bottom:var(--sec)}
|
||||
@media (min-width:900px){.group{grid-template-columns:300px minmax(0,1fr);gap:48px}}
|
||||
.group:last-child{margin-bottom:0}
|
||||
.group .g-head{display:flex;flex-direction:column;gap:12px}
|
||||
.group .g-head p{font-size:15px;color:var(--ash)}
|
||||
.feats{display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
|
||||
.feat{background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);display:flex;flex-direction:column;gap:6px;min-width:0;transition:border-color .2s ease}
|
||||
.feat:hover{border-color:var(--line-2)}
|
||||
.feat b{font-weight:600;font-size:16px}
|
||||
.feat p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.feat .src{font-family:var(--f-mono);font-size:11px;color:var(--ember);margin-top:4px}
|
||||
.feat.wide{grid-column:1/-1}
|
||||
|
||||
.tbl{overflow-x:auto;border:1px solid var(--line);border-radius:var(--card-r);background:var(--graphite);-webkit-overflow-scrolling:touch}
|
||||
table{border-collapse:collapse;width:100%;min-width:560px;font-size:15px}
|
||||
th,td{padding:12px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
|
||||
th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash);font-weight:500;background:var(--obsidian)}
|
||||
tr:last-child td{border-bottom:0}
|
||||
td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
||||
.ol{counter-reset:s;display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));margin:0;padding:0;list-style:none}
|
||||
.ol li{counter-increment:s;background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);font-size:14px;color:var(--ink-2);line-height:1.45;min-width:0}
|
||||
.ol li::before{content:counter(s,decimal-leading-zero);display:block;font-family:var(--f-mono);font-size:11px;letter-spacing:.14em;color:var(--ember);margin-bottom:8px}
|
||||
|
||||
.band{background:var(--ember);color:var(--ember-ink)}
|
||||
.band .wrap{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:24px;padding-block:56px}
|
||||
.band h2{font-weight:900;font-size:clamp(26px,3.5vw,36px)}
|
||||
.band p{font-size:16px;max-width:56ch}
|
||||
.btn.dark{background:var(--obsidian);color:var(--bone);border-color:var(--obsidian)}
|
||||
.btn.dark:hover{background:#222226;color:var(--bone)}
|
||||
.foot{margin-top:0}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="36" height="36" aria-hidden="true"><rect width="1024" height="1024" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-links" aria-label="Menu"><svg class="bars" viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"></path></svg><svg class="x" viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"></path></svg></button>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/wallet" data-nav="wallet" aria-current="page">Wallet</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="cta">Get the miner</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, a tap outside, Escape (focus back on the button) or a resize past 940 px
|
||||
var b=document.getElementById('nav-burger'),l=document.getElementById('nav-links');if(!b||!l)return;
|
||||
function set(o){l.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');}
|
||||
b.addEventListener('click',function(){set(!l.classList.contains('open'));});
|
||||
l.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('click',function(e){if(l.classList.contains('open')&&!l.contains(e.target)&&!b.contains(e.target))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&l.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:941px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
|
||||
<main id="main">
|
||||
<header class="hero" id="top">
|
||||
<div class="wrap">
|
||||
<div class="hero-copy">
|
||||
<div class="eyebrow ember">Igneum Wallet · desktop</div>
|
||||
<h1>Your coins. Final means final.</h1>
|
||||
<p class="lead">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.</p>
|
||||
<div class="cta">
|
||||
<a href="#get" class="btn primary">Get the wallet</a>
|
||||
<a href="#finality" class="btn">How final works</a>
|
||||
</div>
|
||||
<div class="os"><span>macOS first</span><span>Windows next</span><span>MetaMask export</span></div>
|
||||
</div>
|
||||
<div class="shot reveal">
|
||||
<figure class="frame" style="margin:0">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Igneum Wallet</b></div>
|
||||
<img src="/img/wallet-home.webp" width="2240" height="1560" alt="The wallet window: a balance in IGN, an example address with Send and Receive, node and finality panels, and a history of block rewards" fetchpriority="high" decoding="async">
|
||||
<figcaption>Igneum Wallet on a private test network, 5 Oct 2026. The address is an example.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="finality">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Three states, checked here</h2>
|
||||
<p>Every transfer in the history is pending, in a block, or final. The third one is the wallet's own verdict.</p>
|
||||
</div>
|
||||
<div class="states reveal">
|
||||
<div class="state pending"><span class="pill"><i></i>pending</span><div class="t">Waiting for a block</div><p>Signed on this machine and handed to the node. Nothing has carried it yet.</p></div>
|
||||
<div class="state block"><span class="pill"><i></i>in a block</span><div class="t">Chain block 8</div><p>A block carries it and the chain's height passed it. It can still be reorganised until a checkpoint covers it.</p></div>
|
||||
<div class="state final"><span class="pill"><i></i>final · cp 5</span><div class="t">Under a verified checkpoint</div><p>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.</p></div>
|
||||
</div>
|
||||
<div class="shot reveal" style="margin-top:var(--gap);max-width:880px">
|
||||
<figure class="frame" style="margin:0">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Transaction</b></div>
|
||||
<img src="/img/wallet-final.webp" width="1640" height="820" alt="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" loading="lazy" decoding="async">
|
||||
<figcaption>The transfer from the test run: 1.5 IGN, final under checkpoint 5, certificate verified by the wallet. Addresses are examples.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
<div class="reveal" style="margin-top:var(--gap)">
|
||||
<div class="eyebrow" style="margin-bottom:12px">What the wallet checks before it says final</div>
|
||||
<ol class="ol">
|
||||
<li>The certificate as a block carried it: the finality section of the blocks after the checkpoint.</li>
|
||||
<li>The canonical voter list: every key above dust and not stripped, sorted by key hash, as many as the certificate says.</li>
|
||||
<li>The aggregate signature over the checkpoint, by the keys the bitmap names.</li>
|
||||
<li>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.</li>
|
||||
</ol>
|
||||
<p class="pt" style="margin-top:16px">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.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="features">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Every feature, one line each</h2>
|
||||
<p>Version 1, built on the miner's bones: the same local server, the same signed update manifest, the same key code.</p>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="keys">
|
||||
<div class="g-head"><div class="eyebrow ember">01 · Your key</div><h3>Create or import, sealed on your disk</h3><p>The password is never written anywhere. The plaintext only ever exists in the engine's memory and is zeroed when the wallet locks.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Create: 24 words</b><p>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.</p></div>
|
||||
<div class="feat"><b>Import</b><p>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.</p></div>
|
||||
<div class="feat"><b>Sealed with a password</b><p>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.</p></div>
|
||||
<div class="feat"><b>The Ethereum path</b><p>Keys follow BIP-39 and BIP-44 at the Ethereum path, so the same 24 words open the same account in MetaMask.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="money">
|
||||
<div class="g-head"><div class="eyebrow ember">02 · Send, receive, history</div><h3>Everything on one screen</h3><p>Signing happens in the engine, in Rust. Nothing on the window side ever holds the key.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Balance</b><p>Read from your node every few seconds, in IGN, with the block it was read at.</p></div>
|
||||
<div class="feat"><b>Send with the fee shown</b><p>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.</p></div>
|
||||
<div class="feat"><b>Receive by QR</b><p>The code is drawn on your machine as SVG. No image service, no call across the network.</p></div>
|
||||
<div class="feat"><b>History with rewards</b><p>Transfers in and out, block rewards from the execution records, one per blue block, and proving payouts when a block carries a proof record.</p></div>
|
||||
<div class="feat"><b>Finality per transaction</b><p>Pending, in a block, or final with the checkpoint index, verified here. <a href="#finality" style="color:var(--ember)">How it checks</a>.</p></div>
|
||||
<div class="feat"><b>Lock</b><p>One button locks the wallet and zeroes the key in memory. The password opens it again.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="node">
|
||||
<div class="g-head"><div class="eyebrow ember">03 · Your node</div><h3>Reads the miner's node first</h3><p>When the miner is installed, the wallet uses its node on this machine. Nobody else sees your balance.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>1 · The miner app's node</b><p>Found on this machine and used as it is. Nothing is started.</p></div>
|
||||
<div class="feat"><b>2 · A public RPC</b><p>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.</p></div>
|
||||
<div class="feat"><b>3 · The bundled node</b><p>The wallet starts its own copy of the node on its own ports, no mining, and stops it when the wallet quits.</p></div>
|
||||
<div class="feat"><b>Updates, signed</b><p>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.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="metamask">
|
||||
<div class="g-head"><div class="eyebrow ember">04 · MetaMask</div><h3>Export and add the network</h3><p>For people who already live in MetaMask. The key leaves this app only when you copy it.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Add to MetaMask</b><p>One click adds the Igneum network with its chain id and RPC. Copy network settings puts the same values on the clipboard.</p></div>
|
||||
<div class="feat"><b>Export the key</b><p>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.</p></div>
|
||||
<div class="feat"><b>Desktop first</b><p>macOS now, as a disk image. The Windows host is written and untested. No browser extension and no phone app yet.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="measured">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>The first run, timed</h2>
|
||||
<p>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.</p>
|
||||
</div>
|
||||
<div class="tbl reveal"><table>
|
||||
<thead><tr><th>Step</th><th>From the node's start</th><th>What was seen</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Wallet A created, 24 words, three typed back</td><td class="num">0.3 s</td><td>an address</td></tr>
|
||||
<tr><td>Wallet B: a wrong word refused, then created</td><td class="num">0.4 to 0.5 s</td><td>"word 1 is not right"</td></tr>
|
||||
<tr><td>A's balance from block rewards</td><td class="num">3.5 s</td><td>10.14 IGN at block 4</td></tr>
|
||||
<tr><td>Zero address, 999,999,999 IGN, a short address</td><td class="num">4.5 s</td><td>all three refused by the quote</td></tr>
|
||||
<tr><td>Quote for 1.5 IGN to B</td><td class="num">4.6 s</td><td>gas 25,380; base fee 1 gwei; tip 1 gwei; fee at most 0.00007614 IGN</td></tr>
|
||||
<tr><td>In a block</td><td class="num">5.6 s</td><td>chain block 8</td></tr>
|
||||
<tr><td>First locked checkpoint on the network</td><td class="num">about 170 s</td><td>index 5</td></tr>
|
||||
<tr><td>Final in wallet A</td><td class="num">175.2 s</td><td>under checkpoint 5, certificate verified by the wallet: 1 of 1 voters, 100% of total weight</td></tr>
|
||||
<tr><td>B's view of the same transfer</td><td class="num">175 s</td><td>1.5 IGN, final</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p class="pt reveal" style="margin-top:16px">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.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Get the wallet</h2>
|
||||
<p>Public testnet first. Download only from this domain. Nobody from Igneum will ask for your seed.</p>
|
||||
</div>
|
||||
<div class="cta reveal" style="align-items:center">
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg>macOS</a>
|
||||
<a href="/#journey" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg>Windows</a>
|
||||
<a href="#metamask" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M4 4l5 3h6l5-3-1.5 7 1.5 5-3 4H7l-3-4 1.5-5z"/><path d="M9 13h2M13 13h2"/></svg>MetaMask</a>
|
||||
</div>
|
||||
<p class="pt reveal" style="margin-top:20px">The wallet reads this machine's node when the <a href="/miner" style="color:var(--ember)">miner</a> is installed. Without it, a public RPC for balances and sending, or the bundled node for everything.</p>
|
||||
<a href="/litepaper#miners" class="lp reveal">Read more in the litepaper</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<div class="band">
|
||||
<div class="wrap">
|
||||
<div style="display:flex;flex-direction:column;gap:8px">
|
||||
<h2>The miner pays this wallet.</h2>
|
||||
<p>Install the miner, press Start, and the address it makes is the one this wallet imports with one click.</p>
|
||||
</div>
|
||||
<a href="/miner" class="btn dark">The miner</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="30" height="30" aria-hidden="true"><rect width="1024" height="1024" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/#journey">Journey</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Get the miner</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<span class="mono">igneum.network</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- footer:end -->
|
||||
<script>
|
||||
(function(){
|
||||
var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
|
||||
document.querySelectorAll('.reveal').forEach(function(el){io.observe(el);});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in a new issue