thermal ∩ ml — where heat meets intelligence.
A real-time data center cooling optimizer that thinks in workloads, not watts.
Open the link. Follow the on-screen instructions. No setup required.
Data centers waste enormous energy cooling entire server rooms uniformly, when in reality heat is concentrated in specific racks at specific times. therml flips the assumption: instead of adding more cooling to a hot rack, it moves the work to a cooler one — letting hot hardware rest naturally.
Heat follows compute. Control where the work runs, and you control where the heat goes.
The landing page opens with a particle warp animation — blue and red dots rising toward a light source, a nod to Team Icarus and the theme of flying too close to the heat. From there:
- Project overview — what therml is and why it exists
- Team introduction
- Instructions — how to run the live demo (open Simulator + Monitor in separate tabs)
- GitHub — link to this repository
Netlify (landing page)
└── links to Railway (backend)
├── /monitor → Monitoring dashboard
├── /sim → Simulation dashboard
└── / → WebSocket + AI engine (shared port)
Everything communicates over a single WebSocket connection. The AI engine, state management, and both dashboards run from one Railway service. No Docker. No message brokers. No databases.
- Live heatmap grid of server racks — heat-colored, status-bordered, real time
- Workload migration particles animating across physical nodes
- AI thought stream — every decision explained in plain language
- Flexible widget dock — swap between Heat Distribution, Trends, PUE Meter, Gauges, Logs Mini, Override Quick
- Paginated metrics topbar — Thermal / Power / Operations pages
- Layout modes — Visual+Sidebar, Visual+Logs, Visual+Override, Full Visual
- Manual override tab — lock workloads, migrate manually, AI adapts around your decisions
- Add, configure, and remove server racks on a spatial grid
- Inject workloads with priority, heat contribution, and lock settings
- Heat event scenarios: Cold Start, Hotspot, Zone Fire, Gradual Ramp, Chaos Mode
- Per-rack heat trend controls (passive drift per tick)
- Datacenter presets: Small 2×3 / Medium 4×6 / Large 6×8
Runs a thermal scan every 2 seconds. Uses a meta-selection fallback system that builds candidate migration plans across three strategies, scores each, and executes the best plan.
Strategies:
| Strategy | Approach |
|---|---|
greedy-headroom |
Selects migrations based on destination thermal headroom minus workload heat impact |
peak-shaving |
Chooses moves that reduce the projected peak rack temperature the most |
load-spread |
Variance-reduction strategy — balances thermal load evenly across all racks |
fallback-selector |
Meta-strategy — runs all three above, scores each plan, picks the winner |
Scoring factors:
- Manhattan distance between racks (
|row1-row2| + |col1-col2|) — prefers nearby migrations - Weighted objective function
computePlanScore()— ranks candidate plans across heat reduction, balance, and distance cost - Locked workload detection — skips pinned workloads entirely
- Override awareness — human-controlled racks excluded from candidate pool
Supervisor mode: Every ~3 minutes, an AI supervisor pass reviews current policy performance and thermal state, logging a higher-level assessment of whether the active strategy is appropriate for current conditions.
| Layer | Tech |
|---|---|
| Landing page | Netlify (static) |
| Backend + dashboards | Railway (Node.js) |
| Server | Express |
| Real-time | ws (WebSocket) |
| Frontend | Vanilla HTML/CSS/JS — no framework, no bundler |
| Charts | Native Canvas API |
| AI strategies | Custom heuristics (greedy-headroom, peak-shaving, load-spread, fallback-selector) |
| Color | Meaning |
|---|---|
Slate blue #4a7fa5 |
Cool / normal rack |
Copper #c9773a |
Warm / elevated heat |
Terracotta #d64c2a |
Hot / critical rack |
Gold #c9a84c |
Metrics, PUE, warnings |
Burnt orange #e8832a |
AI decisions, active state |
Brass #8a6a3a |
Simulation dashboard identity |
Olive #5a8a5a |
Good / normal / connected |
- Node.js 18+
- npm
git clone https://github.com/yourusername/therml.git
cd therml
npm install
npm start| Path | URL |
|---|---|
| Landing / Monitor | http://localhost:3000/monitor |
| Simulation | http://localhost:3000/sim |
The AI engine works without a key. To enable natural language supervisor logs:
# Create .env in project root
GEMINI_API_KEY=sk-ant-your-key-hereRestart with npm start. The supervisor pass will generate narrative assessments using Claude when the key is present, falling back to rule-based logs silently if unavailable.
- Open therml.netlify.app and follow the instructions page
- Open the Simulator and the Monitor in separate tabs
- In the Simulator, trigger Hotspot under Heat Events
- Watch the Monitor — one rack turns critical, the AI logs a decision within 2 seconds, a migration particle moves across the grid
- Try Chaos Mode — watch the fallback-selector switch strategies under pressure
- In the Monitor Override tab, manually lock a workload — watch the AI route around it
- Check the widget dock — swap to Trends to see thermal history, or Gauges for power and water
therml/
├── server/
│ ├── index.js ← single Express server, all routes, WebSocket
│ ├── ai-engine.js ← thermal scoring, strategy selection, supervisor mode
│ └── state.js ← shared in-memory datacenter state + mutations
├── monitoring/
│ └── index.html ← monitoring dashboard (single file)
├── simulation/
│ └── index.html ← simulation dashboard (single file)
└── package.json
Problem: Smart Resource Allocation (Open Innovation)
Impact: Data centers account for 1–2% of global electricity consumption. Cooling alone represents 30–50% of that. Shifting compute spatially — rather than increasing cooling output — reduces energy consumption without hardware changes, downtime, or capital expenditure.
Scalability path: Replace simulated thermal input with real thermal camera feeds (FLIR, Axis). Swap heuristic strategies for a trained reinforcement learning agent. Deploy as a sidecar service alongside any existing orchestration platform.
Team Icarus — because we flew straight at the heat.
therml = thermal with the a dropped.
The missing letter is the resource being conserved. Also reads as therm + ml. The typo is intentional.
MIT