Three things, one of which we were quietly getting wrong. REAL OPT-OUT. We told members "removable any time" in three separate places and there was no way to remove anything. Same class of failure as the dead "Add mine" button: copy written, mechanism never built. The profile card now offers Remove username, Remove email and Remove everything, and profiles.remove() clears the value while never touching the position. Adding it again later works exactly as before, so opting out is not a one-way door. It is a two-step inline confirm, not a native confirm() dialog. Browsers with "suppress dialogs" switched on return false, which would have made Remove look broken in precisely the way Add mine was broken. First tap arms and explains the consequence, second tap does it, and it disarms itself after six seconds. THE PROMISE WE WERE BREAKING. The payout mailer and the upgrade alerts read member-alerts.json, NOT profiles.json. So a member who completed the new profile got NOTHING, while the invitation card promised "a note the moment POL lands in your wallet". Verifying a profile email now mirrors into member-alerts.json so every existing alert path works, including the unsubscribe link, and removing the email clears both stores so opting out actually stops the email. MANSON'S HUGE ASTERISK. He asked for it to be bigger and bolder so nobody can say they did not see it, and on a decentralized build that burden is ours, not the member's. One gold badge now appears on the dashboard invitation, inside the dialog on every step, in the inbox banner and on the profile card itself: "100% OPTIONAL - never required", with the plain statement that the position, the payouts, the team and everything on the page work exactly the same without it, nothing on chain depends on it, and it can be removed again any time. gate-e2e is 52 assertions, up from 38. The new ones prove one tap does NOT remove anything, the second tap does, the server agrees the value is gone, an email-only removal leaves the username alone, and the invitation reappears afterwards so the whole thing is reversible. profiles-unit 28, signin-fallback 7, captions-e2e 158 all green. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
RM Circle Premium — Crypto Team Build Sponsor Router
A small deployable Node/Express app with:
/— evergreen advertising/bridge page/start— dynamic onboarding page with the current team sponsor/admin— password-protected sponsor queue manager- JSON-file persistence suitable for a Docker volume
Core workflow
- Traffic lands on the evergreen bridge page.
- Visitors click Get Started.
/startreads the active sponsor from the server and builds the RM Circle referral link dynamically.- In
/admin, increment a sponsor's direct count as joins are verified. - When a sponsor reaches 2, click Qualified.
- The next waiting sponsor becomes active immediately—no HTML or ad changes required.
Default seeded queue
The seed data reflects the working Crypto Team Build priority list at build time:
- ID 30 — Orlando (active)
- ID 36 — Mad Dog
- ID 35 — Michael Camire
- ID 32 — Melissa
- ID 34 — Janie
You can change, reorder, add, or delete sponsors in /admin.
Local run
cp .env.example .env
# edit .env and set a strong ADMIN_PASSWORD + SESSION_SECRET
set -a && . ./.env && set +a
npm start
Open:
http://localhost:3000/http://localhost:3000/starthttp://localhost:3000/admin
Docker / Coolify
This project includes a zero-dependency Node server, Dockerfile, and docker-compose.yml. No npm package download is required.
Coolify recommendation
- Create a new application from this source/repository.
- Use the Dockerfile or Compose deployment.
- Add environment variables:
ADMIN_PASSWORD— strong unique passwordSESSION_SECRET— long random stringNODE_ENV=productionDATA_DIR=/app/data
- Persist
/app/datausing a volume. - Point your domain/subdomain at port
3000through Coolify's normal proxy/domain configuration. - Open
/admin, sign in, and verify the queue before sending traffic.
Sponsor referral URL
The default base is:
https://app.thermcircle.com?ref=
The app appends the current sponsor ID, for example:
https://app.thermcircle.com?ref=30
Change the base URL at any time in Admin → Public Page Settings without editing code.
Important operational behavior
The app intentionally does not auto-qualify sponsors based on clicks or blockchain activity. A team admin verifies the actual placement and clicks Qualified. This prevents an ad click or abandoned transaction from rotating the sponsor queue incorrectly.
Safety and compliance notes
The public pages include risk language, avoid guaranteed-income claims, and remind users never to disclose a MetaMask Secret Recovery Phrase. The onboarding page points to the official MetaMask website and identifies Polygon Mainnet as chain ID 137 with POL as the native gas token.
This app does not custody crypto, request wallet seed phrases, execute transactions, or store private keys.