Testers were tapping the highlighted "Most Popular" $50 tile's Buy thinking it
was a general buy, and getting a $50 charge they couldn't afford. Each tile
already buys its own package; label the button "Buy $20" etc. so it's
unambiguous which package a tap purchases.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mobile drops in-flight fetches when the page returns from the wallet app, which
aborted the purchase before the tx ("Failed to fetch"). Retry /api/me and
/api/sponsor, and make waitTx keep polling through transient fetch failures.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clearing localStorage alone wasn't enough — WalletConnect keeps the last wallet
and session in memory, so it auto-reconnected the same wallet. Broadened the
storage purge and reload the page after disconnect, guaranteeing a clean pick.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A stuck WalletConnect request or wrong-wallet choice could trap testers. New
IAPWallet.disconnect() drops the WC session, forgets the chosen provider, and
clears WC localStorage so the next connect re-offers the picker. Surfaced as a
"Disconnect wallet" button on the Wallet pane.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
anvil_setBalance doesn't exist on Amoy. The faucet now connects the wallet,
copies the address, and opens faucet.polygon.technology so testers fund their
own wallet with test POL (choose Polygon Amoy). Server endpoint returns the
faucet link + address instead of minting balance.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mobile and in-app wallet (dApp) browsers handle tabs badly, so opening each ad in
a new tab made the earn loop hard to navigate and impossible to close. Ads now
open in a full-screen in-page overlay that reuses the /view dwell + human-check +
credit logic in an iframe: an always-working close control, no window.close, no
tab-switching. The framed /view relaxes its focus-pause to visibility only and
messages the dashboard when it credits or the user is done.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pre-checked "InstantAdPay newsletter" opt-in on the join screen (read by both the
email-code and password signup paths). On new-account creation only, the server
silently subscribes them to the Sendy "InstantAdPay Newsletter" list
(boolean=true, opt-out always wins). New sendy.js helper reads the API key from
SENDY_API_KEY env or DATA_DIR/sendy.key on the volume (same pattern as
sendgrid.key); subscribe is fire-and-forget and never blocks signup.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed /api/moonpay-url endpoint: public key from MOONPAY_PUBLIC_KEY env or site
config, SECRET from MOONPAY_SECRET_KEY env ONLY (never site config, since
/api/config exposes siteConfig). Wallet-prefilled signed MoonPay URL when keys
are set, else a generic buy page. "Buy POL with a card" button under the Buy
packages tiles. Zero custody: MoonPay is merchant of record; crypto goes
straight to the buyer's wallet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New 125x125 (square button) and 336x280 (large rectangle) promo banners;
rectangle branch scales relative so both rectangles look right.
- 160x600 / 120x600 skyscrapers now filled with feature bullets (instant
payouts, 7 ad formats, earn by viewing, free to join) + CTA.
- Promo tools lists the new sizes; previews cache-busted (?v=3).
- Back-office sidebar is scrollable (overflow-y:auto) so the Legal links at the
bottom are reachable.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Regenerated hero 1200x630, 728x90, 468x60, 300x250, 160x600, 120x600 by
compositing the new logo + headline + mint CTA on a dark mint-glow ground
(canvas, not AI) so text is always crisp and on-brand. Leaderboard tagline
auto-fits; previews cache-busted (?v=2).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New kie.ai art per Marty's palette — Surge dark neon purple, Circuit bright red
starburst, Nexus navy-blue gradient (Spark stays mint). Full-bleed dark, ornate,
blank ribbon; ribbonY re-tuned per badge; ?v=2 cache-bust on the badge images.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New 125x125 "square button" banner size; ad serve now filters by width/height,
and the sidebar slot serves a 125x125 banner (empty until such inventory exists).
- Shorts reel gets a "report this short" link (posts to /api/report-ad).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New "Training" nav pane lists curated lessons (inline video for mp4/webm, links
for external videos and docs) from /api/training (admin-curated via
data/training.json, with a sensible default).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
"Your line at a glance": YOU + three levels of member chips with connectors,
your qualified directs highlighted in gold, and "+ open" placeholders on levels
1-2 showing what's next. Loads from /api/my/line.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Sign-in page shows "You're joining the line of @X" when arriving via a sponsor
link (/api/sponsor now returns the sponsor name + avatar).
- After a new account verifies (or signs up) with no username yet, an onboarding
modal prompts for a username and an optional bio (both skippable), before the
welcome tour.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Daily login bonus: once/day, base 5 credits + gentle streak (+1/day, cap +5)
for consecutive days; granted after sign-in, toast + cha-ching. New
login_day/login_streak on earned_credits; /api/my/login-bonus.
- Solo ad: selecting Solo now defaults Budget to 50 credits (5cr x 10 min
deliveries) so entering 10 isn't rejected after submit.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Welcome email on new account: onboarding steps + who their sponsor is.
- On-chain event emails: a payout received (TierPaid/AwardPaid) and a payout
that passed you by unqualified (PassedUp), wired into the chain event stream.
- Campaign stats: "+N net" relabeled to "+N network" (clearer than "net").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Featured card moved to the top of Overview, centered, max 760px; the rotating
link is capped to 728px and centered (banner-sized, not a huge block).
- Served banner creatives cap at min(100%,728px), centered — kills the oversized
sample banner; ad slots center their creative + label.
- Featured self-sell: shows "N of C slots open today" + "Feature your link →"
that jumps to Campaigns with Featured preselected.
- Campaign target/image/video URL fields get autocomplete=off and clear when the
Campaigns pane opens, so no residual (e.g. massifly) URL carries over.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Ad reporting (auto-approved ads need a safety valve): new reports.js store
(dual-mode) + ad_reports table + POST /api/report-ad; a "⚠ report" control on
served ad slots opens a reason prompt and notifies the admin by email
(siteConfig.adminEmail / ADMIN_EMAIL).
- Featured links now show ONE link at a time and cycle (true rotation), instead
of listing all links at once.
- Campaign form now clears EVERY field on submit (target/creative/title/etc.).
A leftover target URL was carrying into the next campaign — the same reason a
video short was saved with the wrong (massifly) CTA target.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Hide the free-form "Budget (credits)" field for fixed-cost campaign types
(Featured = day-slot priced, Verified visits = flat pack) where spend is derived.
- Overview "Recent payouts" gets a "full history ->" link to the Earnings pane,
which already lists every on-chain payout/referral/purchase with verify links
(it just wasn't discoverable from the Overview mini-chart).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- The members area subscribes to the chain event stream (/api/feed/live) and
reacts to anything relevant to the member: a payout received (cha-ching + toast
+ auto-refresh), a referral qualifying, a passed-up payout (missed), a settled
purchase, a new activation in the line. No page refresh required.
- New chat message -> "pop" sound + toast + badge; ping heartbeat (20s) now
returns chatUnread and pops on an increase.
- Sounds are synthesized via Web Audio (no asset files, CSP-safe).
- Surge badge: nudge the name down (ribbonY .779 -> .805) to center on its ribbon.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Each row was an independent flex line, so variable-width emails threw the date
column out of alignment across rows. Now a CSS grid with a shared template keeps
the date and Message columns lined up; long names/emails truncate; responsive
stack on narrow screens.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Buying now ensures the wallet is LINKED to the account before the purchase
(one signature if not linked). Without it, a wallet only connected for the
faucet bought successfully but credits resolved against member id 0 and never
showed until a manual link. Matches the "buying links your wallet" promise.
- Dashboard computed achievement milestones from buyerCount BEFORE reading it
from chain (always 0), so Surge/Circuit/Nexus never unlocked even when
qualification advanced. Moved the milestone block after the chain read.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The referral row read r.email but dashboard referral objects carry r.name
(username or masked email). Use r.name with an escape + fallback.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fresh wallets hold 0 POL on the rehearsal chain, so nobody could complete a buy.
- Oracle: the mock POL/USD feed had gone ~49h stale (quoteWei reverted "Stale
oracle" -> catalog costWei null -> packages showed "paused"). Refreshed it and
installed a 15-min heartbeat cron so it stays fresh; quotes now return.
- New /api/my/faucet (rehearsal-only, rate-limited) tops a connected wallet up to
10 test-POL via anvil_setBalance (no key). "Get test POL" card in the Wallet
pane wires it. Members can now fund, buy, and see payouts move on the ledger.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Sponsor messaging is now reachable everywhere a new referral looks: a
"Message your sponsor" card on My line, the Overview quick action, and a
pinned "Message your sponsor" row atop the Messages drawer (even with no
thread yet). Chat stores the sponsor from the dashboard.
- Watch-to-earn video + Shorts now PAUSE when the tab/window loses focus and
resume on return, so a viewer must stay on the page for the watch to count.
- Welcome tour hides its frame on completion (no white about:blank panel).
NOTE: rmcircle.team allows framing (frame-ancestors *); the blank was just
the post-dwell blank state.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- BUG: /api/me never returned avatarUrl/bio/socials/lineBanner fields, so the
Profile pane repopulated empty on reload — data WAS saved, just not surfaced.
Now returned so avatar, bio, and social links persist visibly.
- Achievement badge: member name drops the "@" and sits on a per-badge ribbonY
(spark .728 / surge .779 / circuit .713 / nexus .709), gold with dark outline.
- Sessions now expire in 24h (was 30d) so members re-login daily and see the
login ad each day.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Videos now carry client-detected pixel dimensions (videoW/videoH) captured at
campaign create (upload or direct link). serveVideo takes an orientation filter:
Shorts reel (/shorts) serves portrait (height>width); the Watch videos tab
serves landscape, including legacy/unknown-dimension videos so nothing is orphaned.
- shorts.js requests the portrait feed and has a client guard that skips any
landscape video that slips through. Create form shows the detected orientation.
- Achievement badge share image: member name now renders in gold with a dark
outline (was low-contrast dark ink) and sits centered on the ribbon.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bottom-right bubble is the site's AI support chat — only one belongs there.
Sponsor/downline messaging now lives in the lower sidebar under Team → Messages
(unread badge on the link), opening the same threads drawer. Removed the FAB.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Named the milestone ladder: Spark (payouts) / Surge (first buyer) / Circuit (L2) / Nexus (L3)
- Overview badges strip now shows the ornate badge art (locked = dimmed); milestone stepper renamed
- Share button composites the badge template with the member's @username on the ribbon (JPEG, same-origin canvas)
- Badge art in public/badges/ (optimized JPG ~300KB each)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Achievement badge share-image now draws a milestone emblem (⚡🎯⭐🏆) in the medal
- Profile: Facebook/X/YouTube/Instagram/TikTok/Telegram/LinkedIn/Website links, shown on the public bio page
- OG + Twitter Card tags on homepage/ledger/contract (hero banner as share image)
- Per-member OG tags server-injected into /wall/<username> so shared bio links preview with name/bio/avatar
- robots.txt + sitemap.xml; .txt/.xml MIME types
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 3 brand banners generated via kie.ai (mint-on-dark Web3 aesthetic), served from /banners/
- Promo tools Banners card now shows the kit with copy-image-URL
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Buy N verified visits flat up-front; each is a distinct member, dwell + captcha verified
- Verified visits earn sub-tab: open site (new tab), dwell, human-check, earn
- Per-viewer dedup (visit_seen unique), daily cap, completes at N; single-use tokens
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Per-day occupancy shown in composer (Today 1/10, Tomorrow 2/10, …), full days unpickable
- Book a specific start day + duration; every covered day must have an open slot
- Slot cap turns dilution disclosure into a hard ceiling; featured skips frame-check (new-tab)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New 'featured' type: headline + link + 1/2/7 day run, flat up-front price (40cr/day)
- Composer discloses dilution (N links share the rotation, yours makes N+1) before buying
- Overview featured strip shows the live rotation; expires automatically
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Profile pane: avatar upload + bio, with a link to your public page
- Wall becomes a bio page: avatar, bio, scannable join QR, line ladder, join CTA
- qrcode npm dep; /api/qr renders SVG QR server-side (CSP-clean img)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Also lands dormant server-side scaffolding for video ads (type, tiers, validation) — not yet exposed in UI.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Welcome tour (3 levels x 10s) unlocks welcome credits; line banner in Profile; public /wall/<username>
- 'Your next move' redesigned as a milestone stepper
- Solo composer: BV-style rich editor (H2/H3, inline image+video, undo/redo, raw text)
- Solo read reward now requires clicking through to the advertiser, not just dwelling
- Sanitizer: inline media whitelist + script/style stripped whole
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>