How It Works
The challenge format
Each session presents you with a small set of Python problems. For each one you see a description and a function skeleton. You fill in the body of the function – no internet, no AI – then click Run. Your code is tested against a hidden set of test cases and you see which ones pass or fail instantly.
Sessions typically take 5 – 10 minutes. You can attempt each challenge as many times as you like before moving on.
Python runs in your browser
Your code never leaves your device. We use Pyodide – a full CPython interpreter compiled to WebAssembly – running inside a Web Worker. When you click Run, your code is sent to that sandboxed worker thread, executed there, and the results are returned to the page. The server never sees your code; it only receives a summary (pass/fail counts) when you submit.
This means the challenges work offline once the page has loaded, and there is no server-side code execution infrastructure to worry about.
Why no AI or Googling?
The study is measuring your unassisted coding ability over time. If you use AI or search engines during a challenge the data becomes noise. We cannot technically prevent it – we rely on participant honesty, which is why we explain the reasoning rather than just issuing a rule.
Try it yourself
Write a function that satisfies the test cases below and click Run.
Click to try a challenge
Loads in ~5 s on first run
Challenge: sum_of_digits
Write a function sum_of_digits(n) that takes a non-negative integer and returns the sum of its digits.
Example: sum_of_digits(123) → 6
The tech stack
- Backend: Django (Python), PostgreSQL, hosted on Hetzner and managed via Appliku.
- Frontend: Bulma CSS, HTMX for challenge navigation (no page reload between challenges), CodeMirror 5 for the code editor.
- Code execution: Pyodide v0.27 in a Web Worker – full CPython, sandboxed in the browser.
-
Analysis: R with
lme4for linear mixed-effects modelling. - Source: github.com/andytwoods/can-I-still-code