lm-arena/lm-arena.github.io

Multi-model LLM platform (15 models, 270M-12B) with OpenAI-compatible APIs. Testbed for gesture UI, AI-generated interfaces, and model collaboration modes.

TypeScript

2

1,609 commits

updated Jul 6, 2026

See the code

README

LM Arena

Self-hosted LLM inference with GitHub Actions as the compute. Each model runs in a Docker container on a runner, exposes itself through a Cloudflare quick tunnel, and registers that URL in a tunnel-registry Worker. The frontend is a static React app on GitHub Pages that streams chat straight to whichever tunnels are live. No always-on server — compute exists only while a run is in flight.

┌──────────────────┐                      ┌──────────────────────────────┐
│   GitHub Pages   │                      │   GitHub Actions runner      │
│  static React    │                      │  Docker · llama.cpp server   │
└──────────────────┘                      └──────────────────────────────┘
         │                                              │
         │  ① fetch live tunnel URLs                    │  cloudflared quick tunnel
         ▼                                              ▼
┌─────────────────────────────────────────────────────────────────────────┐
│        tunnel-registry Worker   ·   model name → active tunnel URL        │
└─────────────────────────────────────────────────────────────────────────┘
         │
         └── ② browser streams chat directly to the inference tunnel

Why this shape

  • No idle cost — compute is ephemeral Actions minutes, alive only during a run; nothing to keep warm.
  • No infra to own — Pages serves the static app, a Worker holds the registry, Cloudflare opens the tunnel. There is no backend to deploy.
  • One source of truthconfig/models.py defines every model (ports, HF repo, quant, context, rank). The frontend's services.json, the workflow's model choices, and the table below are all generated from it.

Models

#ModelClassHighlights
1Nanbeige4.1-3BreasoningAIME 90.4%, GPQA 82.2%, outperforms Qwen3-32B on reasoning
2Qwen3.5 4BsmallMultilingual (201 langs), 256K context, thinking mode, Apache 2.0
2Qwen3.5-27B Claude Distilledmedium27B reasoning distilled from Claude 4.6 Opus, preserved thinking mode, strong agentic capabilities
3SmolLM3 3BsmallHybrid reasoning (36.7% AIME), tool-calling (92.3% BFCL), 64K context
3LFM2.5 8B-A1BmediumHybrid MoE, 8.3B total / 1.5B active, 128K context — largest model in the arena
4LFM2.5 1.2BsmallHybrid LFM2 model, 8 languages, edge-optimized with RL tuning
4Phi-4 Mini Reasoningreasoning3.8B matching o1-mini on math, outperforms R1-distill-7B, 128K context
4Gemma 4 12BmediumGemma 4 unified 12B, 256K context, Apache 2.0 — largest dense model in the arena
5LFM2.5 1.2B ThinkingsmallThinking variant of LFM2.5, hybrid architecture with reasoning traces
5Gemma 3n E4BmediumMatFormer: 8B params, 4B memory footprint, LMArena 1300+ (first sub-10B)
6LFM2.5 350Msmall255 tok/s on Jetson, 33ms TTFT, 229MB — fastest model in the arena
6LFM2.5 VL 1.6B ExtractsmallVision model — image + field list → structured JSON. In-car, document scan, inspection
7LFM2 350M StepGamesmallLFM2 350M fine-tuned on StepGame spatial reasoning (16% → 70% accuracy)
7LFM2.5 VL 450M Extractsmall450M vision model — image + field list → structured JSON, edge-tier extraction
7Falcon H1R 7BmediumTransformer-Mamba hybrid, AIME 88.1%, LiveCodeBench 68.6%, 256K context
8LFM2 350M NK RisksmallLFM2 350M fine-tuned on GDELT NK military events — geopolitical risk analyst
8Jan-code 4BsmallCode-focused 4B model by Jan, 2.72GB Q4_K_M
8Qwen3.5 7BmediumMultilingual (201 langs), 256K context, thinking mode, Apache 2.0
13GPT-OSS 20BreasoningMoE (21B params / 3.6B active), function calling, agentic operations

Live latency / throughput → benchmarks.html. Architecture notes for select models (growing set) → docs/models/.

Run it

make inference MODEL=qwen     # launch one model (GitHub Actions → Cloudflare tunnel)
make down                     # cancel all in-flight inference runs
make build                    # build the frontend (regenerates services.json from config)

Launch / manage the whole fleet from the browser: open app/chat/frontend/public/admin.html. Local frontend dev: cd app/chat/frontend && npm install && npm run dev.

Internals

config/models.py is the single source of truth. Add a model = add one ModelConfig, then regenerate the derivatives — make build (services.json), make sync-workflow-choices (inference.yml), make sync-readme (this table). The CI build matrix reads the config directly, so new models are picked up automatically.

Deep architecture (workflows, data flow, layout) → docs/architecture.md. AI build-context → CLAUDE.md.

License

MIT

Contributors

jonasneves

1,567 commits

claude

30 commits

lm-arena/lm-arena.github.io

Multi-model LLM platform (15 models, 270M-12B) with OpenAI-compatible APIs. Testbed for gesture UI, AI-generated interfaces, and model collaboration modes.

TypeScript

2

1,609 commits

updated Jul 6, 2026

See the code

README

LM Arena

Self-hosted LLM inference with GitHub Actions as the compute. Each model runs in a Docker container on a runner, exposes itself through a Cloudflare quick tunnel, and registers that URL in a tunnel-registry Worker. The frontend is a static React app on GitHub Pages that streams chat straight to whichever tunnels are live. No always-on server — compute exists only while a run is in flight.

┌──────────────────┐                      ┌──────────────────────────────┐
│   GitHub Pages   │                      │   GitHub Actions runner      │
│  static React    │                      │  Docker · llama.cpp server   │
└──────────────────┘                      └──────────────────────────────┘
         │                                              │
         │  ① fetch live tunnel URLs                    │  cloudflared quick tunnel
         ▼                                              ▼
┌─────────────────────────────────────────────────────────────────────────┐
│        tunnel-registry Worker   ·   model name → active tunnel URL        │
└─────────────────────────────────────────────────────────────────────────┘
         │
         └── ② browser streams chat directly to the inference tunnel

Why this shape

  • No idle cost — compute is ephemeral Actions minutes, alive only during a run; nothing to keep warm.
  • No infra to own — Pages serves the static app, a Worker holds the registry, Cloudflare opens the tunnel. There is no backend to deploy.
  • One source of truthconfig/models.py defines every model (ports, HF repo, quant, context, rank). The frontend's services.json, the workflow's model choices, and the table below are all generated from it.

Models

#ModelClassHighlights
1Nanbeige4.1-3BreasoningAIME 90.4%, GPQA 82.2%, outperforms Qwen3-32B on reasoning
2Qwen3.5 4BsmallMultilingual (201 langs), 256K context, thinking mode, Apache 2.0
2Qwen3.5-27B Claude Distilledmedium27B reasoning distilled from Claude 4.6 Opus, preserved thinking mode, strong agentic capabilities
3SmolLM3 3BsmallHybrid reasoning (36.7% AIME), tool-calling (92.3% BFCL), 64K context
3LFM2.5 8B-A1BmediumHybrid MoE, 8.3B total / 1.5B active, 128K context — largest model in the arena
4LFM2.5 1.2BsmallHybrid LFM2 model, 8 languages, edge-optimized with RL tuning
4Phi-4 Mini Reasoningreasoning3.8B matching o1-mini on math, outperforms R1-distill-7B, 128K context
4Gemma 4 12BmediumGemma 4 unified 12B, 256K context, Apache 2.0 — largest dense model in the arena
5LFM2.5 1.2B ThinkingsmallThinking variant of LFM2.5, hybrid architecture with reasoning traces
5Gemma 3n E4BmediumMatFormer: 8B params, 4B memory footprint, LMArena 1300+ (first sub-10B)
6LFM2.5 350Msmall255 tok/s on Jetson, 33ms TTFT, 229MB — fastest model in the arena
6LFM2.5 VL 1.6B ExtractsmallVision model — image + field list → structured JSON. In-car, document scan, inspection
7LFM2 350M StepGamesmallLFM2 350M fine-tuned on StepGame spatial reasoning (16% → 70% accuracy)
7LFM2.5 VL 450M Extractsmall450M vision model — image + field list → structured JSON, edge-tier extraction
7Falcon H1R 7BmediumTransformer-Mamba hybrid, AIME 88.1%, LiveCodeBench 68.6%, 256K context
8LFM2 350M NK RisksmallLFM2 350M fine-tuned on GDELT NK military events — geopolitical risk analyst
8Jan-code 4BsmallCode-focused 4B model by Jan, 2.72GB Q4_K_M
8Qwen3.5 7BmediumMultilingual (201 langs), 256K context, thinking mode, Apache 2.0
13GPT-OSS 20BreasoningMoE (21B params / 3.6B active), function calling, agentic operations

Live latency / throughput → benchmarks.html. Architecture notes for select models (growing set) → docs/models/.

Run it

make inference MODEL=qwen     # launch one model (GitHub Actions → Cloudflare tunnel)
make down                     # cancel all in-flight inference runs
make build                    # build the frontend (regenerates services.json from config)

Launch / manage the whole fleet from the browser: open app/chat/frontend/public/admin.html. Local frontend dev: cd app/chat/frontend && npm install && npm run dev.

Internals

config/models.py is the single source of truth. Add a model = add one ModelConfig, then regenerate the derivatives — make build (services.json), make sync-workflow-choices (inference.yml), make sync-readme (this table). The CI build matrix reads the config directly, so new models are picked up automatically.

Deep architecture (workflows, data flow, layout) → docs/architecture.md. AI build-context → CLAUDE.md.

License

MIT

Contributors

jonasneves

1,567 commits

claude

30 commits

Languages

TypeScript

68.5%

HTML

13.2%

Python

10.9%

CSS

3.1%

JavaScript

3.0%