License: Proprietary. Copyright © 2026 VesperRun. All rights reserved. See LICENSE.
Popular-forum layout (subpops, posts, threads) with a Reframing Gate on replies. Persistent public handles (no legal names). AI is optional: classification + challenge only when OPENAI_API_KEY is set; otherwise heuristics run locally.
- Node.js 18+
- Python 3.10+ (3.14 supported; pinned
pydanticmust match a wheel for your Python version)
From the repo root:
cd backend
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
cd ../frontend
npm installCopy env templates: backend/.env.example → backend/.env; optional frontend/.env.example → frontend/.env.local.
Secrets: OPENAI_API_KEY and SECRET_KEY live in backend env / host secrets only. The Next app never calls OpenAI and must not define OPENAI_* or NEXT_PUBLIC_* OpenAI vars. Without a backend key, the Gate uses local heuristics.
Optional: set OPENAI_API_KEY in backend/.env (or deploy secrets) for classifier + challenge on replies.
Terminal 1 (backend):
cd backend
venv\Scripts\activate
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000Terminal 2 (frontend):
cd frontend
npm run dev- Frontend: http://localhost:3000
- API: http://127.0.0.1:8000 (frontend default; avoids Windows localhost → IPv6 mismatch)
- Health: http://127.0.0.1:8000/health
- Register → pick a handle
- Open s\general or s\build (
/s/general,/s/build) - Create a post
- Reply on the thread — teardown language gets 422 with a rewrite challenge; constructive replies publish
backend/— FastAPI, SQLite/Postgres, JWT auth, Reframing Gate on subpops, opening posts, and repliesfrontend/— Next.js 14, light UIdocs/hierarchy.md— sample ⊂ branch ⊂ fractalpop ⊂ subpop ⊂ popdocs/acceptable-use-policy.md— AUP (conduct, media, promotion, enforcement)docs/remediation-plan.md— hosting, policy UX, reports, moderation (fragility close-out)