Commit Graph

181 Commits

Author SHA1 Message Date
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
martbost e22f483f99 Explain gas with the car-fuel analogy everywhere newcomers meet it (training, start, join funding box, chatbot, AI prompt) 2026-08-21 12:40:43 -05:00
martbost 2463b5ff40 Teach the no-money-prospect play everywhere it can come up
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.
2026-08-21 12:36:58 -05:00
martbost d936093c56 Add the printable 48-Hour Fast Start sheet
/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.
2026-08-21 12:08:05 -05:00
martbost 75863ad581 Exempt container-internal calls from the translate rate limit (cache warmer) 2026-08-21 07:47:38 -05:00
martbost d35034306a Translate page progressively - parallel chunks, swap text as each batch returns 2026-08-21 07:40:07 -05:00
martbost 0a1f779305 Shrink translation batches to 20 strings and raise the model token cap - 45-string batches truncated the JSON reply 2026-08-21 07:34:44 -05:00
martbost 944d2beb87 Self-host the site translation instead of the Google widget
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.
2026-08-21 07:30:01 -05:00
martbost faf397f681 Add on-site translation for multilingual members
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.
2026-08-21 07:23:55 -05:00
martbost d60e8c6807 Show a USD equivalent next to Earned below you
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.
2026-08-20 16:27:15 -05:00
martbost 9f66412f8c Show the whole-organization totals above the matrix view
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.
2026-08-20 16:16:22 -05:00
martbost d6fa42999f Add the $27 angle to the social-posts toolbox
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.
2026-08-20 16:02:40 -05:00
martbost 03931f3481 Ship the $27 video with Marty's own voiceover
Replace the AI-voiced render with Marty's Demo Creator recording
(105s, loudnorm -14 LUFS, crf 26). New hash name busts caches; old
file removed. Tools card updated.
2026-08-20 15:56:24 -05:00
martbost 8533079425 Teach the stalled-member answer everywhere it can come up
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.
2026-08-20 15:45:59 -05:00
martbost b37f78afa3 Chatbot sync: promo tools answers mention the Official RM Circle Media library
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 14:43:03 -05:00
martbost 9ccf8a4428 Official RM Circle media section on tools: 13 company videos (re-encoded 153MB to 23MB, posters, stable slugs) + 15 graphics in collapsible native-details accordions with lazy loading and copy-link buttons; guidance to pair with personal invite links
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 14:40:41 -05:00
martbost 5d2eb08cb5 Loudness-normalize all four Aug-20 videos to -14 LUFS (was ~-26 dB mean, +8 dB louder) - video streams untouched, audio re-encoded
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 13:29:21 -05:00
martbost 064c6d1d27 New curiosity promo: the 27-dollars pocket-change video (97s, Marty-voice VO from his list, official logo end card, honest POL/risk disclaimer) + tools page card
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 13:15:45 -05:00
martbost 52d678fd23 Official RM Circle logo rollout: header brand mark on all 13 pages (public + private), favicon, circular crop via existing brand-mark styling
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 09:34:56 -05:00
martbost 5d116c21a2 Video 1 rebuilt: 5-min motion-graphics team-build overview (approved script, cloned voice) replaces the 14-min original on the training page - corrected bonus doctrine, verified catch rule, dashboard layer; old file retained
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 09:03:10 -05:00
martbost 0e3af3b244 Rebuilt designed explainer with the approved 60s narration (rmc-explainer-8df7c62098): contract checks, one-tap join, live-dashboard scene, Get 2 Help 2 Teach 2 matrix, disclaimer CTA; tools card updated, poster regenerated, old file retained
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:40:55 -05:00
martbost 6f9d53cfa7 Teaching clips carved from the dashboard walkthrough: 1-min upgrade how-to + 2-min Messages intro, added to tools page; Hermes at-risk nudges now link the upgrade clip
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:33:56 -05:00
martbost 34dc04a9fc Training Video 7: the Member Dashboard full walkthrough (Marty's recording, web-compressed 74MB to 32MB) + chatbot sync + Coach card links to it as the teach-forward reference
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:26:39 -05:00
martbost f9500210eb Refreshed flagship promo (approved script): new 60s combined clip
rmc-combined-16284edbab.mp4 - the scroll b-roll now travels the current
home page INTO a real member dashboard, the matrix panel is retitled
"Get 2 - Help 2 - Teach 2", and a disclaimer end card closes the video.
Narration is the approved 60-second script (STT-verified word for word).
All references updated: home page, invite pages, member pitch, tools
(flagship card copy refreshed). Poster regenerated. Old clip retained
for links in the wild.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:11:21 -05:00
martbost bf7e9b7ea5 Share card rebuilt for person-to-person referrals: always-present personal QR (moving link handles rotation), tap-to-fullscreen scan mode, guidance adapts to 2/2; render pipeline hardened so one panel error can never blank later panels
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 07:33:19 -05:00
martbost 2e0620a251 Front page: replace the last YouTube embed with the self-hosted combined promo (matches join and pitch pages; no external embeds remain)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 07:25:19 -05:00
martbost 230fbde11e Invite pages: replace outdated YouTube embed with the self-hosted combined promo video (keeps prospects on-page, no end-screen leakage, matches the member-pitch hero)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 07:21:19 -05:00
martbost 12046334e4 Chatbot sync: promo tools answers describe dashboard hand-off + auto-personalized links
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 07:16:49 -05:00
martbost 8841e9d718 Tools page auto-personalization: dashboard hands off ?id=, every post/swipe (copy payload AND visible preview) swaps the bare main-domain link for the member's /join/<id> link; sticky via localStorage; green confirmation banner
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 07:14:45 -05:00
martbost 4014d12208 Make Promo Tools prominent on the member dashboard: gold nav button + full-width high-contrast CTA on the share card
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 06:26:55 -05:00
martbost b9ab55a156 Rotation exclusions: config rotationExcludeIds - excluded positions are never offered as the company-rotation target but their subtree is still traversed (founders reserving #4's slot for an incoming team)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 17:09:44 -05:00
martbost 02290f1200 SIWE-format (EIP-4361) sign-in challenge with EIP-55 checksummed address so wallets show their friendly Sign-in UI instead of a raw-signature warning
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 15:44:07 -05:00
martbost 0754a858c3 Fix stale dashboard right after own tx: fresh=1 cache bypass (one-shot via sessionStorage flag) set on upgrade success and post-join redirect
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 15:36:08 -05:00
martbost 70fc321c3e On-dashboard upgrades: qualified members upgrade their level right from /my/<id> - ownership enforced by matching the connected wallet to the position's account, exact BigInt cost read live via getAllCosts, MoonPay assist when underfunded, wallet-app deep links on mobile
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 15:30:50 -05:00
martbost ac5d29fc6e Dashboard freshness: bust the member cache on every indexed chain event + drop browser cache to 15s - joins/upgrades now visible on next page load instead of up to 2-3 min later
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 14:52:03 -05:00
martbost 6ebe436cf3 Rotation queue: reconcile against live chain directs in normalizeStatuses - never activate a sponsor the chain says is already 2/2 qualified (also syncs stale direct counts upward)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 14:37:48 -05:00
martbost dd6644bc3b MoonPay links: /buy/pol is a soft-404 - switch to the live /buy/matic page (POL's old-name slug) + copy note that MATIC is POL's former name
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 14:11:07 -05:00
martbost 9a1833f2b0 Wallet-verified member messaging (matrix-lines permissions, admin visibility)
- messages.js: challenge/personal_sign/recover auth (vendored pinned
  js-sha3 0.9.3 + noble-secp256k1 1.7.1, server-side only; self-tested
  positive + tamper cases), 30d HttpOnly sessions, message store on the
  volume, matrix-line permissions (your downline direct or broadcast, your
  upline chain - nothing else, so spam is impossible by construction),
  daily rate limits (30 direct / 3 broadcasts), 1500-char plain text
- chain.js: memberIdByAccount (wallet -> position for sign-in)
- API: msg-challenge/-verify/-me/-inbox/-send/-read public + msg-unread
  (count only, no auth) + admin/messages (full visibility, disclosed to
  members in the UI)
- Dashboard: Messages card with unread bell, one-tap wallet sign-in,
  inbox with auto-read, compose with to-ID or whole-team broadcast
- Admin: Member Messages review table
- Chatbot canned answer + AI system prompt updated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 13:31:31 -05:00
martbost e31b01e338 Dormant company-rotation mode (publicRotationMode=chain, root #2) + multi-root teamRootId alert gating - founders' deal 2026-08-19, flip deferred until team link migration + Marty's right-leg position secured
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 12:39:01 -05:00
martbost c64a716fcd Fix indexer race: instant verify (join-now auto-submission) pre-cached new members, making the log tail skip their registration (referrer directCount never bumped - #41 stuck at 1/2 despite #134). preIndexed flag + merge on event + one-time re-snapshot migration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:50:20 -05:00
martbost ffd6fb9785 Join page: silent wallet auto-detect on load (eth_accounts, no prompts) + Trust deep link coin_id=966 so it opens the join page, not the site root
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:26:20 -05:00
martbost dc4a79c13b Join page: Trust Wallet loop rescue - DApp-Browser enable deep link + mark MetaMask path recommended
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:21:21 -05:00
martbost 506db9de81 Mobile wallet deep links on the join page: no injected wallet -> offer Open-in-MetaMask/Trust buttons that reopen this URL (ref included) inside the wallet's dApp browser
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:12:55 -05:00
martbost d620555209 MoonPay card on-ramp for crypto-new members (zero custody)
- GET /api/public/moonpay-url: returns a MoonPay checkout link for POL on
  Polygon (pol_polygon). With partner keys in config (moonpayPublicKey/
  moonpaySecretKey, now PATCHable), the URL is HMAC-signed and prefilled
  with the member's own wallet address + shortfall amount; without keys it
  falls back to MoonPay's generic buy page. MoonPay is merchant of record -
  the site never touches funds.
- Join page: when the connected wallet can't cover the Premium entry, a
  funding box appears with the exact shortfall, a buy button (new tab), and
  a refresh-balance button.
- Training page: "buy POL with a card" callout after the funding video with
  the three things to get right (POL, Polygon network, own address).
- Start page: one-line card-buy pointer under the sponsor card.
- Chatbot canned answer + AI system prompt updated (funding guidance).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 09:44:01 -05:00
martbost f0a35a0127 Coach card: raise row cap 8 -> 10 so high-value entries like a funded at-risk member aren't trimmed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 07:07:13 -05:00
martbost 43753dda4e Coaching Radar: separate Marty-owned positions (config.ownerIds) into their own action-item block, exclude from member-nudge tiers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 06:24:22 -05:00
martbost 2872a30b96 Coaching scan: expose earnedPol + next upgradeCost on at-risk entries for funded-vs-timing nudge framing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 06:13:41 -05:00