IOH Student Survey Filler
Downloads
Right-click → "Save link as…" (or just click; your browser may offer to save it).
One-time setup
Install Chrome
Any recent Chrome build is fine. Nothing else to install — Go runtime, drivers, etc. are already baked into the exes.
Allow Mongo Atlas access from the machines you'll run on
Atlas → Security → Network Access → Add IP → Allow access from anywhere (0.0.0.0/0).
Seed MongoDB with the 5913 UG rows — do this once on one machine
Open PowerShell in the folder that has upload.exe + student_needed.csv + student_answer_pool.json and run:
.\upload.exe -type student
Expected output: inserted 5913 student docs inserted 6 answer-pool questions done
This drops and rebuilds the ioh.student collection, so only do it once.
Running the filler
Open the dashboard (one terminal)
.\monitor.exe -coll student
It auto-opens http://localhost:8080 — live counts, per-worker activity, retry buttons.
Smoke test — one row, visible browser, no actual submit
.\filler.exe -type student -count 1 -dry
You'll see Chrome open, walk through the Zoho pages, and stop at the Submit button.
Submit one row for real
.\filler.exe -type student -count 1
Takes ~60 seconds. The monitor will flip that row from in_progress to done.
Go wide — all remaining rows, 10 parallel Chromes, headless
.\filler.exe -type student -tabs 10 -headless
Run this on as many machines as you want. Each row is claimed atomically from Mongo, so no duplicates ever.
Human-paced (15–20 min per response — looks natural)
.\filler.exe -type student -tabs 5 -headless -pace-min 15m -pace-max 20m
The 5-minute per-row cap auto-extends to pace-max + 5 min, so slow pacing won't cause timeouts.
All flags
| Flag | Default | Meaning |
|---|---|---|
-type | faculty | Pass student here |
-count | 1 | Max rows this worker will claim (0 = all remaining) |
-tabs | 1 | Concurrent Chrome windows per machine |
-headless | false | Hide the Chrome windows |
-dry | false | Fill everything but don't click Submit |
-pace-min | 0 | Minimum total time per response (e.g. 15m) |
-pace-max | 0 | Maximum total time per response (e.g. 20m) |
-timeout | auto | Hard per-row cap (defaults to pace-max + 5m, or 5m) |
-data | — | Use a local CSV instead of Mongo (bypasses atomic claim) |
-delay | 400ms | Pause between field fills |
-debug | false | Verbose logs + screenshots in debug/ |
Open-text answer mix
Each of Q19 / Q24 / Q29 / Q34 / Q39 / Q44 is picked per-row from this blend:
| Share | Source | Examples |
|---|---|---|
| ~90% | Random preset from the Answers sheet (153 per Q) | Mentorship · Peer tutoring · Centralization · Internships … |
| ~7% | Short random comment | "ok", "idk", "nothing much", "all good", "could be better" … |
| ~3% | NA / No / "-" | "NA", "N/A", "No", "None", "Nothing", "-" |
If a row shows red in the monitor
| Reason | What it means / what to do |
|---|---|
stuck on page N: no Next/Submit found | Zoho rejected a mandatory field. Click Retry on the row; a different random answer may land cleanly. |
page N not advancing after 2 retries | Same as above — the row's data has something Zoho won't accept. |
timeout (Xm exceeded) | Chrome or Zoho got slow. Retry. |
Submit rejected: N field(s) still flagged | Rare consent-page race. Retry. |
JS inject failed - page likely crashed | Transient Chrome crash. Retry. |
The monitor also has a Reclaim stale (>15m) button that releases rows left in_progress by crashed workers so other machines can pick them up.