Frontier models are crushing benchmark after benchmark...so I built a quiz to ask this simple yet humbling question: can a human still beat them?
Humans vs. HLE is a web-based quiz that pits you against frontier AI models on Humanity's Last Exam HLE is a benchmark of expert-level academic questions designed to be insanely challenging. You answer a series of multiple-choice questions (if you miss 4, you're out and the quiz ends!) and your score is stacked up both against how the best models perform on the same material as well as against other humans who have taken this quiz via a persistent human leaderboard.
Spoiler: it's harder than it looks.
Entire tracks prompts, outputs, and tool calls. You can see some of my prompts here.
You can see I used Claude code Opus 4.8, edited 27 files, and added 912 lines of code (and removed 239) for that checkpoint/feature.
The entire (see what I did there) app runs on Cloudflare Workers. Here are a few decisions I want to call out.
Rather than fetch questions at runtime, they're curated offline from the gated cais/hle
Hugging Face dataset into src/questions.json
and then imported directly by src/questions.ts
so the bank ships inside the Worker bundle. This means no database or external fetch, and that the deployed Worker never calls Hugging Face or agi.safe.ai at request time. This means the app is fast to serve and that nothing sensitive travels over the wire.
The interesting engineering challenge in a quiz app is: how do you stop people from just reading the answers in the network tab?
The approach keeps correct answers server-side the entire quiz lifecycle. GET /api/quiz/new
shuffles each question's choices, strips the answers, and hands back an AES-GCM–encrypted answer-key token that's opaque to the browser. POST /api/quiz/answer
decrypts it server-side to grade one question at a time. POST /api/quiz/submit
returns an HMAC-signed result token — so a score forged in the client simply won't verify. The client gets what it needs to render a question, but never the answer key, and scoring happens where it can't be tampered with.
The leaderboard and result signing use Cloudflare Durable Objects, which are my go-to dev tool for consistent, stateful coordination (ie. a persistent leaderboard).
The entire development process (again, see what I did there) was tracked with Entire, so every architectural decision (why encrypted tokens, why Durable Objects) has its reasoning captured alongside the code, not lost to a closed chat window.
The pieces that matter, and what each one owns:
scripts/
build-questions.py # curate cais/hle → questions.json (offline)
src/
questions.json # 140 text-only MCQs, baked in
questions.ts # imports the JSON into the bundle
index.ts # Worker + the /api/quiz/* routes
models.ts # published HLE accuracy + AS_OF date
The API surface: /api/quiz/new
, /api/quiz/answer
, /api/quiz/submit
, and /api/questions
for the browse page.
Standard Workers setup — install, drop in two secrets, and go.
npm install
cp .dev.vars.example .dev.vars
npm run dev
Tests:
npm run test
Deploy:
wrangler secret put QUIZ_TOKEN_KEY # an openssl rand -base64 32 value
wrangler secret put RESULT_TOKEN_SECRET # a different one
npm run deploy
The AI numbers aren't the models sitting your exact ten questions live. They're each model's published overall accuracy on the full HLE benchmark, sourced from Scale AI's leaderboard (with an AS_OF
date in models.ts
). So it's you-on-a-sample versus them-on-the-whole-thing — close enough to sting, honest enough to admit.
Think you can beat the models? Give it a shot, and let me know your score in the comments (as well as the leaderboard.)