The name in the Sponsor Queue is now a click-to-rename control (pencil
appears on hover), using the existing PATCH endpoint; server trims and
caps the name.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New config teamAlertEmail: the same team-gated on-chain events that post
to Telegram (registration, upgrade, payout at/below teamRootId) also go
to this address via SendGrid, so deep-leg activity surfaces even away
from Telegram.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both marketingwithmarty.com and mybrandedvoice.com are SendGrid
DKIM-authenticated; Marty's sending identity is marketingwithmarty.com,
so the default from and the admin label now reflect that.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
When the chain tail sees a payout to a member whose sponsor record has a
contact email, the site emails them the amount, source, and Polygonscan
link (plain text — deliverability). SendGrid key is pasted in a new
admin panel (stored in the data volume, like the OpenRouter key) or set
via SENDGRID_API_KEY. From address defaults to no-reply@mybrandedvoice.com
— the domain SendGrid is DKIM-authenticated for — and is editable in the
same panel. Not gated on teamRootId; any member with an email on file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sponsors can carry an optional contact email (Add Sponsor form, ✉ inline
edit in the queue, shown under the name). New config teamRootId: any NEW
on-chain event at or below that member ID — registration, upgrade, or
payout seen by the live tail — posts to the Telegram group topic, with
the tx link and the sponsor's contact email when one is on file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Matrix View now defaults to a generation-by-generation pyramid (root + 3
generations of position cards, empty placements shown as dashed open
slots). Clicking a position re-roots the pyramid there; a breadcrumb
navigates back up. The collapsible list stays behind a toggle. Tree
payload now carries explicit left/right children so an only-child lands
on the correct side.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New chain.js reads the RM Circle contract (0x33Bd…2DAF, Polygon) via free
public RPCs — no API keys. Daily snapshot rebuilds complete payout history
from getIncomeHistory (log providers prune old history), and a 60s
eth_getLogs tail catches new payouts with tx hashes, upgrade context, and
passed-over upline IDs.
- Bridge page: "Live payment proof" feed + timed toast pop-ups for payouts
seen in the last 15 min, every row linking to Polygonscan.
- /start: same toasts; ID submissions are now verified against the contract
(result shown to the member, in Telegram notify, and in admin).
- Admin: on-chain member lookup (lineage to root, directs, matrix children,
full income history) and a collapsible full matrix tree view.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Framing was blocked site-wide (X-Frame-Options DENY + frame-ancestors
none), so safelists and traffic exchanges showed a blank panel. Public
pages now send frame-ancestors *; admin.html keeps the strict lockdown.
Join button opens the dApp in a new tab so it escapes the exchange
iframe (dApps typically refuse to render framed).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Start page step 6 is now a bold gold-highlighted "Submit your NEW RM
Circle ID" form with larger step numbers throughout; captures the
sponsor the visitor was shown at join time.
- POST /api/public/submit-id: validates numeric ID, dedupes, stores on
the volume, records a per-source "purchase" analytics event, fires a
BeMob postback (txid=purchase-<clickid>) to close paid campaigns, and
posts the new ID + sponsor + source to the configured Telegram chat
(MB Hermes pattern). Rate-limited.
- Admin: Member ID Submissions table, "Confirmed joins" tile, and
Telegram bot token / chat ID settings.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- track.js stores ?clickid= (or ?cid=) for the session; rides through
bridge -> start navigation alongside the existing source attribution.
- Join click (the conversion) sends the clickid; server fires a
fire-and-forget S2S postback to the admin-configured BeMob postback
URL (cid + txid=join-<clickid>, payout 0) and counts successes per
source in analytics.
- New admin setting: BeMob postback URL (server-side only, not exposed
in public config).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Key is stored on the persistent volume (0600, never in git), read
dynamically per request, maskable status only in admin state, and
clearable to fall back to built-in answers. OPENROUTER_API_KEY env var
still takes precedence if ever set.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
POST /api/public/chat proxies to OpenRouter (model from
OPENROUTER_MODEL, default deepseek/deepseek-v4-flash:nitro) with a
system prompt built from live site config, sponsor queue, and strict
guardrails (no income claims, seed-phrase warnings, Telegram fallback).
Rate-limited per IP. Without OPENROUTER_API_KEY set, or on any API
error, the widget transparently falls back to the built-in knowledge
base, so the chat always works.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Self-contained assistant (no external services) with a knowledge base
covering the strategy, levels, costs, wallet setup, funding, joining,
training videos, and live current-sponsor/queue data; falls back to
the configured Telegram group link when it can't answer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Videos loudness-normalized to -16 LUFS (originals were ~-33 LUFS).
- Static file serving rewritten to stream with HTTP Range support so
video seeking works; .mp4/.webm MIME types added.
- Training nav links on homepage and /start, plus a first-time callout
on /start; training page views tracked per source in admin analytics.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CSS and JS are now served no-cache like HTML so style/script updates
apply on normal refresh instead of waiting out a 1-hour browser cache.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- track.js captures first-touch source per session (utm_source/src param
or external referrer domain) and logs bridge/start page views.
- Join clicks now carry the source; all events aggregate per-source in
data/analytics.json on the persistent volume.
- Admin: new Traffic & Conversions card with funnel totals (bridge ->
start -> join click rates) and a per-source breakdown table.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Keeps the current sponsor card above the fold; the roadmap stays
above the fold on the bridge homepage.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Admin: Level column is now a dropdown of the 8 premium levels (Scintilla
through Corona), saving immediately via PATCH; server validates levels.
- Start page: RM Circle Team Build Roadmap graphic above the fold with
Crypto Team Build Network attribution (compressed to 198KB WebP).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>