English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

Analytics

Public & anonymized. Same page for everyone, no account needed. Rows hold shape, never identity: no ip, no cookie id, no user id, no answer text. Cells under 7 observations stay hidden. How this data works · JSON

un (continuing education) · Last 28 days · computed 2026-10-19 07:08 UTC · refreshes every few minutes

Why this page exists

A family that trusts a learning system deserves to see how it performs. Numbers a company would keep private appear here for anyone: how visitors arrive, which lessons get finished, where learners stop, whether they come back, & how the grading behaves. Open data as intellectual capital.

What a row can hold

  • Page view: a route name such as "nu lesson" or "home" (never a raw address), a lesson slug when a lesson route matched, referrer class & domain (never a search query), device class from viewport width, time on page, scroll depth, the page's position in the session, a return-cadence bucket, a visit-count bucket, the viewer's local hour & weekday, site language, browser language (two letters), & whether the viewer had signed in.
  • Lesson session: lesson slug, steps on the shortest path, steps completed, questions answered, attempts, help questions, completion, score, durations, read-aloud plays, whether the next lesson or the sign-up button got clicked.
  • Sign-up: written once, at the first verified login: entry page, referrer class & domain, last page, last lesson, lessons touched, pages before. No link to the account it produced.
  • Graded answer: lesson, step, category, grader, confidence, time, outcome, answer length. Never the answer.
  • Model call: purpose, host, model name, latency, success. Never the prompt or completion.

What a row can never hold

No ip address, no cookie identifier, no fingerprint, no user id, no email, no raw url, no search query, no answer text, no prompt.

How a browser reports without identifying itself

Return cadence & visit count live in the browser's own local storage. A page reports only a bucket ("came back within a week"), never a timestamp or a device id. The journey before a sign-up lives in session storage until the join form submits; the server keeps route names only until the first verified login, then writes one summary row. Clearing browser storage resets all of it. Without JavaScript nothing gets sent at all; the sign-up row still lands, with the journey fields empty.

Reporting floor

Any breakdown cell (a referring domain, an entry page, a lesson, a language) with fewer than 7 observations stays hidden so a single visitor never appears as a row.

Satisfaction index

Computed per lesson session from behavior: 35% progress, 20% completed, 15% attempt quality, 15% attention, 15% continuation. Sessions visible under 7 seconds score 0. A proxy, never a survey.

Open data

Every tab as JSON: analytics?format=json. Same aggregates, same floor. Source code: unhomeschool/views/analytics.py, unhomeschool/signals.py, unhomeschool/static/js/signals.js.