Skip to content

LM Dashboard

LM Dashboard is a live "who needs help" board for a room full of students coding in the VEX block environment. It mirrors what they're doing from the Reflecks production backend onto your own machine, measures how much each student's code changes between runs (a plain edit distance, no black-box model), splits their session into episodes, raises intervention flags when someone is wheel-spinning, idle, exploring, or grinding through steady edits, and lays it all out on one screen.

%%{init: {"flowchart": {"nodeSpacing": 90, "rankSpacing": 110}, "themeVariables": {"fontSize": "22px"}}}%%
flowchart LR
    students["Students coding<br/>in VEX"] --> prod[("Reflecks<br/>production server")]
    prod -. "polls, read-only" .-> daemon["Daemon<br/>mirror and analyze"]
    daemon --> pg[("Postgres<br/>mirror")]
    pg --> api["Read API"]
    api --> dash["Researcher<br/>dashboards"]

How It Works, In One Paragraph

Students code in VEX, and their logs land in the Reflecks production server. A daemon asks that server's REST API for new events (keeping a cursor and backing off when things go quiet), drops the raw logs into Postgres, and keeps each tracked student's derived state, per-run edit distances, episodes, and flags, up to date in a materialized table. A small read API serves that table to a React dashboard over a live stream, so changes land on screen in about a quarter second. Only the daemon writes; the dashboard recomputes nothing, it just reads what's already there. And nothing ever flows back to production. It's a read-only mirror, full stop.

Each researcher works on their own isolated board behind a login: they sign in with the browser's native prompt, and every browser gets its own roster, notes, and picks. The daemon serves all the boards at once from a single shared mirror, so a student watched by two researchers is still pulled from production only once.

What You Get

For each student you track, the daemon takes a raw stream of VEX events and turns it into three things you can actually act on:

flowchart LR
    ev["One student's<br/>VEX event stream"] --> d{{"Local daemon<br/>read-only mirror"}}
    d --> strat["Per-run edit distance<br/>0 = re-run · small = edit · large = rewrite"]
    d --> epi["Episodes<br/>code · run · reset + pauses"]
    d --> flags["Intervention flags<br/>wheel-spin · resilience · inactive · explorer · step-by-step"]

The whole thing runs as a small Docker stack (Postgres + the API + the daemon), and production is never touched.

Where To Go Next

  • Quickstart


    Install it, add your credentials, and get all three processes running.

  • Architecture


    The CQRS plus materialized-view design and the polled micro-batch model.

  • Using The Dashboard


    Student cards, the who-needs-help column, drill-down, and reset.

  • API Reference


    Every endpoint the read API exposes.