Commit Graph

192 Commits

Author SHA1 Message Date
martbost 8fb585246c Route /p/<id> into the API handler — member pages are dynamic HTML and were falling through to the static 404
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 07:26:57 -05:00
martbost 6a7867588d Page Builder ships: labelled-section AI output parsed deterministically, escaped renderer, one page per position at public /p/<id> with angle video + QR, rebuild keeps the same URL; L2 tile live
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 07:15:11 -05:00
martbost 2a8b311a83 Copy Engine ships: Suite AI layer (own engine, RM facts + compliance in our system prompt, deterministic link injection), metered generate/meters APIs, /suite/copy tool page; L2 tile now live
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 06:51:16 -05:00
martbost 323c86b750 L6 tile: 'webinar rooms' -> Replay Funnels (evergreen registration page around a recorded team webinar, timed CTA); AI prompt clarifies it is NOT live conferencing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 06:44:16 -05:00
martbost 35b3c07e74 Fix Suite org check: teamRootId is a comma-separated list, Number() made it NaN so every member read as outside the org (Marty hit this as #21); parse all roots + orgRootId fallback. Nav dedupe on /suite. Adds suite-meter module (per-position monthly quotas by level)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 06:33:08 -05:00
martbost 6f28e94abd Suite team-beta gate: config.suiteAllowlist restricts entitlements to listed IDs (others get an honest 'you're early' notice); homepage CTA + chatbot answer held until launch; AI prompt marked private-beta
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 05:22:50 -05:00
martbost 0258b82a16 Circle Suite P0: /suite tool wall — wallet sign-in (existing challenge/verify flow), live level entitlements via /api/public/suite-me (org-gated to teamRootId), all tiles always visible (yours / unlocks-at / in-development), L1 = today's real tools; homepage CTA + chatbot + AI prompt synced
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 05:19:09 -05:00
martbost 21e105b953 /generation-pay: printable generation-pay chart personalized from the live chain (level/tier/qualification -> catching vs needs-Level-N per generation); dashboard + how-pay-works links, chatbot + AI prompt synced; exact-costs card now states the exact one-catch identity
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 14:34:20 -05:00
martbost 30a5c7237e Training Video 7 'Your level is your reach' (97s, script Marty-approved): catch eligibility + reach rule + pass-over + one-catch funding identity; how-pay-works first-catch line tightened to exact; chatbot + AI prompt synced
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 13:23:08 -05:00
martbost 1029bdb3e2 Two hard-question objection cards from live member Q&A (catch-eligibility: level = reach; fixed counts vs quadrupling value) + chatbot + AI prompt synced
Both verified against contract source today (payout loop: level > levelIndex && 2 directs; one structural skip per depth).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 12:59:09 -05:00
martbost b76a590714 Correct #exact-costs: entry exists ONLY at Scintilla (register() has no level param; upgrade() one rung per call) — levels cannot be skipped; table now shows upgrade path + cumulative totals; AI prompt synced
Verified against the exact-match ABI on Sourcify: per-level entry rows on company charts are vestigial contract data with no callable path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 11:32:43 -05:00
martbost bdfb40667e Contract-exact price table (#exact-costs on how-pay-works) + entry-vs-upgrade objection card; chatbot + AI prompt synced
Live getAllCosts() numbers: entry 360.58 incl 5% (sponsor 326.24), upgrades double exactly per level, 100% member-to-member. Answers the 'why is entry different from upgrade / is the chart inflated' question with verifiable numbers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 11:08:07 -05:00
martbost 8858470244 stopwaiting angle: squeeze page on the lander (combined overview video) + handout QR now carries ?v=stopwaiting
The stop-waiting handout QR previously hit the plain join page with no angle continuation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 10:11:41 -05:00
martbost 7fb7a6c0d1 Remove tear-off full-page flyers; /flyers is now the five artwork handouts only
Marty: the tear-off designs did not look good next to the artwork handouts. Page renamed Printable Handouts; dashboard link, tools card/nav, chatbot answer, and AI prompt synced.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 09:25:17 -05:00
martbost 3761fab3c6 Half-sheet handouts on /flyers: 5 vibrant angle designs (pocket, two, phone, graveyard, stop-waiting), 2 per letter page with cut line, personalized QR + angle-matched links; chatbot + AI prompt + tools card synced
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 07:31:40 -05:00
martbost df5f94573e Printable flyers feature: 4 colorful personalized flyer designs with member QR + tear-off tabs for offline promotion; /flyers route, tools + dashboard links, chatbot + AI prompt synced 2026-08-26 16:55:50 -05:00
martbost 4b53dd5326 Direct link option: opt out of moving-link rotation to build personal spillover (Team link default, Direct link alternate) 2026-08-26 14:24:32 -05:00
martbost 6282e8c768 Triple Play: add the upgrade strategy (concentrate on the top position; pass-ups bubble up to it) 2026-08-26 08:13:33 -05:00
martbost 04a0ae1c6a Triple Play: correct the wallet guidance (separate addresses; MetaMask add-account switch gotcha -> already-registered) 2026-08-26 08:02:21 -05:00
martbost c3d28f17a8 The Triple Play: optional 3-position fast-start (how-pay-works section + objection card + chatbot + AI prompt) 2026-08-26 07:50:58 -05:00
martbost cffaf4ffc0 how-pay-works: Does it cap at 8 levels explainer (pass-ups bubble up; Corona catches all) + chatbot + AI prompt 2026-08-26 06:17:07 -05:00
martbost 1f5bcd688f how-pay-works: What each level opens up scaling table (illustration, not a promise) + dashboard link 2026-08-26 06:00:31 -05:00
martbost a413062c5c Config-driven wallet-connect notice (for the Blockaid false-positive window)
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>
2026-08-25 18:40:32 -05:00
martbost aba3db2938 Doctrine sweep: your link never retires — the moving link auto-routes
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>
2026-08-25 06:48:32 -05:00
martbost afe7173680 Objections bank: the what-is-the-product + members-area answer
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>
2026-08-25 06:07:49 -05:00
martbost ca4b5bf34f Members area: Circle Method lessons 2-10 + Video 8 gated behind position ownership
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>
2026-08-25 04:10:57 -05:00
martbost 76a9b449c9 Unlisted Friend Circle demo video + config-driven recruiting-feed CTA
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>
2026-08-24 08:38:10 -05:00
martbost 86ed87510b Coach panel: one-tap Send-this-nudge buttons on every recommendation
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>
2026-08-24 07:20:23 -05:00
martbost a0642516e1 My Dashboard nav shortcut + analytics whitelist fix for engaged/ctb-offer
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>
2026-08-24 07:10:52 -05:00
martbost c5e2c30ff3 CTB featured-offer relay: 30s visible-dwell engaged event -> signed postback
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>
2026-08-23 08:10:29 -05:00
martbost 7182746883 Tools: Text-a-friend section (SMS + WhatsApp + messenger share, per angle)
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>
2026-08-23 07:46:36 -05:00
martbost b8fd3a8bbf Telegram group-ad banner (1280x720) added to the banner kit
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>
2026-08-23 07:35:39 -05:00
martbost 131fa8ae2a Tools: Promote-on-Telegram section (Mini App links, posts, team setup swipe)
/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>
2026-08-23 07:22:00 -05:00
martbost 826f779bc0 Training Video 8: real e-gift-card cash-out walkthrough (8 min)
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>
2026-08-23 07:03:10 -05:00
martbost f876351391 Mini App join funnel: startapp sponsor attribution + wallet-app handoff
- /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>
2026-08-23 06:32:51 -05:00
martbost cd361a1eaa Telegram Mini App v1: initData auth bridge into the existing site
- 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>
2026-08-23 05:56:51 -05:00
martbost 1f95025587 Companion bot requires its own dedicated token (companionBotToken) - never the shared CTBRewards_Bot token; allowlist the new config key 2026-08-22 19:42:58 -05:00
martbost 6ac1bcab55 Telegram companion bot, phase 1
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.
2026-08-22 19:39:55 -05:00
martbost 0562579a56 og:url keeps the ?v= angle - Facebook was canonicalizing every variant back to the cached plain URL 2026-08-22 12:09:25 -05:00
martbost 1dc60e8c4c Angle OG override in serveMemberPage (the real join-page server); remove dead first attempt 2026-08-22 12:01:00 -05:00
martbost 9c21cc3c99 Message-matched social previews: angle links rewrite og/twitter cards server-side with hook-frame images (no RM Circle branding before the click) 2026-08-22 11:58:33 -05:00
martbost 8869150312 Add the spending/off-ramp guide (gift cards via CWallet/eGifter, exchange cash-out, keep-it-working) to training + chatbot + AI 2026-08-22 11:15:22 -05:00
martbost 267d8cda1d Complete The Circle Method + productize the business-in-a-box
- 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.
2026-08-22 10:55:39 -05:00
martbost 4584d508be Angle-matched landing pages (?v=hook on the invite link)
/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.
2026-08-22 08:21:52 -05:00
martbost 0ecca2dc8a Launch The Circle Method - Module 1: Get Your Two
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.
2026-08-22 07:46:47 -05:00
martbost eb2bff2d23 Ship Pocket Change (Marty-voiced, Almighty Dollar bed) and retire every $27 reference sitewide 2026-08-22 06:43:12 -05:00
martbost 950d412738 Make every dollar figure evergreen via the live POL price
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).
2026-08-22 04:56:25 -05:00
martbost 9a1d8dbbf7 Translate: accept batch items individually so one malformed item cannot poison the rest; log partial parses 2026-08-21 16:41:12 -05:00
martbost af874a6022 Fix eaten newline escapes in the translate marker protocol (broke server start) 2026-08-21 15:49:21 -05:00
martbost 7f527989b6 Translate endpoint: numbered-marker protocol instead of JSON arrays - multi-line swipe strings with embedded quotes broke JSON.parse and poisoned whole batches 2026-08-21 15:46:47 -05:00