Case study · Qingban youth STEM platform
Fifty-nine lessons, and one free account
Qingban is a free STEM platform for left-behind children and the children of migrant workers: 59 recorded lessons across six subjects, nothing to install, and no fee at any point. The account came later, because progress has to belong to someone; section 03 says what it bought and what it cost.
01Project background
Qingban is aimed at one specific situation: a child studying in a county or township school that offers no programming course, in a home where nobody can sit down and write the first line of code with them. Left-behind children and the children of migrant workers lack different things, but outside the classroom they run into the same shortage: too few places to go. STEM is where it shows most, because that subject depends on equipment and on people who can teach it, and both tend to sit in the city.
Recording a course costs money once. After that, one more viewer adds almost nothing, which is about the only reliable advantage the internet offers here. So what Qingban does is narrow: record the lessons once, then publish them. Six subjects are open now. Three carry video: 47 on Python (33 in the Python 3 series, 8 for ages eight to twelve, 6 for older beginners), 6 on maths through turtle graphics, 6 on physics experiments. The other three carry written pages, one on engineering, two on chemistry, two on biology, with no video yet.
The project was started and is supported by Hongxin Su. It has been run since founding by the Qingban Growth Center, and it charges nothing to students anywhere in the country. One thing worth stating plainly: a library of recorded lessons does not change how teachers are distributed across counties, and it does not stand in for the teacher in the room. What it can do is let a student who would otherwise never meet the subject see what it looks like.
02Defining "finished"
Progress is recorded from the video element itself, not from a button the student presses. While a lesson plays, the player reports its current position every ten seconds; the last position is kept so that reopening the page resumes where the student stopped. This runs on a separate table rather than the CMS content tables, because progress writes are frequent and the content tables are read on every page.
p = 0 or no row → not started
0 < p < 100 → in progress
p ≥ 100 → completed
The line is at 100%, so the playhead has to reach the end of the video. Nothing is held back for the credits, closing music included. Play it out and the certificate is there; leave a few seconds early and it isn't. A few seconds, no more. The number only goes up, because the write uses GREATEST, so replaying a lesson cannot roll a finished course back to unfinished. The certificate number encodes what happened rather than who deserves it: CERT, the completion date, the four-digit course id, the six-digit user id. Printed from the browser with a stylesheet that drops the navigation, it fits on one sheet of A4.
What the rule actually proves: the playhead reached the end of the video. It does not prove the student understood the lesson, and there is no quiz on this platform that would.
03An account, and what it costs
A lesson no longer opens for a visitor. Press Start Learning without an account and the site sends you to the login form. Registration asks for a username, a nickname, a password typed twice, and the characters in a captcha image. Nothing else: no phone number, no email address, no confirmation mail.
What the account buys is continuity. Add to My Courses files a lesson under My Courses, which counts what is enrolled, completed and in progress and averages the bars. Learning Progress lists every lesson a student has opened, with the percentage, the minutes watched, a status and a Continue button. Certificates collects the ones already printable, and comments stay under the video they belong to.
Each Python 3 lesson also carries its courseware under the video: the slides, page by page, inside the lesson body. A student whose connection cannot hold a video reads the same material, and the page still makes sense printed.
The cost is a wall between a thirteen-year-old and a two-minute video. I put it there because progress and a certificate need an identity behind them: without one, the 100% mark points at nobody and the certificate number has no user id to carry. The form is the mitigation, not a fix. A registration step is still a step where people leave.
04What I did not build
- No app. A URL works on a phone browser, and asking a family to install something is a step where people drop out. The site is responsive from 320px up.
- The framework is not mine. This runs as secondary development on PbootCMS 3.2.16, and the reason is administrative rather than technical: whoever takes the site over is more likely to find someone who can edit a template than someone who can read a framework I wrote.
- No recommendations and no leaderboard. What a thirteen-year-old studies next should not be decided by a model trained on other people’s children, and a public ranking mostly tells the kids with the least support where they stand.
- No payment entry of any kind. Once a charity site accepts money, it also owes an audit trail, and that is a different project with a different team.
05Two languages means two column trees
Chinese and English are not a translation layer here. Each language owns its own columns and its own entries: 152 entries in total, 76 per language, and six subject columns on each side. Switching language swaps the labels through a cookie plus a CSS class, and fifteen templates carry both wordings. The hreflang tags point Chinese, English and a default at the same page so a search engine indexes them as alternates.
The cost is that every entry gets written twice. Changing one title means changing two places, and a miss shows up as the two sides saying different things.
Two places where it breaks down. The Python 3 series, 33 lessons, is written in Chinese and served under both language settings: the chrome translates, the lesson text does not. On the English side of a course page, the type and subject fields are still empty, so the page prints both labels with nothing after them.
06What it runs on
Nginx in front, PHP 8.2 behind it, MySQL on the same machine. At this size, spreading the site across machines would add ways to fail without making anything better. The database listens on loopback and the application connects with its own user, so a leaked credential does not hand over the whole server. Certificates renew themselves, and a check watches the date: an expiry fails quietly, and nobody notices until the site is down.
07Where the value sits
- Education equity. One set of lessons. A student in Shanghai and a student in a county town open the same address, and no region gets its own version.
- Public outreach. An activity stays in the public activity column from the first notice to the closing post. When someone asks what we have done, the answer is a link to that column.
- Practice and innovation. Maths is taught through figures, physics through experiments, Python by writing code, and none of it costs anything.
- Replicability. The system was built by modifying an open-source PbootCMS install. Another organisation takes it, swaps columns and content, and goes live with the back end already there.
Served from a mainland-China server, so it may not load outside mainland China. If the main address fails, the fallback is 8.153.199.66 (HTTP, so the browser marks it as not secure).