⚠Loaded over HTTPS — browsers will block requests to your http:// LM Studio servers (mixed content).
⚠
Mixed content blocked
Browsers block http:// requests from https:// pages
Pick one of these — most reliable first:
Save this page locally and open with file:// File → Save As → save as index.html, then double-click. file:// origins can talk to localhost without mixed-content blocking.
Serve over plain HTTP from the same machine In the folder containing the HTML: python3 -m http.server 8000 then visit http://localhost:8000/index.html.
Allow insecure content for this site (Chrome only, not recommended) Click the lock icon in the address bar → Site settings → Insecure content → Allow. Reload. This persists per-origin.
Front your LM Studio servers with HTTPS Run a reverse proxy with a self-signed cert (Caddy, nginx) on each machine. Most work for the most flexibility.
Note: clicking a link from this page to http:// won't work — modern browsers refuse to navigate downward to insecure origins. The fix has to happen at the page-load level.
Manage Machines
Add Machine
Add Engineer
First family
Middle params
Last role
Nickname · overrides display
ID (e.g. 32)
Role
Status
Primary specialization
Secondary specializations · optional · stackable
${SECONDARY_SPECS.map(s=>``).join('')}
Persona name · in system prompt (defaults to nickname or First Last)
Model ID (LM Studio path) · auto-fills name ↑
Machine
Size (GB)
Temp
System Prompt · auto-generated · edit freely
Score Response
—
Average
—
Auto
—/10
Manage Criteria
Rename, remove, or add criteria. Changes apply globally — existing scores stay, new criteria show as unscored on past sessions.
🎤 Global Interview Question
This prompt is sent as the first user message in every new interview.
Each model's own system prompt (persona) is still active. Leave blank to start interviews with no default question.
Clears open interview threads
Stats
Pick Emoji
Settings
Display
Inference
Director
LM Link · Device Map
Paste the output of lms ls --json from any linked machine. The app will detect each device hash and let you assign it to a machine.
Check All machines then open the new models modal
Roster
Roles
Roles are built from three layers. Status sets color saturation (Unhired = neutral gray, Flagship = full color). Primary specialization sets the color family and main prompt line. Secondary specializations add focused function lines on top.
Status × Primary
Secondary specializations · stackable · each adds a prompt line
Custom roles
Interview
1 · Opening · auto from Director settings above
2 · Product · what you're building
3 · Stack · tech environment
4 · Team · auto-generated from roster
5 · Closing ask · what you want to learn
Preview
Group Chat
Episodes
Scoring
Auto-score signals — each response is scored automatically 0–10
Total weight100%
How auto-score works
Each signal rates the response ★1–★5 based on its thresholds. Stars are weighted by their % importance and combined into a 0–10 score. Formula: (stars/5) × weight% × 10, summed across all signals.
Leaderboard ranking
The leaderboard score is a source-weighted aggregate: Auto-score 20% · Interview sessions 30% · Team chat sessions 50%
Sources with no data are excluded and the remaining ones are rescaled to 100%.
Refusal penalty
Any response containing "I'm sorry", "I can't", "I cannot", or "as an AI" gets a −0.5 penalty.
Think token signal is inverted
Fewer think tokens = more stars. It measures efficiency, not effort. Set its weight to 0% when evaluating reasoning-heavy tasks.
Prompt classification
Each prompt is auto-classified as Code, Reasoning, Creative, or General. Shown in the roster detail. No effect on scoring.
Leaderboard
Data
Roster
Full app
Danger zone
🆕 New Models Detected
Add Custom Role
Custom roles extend the built-in proficiency × specialization grid. You must provide prompt language so the canned sentences stay consistent.
Proficiency
Specialization
Prompt language *required
This sentence is appended to the system prompt for every model assigned this role.