New shared wallet-notice.js on join-now, my, training: if config.walletNotice
is set, shows an admin-authored heads-up right above every connect/unlock
button; empty string hides it everywhere (one PATCH, no deploy). Placed at the
friction point only, not a sitewide banner, so unaffected wallets/Mini App
users are not told about a warning they will never see.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaced every retire-your-link instruction (8 spots across index, join,
start, my, training FAQ, chat.js core-strategy + qualified + moving-link
answers, and the AI prompt) with the automated doctrine: after 2/2 the same
invite link self-routes each signup to the next position in the leg that
needs a direct; personal effort shifts to coaching your two. Raw-ID dApp
signups on a qualified position stay documented as the bonus path. Video
content already correct (Video 1 rebuild script fixed this framing before
recording; Method lesson scripts never said retire).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New card in the tools objection section: truth (name the product first;
business-in-a-box inventory; wallet-is-the-login members area) + the
ready-to-send casual reply (Lesson 1 free preview, verify-before-you-join
close). AI prompt tools inventory notes the objection bank.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The product now has a lid. Server refuses the gated video FILES without a
wallet-verified member session (the Mini App bridge session counts, so
Telegram members see no locks). Lesson 1, every poster, and all join-funnel
and transparency videos stay public: free preview + trust engine. Training
page renders locked cards with a one-signature unlock (same SIWE flow as
Messages) and a members-unlocked badge. Chatbot: new members-area canned
answer, Method answer notes the preview, AI prompt routing rule now answers
prospects directly instead of sending locked links; bot lesson command notes
the unlock path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
friend-circle-290a3815db.mp4: Marty-only share URL, referenced from no page.
recruitMsg + its Get Started button now read config.recruitCtaUrl (new PATCH
key, default home page) so notification CTAs can point at a proof-first
landing like /my/21. Tweet CTA was already config-driven (value PATCHed).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Each coach card now carries a pre-written, situation-specific teach-forward
message (all four recommendation kinds) sent over the existing wallet-verified
Messages rails: msg-send plus the Telegram bridge. When not signed in, an
inline prompt appears and the page smooth-scrolls to the Messages card.
Chatbot canned answer and AI prompt synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nav-dash.js on all header pages: a top-right My Dashboard button when the
visitor is known (msg session from wallet sign-in or the Mini App bridge is
authoritative; else the last dashboard opened on the device). Prospects with
no identity never see it.
recordEvent was silently dropping the new engaged + ctb-offer-* events
(whitelist); now recorded per source, with admin funnel tiles for both.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
track.js: on join pages with a ctb1_ clickid, count 30s of VISIBLE time (1s
ticks, pauses when tab hidden), then report engaged once per session.
server.js: relay engaged ctb1_ clickids to the CTB backend per the spec
contract (X-Offer-Secret header, any-200-is-done); light in-process dedupe.
New volume config keys ctbOfferPostbackUrl + ctbOfferSecret (PATCH allowlist).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5 SMS-sized low-pressure messages (general moving link + one per angle video,
each carrying the matching ?v= landing link) with one-tap launchers: sms: body
pre-fill, wa.me text pre-fill, t.me/share with the member''s Mini App invite
(angle-matched), Copy for Messenger/IG. Hrefs rebuilt on personalization.
Chatbot canned answer + AI prompt synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brand-matched (navy gradient, gold RM ring, paper-plane watermark), reusable
by any member: no baked-in link, CTA points to the link below the image.
First cell in the tools-page banner grid; AI prompt synced. Generator HTML
kept at D:\tmp\banner-telegram-generator.html.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
/tools#telegram: the member's t.me/RMCircleBot/join?startapp=YOURID links
(moving + 4 angles, self-preview tip), a paste-ready group post and warm DM,
and the connect-your-team setup message to forward (teach-forward). tools.js
personalize() now also fills YOURID tokens. Chatbot canned answer + AI prompt
synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Marty's screen recording: POL -> CWallet -> dollar swap -> gift card, with the
Google Wallet tap-to-pay screenshot as the end-result proof under the player.
Encoded CRF23 + loudnorm (235MB -> 24MB). Cross-linked from the #spending
guide; chat.js cash-out answer + AI prompt synced (7 -> 8 how-to videos).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- /app decodes startapp=<sponsorId>[_<angle>] -> unlinked visitors land on the
sponsor squeeze page /join/<ref>?src=miniapp (linked members still go to
their dashboard); no-invite prospects get a gold Join button -> /join-now
- tg-app.js: sync __rmcInTg flag; external links route out of the webview via
openLink/openTelegramLink (wallet deep links reach the wallet app reliably)
- join-now.js in the webview leads with the MetaMask/Trust deep links (no
injected wallet can exist there); ref + src survive into the wallet browser
- tgbot: links command + weekly digest include the t.me/<bot>/<short>?startapp
Telegram-native invite once config.miniAppShortName is set (new PATCH key)
- Synced chat.js canned answer + AI prompt (prospects can join from the app)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- POST /api/public/tg-webapp-auth: HMAC-verifies WebApp initData against the
companion bot token (12h freshness, timing-safe), maps chat -> member via
tg-links.json, mints a message session -> linked members land on /my/<id>
with zero login
- /app entry page (vendored telegram-web-app.js keeps CSP script-src 'self');
unlinked users get the one-time wallet-link instructions
- tg-app.js on all pages: no-op in browsers; inside the webview lazy-loads the
SDK, expands, themes header/background #071421, wires native BackButton
- Bot menu button set programmatically to open /app; /start + help mention it
- Synced chat.js canned answer + AI system prompt (Mini App facts)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New tgbot.js (raw Bot API, zero deps, private-chats only so the
group feeds are untouched): wallet-verified linking via dashboard
deep-link codes, personal payout + joined-on-your-link DMs, a
message bridge that delivers site messages natively in Telegram
with reply-to-answer routing (matrix-line permissions enforced by
the existing messages.js rules), and links/msg/help commands.
Webhook self-registers; secret derived from the token. Config key
companionBotToken overrides the feed bot token when Marty creates
a dedicated bot. Dashboard Messages panel gains Connect Telegram;
chatbot + AI prompt synced.
- Modules 2 (Help Your Two) and 3 (Teach the Teachers) live on the
training page: six Marty-voiced lessons, coming-soon card retired,
anchor ids on all ten lesson cards.
- Coach panel and pipeline now prescribe lessons per situation
(L2/L3/L7/L8 chips) - Lesson 9's routing table as buttons.
- Chatbot + AI prompt know the full ten-lesson course and the
situation-to-lesson routing rule, plus the business-in-a-box
product answer.
- New printable: /weekly-rhythm (Lesson 10's 20-minute routine +
4-week tracker, personalized QR), cross-linked from dashboard and
fast-start.
- "Business in a box" section on the join page and home page names
the full toolkit: course, promo arsenal, printables, AI coach,
live dashboard, public engine.
/join/<id>?v=pocket|phone|two|graveyard swaps the hero headline and
the watch-first video to continue the curiosity hook that brought
the prospect, keeping the sponsor identity in the sub line. Tools
page: each angle card gains a "Copy matched invite link" button
(personalizes through the existing bare-domain swap); Posts 6/7
carry ?v=pocket. AI prompt knows to recommend matched links.
Four Marty-voiced lessons (pause-trimmed, constant low music beds,
two-pass loudnorm) debut on the training page as the team's
recruiting course: mindset, warm list, the conversation, objections.
Module 2 teased. Chatbot canned answer + AI prompt synced.
The config API now carries the hourly-cached polUsd; the start page,
training callout, join-page shortfall, and chatbot (canned + AI
prompt) all compute entry dollars live instead of quoting stale
numbers. Post 6/7 copy drops hard "$27 = entry" claims for
pocket-change framing (the video's $27 stays - it describes weekly
wasted spending, which is evergreen).
Three-way sort (cost confusion -> debit card path; priority -> the
$27 video; genuinely broke -> "not yet" + payday follow-up) with the
hard no-fronting rule. Baked into the chatbot canned answers, the AI
prompt objections, and the coaching skill docs.
/fast-start: one-page checklist that personalizes with the member's
ID, invite link, and a scannable QR of /join/<id> when opened from
their dashboard (or with ?id=). Print stylesheet flips it to clean
black-on-white letter format; floating translate/chat widgets are
now excluded from printing on every page. Dashboard share card
links to it; chatbot + AI prompt synced.
The widget needed inline-script CSP we refuse to grant, so: a
/api/public/translate endpoint feeds misses through the chatbot's
OpenRouter model and caches every string forever on the volume
(translations.json); the client walks text nodes, swaps them in
place, and a MutationObserver keeps late-rendered panels covered.
CSP goes back to fully tight. 21 languages; choice sticks in
localStorage; level names and POL stay untranslated.
Floating translate button (bottom-left) on every member-facing page
lazy-loads the Google Translate element; language choice persists
across pages via the googtrans cookie. CSP extended for Google's
translate hosts only. Chatbot now replies in the member's language
and a canned answer points at the button.
Server keeps an hourly-cached POL/USD spot price (CoinGecko, 8s
timeout, last-known fallback) and rides it on the member API. The
org bar adds a dollar tile with the rate it used; hidden when no
price is known. Display-only - never used in on-chain math.
New org bar at the top of the Your team panel: total members below
(full-depth rollup), generations deep, qualified count, and POL
earned below. Chatbot canned answer + AI prompt updated in sync.
Post 6 (X hook) and Post 7 (Facebook story) pair with the $27 video:
a how-to-use note tells members to upload the video natively and let
the personalized invite link in the caption carry attribution. AI
prompt now describes the $27 hook video on /tools.
A member below you pausing on an upgrade never blocks money - payments
pass UP through them to the next eligible position and everything
below keeps flowing. Bake that explanation into: the dashboard
pipeline panel (micro-note when building rows exist), the chatbot
(canned answer + AI system-prompt objection entry), and the coaching
skill docs.