Drill Room: how it's built
Timed coding drills where the interviewer never solves.
228 problems, with your approach stated before the clock starts. Run checks the examples in a throwaway sandbox. In Java, Submit sweeps generated inputs against a correct implementation on 164 of them. State is local first, with encrypted sync.
Architecture
A drill, end to end
No cron and no polling on the drill path; a one-second interval only redraws on-screen timers.
- Drill page → Static problems: statement, examples and stub, cached (request, sync)
- Drill page → Local storage: every change written here first (event, sync)
- Drill page → Sign-in check: sign in; every route checks the session (request, sync)
- Sign-in check → Postgres revisions: credential read on every call; session tokens not stored (request, sync)
- Drill page → State sync: save 6 s after the last change; a stale write merges (timer, async)
- State sync → Postgres revisions: encrypted revisions, last 30 kept (request, sync)
- Drill page → Run route: Run or Submit (request, sync)
- Run route → Throwaway Micro virtual machine — A small virtual machine started for one job and thrown away after it.: create, run, stop in a finally block (request, sync)
- Throwaway Micro virtual machine — A small virtual machine started for one job and thrown away after it. → Runner snapshot: boot from the prebuilt runner image (request, sync)
- Run route → Gemini oracle: Submit only: your code and the statement (request, sync)
- Drill page → Local Ollama: analysis of logged attempts, on a device that can reach it (request, async)
Submit
The bound is worked out from the statement ahead of time and never sees your code. The oracle is written per Submit.
- Submit → Check the signature: Java source and signature (request, sync)
- Check the signature → Write the oracle: code and statement, sent only after the signature passes (request, sync)
- Write the oracle → Sweep the inputs: oracle appended after your code, never returned (request, sync)
- Sweep the inputs → Smallest failing case: first disagreement, shrunk (response, sync)
- Problem file → Submit: stored bound, worked out ahead of time, shown beside it (event, sync)
- Smallest failing case → Submit: verdict, smallest case, your code's complexity (response, sync)
- Which line? → Local Ollama: the failing input goes to a local model (request, async)
- Smallest failing case → Which line?: hand off the failing case (event, sync)
Wiremocks
A mock-up of a screen — Here, a static picture of a screen, drawn to show layout and flow, not the working app. — a static picture, not the real app
The console after Run and Submit
A drawing of the console on a made-up problem; Run checks the examples, Submit sweeps generated inputs.
After Run: Testcases and Output
Pair sum: return the indices of two numbers that add to a target.
Case 1Pass
nums = [4, 1, 8, 5], target = 9
Expected [0, 3], got [0, 3]
Case 2Fail
nums = [5, 5], target = 10
Expected [0, 1], got [1, 1]
Case 3unchecked
nums = [1, 5, 9], target = 14
No expected output, so nothing was compared
Each run is capped at 12 seconds.
After Submit: the sweep
Disagrees with the reference on a generated input
Smallest failing case
nums = [4, 9, 4], target = 8
Yours returned [0, 0]; the reference returned [0, 2].
Your solution: O(n²) · Achievable: O(n)
Which line?
Which line? hands the failing input to a local model.
Running cost
| Resource | Figure | Status | Source |
|---|---|---|---|
| Sandbox Central processing unit — The main chip that executes a computer's instructions., Run | ~2.1–2.7 seconds per run | Measured | build log, line 1019 Read on 2026-10-17 |
| Sandbox Central processing unit — The main chip that executes a computer's instructions., Submit sweep | ~9–11 seconds per sweep | Measured | build log, line 1019 Read on 2026-10-17 |
| Sandboxes created | at most 1 per Run or Submit | Set in the project's code | run route, lines 203-206 and 327-332 (a request refused before create costs nothing) Read on 2026-10-17 |
| One production Run, end to end | 5,331 ms one run | Measured | build log, line 6383 (2026-10-15; 1,547 ms of it boot) Read on 2026-10-17 Conflicts with readme, lines 443-444 and 477 (boot under 300 ms, read on 2026-10-17): The build log is newer and measured, so it governs the row. |
| Runner snapshot | 833 Megabyte — Megabyte, a million bytes. no expiry | Measured | build log, line 6378 (2026-10-15) Read on 2026-10-17 Conflicts with readme, line 461 (about 0.94 Gigabyte — A billion bytes of data; storage is priced per gigabyte per month. with a 14-day expiry, read on 2026-10-17): The build log is newer and measured, so it governs the row. |
| Vercel Sandbox plan | — | Not verified | owner's metered-resource table (Vercel Sandbox, plan tier marked verify, names this project) Read on 2026-10-17 |
| Gemini requests | 20 per day per model | Measured | owner's metered-resource table (Gemini free tier row); build log, lines 1530-1531 (seen in 429 responses; the provider does not publish it, build log line 1135) Read on 2026-10-17 |
| Gemini requests per Submit | 1 (0 with your own oracle class) | Set in the project's code | problem page, lines 661, 2526, 2538 and 2543 (no bound call when the file has one); oracle module, lines 356-360 (no retry) Read on 2026-10-17 Conflicts with build log, line 1130 (2 if the first is rejected and retried, read on 2026-10-17): The log is older and the code has no retry now, so the code governs the row. |
| Submits a day at the cap | 20 per day | Derived | derived (see inputs) Inputs: 20 requests a day (measured) ÷ 1 per Submit (configured) = 20 Read on 2026-10-17 |
| Gemini price | $0.00 | Published price | build log, lines 1128-1129 (quoting the free tier's price) Read on 2026-10-17 |
| Edge requests per Run or Submit | 1 | Set in the project's code | build log, lines 1015-1022 (one route call per click; a planning table) Read on 2026-10-17 |
| Vercel edge requests, plan | One million — Shorthand in prices and limits, as in $1 per 1M tokens. per month, shared by about 10 projects | Published price | owner's metered-resource table (Vercel Requests Vercel counts at its edge — Every request Vercel serves (a page, a script, an image) counts as one.) Read on 2026-10-17 Conflicts with readme, lines 489-490 (15 projects, read on 2026-10-17): The owner's row is newer, so it governs the row. |
| Neon compute | $0.106 per Compute unit — The unit a serverless database bills its processing time in; one unit-hour is one unit running for one hour.-hour | Published price | owner's metered-resource table (Neon Postgres; the org bills on Launch from 2026-09-29) Read on 2026-10-17 Conflicts with readme, line 508 (free tier, read on 2026-10-17): The owner's row is newer, so it governs the row. |
Attempt analysis runs on a local Ollama, no hosted Application Programming Interface — A defined way for one program to request data or actions from another.. Storage outside the drill is not counted.
Design decisions
- The interviewer never solvesThe hint pane stays sealed until you confirm your approach; naming an approach is on the interviewer's never list.
- One throwaway Micro virtual machine — A small virtual machine started for one job and thrown away after it. per runEach run boots from a prebuilt snapshot, so a runaway loop dies with its Micro virtual machine — A small virtual machine started for one job and thrown away after it.. Without the flag that discards a stopped session, each stop wrote a ~900 Megabyte — Megabyte, a million bytes. snapshot and one day filled storage.
- Correctness is a sweep, never a modelA differential sweep compares your code with a correct implementation on generated inputs. A model once graded a correct solution as failing.
- The bound never sees your codeThe bound is worked out from the statement alone, so it never sees your code and cannot echo a slow solution. Every problem file stores one; 153 are stamped as written by a local model.
- Local-first state, encrypted syncChanges land in the browser first, then sync as encrypted revisions. Models run locally on Ollama; on the live path the one exception is the free-tier Gemini oracle.
Open questions
- Vercel Sandbox plan: the readme (lines 79-85) infers Hobby from the 12-function cap; the owner's row says verify
- Sandbox usage: monthly Active Central processing unit — The main chip that executes a computer's instructions. and Gigabyte — A billion bytes of data; storage is priced per gigabyte per month.-hours are not measured
- Neon: the drill's share of Compute unit — The unit a serverless database bills its processing time in; one unit-hour is one unit running for one hour.-hours is not measured
- Edge requests: the usage Application Programming Interface — A defined way for one program to request data or actions from another. is Pro-only, so there is no month-to-date count
- Gemini billing: whether the key's project has a billing account is not recorded