Add home "team by the numbers" showcase + why-a-winning-team-pays

Public /api/public/org-stats (from config.orgRootId, default 21) feeds a
prominent home-page band: share of the whole network, team size,
generations deep, and on-chain POL to the team — populated by bridge.js,
section hides itself if stats aren't ready. Paired with three mechanics
cards (spillover fills your matrix, depth pays as it climbs, the rotation
qualifies you) that make the "winning team" case honestly, plus the risk
caveat ("most participants may not profit") and a disclaimer link.
Live: 51.1% of members, 48 in the org, 10 generations, 25,423 POL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-15 07:14:23 -05:00
parent 7b6f629780
commit d805a33608
5 changed files with 38 additions and 1 deletions
+3 -1
View File
@@ -527,8 +527,10 @@ function getOrgShare(rootId) {
const orgBelow = root.downCount || 0;
const orgMembers = orgBelow + 1;
const orgPol = (rm.earnedPol || 0) + (root.downPol || 0);
let generations = 0;
(function depth(n, dep) { if (!n) return; if (dep > generations) generations = dep; depth(n.left, dep + 1); depth(n.right, dep + 1); })(root, 0);
return {
...base, found: true, orgBelow, orgMembers,
...base, found: true, orgBelow, orgMembers, generations,
memberPct: +(100 * orgMembers / totalMembers).toFixed(1),
belowPct: +(100 * orgBelow / totalMembers).toFixed(1),
orgPol: +orgPol.toFixed(2),
+15
View File
@@ -12,6 +12,21 @@
if(h&&c.bridgeHeadline)h.textContent=c.bridgeHeadline;
const qs=window.location.search; if(qs){document.querySelectorAll('a[href="/start"]').forEach(a=>a.href='/start'+qs)}
}catch(e){}
// team-by-the-numbers showcase — live org stats vs the whole network
try{
const grid=document.getElementById('teamStatGrid');
if(grid){
const os=await fetch('/api/public/org-stats').then(r=>r.ok?r.json():null).catch(()=>null);
if(os&&os.found){
const fmt=n=>Number(n||0).toLocaleString(undefined,{maximumFractionDigits:0});
grid.innerHTML=
`<div class="team-stat"><div class="num">${os.memberPct}%</div><small>of the entire network is on our team</small></div>`+
`<div class="team-stat"><div class="num teal">${fmt(os.orgMembers)}</div><small>members and growing</small></div>`+
`<div class="team-stat"><div class="num teal">${os.generations||0}</div><small>generations deep</small></div>`+
`<div class="team-stat"><div class="num ok">${fmt(os.orgPol)}</div><small>POL paid to our team, verifiable on-chain</small></div>`;
} else { const sec=grid.closest('section'); if(sec)sec.style.display='none'; }
}
}catch(e){ const g=document.getElementById('teamStatGrid'), sec=g&&g.closest('section'); if(sec)sec.style.display='none'; }
// fill each generation's crowd from data-n; cap the rendered icons so the
// deeper generations (up to 256) stay compact — the number label is the truth
const ICON_CAP=12;
+5
View File
@@ -7,6 +7,11 @@
<main>
<section class="hero wrap"><div class="eyebrow">Premium • Polygon • Team Duplication</div><h1 id="bridgeHeadline"><span class="gold">Get Your 2.</span><br>Help Your 2 Get Their 2.</h1><p id="bridgeSubheadline">A team-first strategy built around qualification, depth, and duplication.</p><div class="hero-actions"><a class="btn btn-primary" href="/start">Show Me the Current Team Placement →</a><div class="qr-cta"><img src="/qr-start.svg" width="106" height="106" alt="QR code — scan to open the getting-started page with the current team sponsor"><span>Scan to get started<br><small>opens the current team placement</small></span></div><a class="btn btn-secondary" href="#strategy">See the Strategy</a></div><div class="micro">Independent team training resource • Participation involves risk • No income is guaranteed</div>
<figure class="roadmap-figure" style="margin-top:34px"><a href="/roadmap.webp" target="_blank" rel="noopener"><img src="/roadmap.webp" alt="RM Circle Premium Team Build Roadmap — core strategy, step-by-step guide, premium levels, and duplication formula" width="1149" height="1369"></a><figcaption>The RM Circle is a team build project of the <strong>Crypto Team Build Network</strong>. This roadmap is the plan every member follows — tap to view full size.</figcaption></figure></section>
<section class="section" id="teamstats" style="padding-top:38px"><div class="wrap"><div class="section-head" style="max-width:880px"><div class="eyebrow">Our team by the numbers</div><h2>Why it pays to be on a <span class="gold">winning team.</span></h2><p>Every figure below is read live from the Polygon blockchain — anyone can verify it. These are historical on-chain facts, not a promise of future income.</p></div>
<div id="teamStatGrid" class="team-stats"><div class="empty">Reading the blockchain…</div></div>
<div class="grid-3" style="margin-top:24px"><article class="card"><div class="card-icon">↧</div><h3>Spillover works for you</h3><p>When your team keeps recruiting, the overflow spills <em>down</em> into your matrix — filling your structure with members you didn't personally enroll. A bigger, more active team means more spillover landing under you.</p></article><article class="card"><div class="card-icon">↑</div><h3>Depth pays as it climbs</h3><p>Your income comes from your team upgrading through the levels, and every upgrade travels up the matrix. The deeper and more active your side, the more upgrade payments flow toward your position — if you stay qualified and keep your level ahead.</p></article><article class="card"><div class="card-icon">★</div><h3>You never build alone</h3><p>The team rotation points everyone's effort at helping the next person get their two. Join the momentum and the team works to qualify you — instead of grinding solo.</p></article></div>
<p class="micro" style="margin-top:16px">Blockchain data can lag or contain display errors — always verify on-chain. Participation involves cryptocurrency risk and no income is guaranteed; most participants may not profit. <a href="/disclaimer" style="color:var(--teal)">Full disclaimers →</a></p>
</div></section>
<section class="section" style="padding-bottom:0"><div class="wrap"><div class="section-head"><div class="eyebrow">Watch first</div><h2>See how simple this is.</h2><p>A quick walkthrough of the team build in action. Watch this before you dive into the strategy below.</p></div><div class="video-card" style="max-width:880px;margin:0 auto"><iframe class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" width="880" height="495" src="https://www.youtube-nocookie.com/embed/VOhwBiAO7to" title="RM Circle Premium team build walkthrough video" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div></div></section>
<section id="strategy" class="section"><div class="wrap"><div class="section-head"><div class="eyebrow">The strategy</div><h2>Simple enough to duplicate.</h2><p>Each position gets two directs to qualify, then retires its link and helps the next two positions repeat the process. Late signups on a qualified link are a welcome bonus — they pay that member and spill downward as depth.</p></div><div class="grid-3"><article class="card"><div class="card-icon">2</div><h3>Get exactly two</h3><p>Use your position's link until two direct positions are placed beneath you and your position is qualified.</p></article><article class="card"><div class="card-icon">↘</div><h3>Move the effort down</h3><p>Retire your link and help each of your two directs use their own links until they each have two — that's what qualifies them. If someone still joins through your link anyway, it's a bonus: it pays you and spills down as depth.</p></article><article class="card"><div class="card-icon">↑</div><h3>Upgrade responsibly</h3><p>Use earned POL to advance when practical. Active builders may also choose to self-fund, but only within their own risk tolerance.</p></article></div></div></section>
<section class="section"><div class="wrap"><div class="section-head"><div class="eyebrow">Moving-link workflow</div><h2>Qualify. Then the effort moves down.</h2></div><div class="flow"><div class="flow-step"><b>Step 1</b><strong>Use link</strong><p>Share the current position's referral link.</p></div><div class="flow-step"><b>Step 2</b><strong>Get 2</strong><p>Place exactly two direct positions.</p></div><div class="flow-step"><b>Step 3</b><strong>Retire link</strong><p>Late signups still spill down — bonus depth, not a problem.</p></div><div class="flow-step"><b>Step 4</b><strong>Help your 2</strong><p>Shift the team effort to their links.</p></div><div class="flow-step"><b>Step 5</b><strong>Repeat</strong><p>Keep the qualification wave moving down.</p></div></div></div></section>
+9
View File
@@ -133,3 +133,12 @@ a.brand{text-decoration:none;color:inherit}
.matrix .person{width:12px;height:16px}
.matrix .person::before{width:6px;height:6px;left:3px;top:-4px}
.person-more{color:var(--teal);font-weight:900;align-self:center;font-size:15px;line-height:1;margin-left:2px}
/* Home "team by the numbers" showcase */
.team-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.team-stat{background:linear-gradient(180deg,rgba(16,40,63,.94),rgba(9,27,43,.96));border:1px solid #23425d;border-radius:var(--radius);padding:24px 18px;text-align:center;box-shadow:var(--shadow)}
.team-stat .num{font-size:clamp(32px,4.4vw,50px);font-weight:900;line-height:1;color:var(--gold);letter-spacing:-1px}
.team-stat .num.teal{color:var(--teal)}
.team-stat .num.ok{color:var(--ok)}
.team-stat small{display:block;color:var(--muted);margin-top:9px;font-size:13px;line-height:1.45}
@media(max-width:720px){.team-stats{grid-template-columns:1fr 1fr}}
+6
View File
@@ -366,6 +366,12 @@ async function handleApi(req,res,pathname){
if(req.method==='GET'&&pathname==='/api/public/payouts'){
return json(res,200,chain.getPayoutsPublic(),{'Cache-Control':'public, max-age=20'});
}
if(req.method==='GET'&&pathname==='/api/public/org-stats'){
const root=Number(getConfig().orgRootId||21);
const d=chain.getOrgShare(Number.isInteger(root)&&root>0?root:21);
// expose only the aggregate showcase numbers (all public on-chain data)
return json(res,200,{ready:d.ready,found:!!d.found,memberPct:d.memberPct,orgMembers:d.orgMembers,generations:d.generations,orgPol:d.orgPol,totalMembers:d.totalMembers},{'Cache-Control':'public, max-age=60'});
}
if(req.method==='GET'&&pathname==='/api/public/alert-status'){
const id=Number(new URL(req.url,'http://x').searchParams.get('id')||0);
const rec=getMemberAlerts()[id];