git / moonbite-network / templates/community.html · raw
{% extends "base.html" %}{% block body_class %}{% endblock %}{% block title %}Community — MoonBite{% endblock %}{% block meta_description %}MoonBite is a small, early proof-of-work network. Watch the live chain, find where people talk, and pick a way to help: mine, run a node, review the code.{% endblock %}{% block head_extra %}<style nonce="{{ csp_nonce }}"> /* Community hub: composes the ds- kit; only the few rules below are page-specific. */ .cm-stage .ds-eyebrow { display: flex; align-items: center; gap: 8px; } .cm-stage .ds-board { margin-top: 24px; } .cm-stage .ds-brow { padding: 20px 24px; } .cm-stage .ds-brow .val { font-size: clamp(20px, 2.4vw, 28px); } .cm-blocks .ds-row { grid-template-columns: 120px minmax(0, 1fr) auto; min-height: 44px; } .cm-blocks .ds-row .id { color: var(--ds-bone); } .cm-blocks .empty { padding: 24px 0; color: var(--ds-ash); border-bottom: 1px solid var(--ds-line); } .cm-talk .ds-row { grid-template-columns: 160px minmax(0, 1fr) auto; } .cm-talk .ds-row .meta svg { vertical-align: middle; } .cm-talk a.ds-row:hover .t { text-decoration: underline; text-decoration-color: var(--ds-line-2); text-underline-offset: 4px; } .cm-callout { margin-top: 32px; } .cm-callout a { color: var(--ds-bone); border-bottom: 1px solid var(--ds-line-2); } @media (max-width: 767px) { .cm-blocks .ds-row, .cm-talk .ds-row { grid-template-columns: minmax(0, 1fr) auto; gap: 8px 16px; } .cm-blocks .ds-row .id, .cm-talk .ds-row .id { grid-column: 1 / -1; } }</style>{% endblock %}{% block content %}{% set MARK = "M 13.99 -99.02 A 100 100 0 1 0 99.02 -13.99 A 62 62 0 0 1 13.99 -99.02 Z" %}{% set ARROW %}<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>{% endset %}{% set OUT %}<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3h7v7M13 3L4 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>{% endset %}<div class="ds"> <!-- ================= HEAD ================= --> <header class="ds-pagehead split"> <div class="ds-wrap"> <div> <ol class="ds-crumbs"> <li><a href="/">MoonBite</a></li> <li><span aria-current="page">Community</span></li> </ol> <p class="ds-eyebrow">Community</p> <h1 class="ds-title">A small network.<br><span class="g">Your CPU shows up.</span></h1> <p class="ds-lede">MoonBite is early and the network is small. That is the honest state of things, and it is also the opening: <b>one more miner moves the hashrate, one more node makes the chain harder to attack.</b></p> <div class="ds-actions"> <a class="ds-btn gold" href="/mine">Start mining {{ ARROW }}</a> <a class="ds-btn" href="#talk">Where people talk</a> </div> <ul class="ds-checks"> <li>No sign-up</li> <li>No premine</li> <li>Same rules for everyone</li> </ul> </div> <div class="ds-stage cm-stage" aria-live="polite"> <p class="ds-eyebrow"><span class="ds-dot" id="cm-dot"></span> <span id="cm-state">Reading the chain</span></p> <div class="ds-board"> <div class="ds-brow"><span class="k">Height</span><span class="val" id="cm-height">–</span></div> <div class="ds-brow"><span class="k">Last block</span><span class="val" id="cm-last">–</span></div> <div class="ds-brow"><span class="k">Hashrate</span><span class="val" id="cm-rate">–<small>whole network</small></span></div> </div> </div> </div> </header> <!-- ================= LIVE BLOCKS ================= --> <section class="ds-section" aria-labelledby="live-h"> <div class="ds-wrap"> <div class="ds-head"> <div> <p class="ds-eyebrow">Live</p> <h2 class="ds-h2" id="live-h">The chain, <span class="dim">right now.</span></h2> <p class="ds-sub">The newest blocks, read from a MoonBite node. Open one in the explorer to see which address mined it.</p> </div> <a class="ds-textlink" href="/explorer">Open the explorer</a> </div> <div class="ds-rows cm-blocks" id="cm-blocks"> <p class="empty">Waiting for the node to answer.</p> </div> <p class="ds-note"><span id="cm-note">Refreshed every 30 seconds. Nothing here is a mock-up.</span></p> </div> </section> <!-- ================= WHERE PEOPLE TALK ================= --> <section class="ds-section alt" id="talk" aria-labelledby="talk-h"> <div class="ds-wrap"> <p class="ds-eyebrow">Talk</p> <h2 class="ds-h2" id="talk-h">Where people talk</h2> <p class="ds-sub">These are the only official places. If a link isn't on this page, it isn't ours.</p> <div class="ds-rows cm-talk"> {% if discord_url %} <a class="ds-row" href="{{ discord_url }}" target="_blank" rel="noopener"> <span class="id">Discord</span> <span class="t">Chat, mining help, announcements<span class="d">The fastest place to get an answer.</span></span> <span class="meta">{{ OUT }}</span> </a> {% else %} <div class="ds-row"> <span class="id">Discord</span> <span class="t">Chat, mining help, announcements<span class="d">Not open yet. When it is, the invite will be here and nowhere else.</span></span> <span class="ds-tag">Not open yet</span> </div> {% endif %} {% if bitcointalk_url %} <a class="ds-row" href="{{ bitcointalk_url }}" target="_blank" rel="noopener"> <span class="id">Bitcointalk</span> <span class="t">The announcement thread<span class="d">Launch facts, release notes and public questions, on the record.</span></span> <span class="meta">{{ OUT }}</span> </a> {% else %} <div class="ds-row"> <span class="id">Bitcointalk</span> <span class="t">The announcement thread<span class="d">Not posted yet. The thread will be linked here once it is up.</span></span> <span class="ds-tag">Not posted yet</span> </div> {% endif %} <a class="ds-row" href="/discussions"> <span class="id">Forum</span> <span class="t">The discussion board on this site<span class="d">No account needed: pick a name and post.</span></span> <span class="meta">{{ ARROW }}</span> </a> <a class="ds-row" href="mailto:support@moonbite.org"> <span class="id">Email</span> <span class="t">support@moonbite.org<span class="d">Bug reports, security findings and anything that shouldn't be public.</span></span> <span class="meta">{{ ARROW }}</span> </a> </div> <div class="ds-callout warn cm-callout"> <span class="label">Scam warning</span> <p><strong>Nobody from MoonBite will message you first,</strong> ask for your seed phrase, or offer to "double" your coins. Anyone who does is a scammer. <a href="/scams">How to spot them</a></p> </div> </div> </section> <!-- ================= WAYS TO HELP ================= --> <section class="ds-section" aria-labelledby="help-h"> <div class="ds-wrap"> <p class="ds-eyebrow">Help</p> <h2 class="ds-h2" id="help-h">Pick a way in</h2> <p class="ds-sub">Nobody needs to give you permission. Choose whatever fits the time you have.</p> <div class="ds-grid c3"> <a class="ds-card" href="/mine"> <div class="body"> <span class="n">01</span> <span class="t">Mine</span> <span class="d">Run the miner on any desktop or laptop CPU. Every block you find pays you and adds work to the chain. You don't need a pool.</span> <span class="go">Start mining</span> </div> </a> <a class="ds-card" href="/full-node"> <div class="body"> <span class="n">02</span> <span class="t">Run a node</span> <span class="d">Sync MoonBite Core and check every block yourself. Every node you add makes the network harder to take down.</span> <span class="go">Node setup guide</span> </div> </a> <a class="ds-card" href="/git/"> <div class="body"> <span class="n">03</span> <span class="t">Review the code</span> <span class="d">The node, wallet, explorer and this site are all public. Read them, build them, and send findings to support@moonbite.org.</span> <span class="go">Read the source</span> </div> </a> <a class="ds-card" href="/learn"> <div class="body"> <span class="n">04</span> <span class="t">Help newcomers</span> <span class="d">Answer questions and write up what you've learned. A short guide that clears up one confusing step is real work.</span> <span class="go">Learning resources</span> </div> </a> <a class="ds-card" href="/merchants"> <div class="body"> <span class="n">05</span> <span class="t">Accept MBITE</span> <span class="d">Take payments with self-custody, so no processor ever holds your coins.</span> <span class="go">Merchant guide</span> </div> </a> <a class="ds-card" href="/governance"> <div class="body"> <span class="n">06</span> <span class="t">Question the rules</span> <span class="d">Every rule change starts as a written record. Read the reasoning and point out where it's wrong.</span> <span class="go">Decision records</span> </div> </a> </div> </div> </section> <!-- ================= BUILD LOG ================= --> <section class="ds-section alt" aria-labelledby="log-h"> <div class="ds-wrap"> <p class="ds-eyebrow">Build log</p> <h2 class="ds-h2" id="log-h">What changed lately</h2> <p class="ds-sub">Progress is posted in the open, so you can check what was done instead of taking our word for it.</p> <div class="ds-rows cm-talk"> <a class="ds-row" href="/blog"> <span class="id">17 Oct 2026</span> <span class="t">Mainnet relaunched from a clean genesis<span class="d">Earlier chains are retired, their balances are void, and every coin is mined from zero.</span></span> <span class="meta">{{ ARROW }}</span> </a> {% if newest_adr %} {% set parts = newest_adr.slug.split('-') %} <a class="ds-row" href="/governance/{{ newest_adr.slug }}"> <span class="id">{{ parts[0] }}-{{ parts[1] }}</span> <span class="t">{{ newest_adr.title.split('—', 1)[1].strip() if '—' in newest_adr.title else newest_adr.title }}<span class="d">The newest decision record.</span></span> <span class="meta">{{ ARROW }}</span> </a> {% endif %} <a class="ds-row" href="/git/"> <span class="id">Source</span> <span class="t">Every commit<span class="d">The full history of the code, with nothing summarized away.</span></span> <span class="meta">{{ ARROW }}</span> </a> </div> </div> </section> <!-- ================= CLOSING ================= --> <section class="ds-section" aria-labelledby="close-h"> <div class="ds-wrap"> <div class="ds-band"> <svg class="mk" viewBox="-150 -150 300 300" aria-hidden="true"><path fill="#F5F2EA" d="{{ MARK }}"/><rect x="-127.5" y="-40.5" width="255" height="13" fill="#D9A441"/><rect x="-127.5" y="11.5" width="255" height="13" fill="#D9A441"/></svg> <h2 class="ds-h2" id="close-h">Find a block. Then tell us.</h2> <p class="ds-sub">The first blocks on a new chain are a short list, and your address can be on it.</p> <div class="ds-actions"> <a class="ds-btn" href="/mine">Download the miner</a> <a class="ds-btn" href="/discussions">Post on the forum</a> </div> </div> </div> </section></div>{% endblock %}{% block scripts_extra %}<script nonce="{{ csp_nonce }}">(function () { "use strict"; function $(id) { return document.getElementById(id); } var lastTime = null; function ago(t) { var s = Math.max(0, Math.round(Date.now() / 1000 - t)); if (s < 60) return s + "s ago"; if (s < 3600) return Math.floor(s / 60) + " min ago"; if (s < 86400) return Math.floor(s / 3600) + " h ago"; return Math.floor(s / 86400) + " d ago"; } function rate(h) { if (h >= 1e9) return (h / 1e9).toFixed(2) + " GH/s"; if (h >= 1e6) return (h / 1e6).toFixed(2) + " MH/s"; if (h >= 1e3) return (h / 1e3).toFixed(2) + " kH/s"; return Math.round(h) + " H/s"; } function setVal(id, text, sub) { var el = $(id); el.textContent = text; if (sub) { var s = document.createElement("small"); s.textContent = sub; el.appendChild(s); } } function el(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text !== undefined) e.textContent = text; return e; } function apply(d) { $("cm-dot").classList.add("on"); $("cm-state").textContent = "Mainnet, live"; setVal("cm-height", Number(d.height).toLocaleString("en-US")); lastTime = d.last_block_time; setVal("cm-last", ago(lastTime)); setVal("cm-rate", d.hashps != null ? rate(Number(d.hashps)) : "not reported", "whole network"); var box = $("cm-blocks"); box.textContent = ""; (d.blocks || []).forEach(function (b) { var row = el("a", "ds-row"); row.href = "/explorer#block/" + encodeURIComponent(b.height); row.appendChild(el("span", "id", "#" + Number(b.height).toLocaleString("en-US"))); var t = el("span", "t", Number(b.subsidy_coins).toLocaleString("en-US") + " MBITE"); var tx = Number(b.tx_count) || 0; t.appendChild(el("span", "d", tx + (tx === 1 ? " transaction" : " transactions"))); row.appendChild(t); row.appendChild(el("span", "meta", ago(b.time))); box.appendChild(row); }); if (!box.firstChild) box.appendChild(el("p", "empty", "The node returned no blocks.")); $("cm-note").textContent = "Refreshed every 30 seconds. Nothing here is a mock-up."; } function poll() { fetch("/api/tip", { cache: "no-store" }).then(function (r) { return r.ok ? r.json() : Promise.reject(); }).then(function (d) { if (d && d.status !== "error" && d.height !== undefined) apply(d); else throw 0; }).catch(function () { $("cm-dot").classList.remove("on"); $("cm-state").textContent = "Node didn't answer"; if (lastTime === null) { $("cm-blocks").textContent = ""; $("cm-blocks").appendChild(el("p", "empty", "The node didn't answer just now. Nothing is shown in its place.")); } $("cm-note").textContent = "The node didn't answer the last refresh. Retrying in 30 seconds."; }); } poll(); setInterval(poll, 30000); setInterval(function () { if (lastTime !== null) setVal("cm-last", ago(lastTime)); }, 15000);})();</script>{% endblock %}