From d805a336083547279d2d8db4a10c605db0530bab Mon Sep 17 00:00:00 2001 From: martbost Date: Sat, 15 Aug 2026 07:14:23 -0500 Subject: [PATCH] Add home "team by the numbers" showcase + why-a-winning-team-pays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- chain.js | 4 +++- public/bridge.js | 15 +++++++++++++++ public/index.html | 5 +++++ public/styles.css | 9 +++++++++ server.js | 6 ++++++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/chain.js b/chain.js index 798df92..d2f37a6 100644 --- a/chain.js +++ b/chain.js @@ -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), diff --git a/public/bridge.js b/public/bridge.js index f8f2106..d084c13 100644 --- a/public/bridge.js +++ b/public/bridge.js @@ -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= + `
${os.memberPct}%
of the entire network is on our team
`+ + `
${fmt(os.orgMembers)}
members and growing
`+ + `
${os.generations||0}
generations deep
`+ + `
${fmt(os.orgPol)}
POL paid to our team, verifiable on-chain
`; + } 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; diff --git a/public/index.html b/public/index.html index bbf4697..8880be2 100644 --- a/public/index.html +++ b/public/index.html @@ -7,6 +7,11 @@
Premium • Polygon • Team Duplication

Get Your 2.
Help Your 2 Get Their 2.

A team-first strategy built around qualification, depth, and duplication.

Show Me the Current Team Placement →
QR code — scan to open the getting-started page with the current team sponsorScan to get started
opens the current team placement
See the Strategy
Independent team training resource • Participation involves risk • No income is guaranteed
RM Circle Premium Team Build Roadmap — core strategy, step-by-step guide, premium levels, and duplication formula
The RM Circle is a team build project of the Crypto Team Build Network. This roadmap is the plan every member follows — tap to view full size.
+
Our team by the numbers

Why it pays to be on a winning team.

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.

+
Reading the blockchain…
+
↧

Spillover works for you

When your team keeps recruiting, the overflow spills down into your matrix — filling your structure with members you didn't personally enroll. A bigger, more active team means more spillover landing under you.

↑

Depth pays as it climbs

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.

★

You never build alone

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.

+

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. Full disclaimers →

+
Watch first

See how simple this is.

A quick walkthrough of the team build in action. Watch this before you dive into the strategy below.

The strategy

Simple enough to duplicate.

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.

2

Get exactly two

Use your position's link until two direct positions are placed beneath you and your position is qualified.

↘

Move the effort down

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.

↑

Upgrade responsibly

Use earned POL to advance when practical. Active builders may also choose to self-fund, but only within their own risk tolerance.

Moving-link workflow

Qualify. Then the effort moves down.

Step 1Use link

Share the current position's referral link.

Step 2Get 2

Place exactly two direct positions.

Step 3Retire link

Late signups still spill down — bonus depth, not a problem.

Step 4Help your 2

Shift the team effort to their links.

Step 5Repeat

Keep the qualification wave moving down.

diff --git a/public/styles.css b/public/styles.css index f4ebdf4..b494072 100644 --- a/public/styles.css +++ b/public/styles.css @@ -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}} diff --git a/server.js b/server.js index d92d3b5..f336772 100644 --- a/server.js +++ b/server.js @@ -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];