R1V3R.CC nilo@r1v3r:/home/obras/hiveclass$ Hiveclass · physical-education avatar /home/obras/axis-smart-deck AXIS · Smart Deck
drwxr-xr-x/home/obras/hiveclassHiveclass · physical-education avatar1/1
README

Hiveclass

The student's webcam becomes a 3D avatar that does the exercise with them — and counts the reps.

hiveclass.mp4
the-ask.txt

The ask

With a whole class, the teacher can't see whether each student actually did the exercise, or did it right. The answer had to fit the school's reality — an ordinary webcam, a browser, no sensor or app to install. Brief and client goals as written [to measure].

What the house made

An avatar that moves like the student, inside the platform's task. The task runs in three timed scenes: a video explains the exercise; preparation asks the student to step back until their whole body is in frame, calibrates, and waits for the right hand to go up; the demonstration counts reps with live feedback ("EXCELLENT") until the target. Before that came an MVP comparing the student's skeleton with the correct form, plus student and teacher portals.

How it was built

MediaPipe reads 33 body landmarks per frame. A solver turns those landmarks into rotations of a Ready Player Me rig in three.js, with IK, ground contact and jump detection. Each exercise is a phase machine: in jumping jacks, arms up and legs apart is one phase, arms down and legs together the other, and a rep only counts on the full cycle, with thresholds tuned by hand (arms 0.05, legs 0.12). The base was the open-source Mesekai project [to measure: licence].

measured.txt

Measured

33body landmarks per frame
16jumping jacks, all counted
10/10in the in-platform validation
3scenes: explain · prepare · do
200 msphase-change timeout
[to measure]students and classes

The 16-rep count is the 2025-05-27 test, a single person on a webcam; the 10/10 is the 2026-05-13 screen recording. Accuracy across students, ages, rooms and lighting, and use in real classes [to measure].

screens.txt

Screens

Preparation scene: body detected, calibrated, waiting for the right hand to be raised; the avatar stands in the 3D room
preparation: calibrated, raise your hand · 640×360 · 16 colours
Demonstration scene: the jumping-jack counter reaches the target and the Finish button appears
demonstration: target reached
The MVP: two skeletons side by side, the student's with errors and the correct form
the MVP: wrong form × correct form
special-custom-interactive-v.txt

Special · Custom Interactive Video Player

The problem

An accessibility audit found that the video controls could not be reached with Tab: the Cloudflare Stream player lives in a nested iframe. Every lesson in the platform is a video, so it had to be fixed without changing where the videos are stored — and the same player had to become the base for interactive lessons.

The player

The player reads the HLS manifest straight from Cloudflare Stream and plays it in a plain <video> in the page: no iframe to enter or leave. Safari and iOS play HLS natively; the other browsers load hls.js only when a video task opens, and segments only when Play is pressed. If an engine fails before playback, the old iframe comes back. Shortcuts copy YouTube's, the bars follow the W3C slider pattern ("1 minute 23 seconds of 2 minutes 39 seconds"), letters work only with focus in the player (WCAG 2.1.4), and changes are announced to the screen reader. A switch per client group turns it on or off with no deploy.

The interactive layer

A story is one long video plus a timeline of interactions: choice (2 to 4 answers, each jumps to a part), menu (clickable areas drawn over the frame), quick time event (act before the timer: one part on success, another on fail), quiz (the task's own questions, counted in the grade), jump and ending. While waiting for an answer, a stretch of the video loops. With the camera on, MediaPipe turns the body into the controller. In the editor, the author pauses the video and adds the interaction at that moment; menu hotspots come from an SVG drawn in Figma, matched by layer name.

0iframes in the page
6interaction types
1video file per story
3 sholding a hand on a choice
2:52demo story · 14 scenes
10device profiles in QA

The demo story (Field Day Warm-Up) was made to test the player: scenes generated in Gemini and Google Vids, with the timeline and the scene sheet generated from the same table. QA on real devices in BrowserStack, from iOS 15 to 18, iPadOS, Android, ChromeOS, Windows and macOS. Results across schools and students [to measure].

task pageTask.svelteplayer on?group toggle · ?player=custom player<video> in the pageplays HLS natively?feature testnative engineSafari · iOShls.js 1.7.3Chrome · Edge · Firefox · AndroidStream iframe (old)fallback onlyyesnoyesnofails before Playboth engines play the same Cloudflare Stream HLS manifest · segments load only when the viewer presses Play
The editor's INTERACTIVE tab: the video paused on the station menu, the timeline with the interaction markers and the menu settings with Import SVG map
the editor: 10 interactions on one timeline
The player during the menu: Pick a station, with three cards — cones, ladder, jump rope
menu: hotspots from an SVG map
Gesture test: a plain coloured clip and the camera thumbnail with the detected skeleton
gesture test on mock clips
credits.txt

Credits

Development: Nilo River. Client: Hiveclass. Avatar: Ready Player Me. Pose: MediaPipe (Google). Base code: Mesekai (open source). Player demo scenes: Gemini (Nano Banana) and Google Vids. Hiveclass team and other credits [to measure]