A static-site fork of karpathy/llm-council that runs entirely in the browser — no server, no database, no signup. Each visitor brings their own OpenRouter API key and stores it in their own browser's localStorage.
Live: https://raalzz.github.io/llm-council-on-browser/
A 3-stage deliberation flow over multiple LLMs (via OpenRouter):
- Stage 1 — every council model answers the question independently.
- Stage 2 — the same models rank each others' responses, anonymized.
- Stage 3 — a chairman model synthesizes a final answer from the responses + rankings.
All orchestration runs in your browser. The repo has no backend.
- Your OpenRouter key lives only in your browser's
localStorage. It is sent directly from your browser tohttps://openrouter.ai. The repo owner never sees it. - Conversations are also stored in your
localStorage— they're scoped to the browser you used to write them. Clearing site data wipes them. - The repo is fully static. Anyone hosting a fork has no way to capture visitor traffic.
npm install
npm run devOpen the URL Vite prints (note the trailing path — the dev server respects base):
http://localhost:5173/llm-council-on-browser/
On first load, a settings modal will ask for your OpenRouter API key. Get one at openrouter.ai/keys.
The Settings panel lets you change:
- Council models — one OpenRouter model id per line (browse at openrouter.ai/models). 2 minimum.
- Chairman model — synthesizes the final answer.
- Title model — generates short titles for new conversations.
Defaults match upstream: GPT-5.1, Gemini 3 Pro, Claude Sonnet 4.5, Grok 4, with Gemini 3 Pro as chairman.
- Fork or create a repo (the included
vite.config.jsassumes the repo is namedllm-council-on-browser; changebaseif you rename). - Push to
main. - In repo Settings -> Pages, set Source to GitHub Actions.
- The included
.github/workflows/deploy.ymlbuilds with Node 20 and publishes viaactions/deploy-pages. Your URL will behttps://<username>.github.io/<repo>/.
src/
api.js # thin facade — preserves the upstream surface area
lib/
openrouter.js # direct OpenRouter client
council.js # 3-stage orchestration (port of backend/council.py)
storage.js # localStorage CRUD for conversations
settings.js # localStorage CRUD for API key + model config
components/
SettingsModal.jsx # API key + model configuration
Sidebar.jsx # (unchanged from upstream)
ChatInterface.jsx # (unchanged from upstream)
Stage1/2/3.jsx # (unchanged from upstream)
Original concept and UI by Andrej Karpathy: https://github.com/karpathy/llm-council.