// screens-public.jsx — WiserGuy landing page + admin Signup // // Clean, pricing-forward design. The buy module is now a full-width // pricing section below the hero so visitors see prices immediately. const API_BASE = ""; const USERSCRIPT_URL = "/userscript.user.js"; // ── Brand registry ────────────────────────────────────────────────── const BRANDS = { // Public site — wiserguy.cc. No CCU mentions, full public pricing, // each money flow goes through its own dedicated bot. public: { id: "public", siteLabel: "wiserguy.cc", eyebrow: "your gambling sidekick", heroH1Lead: "Auto Claimer for Stake", heroH1Tail: null, heroSub: "Auto-claim bonus codes. Auto-vault winnings. Daily $1 and scheduled reloads.", heroFootnote: <>Free panel forever. Paid passes start at $10 for 1 week., crossLink: null, manifestoEyebrow: "why we built this", manifesto: "We were sick of paying premium prices to claim bonuses we'd already wagered for. WiserGuy is the tool we wanted to exist — fast, honest, priced under what the going rate has been. Built by people who play the same drops you do.", timepassBotUser: "@claimtopupbot", timepassBotUrl: "https://t.me/claimtopupbot", apiUsBotUser: "@APIstakeUSbot", apiUsBotUrl: "https://t.me/APIstakeUSbot", apiComBotUser: "@APIstakebot", apiComBotUrl: "https://t.me/APIstakebot", supportBotUrl: "https://t.me/claimtopupbot", userscriptPasses: [ { name: "1 week", price: "$10", blurb: "~$1.43/day. Most popular.", featured: true }, { name: "1 month", price: "$40", blurb: "~$1.33/day. Best long-term value.", featured: false }, ], apiUsPasses: [ { name: "1 week", price: "$20", blurb: "Stake.us, 24/7 server-side claiming, one slot.", featured: false }, { name: "1 month", price: "$60", blurb: "$2/day. Best value for steady use.", featured: true }, ], apiComPasses: [ { name: "1 week", price: "$30", blurb: "Stake.com, 24/7 server-side claiming, one slot.", featured: false }, { name: "1 month", price: "$90", blurb: "$3/day. Best value for steady use.", featured: true }, ], pricingSubhead: <>Three separate bots, one shared infrastructure. Each is its own crypto-paid flow — no subscriptions, no account., discountLine: null, }, // CCU site — ccu.wiserguy.cc. Current member-exclusive view with // discounted pricing, single bot (@CCUclaimerbot) managing all flows. ccu: { id: "ccu", siteLabel: "ccu.wiserguy.cc", eyebrow: "ccu members · gambling sidekick", heroH1Lead: "You know", heroH1Tail: <>Now he rides along in your tabs., heroSub: "Same bot that keeps CCU running — now in your Stake & Shuffle tabs. Auto-claims, Safe-Gambling tools, and reloads on a member-exclusive priced pass.", heroFootnote: <>Free panel forever. Passes start at free 24h for CCU members., crossLink: { url: "https://wiserguy.cc", text: <>Not a CCU member? Head over to wiserguy.cc for the public version. }, manifestoEyebrow: "why we built this", manifesto: "We were sick of watching our own community get rinsed paying premium prices to claim bonuses they wagered for. WiserGuy is the tool we wanted to exist — built by people in the same drops you're in, priced exclusively for our community.", timepassBotUser: "@CCUclaimerbot", timepassBotUrl: "https://t.me/CCUclaimerbot", apiUsBotUser: "@CCUclaimerbot", apiUsBotUrl: "https://t.me/CCUclaimerbot", apiComBotUser: "@CCUclaimerbot", apiComBotUrl: "https://t.me/CCUclaimerbot", supportBotUrl: "https://t.me/CCUclaimerbot", userscriptPasses: [ { name: "24 hours", price: "Free", blurb: "CCU member benefit — free 24h passes on request.", featured: false }, { name: "1 week", price: "$5", blurb: "~71¢/day. Most popular for active players.", featured: true }, { name: "1 month", price: "$20", blurb: "~67¢/day. 50% off the public rate.", featured: false }, ], apiUsPasses: [ { name: "1 week", price: "$10", blurb: "Stake.us, 24/7 server-side claiming, one slot.", featured: false }, { name: "1 month", price: "$30", blurb: "~$1/day. Best value for steady use.", featured: true }, ], apiComPasses: [ { name: "1 week", price: "$15", blurb: "Stake.com, 24/7 server-side claiming, one slot.", featured: false }, { name: "1 month", price: "$45", blurb: "~$1.50/day. Best value for steady use.", featured: true }, ], pricingSubhead: <>Our public prices are already below the going rate. The prices below are CCU-member exclusive. Buy on Telegram via @CCUclaimerbot — crypto, no subscriptions., discountLine: <>Elite VIP members receive exclusive discounts on top — get with an admin via /support to discuss., }, }; function pickBrand() { if (typeof window === "undefined") return BRANDS.public; const h = window.location.hostname.toLowerCase(); return h.startsWith("ccu.") ? BRANDS.ccu : BRANDS.public; } // ── MAIN LANDING — "manifest" layout ───────────────────────────────── // // Designed as one continuous monospace document, not a stack of cards. // The page IS the product's interface: a system console with sections // (LAST 24H / ACCESS / PIPELINE / FAQ) separated by hairline rules. // No card chrome, no shadows, no rounded containers — type, rules, density. // The TERMINAL palette (cyan acid on near-black) carries the personality; // JetBrains Mono carries the structure. const Landing = ({ goto }) => { const brand = React.useMemo(() => pickBrand(), []); React.useEffect(() => { document.documentElement.classList.add("pattern-loud"); document.documentElement.classList.add("page-manifest"); return () => { document.documentElement.classList.remove("pattern-loud"); document.documentElement.classList.remove("page-manifest"); }; }, []); // Live stats from /api/public/stats. Fall back to placeholders so the // page never shows skeletons or zeros — it's better to show "—" than // a fake "0 claims fired" reading. const [stats, setStats] = React.useState(null); React.useEffect(() => { fetch(API_BASE + "/api/public/stats") .then(r => r.ok ? r.json() : null) .then(d => { if (d) setStats(d); }) .catch(() => {}); }, []); const fmt = (n) => (n == null ? "—" : Number(n).toLocaleString()); // Pricing rows — flattened from the brand block. Each row collapses // two durations into one entry to fit the line-item shape. const ACCESS = [ { key: "userscript", label: "userscript", blurb: "browser, your session", passes: brand.userscriptPasses, url: brand.timepassBotUrl, target: brand.timepassBotUser }, { key: "us", label: "api stake.us", blurb: "server-side, 1 slot, 24/7", passes: brand.apiUsPasses, url: brand.apiUsBotUrl, target: brand.apiUsBotUser }, { key: "com", label: "api stake.com", blurb: "server-side, 1 slot, 24/7", passes: brand.apiComPasses, url: brand.apiComBotUrl, target: brand.apiComBotUser }, ]; const PIPELINE = [ { stage: "spot", note: "a bonus code drops in a community channel" }, { stage: "relay", note: "we send it to every active member at the same instant" }, { stage: "claim", note: "it gets claimed on your stake.com or stake.us account" }, ]; const TUTORIAL = [ { key: "script", label: "userscript path", steps: [ <>install Tampermonkey — a free browser extension, <>click install the WiserGuy userscript (Tampermonkey will prompt), <>open Stake.com, Stake.us, or Shuffle — paste your token in the panel that appears, ], foot: <>done. the widget rides along in your tab — codes get claimed through your own session. { e.preventDefault(); goto && goto("tutorial"); }}>see full instructions →, }, { key: "api", label: "api path", steps: [ <>get your Stake API key (in Stake: Settings → API → Reveal), <>buy a pass on the access list above — Telegram opens, DM /topup for payment instructions, <>paste your API key into the bot via /key <name> api <key> — we claim 24/7, no browser needed, ], foot: <>done. codes get claimed even while you sleep — server-side, on your account, per platform. { e.preventDefault(); goto && goto("tutorial"); }}>see full instructions →, }, ]; const faqs = [ { q: "userscript or api?", a: <>userscript runs in your browser on your session. api runs on our servers, 24/7, no browser needed, per platform. }, { q: "what's free?", a: <>the panel itself, safe-gambling auto-vault, game tools, time-limit warnings, and stake.us daily $1. a pass unlocks live code-claim, reloads, and missed-codes catch-up. }, { q: "will i get banned?", a: <>userscript fires claims via your own logged-in session — the same path as clicking redeem. api uses your own stake key with the "claim bonus" scope. we never see your password. each site has its own terms; use at your own risk. }, { q: "do i need my browser open?", a: <>userscript: yes — pin the tab. api: no — it runs server-side, you don't need to be anywhere. }, ]; return (
{/* ── HEADER ─────────────────────────────────────────────────── */}
{brand.id === "ccu" ? "ccu members · auto-claim infrastructure" : "auto-claim infrastructure"} online
{/* ── WHY WE BUILT THIS ─────────────────────────────────────── */} {brand.manifesto && (
{brand.manifestoEyebrow || "why"}

{brand.manifesto}

)} {/* ── ACCESS ─────────────────────────────────────────────────── */}
access
{brand.discountLine && (

{brand.discountLine}

)}
{/* ── HOW IT WORKS ───────────────────────────────────────────── */}
how it works
    {PIPELINE.map((p, i) => (
  1. {p.stage} {p.note}
  2. ))}
{/* ── GET STARTED ────────────────────────────────────────────── */}
get started
{TUTORIAL.map(t => (

{t.label}

    {t.steps.map((step, i) => (
  1. {step}
  2. ))}

{t.foot}

))}
{/* ── FAQ ────────────────────────────────────────────────────── */}
faq
{faqs.map((f, i) => (
Q. {f.q}
A. {f.a}
))}
{/* ── FOOTER ─────────────────────────────────────────────────── */}
); }; // ── TUTORIAL — detailed setup walkthroughs ────────────────────────── const Tutorial = ({ goto }) => { const brand = React.useMemo(() => pickBrand(), []); React.useEffect(() => { document.documentElement.classList.add("pattern-loud"); document.documentElement.classList.add("page-manifest"); return () => { document.documentElement.classList.remove("pattern-loud"); document.documentElement.classList.remove("page-manifest"); }; }, []); return (
setup · step-by-step { e.preventDefault(); goto && goto("landing"); }} className="manifest-back" > ← back
{/* ── USERSCRIPT ──────────────────────────────────────────────── */}
userscript path

The browser route. Free panel forever; a paid pass unlocks live bonus-code auto-claim. Runs in your own logged-in session — same path as clicking "Redeem" yourself, just automated.

  1. Install Tampermonkey — a free browser extension that runs custom scripts on web pages. Pick your browser:
  2. Install the WiserGuy userscript. Click this link — Tampermonkey will open a preview page. Click Install in the top corner.
  3. Open a target sitestake.com, stake.us, or shuffle.com. A small WiserGuy panel appears in the corner.
  4. Paste your token. Get a token from the dashboard (top right when signed in). Click the gear icon ⚙ in the panel and paste it. The dot turns green when claims are armed.

Troubleshooting: if the panel doesn't appear, make sure Tampermonkey shows the script as Enabled in the extensions menu, then refresh the tab. If the dot stays yellow ("connecting") for more than 10 seconds, your token may have expired — click ⚙ and paste a fresh one.

{/* ── API ─────────────────────────────────────────────────────── */}
api path

The server-side route. No browser needed — we claim on your account 24/7 using your own Stake API key. Per platform: separate pass for Stake.com and Stake.us.

  1. Generate your Stake API key. Log into Stake. Top right avatar → SettingsAPIReveal. Stake will show a long string. Copy it.

    Don't see "API" in Settings? It's usually under Account or Security. If your account is brand new, Stake may require a small wager or deposit before exposing the API tab.

  2. Pay for a pass. On the landing page → access section, pick a duration for the API product that matches your platform. Click the button — Telegram opens the bot. DM /topup inside the bot for payment instructions (crypto to admin, manual credit).
  3. Give the bot your API key. In the bot DM, send /create <name> to create a slot, then /key <name> api <your-api-key> to register your Stake API key.
  4. (Optional) Set your currency. On Stake.com you pick which currency the bonus credits in (USDT, BTC, etc). Default is USDT. On Stake.us it's always Sweeps Coins.
  5. Confirm it works. Send /all in the bot DM — your slot shows as active. The next bonus-code drop on your platform gets claimed automatically.

Safety: we never see your password. The Stake API key only has Claim Bonus scope — it can't withdraw funds, change settings, or place bets. If you revoke the key in Stake, claims stop immediately on our side.

{/* ── HELP ────────────────────────────────────────────────────── */}
if you get stuck

DM {brand.timepassBotUser} on Telegram with /support and a quick description of what step you're on. An admin gets back fast.

); }; // ── SIGNUP — unchanged from original ────────────────────────────── const Signup = ({ goto, signIn }) => { const [mode, setMode] = React.useState("telegram"); const [isSignIn, setIsSignIn] = React.useState(false); const [busy, setBusy] = React.useState(false); const [error, setError] = React.useState(""); const [tgUser, setTgUser] = React.useState(""); const [tgCode, setTgCode] = React.useState(null); const [tgPolling, setTgPolling] = React.useState(false); const [tgToken, setTgToken] = React.useState(null); const pollRef = React.useRef(null); const [email, setEmail] = React.useState(""); const [pw, setPw] = React.useState(""); const [settingCreds, setSettingCreds] = React.useState(false); const [credEmail, setCredEmail] = React.useState(""); const [credPw, setCredPw] = React.useState(""); const [credError, setCredError] = React.useState(""); const [credBusy, setCredBusy] = React.useState(false); const tgValid = tgUser.replace("@", "").length > 2; const emailValid = /\S+@\S+\.\S+/.test(email) && pw.length >= 6; const stopPoll = () => { if (pollRef.current) { clearInterval(pollRef.current); pollRef.current = null; } }; const startPoll = (code) => { stopPoll(); setTgPolling(true); pollRef.current = setInterval(async () => { try { const r = await fetch(`${API_BASE}/api/auth/telegram/poll`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ code }), }); const d = await r.json(); if (d.verified) { stopPoll(); setTgPolling(false); if (d.needs_credentials) { setTgToken(d.token); setSettingCreds(true); } else { localStorage.setItem("cc_token", d.token); signIn(d.user); goto(d.user?.plan && d.user.plan !== "free" ? "dashboard" : "subscription"); } } } catch (_) {} }, 2000); }; const submitTg = async (e) => { e?.preventDefault(); if (!tgValid) return; setError(""); setBusy(true); try { const r = await fetch(`${API_BASE}/api/auth/telegram/request`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ username: tgUser.replace("@", "") }), }); const d = await r.json(); if (d.error) { setError(d.error); setBusy(false); return; } setTgCode(d.code); setBusy(false); startPoll(d.code); } catch { setError("Network error"); setBusy(false); } }; const submitEmail = async (e) => { e?.preventDefault(); if (!emailValid) return; setError(""); setBusy(true); const endpoint = isSignIn ? "/api/signin" : "/api/signup"; try { const r = await fetch(`${API_BASE}${endpoint}`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ email, password: pw }), }); const d = await r.json(); if (d.error) { setError(d.error); setBusy(false); return; } localStorage.setItem("cc_token", d.token); signIn(d.user); goto(d.user?.plan && d.user.plan !== "free" ? "dashboard" : "subscription"); } catch { setError("Network error"); setBusy(false); } }; const submitCreds = async (e) => { e?.preventDefault(); if (!/\S+@\S+\.\S+/.test(credEmail) || credPw.length < 6) return; setCredError(""); setCredBusy(true); try { const r = await fetch(`${API_BASE}/api/me/set-credentials`, { method: "POST", headers: { "content-type": "application/json", "Authorization": `Bearer ${tgToken}` }, body: JSON.stringify({ email: credEmail, password: credPw }), }); const d = await r.json(); if (d.error) { setCredError(d.error); setCredBusy(false); return; } localStorage.setItem("cc_token", d.token); signIn(d.user); goto(d.user?.plan && d.user.plan !== "free" ? "dashboard" : "subscription"); } catch { setCredError("Network error"); setCredBusy(false); } }; if (settingCreds) { const credValid = /\S+@\S+\.\S+/.test(credEmail) && credPw.length >= 6; return (
one more thing

Set a password

setCredEmail(e.target.value)} /> setCredPw(e.target.value)} /> {credError &&

{credError}

} {credBusy ? "Saving…" : <>Continue }
); } if (tgCode) { return (
{ stopPoll(); setTgCode(null); }}> Back

Send to @CCUclaimerbot

Open Telegram. Paste this code to the bot.

{tgCode}

{tgPolling ? "⏳ waiting…" : ""}

); } return (
goto("landing")}> Back

{isSignIn ? "API sign in" : "API sign up"}

Manage your API slots, view claim history, and configure per-slot toggles.

{mode === "telegram" ? (
setTgUser(e.target.value)} /> {error &&

{error}

} {busy ? "…" : <> Continue with Telegram}
) : (
setEmail(e.target.value)} /> setPw(e.target.value)} /> {error &&

{error}

} {busy ? "…" : isSignIn ? <>Sign in : <>Create account }
)}

{isSignIn ? "New here?" : "Already have an account?"} {" "}

); }; Object.assign(window, { Landing, Tutorial, Signup });