Every screen, every state, every route through Lightkeepers.
Read out of the live codebase rather than described from memory. This is the brief a wireframe set gets built from: what exists, what each screen does in each of its states, and where the holes are.
The five actors
Who can be on the other side of the screen, and what lets them in.
| Actor | How they exist | What gates them |
|---|---|---|
| Visitor | No account | Nothing. Every marketing route is ungated |
| Parent, unverified | Signed up, email not confirmed | Held at /app/verify-email |
| Parent, verified | Supabase session in an httpOnly cookie | All of /app/* except admin |
| Child | A signed cookie layered on the parent's session, 12 hour life | Optional 4 digit PIN. Locked out of settings, documents and work review |
| Admin | An is_admin() check, re-run inside the database | /app/admin/* only |
The fact that shapes every wireframe
Get this wrong and half the screen designs are wrong with it.
A child never logs in.
There is no child account and no child password. The parent signs in, then hands the device over at /app/switch/[id], which checks an optional four digit PIN and sets a signed 12 hour cookie on top of the parent's own session.
So most app screens have two designs, not one. The lesson page is the clearest case: a child can type answers but never sees the answer key download, while a parent sees the answer key but gets read-only fields. Settings, documents and work review redirect away entirely in child mode.
Journey A. Visitor to signup
The free side. Fully built, and the most finished part of the product.
The nine steps
| # | Question | Input |
|---|---|---|
| 1 | Where do you live? | Single select, eight states |
| 2 | What's your first name? | Text |
| 3 | Tell us about your children | Repeatable block: name, year or age, one interest. Add and remove rows |
| 4 | What's your current situation? | Still enrolled, already withdrawn, starting fresh |
| 5 | When do you want to start? | Right away, few weeks, next term, not sure |
| 6 | What's your biggest worry? | Paperwork, curriculum, socialisation, not sure |
| 7 | Who will be the main educator? | Two text fields. Prefills from step 2 |
| 8 | How will you track progress? | Multi select plus free text. All four preselected |
| 9 | Which style sounds like you? | Structured, eclectic, child-led |
Four things already broken here
The /start copy promises "six quick questions" for a nine step wizard. The progress bar is calculated so step 9 reads 88.9 percent and never reaches 100. Step 9 collects a learning style that gates the final button and is then never shown on the plan. And the state content file is flagged as a draft that no page may render from, while all three public surfaces render from it today.
Journey B. Signup to a generated term
The funnel that decides whether anyone ever sees the product working.
The seven states of the hub screen
The build screen is already good work. It shows a per block checklist, one row per subject and week, each pending, building or done. A flavour line rotates every six seconds and is seeded with the child's own interests. It reassures the parent that closing the browser is safe, and it surfaces an early "first lessons are ready, start now" callout before the whole term finishes.
Two approvals, one dead end
A term plan reaches a parent through two gates. Staff move it from draft to vetted in the admin queue, then the parent moves it from vetted to live by approving it. A plan sitting at draft shows the parent "awaiting review" with no action, no timeline and no way to nudge it. Worse, the dashboard reads that same state as "no plan" and tells them to generate a term they already have. Two screens describing reality differently is the single worst moment in the product today.
Journey C. The child's daily loop
Parent hands over the device. Everything from here is designed for a kid.
Answers save themselves
Questions are detected from the lesson markdown in five different ways, so the field layout varies by lesson. Each answer saves 800 milliseconds after typing stops and immediately on blur, with a saving, saved or could not save status line. Worth knowing for the wireframes: a parent viewing a lesson gets read-only fields. Only a child mode session can write.
Ask Sarah
A fixed bubble, scoped to "about this lesson only", 300 characters per question and twenty questions per lesson per day. The question is stored, an external service answers it, and the page polls every three seconds for up to a minute showing a thinking bubble, then a graceful apology if nothing arrives.
One honesty problem
Locked nodes on the quest map are still ordinary links, and nothing on the server stops a child opening a later lesson directly. The only real sequencing lock in the product is the step accordion inside a lesson. Either enforce the lock or stop drawing padlocks.
Journey D. Parent oversight
The half of the product a parent pays for and a child never sees.
Dashboard /app
A greeting band that changes on this week's actual progress, a conditional onboarding nudge, a compliance-due card that appears within sixty days of a deadline, a single "today's quest" next action, per child progress with pace pills and week dots, then the child cards. It polls for attention signals every forty five seconds and shows a "needs a look" badge, where a signal means a flagged Sarah message or a lesson finished with low confidence in the last fortnight.
Work review /app/work/[id]
Read only, grouped by subject then week, newest first. A summary strip counts lessons done this week, average confidence this term, lessons worth revisiting and Sarah questions asked. Each lesson expands to show exactly what the child wrote and the full Sarah thread. Printable per lesson, per week or all at once.
Compliance documents /app/documents
| Document | What it produces |
|---|---|
| Checklist | The state's registration checklist as printable tickboxes with sources |
| Education plan | Queensland and WA get a real state-specific plan. The other six states get a generic template with a "verify this yourself" warning banner |
| Log | A blank 24 row table. Populated from nothing, while the database holds every completed lesson |
| Portfolio | Auto-curated work samples by subject, pulled from finished lessons and saved answers |
Journey E. Admin vetting
Deliberately minimal. The team's own words: anything else is a job for the database console.
The queue lists term plans filtered by status. Opening one shows every lesson with its eval flags as raw JSON, plus a table of generated assets. The reviewer has exactly one lever: a status dropdown and an update button. There is no per lesson approve, reject or edit, so a reviewer who dislikes one lesson out of forty must reject the whole term or let it through. The generation request list is a read-only monitor with no retry, and the household list has no edit controls at all.
Screen inventory
Thirty two routes across six surfaces.
Public 4
- /
- /start
- /start/plan
- /guide/[state]
Auth 6
- /app/login
- /app/signup
- /app/verify-email
- /app/reset-password
- /app/reset-password/confirm
- /app/logout
Onboarding 2
- /app/onboarding (3 steps)
- /app/settings/children/new (4 steps)
Parent 10
- /app
- /app/settings
- /app/settings/children/[id]
- /app/documents
- /documents/[childId]/checklist
- /education-plan
- /log
- /portfolio
- /app/work/[id]
- /app/digest-preview
Child 5
- /app/switch/[id]
- /app/child/[id]
- /app/lesson/[id]
- /app/quest/[termPlanId]
- /app/exit-profile
Admin 5
- /app/admin
- /app/admin/households
- /app/admin/generation-requests
- /app/admin/term-plans
- /app/admin/term-plans/[id]
Where one route is really five designs
Thirty two routes, but roughly sixty distinct things to draw.
| Screen | States | What to draw |
|---|---|---|
| /app/child/[id] | 7 | No plan, building, awaiting review, ready for review, failed, live, partially live |
| /app/lesson/[id] | 9 | Step one, mid lesson, final step with completion card, already complete, celebration, Sarah open, Sarah thinking, Sarah failed, empty lesson |
| /app | 5 | No children, children with no plan, building, in progress, all complete |
| /start/plan | 10 | Nine wizard steps plus the plan output |
| /app/quest/[id] | 3 | Early term, mid term, complete |
| /app/work/[id] | 3 | Empty, populated, flagged concerns |
Gaps and openings
Ranked by how much they hurt a real person using this today.
A parent whose term is stuck before vetting sees "awaiting review" with no action and no timeline, while the dashboard tells them to generate a plan they already have.
Nothing reaches a parent when a term finishes building, when a plan needs approving, or when Sarah flags a message. The weekly digest toggle exists in settings and does nothing.
Twenty four empty rows, while the database already holds every completed lesson with its date and subject.
Only Queensland and WA are properly served. A content gap rather than a code one, but it decides what the screen is allowed to claim.
Quest map padlocks and checklist states are decorative. Nothing stops a child opening a later lesson directly.
Unlimited attempts at the child switch screen, with no delay and no counter.
A child sees today's lesson and a quest map, but never a view of their own week or term.
The request list is a read-only monitor, so a failure has to be fixed from outside the product.
The reviewer's only lever is a whole plan status flip.
Settings offers no way out.
Suggested wireframe order
In the order a user meets them, with the two compounding screens pulled to the front.
- The child hub, all seven statesIt is the junction. Everything routes through it.
- The lesson, all nine statesIt is the actual product. Get this right and the rest follows.
- The dashboard, five statesThe parent's home base.
- Onboarding and add child, seven stepsThe funnel that decides whether anyone reaches a term at all.
- Quest map and the badge systemThe delight layer, and there is already staged art to work with.
- Work review and compliance documentsThe parent's reason to keep paying.
- Public side and the nine step wizardAlready the most finished part of the product.
- AdminFunctional is enough.