Your course, as a league. A gamified Python and data science platform, built for one university course.
Only enrolled students can sign in, so this page is the public view of it.
PYTHON / COURSE SEQUENCEleague_analysis.py
1# MODULE 02 · CONDITIONALS AND LOOPS
2scores = [82, 95, 74, 88]
3scores.sort()
4
5for score in scores:
6if score >= 50:
7print(score, "pass")
8
9# MODULE 03 · DATA SCIENCE
10import pandas as pd
11league = pd.DataFrame({"score": scores})
12print(league["score"].mean())
13
READY
00:00 / --:--
Demo students, real Season 0 numbers, counted on October 29, 2026.
A progress page that became a platform
The course's teaching assistant came to us with a small request: a Streamlit app where students could log in and see their progress and their place in the league. Until then the league ran on spreadsheets, kept by hand. We saw something much bigger in it and proposed a full platform: Python in the browser, a large question bank, a profile with medals. The TA said go.
Season 0 was for students. Season 1 runs the course.
We started and shipped it within November 2025. Season 0 was built mostly for the students: the league table, profiles and medals, quizzes and the Python playground, with no admin console, so attendance and points were still entered by hand. Season 1 finished the job: an admin console, seasons, roster import, a configurable reward protocol and a much bigger question bank, so one instructor can run the whole course from one place.
SEASON 0NOV 2025 · FOR STUDENTS
League table and standings graph
Profile, medals and activity heatmap
Quizzes: 165 questions
Python playground
No admin console: attendance and points by handBY HAND
Python runs in the browser, on the student's own device. There is nothing to install, so there is no setup to get stuck on and no weak laptop to blame. A student who has never heard of VS Code just logs in and writes code. The TA can explain an idea or write code live in class on the same page. The whole course is covered, libraries included.
Phones are how these students study, so the mobile layout was treated as the main one, not a shrunken desktop. Every screen is laid out for a small display first, and the desktop app uses the extra room.
Questions with a paper trail
Each lesson's materials go through vision-language OCR to extract the text. A language model drafts the questions that lesson needs, and then every question is reviewed by sampling and put through quality checks.
01Lesson materials
02Vision-language OCR
03Draft questions
04Review
05Quality checks
06Question bank
84items sampled first
588items in the full pass after
560multiple-choice questions, every option explained
What the checks found
Every item is checked against the lesson it came from: the key, the explanation and, for written questions, the rubric.
Mechanical checks catch the quiet problems: every key valid, correct answers spread evenly across A to D, no duplicate stems, no answer that gives itself away by length.
A sample audit of 84 items came first, then a full pass over the other 588. It found and fixed duplicate distractors and an answer key that described an incomplete fix.
It also caught mistakes in the source slides, such as an example that imports random one way and calls it another. The questions follow what the code actually does.
Every multiple-choice question explains all four options, not just the right one.
Limits, stated plainly: the review ran in the same session as drafting, so it is a thorough check and not an independent audit. Bloom's-taxonomy levels on each question are provisional.
ILLUSTRATIVE ITEM4 / 4 OPTIONS EXPLAINED
After r = sorted(x), what happens to x?
Ax is sorted in placeThat is x.sort(). sorted() leaves its input alone.
Bx is unchanged; r is a new sorted listCorrect. sorted() returns a new list.
Cx becomes NoneNone is what x.sort() returns, not sorted().
Dx and r are the same listThey are two separate lists.
Adopted late, used heavily
We went live late in the term, so we expected adoption to be slow. In Season 0, 41 of 77 enrolled students answered at least one question. The busiest week came after the term's last recorded class: 37 students and 3,825 answers.
53%of Season 0 students answered at least one question
7Nov 24
16Dec 1
37Dec 8
3Dec 15
1Dec 29
STUDENTS ANSWERING PER WEEK · SEASON 0
77students enrolled in Season 0 (Oct–Dec 2025)
5,180quiz answers recorded in Season 0
21students who answered all 165 Season 0 questions
85students enrolled in Season 1 (Oct–Dec 2026)
672Season 1 questions: 560 multiple-choice, 112 written
Counted from the platform's database on October 29, 2026.
Built for the way the course runs
A league, not a gradebook
XP, levels and streaks feed a live leaderboard with rank history and rivals, so every student can see where they stand and who to catch.
#1#2#3#4
NNovaLEVEL 122,480
AAtlasLEVEL 112,310
KKiteLEVEL 112,290
EEmberLEVEL 102,105
A profile worth opening
Each student has a full profile with eight service medals, from a three-session attendance streak to reaching the global top 10.
Neuro-Link
Signal Lock
Sniper Grade
Grid Reliability
Senior Operative
High Command
Unbroken Stream
Data Warlord
A path through the course
Material is split into modules and lessons, each with graded questions and written responses. Answer keys never leave the server.
LESSON 1.2 · COMPLETEAlgorithms
LESSON 2.3 · COMPLETELoops
LESSON 2.4Functions and modules
LESSON 3.1 · LOCKEDData science with pandas
Attendance without the sheet
Attendance is recorded week by week in the admin console. A milestone reward can go to a student only once per season, and the database enforces it.
Seasons
Every record belongs to a season. A new term starts clean and the old one stays archived, and the database rejects links across seasons.
SEASON 1ACTIVE
SEASON 0ARCHIVED
A configurable reward protocol
Attendance, coursework and participation each have their own rewards. The instructor runs them in batches, and every award lands in an audit log.
+50 XPAttendance track
+120 XPCoursework
+30 XPParticipation
+50 XPAttendance track
+120 XPCoursework
+30 XPParticipation
+50 XPAttendance track
+120 XPCoursework
+30 XPParticipation
+50 XPAttendance track
+120 XPCoursework
+30 XPParticipation
Illustrative interface with demo data.
A real class, so real guardrails
STUDENT IDPASSWORDACCESS SYSTEM →
SIGN UPACCOUNTS ISSUED BY THE INSTRUCTOR
Closed to the public
Accounts are issued by the instructor. There is no sign-up page, and credentials go out as one email per student.
LEARNER SEESSERVER ONLY
A
B
C
D
Keys stay server-side
Learners can read a question and its options. Answer keys, feedback and marking rubrics are readable only by the server.
LEARNER
SERVER
Question and options
✓
✓
Answer keys and rubrics
✕
✓
Archived seasons
✕
✓
Rules in the database
Row-level security scopes what each role can read, so the guarantees do not depend on the app code remembering to check.
Screens
The platform shows real student data, so every screenshot will be taken on demo data.