IOH Student Survey Filler

Mongo-backed, atomic row claiming. Run on as many machines as you want — no two workers will ever grab the same student.

Downloads

Right-click → "Save link as…" (or just click; your browser may offer to save it).

filler.exe
Worker · 17 MB · claims & fills rows
↓
monitor.exe
Live dashboard · 13 MB
↓
upload.exe
One-time Mongo loader · 14 MB
↓
student_needed.csv
5913 UG rows · 2.2 MB · for upload.exe only
↓
student_answer_pool.json
Preset answers · 31 KB · for upload.exe only
↓
filler.exe and monitor.exe are 100% standalone — nothing else is needed on the worker machines. The CSV + JSON only need to live next to upload.exe on the one machine that seeds Mongo.

One-time setup

1

Install Chrome

Any recent Chrome build is fine. Nothing else to install — Go runtime, drivers, etc. are already baked into the exes.

2

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).

3

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

1

Open the dashboard (one terminal)

.\monitor.exe -coll student

It auto-opens http://localhost:8080 — live counts, per-worker activity, retry buttons.

2

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.

3

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.

4

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.

5

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

FlagDefaultMeaning
-typefacultyPass student here
-count1Max rows this worker will claim (0 = all remaining)
-tabs1Concurrent Chrome windows per machine
-headlessfalseHide the Chrome windows
-dryfalseFill everything but don't click Submit
-pace-min0Minimum total time per response (e.g. 15m)
-pace-max0Maximum total time per response (e.g. 20m)
-timeoutautoHard per-row cap (defaults to pace-max + 5m, or 5m)
-data—Use a local CSV instead of Mongo (bypasses atomic claim)
-delay400msPause between field fills
-debugfalseVerbose logs + screenshots in debug/

Open-text answer mix

Each of Q19 / Q24 / Q29 / Q34 / Q39 / Q44 is picked per-row from this blend:

ShareSourceExamples
~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

ReasonWhat it means / what to do
stuck on page N: no Next/Submit foundZoho rejected a mandatory field. Click Retry on the row; a different random answer may land cleanly.
page N not advancing after 2 retriesSame 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 flaggedRare consent-page race. Retry.
JS inject failed - page likely crashedTransient 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.