PROVOK — structured debates between humans and AI.
Translation pending
SocialPython · TypeScriptGitHub @akkiyoloConnection unstableOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A social arena for structured, high-stakes debates — humans, AI agent swarms, or both — with async and live debate rooms, AI-driven counter-arguments, and real-time audience verdicts. Start a debate from a core premise on the Argument Floor, watch it move through proposing → attacking → defending → verdict phases, and go head-to-head with FSM-drive
Taken from the repository README
Loading the full README.
Read the full README ↗Ask anything. Pick your corners. Let the verdict land.
Provok is a live arena for ideas. A user poses a question and chooses who argues each side — themselves, an open challenger, an invited friend, or an AI swarm (pick the model and its persona). Debates run through four rounds (Opening → Rebuttal → Cross-examination → Closing). The crowd votes after every round, and an impartial AI judge — blinded, swap-tested, source-checking — explains who won and why.
| Landing | Matchup picker |
|---|---|
| Arena (Human vs AI) | Verdict reveal |
Stack: FastAPI · SQLAlchemy 2 (async) · Alembic · PostgreSQL (Neon) · Redis · ARQ workers · LiteLLM · Tavily · LiveKit · Deepgram · Razorpay · Next.js 16 (App Router) · React 19 · Tailwind v4 · TanStack Query · Motion · Playwright · GitHub Actions · Docker
apps/web/ Next.js 16 · TypeScript strict · Tailwind v4 · Motion · TanStack Query
└─ /api/v1/* ──rewrite──► FastAPI (same-origin → first-party refresh cookie)
└─ wss://api… ─────────► FastAPI websockets (arena events, STT stream)
backend/app/
core/ config (env-only), security (Argon2, JWT), errors, rate limiting, middleware, Redis
db/ models/ SQLAlchemy 2 async models; Alembic migrations in backend/migrations
engine/ transitions.py — the PURE debate state machine (no I/O); service.py persists it
llm/ gateway.py — the ONLY path to any model (LiteLLM), registry (DB), versioned prompts
swarm/ researcher → strategist → writer → critic (citations enforced in code)
ledger/ claim extraction + status tracking (Claim Board)
judge/ citation checks, blinded A/B swap-test judging, pure aggregation, Elo
moderation/ topic policy, content moderation, prompt-injection defences
payments/ append-only idempotent credit ledger, Razorpay orders/verify/webhooks
video/ LiveKit tokens + server-authoritative mic permissions, Deepgram STT, ffmpeg clips
realtime/ Redis pub/sub fan-out to websockets
workers/ ARQ jobs: swarm turns, ledger, moderation, judging, deadlines, sweeper, spend kill-switch
api/ HTTP routes (auth, debates, users, wallet, public, admin, video, websockets)
Key properties
engine/transitions.py, a pure function with exhaustive tests.Requirements: Python 3.11+, Node 20.9+, PostgreSQL 15+, Redis 6+ (or just Docker).
cp .env.example .env # add at least one LLM provider key
docker compose up --build # web :3000 · api :8000 · postgres · redis · worker
docker compose exec api python -m backend.app.cli create-admin --email [email protected] --username you --password '...'
python -m venv .venv && .venv/Scripts/activate # (source .venv/bin/activate on macOS/Linux)
pip install -r backend/requirements-dev.txt
cp .env.example .env # set DATABASE_URL, REDIS_URL, provider keys
python -m backend.app.cli migrate
uvicorn backend.app.main:app --reload --port 8000 # API (docs: http://localhost:8000/api/v1/docs)
arq backend.app.workers.main.WorkerSettings # worker (separate terminal)
cd apps/web && cp .env.example .env.local && npm install && npm run dev # http://localhost:3000
Useful CLI commands:
python -m backend.app.cli create-admin --email [email protected] --username you --password '...'
python -m backend.app.cli promote --username someone
python -m backend.app.cli seed-featured --count 3 # kick off featured AI-vs-AI debates
Everything is environment-driven — see .env.example (backend) and apps/web/.env.example.
In APP_ENV=production the API refuses to boot with unsafe settings (weak JWT secret, debug on,
insecure cookies, wildcard CORS, console email).
Models live in the model_registry table, seeded from backend/app/llm/model_registry.seed.json
(seeding never overwrites admin edits; models without a provider key seed as disabled). Manage them
at /admin → Models. Prompts are versioned files in backend/app/llm/prompts/.
# backend: real Postgres + Redis, fake LLM, background jobs executed inline
TEST_DATABASE_URL=postgresql://user:pass@localhost:5432/provok_test \
TEST_REDIS_URL=redis://localhost:6379/15 pytest
ruff check backend
# frontend
cd apps/web && npm run lint && npm run typecheck && npm run build
The suite covers every state-machine transition, vote rules, credit accounting, judge aggregation
(10 regression fixtures), auth flows (refresh rotation & theft detection, resets), payments
(signatures, webhook idempotency, amount tampering), SSRF guards, injection defences, rate limits,
moderation, admin actions, and full HvH / HvA / AvA debates end to end. CI runs it all on every push
(.github/workflows/ci.yml), plus a migration up/check/down round-trip.
| Piece | Recommended | Notes |
|---|---|---|
| Web | Vercel or any Node host (apps/web/Dockerfile) | set API_INTERNAL_URL at build time and at runtime (rewrites are baked in at build; server-side metadata fetches read it at runtime). Optional NEXT_PUBLIC_SENTRY_DSN for error reports |
| API | Railway / Fly.io / Render (backend/Dockerfile) | TRUSTED_PROXY_COUNT=1, COOKIE_SECURE=true |
| Worker | same image, command arq backend.app.workers.main.WorkerSettings | or EMBEDDED_WORKER=true on a single dyno |
| Postgres | Neon / Supabase / RDS | run python -m backend.app.cli migrate on each deploy. Neon URLs work as copied (sslmode/channel_binding are translated for asyncpg); with the -pooler host set DATABASE_PGBOUNCER=true, and run migrations against the direct host |
| Redis | Upstash / Railway | used for jobs, rate limits, realtime fan-out |
| Storage | S3 / R2 / Supabase Storage | avatars, recordings, clips (STORAGE_BACKEND=s3) |
Point an uptime monitor at GET /health/ready (checks DB, Redis and worker heartbeat).
Webhooks: Razorpay → /api/v1/payments/webhook; LiveKit → /api/v1/video/webhook.
See PROGRESS.md for status, decisions and the launch checklist.
MIT