Give an AI agent this one line:
Build me outbid for SEO products using https://github.com/kendrekaran/outbit
Swap the niche (AI tools, developer tools, agencies, …). The agent reads AGENTS.md, specializes site.config.ts, then goes live with Supabase and one payment gateway (Stripe or Dodo — it will ask). Same board, new topic, real listings, real checkout.
npm install
cp .env.example .env.local
npm run devOpen http://localhost:3000. Without Supabase and payment keys the board still runs on a local JSON file with demo checkout. A setup banner stays on the home page. That is not a finished board.
Paid products are rows in Postgres. Local data/board.json is only a laptop fallback.
Fastest path: connect Supabase MCP (https://mcp.supabase.com/mcp), then say “Go live with Supabase.” The agent creates (or reuses) a project, applies supabase/schema.sql, seeds categories from site.config.ts, and writes:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
USE_SUPABASE=1
The anon key is public and SELECT-only. Writes use SUPABASE_SERVICE_ROLE_KEY (never NEXT_PUBLIC_*). Or paste those from Project Settings → API after you run schema.sql and seed.sql yourself. Do not seed listings.
Pick one: Stripe (cards, USD) or Dodo (UPI and cards, INR). Do not add both. The agent will ask before writing keys.
Fastest path: say Stripe or Dodo, connect that MCP, paste that secret API key, tell the agent to continue.
- Stripe — Cursor Settings → MCP → add
https://mcp.stripe.comand sign in. PutSTRIPE_SECRET_KEYin.env.local. Say “Go live with Stripe.” - Dodo — Cursor Settings → MCP → add the Dodo Payments MCP, sign in, put
DODO_PAYMENTS_API_KEYin.env.local. Say “Go live with Dodo.” The agent creates the Pay What You Want product and webhook.
Or paste keys for the one you picked (see .env.example):
| Provider | Env | Where |
|---|---|---|
| Stripe | STRIPE_SECRET_KEY |
Dashboard → Developers → API keys |
| Stripe | STRIPE_WEBHOOK_SECRET |
Webhook on /api/webhooks/stripe (checkout.session.completed). Local: stripe listen --forward-to localhost:3000/api/webhooks/stripe |
| Dodo | DODO_PAYMENTS_API_KEY |
Dashboard → Developer → API |
| Dodo | DODO_PAYMENTS_PRODUCT_ID |
One-time product with Pay What You Want / dynamic amount |
| Dodo | DODO_PAYMENTS_WEBHOOK_KEY |
Webhook on /api/webhooks/dodo (payment.succeeded) |
Set NEXT_PUBLIC_APP_URL to your public URL before creating webhooks.
Confirm: GET /api/setup returns "ready": true (Supabase + exactly one gateway). Checkout should say Checkout, not Demo checkout.
A public leaderboard. People bid to keep their product on top. Rank is the bid — nothing else.
- Submit a product URL or
@handleand a dollar amount - Taking #1 costs at least $5 more than the current top
- Board amounts stay in USD. Dodo charges INR at
site.payments.inrPerUsd. Stripe charges USD.
Listings, payments, activity, and visitor counts belong in Supabase (outbid_listings, outbid_payments, and the rest). The board starts empty — seed categories only. data/board.json is the local fallback when USE_SUPABASE is not 1.