Private administration page. Do not link to this from your public site.
Enter the admin password you set as the ADMIN_TOKEN secret in Cloudflare.
You stay signed in through a reload. Closing this tab signs you out.
Analytics are switched off in the Worker (ANALYTICS = false). Only the spending caps are being counted.
Reader questions per day in navy, development in grey above it. Hover a bar for the date and both counts. The two were shown as one figure until 23 September 2026, which overstated reader use on any day that carried testing.
Aggregate totals only — no identifiers, no devices, no question text. Daily totals expire automatically after 90 days.
| Step | Median | 90th percentile |
|---|
Seconds for each step of an answer and tokens sent to and from the model, over every answer recorded on the chosen day. A regeneration counts inside the answer it belongs to. The fixed origin reply is left out, because it never calls the model. Read from the per-answer records, which carry no question or answer text.
Questions per day, per code, with the last date each code was used and the band it starts at. Counts are kept for 90 days and expire on their own. A day before the counts were retained shows as a dash rather than a zero, because nothing was kept then and an empty column would read as a quiet day.
Give each buyer, class, or co-op its own code. Codes are not case sensitive. Revoking one takes effect immediately — no redeploy needed.
Pick the right daily allowance and the term takes care of itself. An individual code allows 15 questions a day and runs two years. A classroom code allows 75 a day and runs ten months — a school year. A parent code allows 5 a day on either tier. Both terms start the first time the code is used, not today, so a book that sits on a shelf for a year still gives its buyer a full term. The optional date below is a hard stop on top of that, for a reviewer copy or a pilot that must end on a set day.
Teacher or parent code: the adult's name. Student code: a label only, for example Cox family, student 2 or Lincoln class, S07. Never enter a child's name. The list matching labels to children stays with you, off the service.
Kept here in the admin so a search on the parent finds the whole family. It goes into no download, no daily file and nothing the tutor sees.
Every code is minted by the service in the random AP-XXXXX-XXXXX format. A code cannot be typed in.
A teacher code can switch itself into the student view from inside the app, to preview what the class sees. It never runs the other way — a student code cannot be raised to a teacher code.
Set once, when the code is issued, and never changed afterwards, so a code cannot be promoted into the signed-off cohort by a typo. A development code is the only one that does not spend the readers' daily ceiling; it has its own, smaller one.
Set this and PATCH starts at that band without asking. Leave it on “ask the student” and the code behaves as codes always have. Human Dimensions is not listed because it is a kind of question rather than a level — PATCH offers it at every band when the question calls for it.
A new code works for three months from the day it is first used. Choose no expiry for demonstrations and reviewers, or a date, which is then the only stop. Codes already issued keep the term they have.
Every question and answer from a code with review consent ticked, newest first. Click a row for the full question, the served answer, the draft before the reviewer and the reviewer's notes. Codes only, never names: the list of who holds which code stays in the codes table below.
| Time (UTC) | Code | Consent | Band | Question | Review | Figure | Status | Seconds | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| Choose dates and press Show. | |||||||||
A CSV with the columns id, verdict (correct, corrected, wrong or not reviewed), corrected_text (needed for corrected), reviewer_note and review_date (YYYY-MM-DD, today if empty), or the day's JSONL file with those fields filled in. Every row is checked first; if any row has a fault, nothing is applied and the faults are listed.
Prepare the sheet in Excel with one row per code and these seven columns, in any order, with the names in the first row: issued to, type (student, teacher or parent), band (Foundations, High School, Advanced Enrichment, or empty to let the student choose), cohort (pilot, scaapt, dev, or empty for unassigned), history (yes or no), expiry (empty for three months from first use, none for no expiry, or a date, which is then the only stop) and daily allowance (individual or classroom). Save it as CSV and choose it below. Up to 100 new codes per upload. An optional review consent column takes yes, or empty: empty means yes for a dev code and not yet for every other code, so a family's questions are recorded only once you mark yes. An optional client id column takes your Client ID (CH-T-004, CH-S-012, CH-R-001) or empty.
A code already in the sheet always stays. An optional code column may be included. A row with a code in it is shown as kept: it is never issued again and comes back on the returned sheet exactly as it went in. A kept code that is not in your codes list, or is revoked, is marked as a fault. Only rows with the code cell empty get a new code.
Nothing is issued until you confirm. Every row is shown first, and any fault is marked: a missing issued to, an unknown type, band, cohort or allowance, a duplicate row, or a date that cannot be read. The new codes get one batch number, and the whole sheet comes back in its own order with the new codes filled in.
| Row | Code | Status | Issued to | Type | Band | Cohort | History | Review consent | Expiry | Daily allowance | Fault |
|---|
If a sheet turns out to be wrong, every code it issued can be revoked together. AP-66814 is never touched.
A CSV with a code column, up to 100 codes. Every row is shown first. A code not in your list, one already revoked, a repeated row, and AP-66814 are marked and skipped. One reason covers the whole sheet and is kept with each code. Nothing is revoked until you confirm, and Restore works on each code as it does today.
| Row | Code | Issued to | Result |
|---|
| Code | Issued to | Type | Band | Cohort | History | Review | Expiry | Issued | Status | |
|---|---|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||||
Changes the record in place. It does not revoke the code and does not mint a new one, so the code keeps working throughout. Cohort is set when a code is issued and is not editable. Changing the tier changes the daily cap and leaves the term end where it is. Daily limit overrides the tier for this one code only. Leave it empty and the tier decides, which is what every code did before this field existed.