// CashClaw landing page — Cashclaw Consortium, members-only. // // Layout: // Header → Hero → ConsortiumCard → PerformanceCard → TreasuryCard // → LimitedAccessCard (Sarah's structure + Moses's copy) // → TrustStrip → MemberOnboardingFooter → Footer // // LimitedAccessCard exposes two member-only paths (A: easy guided setup, // B: managed trading access) that both funnel to the consortium // application form. No "open access" / "free MCP" / "Kalshi key" / // "1% of wins" jargon in the public UI. // // AgentConnectModal + OnboardingWizard are preserved for the // post-approval member flow and reachable only via the small "already a // consortium member?" link or ?demo=1 (stage demo path). const { useState, useEffect } = React; const CFG = window.CASHCLAW_CONFIG || {}; // Where to hit the API. Same-origin when served from claw-cash.com (or the // nip.io fallback / direct droplet IP); otherwise fall back to public base. const API_BASE = (() => { if (typeof window === "undefined") return ""; const host = window.location.host; const ownsApi = /(^|\.)claw-cash\.com$/.test(host) || host.endsWith(".nip.io") || host.startsWith("209.38.73.113"); if (ownsApi) return ""; return (CFG.apiBaseUrl || "https://claw-cash.com").replace(/\/$/, ""); })(); function api(path) { return `${API_BASE}${path}`; } const MCP_SNIPPET = JSON.stringify({ mcpServers: { cashclaw: { type: "http", url: CFG.mcpUrl || "https://claw-cash.com/mcp", }, }, }, null, 2); // ────────────────────────────────────────────────────────────────────── // App // ────────────────────────────────────────────────────────────────────── function App() { const [applyOpen, setApplyOpen] = useState(false); const [agentOpen, setAgentOpen] = useState(false); const [wizardOpen, setWizardOpen] = useState(false); // Sarah's demo path: ?demo=1 auto-opens the member onboarding wizard // so the consortium flow can be shown live on stage without exposing // a public CTA. Remove the param to hide the trigger. useEffect(() => { if (typeof window === "undefined") return; const params = new URLSearchParams(window.location.search); if (params.get("demo") === "1") setWizardOpen(true); }, []); return (
setApplyOpen(true)} />
setApplyOpen(true)} /> setApplyOpen(true)} /> setApplyOpen(true)} /> setAgentOpen(true)} onWizard={() => setWizardOpen(true)} />
setApplyOpen(true)} />
{applyOpen && setApplyOpen(false)} />} {agentOpen && setAgentOpen(false)} />} {wizardOpen && setWizardOpen(false)} />}
); } // ────────────────────────────────────────────────────────────────────── // Header // ────────────────────────────────────────────────────────────────────── function Header({ onApply }) { return (
cashclaw
prediction-market consortium · by application
contract
); } // ────────────────────────────────────────────────────────────────────── // Hero // ────────────────────────────────────────────────────────────────────── function Hero({ onApply }) { return (
cashclaw consortium · by application
cashclaw.
Kalshi research and advisory for capital that takes prediction markets seriously. an invitation-only consortium, an autonomous research engine, and a forward-paper journal you can audit before you size a position.
membership is curated. we keep the room small on purpose — twenty serious operators with conviction, not two thousand drive-by traders.
); } // ────────────────────────────────────────────────────────────────────── // ConsortiumCard — primary // ────────────────────────────────────────────────────────────────────── function ConsortiumCard({ onApply }) { return (
the consortium
a private desk for serious prediction-market capital
members get human review on every signal, direct access to the research desk, and a hand-picked weekly book — not a firehose. we keep the room small on purpose. our edge isn't being available to everyone; it's being unavailable to almost everyone.
applications reviewed within 48h · capital allocations and structure discussed 1-on-1
); } function Bullet({ text }) { return (
{text}
); } // ────────────────────────────────────────────────────────────────────── // PerformanceCard — hard numbers up front // ────────────────────────────────────────────────────────────────────── function PerformanceCard() { const [data, setData] = useState({ loading: true }); useEffect(() => { let alive = true; async function tick() { try { const [paperRes, statusRes] = await Promise.all([ fetch(api("/api/paper")), fetch(api("/api/status")), ]); if (!alive) return; const paper = paperRes.ok ? await paperRes.json() : {}; const status = statusRes.ok ? await statusRes.json() : {}; setData({ loading: false, paper, status }); } catch (e) { if (!alive) return; setData({ loading: false, error: e.message }); } } tick(); const id = setInterval(tick, 30_000); return () => { alive = false; clearInterval(id); }; }, []); const resolved = data.paper?.summary?.resolved_decisions ?? null; const wins = data.paper?.summary?.wins ?? null; const pnl = data.paper?.summary?.pnl_usd ?? null; const brier = data.status?.readiness?.brier_lift ?? data.status?.readiness?.brier_delta ?? null; return (
forward-paper journal
live performance, not a backtest
refreshes every 30s
every call is published before resolution and locked into a hash-chained journal. members audit the same numbers the desk does — full traces, every signal, every reconciliation. nothing here is post-hoc.
); } function Stat({ label, value, suffix }) { return (
{label}
{value} {suffix && {suffix}}
); } // ────────────────────────────────────────────────────────────────────── // TreasuryCard — Polygon credibility + member settlement rail // ────────────────────────────────────────────────────────────────────── function TreasuryCard() { const [t, setT] = useState({ loading: true }); useEffect(() => { let alive = true; async function tick() { try { const r = await fetch(api("/api/treasury")); if (!alive) return; const j = await r.json(); setT({ loading: false, ...j }); } catch (e) { if (!alive) return; setT({ loading: false, error: e.message }); } } tick(); const id = setInterval(tick, 30_000); return () => { alive = false; clearInterval(id); }; }, []); const fmt = (n) => (n == null ? "—" : Number(n).toFixed(2)); const explorer = t.explorer || `https://polygonscan.com/address/${t.treasury_address}`; return (
member settlement rail · polygon
on-chain accounting
consortium performance fees settle through an audited contract — non-custodial, revocable, and inspectable on-chain
view on polygonscan ↗
treasury balance
{fmt(t.treasury_balance_usdc)}USDC
cumulative performance fee
{fmt(t.cumulative_skimmed_usdc)}USDC
cumulative member wins
{fmt(t.cumulative_wins_usdc)}USDC
{t.loading &&
loading on-chain…
} {t.error &&
api error: {t.error}
} {t.treasury_balance_error &&
balance read error: {t.treasury_balance_error}
}
); } // ────────────────────────────────────────────────────────────────────── // LimitedAccessCard — two member-only paths (Sarah's structure, Moses's // copy). No "open access" / "free" / "MCP paste" / "Kalshi key" jargon. // Both tiles funnel to the consortium application form. // ────────────────────────────────────────────────────────────────────── function LimitedAccessCard({ onApply }) { return (
limited access
guided onboarding for new members
once admitted, members choose how deep they want to engage the consortium. both paths are concierge-onboarded by the desk — no setup, no jargon.
performance-based fees only · never on losses, never monthly · on-chain audit via Polygon · revoke anytime.
); } function LimitedTile({ letter, title, body, stat, tag, onClick }) { return (
{letter}
{title}
{body}
{stat && (
{stat}
)} {tag && (
{tag}
)}
); } // ────────────────────────────────────────────────────────────────────── // TrustStrip — disclaimers, regulated venue // ────────────────────────────────────────────────────────────────────── function TrustStrip() { return (
regulated venue
we only trade on Kalshi — a CFTC-regulated US designated contract market. no offshore counterparty, no synthetic order book.
non-custodial
your USDC stays in your wallet. the consortium contract pulls a performance fee on a winning trade only — never on losses, never monthly. revoke anytime.
not financial advice
cashclaw publishes research and trade ideas to consortium members. nothing here is a solicitation or recommendation. you take your own risk; size accordingly.
); } // ────────────────────────────────────────────────────────────────────── // MemberOnboardingFooter — unobtrusive entry to the post-approval flow. // Only members see this in practice (the link is small, the language is // "continue onboarding"). Doubles as Sarah's demo path on stage. // ────────────────────────────────────────────────────────────────────── function MemberOnboardingFooter({ onAgent, onWizard }) { return (
already a consortium member? ·
); } // ────────────────────────────────────────────────────────────────────── // Footer // ────────────────────────────────────────────────────────────────────── function Footer({ onApply }) { return ( ); } // ────────────────────────────────────────────────────────────────────── // ApplyModal — Consortium application form // ────────────────────────────────────────────────────────────────────── function ApplyModal({ onClose }) { const [form, setForm] = useState({ name: "", contact: "", capital: "", markets: "", why: "", rail: "", notes: "", }); const [busy, setBusy] = useState(false); const [err, setErr] = useState(""); const [done, setDone] = useState(false); function set(key) { return (e) => setForm((f) => ({ ...f, [key]: e.target.value })); } async function submit() { setErr(""); if (!form.name || !form.contact || !form.capital) { setErr("name, contact, and capital range are required."); return; } setBusy(true); try { const r = await fetch(api("/api/applications"), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...form, submitted_at: new Date().toISOString(), referrer: typeof document !== "undefined" ? document.referrer : "", }), }); if (!r.ok) { const j = await r.json().catch(() => ({})); throw new Error(j.error || `HTTP ${r.status}`); } setDone(true); } catch (e) { setErr(e.message); } finally { setBusy(false); } } return (
{ if (e.target.classList.contains("wizard-backdrop")) onClose(); }}>
{done ? ( <>
application received
thank you — we'll be in touch within 48h.
the desk reviews every application personally. if there's a fit, you'll get a calendar link from a real person to talk capital sizing, rail, and reporting cadence. no auto-mailers.
) : ( <>
cashclaw consortium · application
request access
this is a small, hand-picked consortium. tell us a little about how you'd use it — we read every application personally.