Front Door: signup flow mockups

Climbing with Phonics

Phonics lessons your child does out loud, one sound at a time.

Your child hears a sound, says it, and climbs. You see each day's progress.

It's brand new, so it's free while we test it. Children using it is how it gets good. You tell us what breaks, and we fix it.

Adults only. No card is taken. Privacy notice (shown before you type anything).

How it works

  1. 1You ask to join. We approve a small number of families at a time.
  2. 2You add your children (up to 10) and set where each one starts.
  3. 3Your child opens their climb on a tablet. You check progress here.

Who made it

[Dorothy's role and credentials go here, checked before anything is published. No testimonials or results claims until they are real.]

Why is it free?

[Draft, from the campaign plan] It hasn't been used by real children yet. Early families help us make it good. If it later becomes paid monthly, you hear first by email, with time to decide.

What do you keep about my child?

A first name or nickname, grade and lesson progress. Spoken answers are sent to Microsoft Azure to be scored. We don't ask for a birthday, school or photo.

Saves: nothing. A static page. No trackers or ad pixels (plan §5.1).
Updates

Tell me when it opens

We'll email you about the launch and big changes. That's all.

Your email
Cloudflare check, runs by itself (Turnstile, no puzzle for most people)

You're not on the list until you tap the link we email you. Unsubscribe from any email. Privacy notice.

Next state: after Send
Check your email

We sent a link to [email protected] EXAMPLE. Tap it to confirm. It expires in 24 hours. Nothing came? Check spam, or try again in a minute.

After the link is tapped
You're on the list.

Want to try it now instead?

Saves (server only, via a Cloudflare Pages Function): email_leads: email, status pending → confirmed, hash of the confirm token, notice version, times. Not a login. Browsers can never read this table.
Free pilot

Ask to join

For parents and teachers. Children never get their own login.

I am a
ParentTeacher
Your email
Cloudflare check (Turnstile)
Continue with Google (later)

No password to remember. By continuing you agree to the terms and privacy notice.

Next state: code sent
Enter the 6-digit code

We emailed a code to [email protected] EXAMPLE. It works for 1 hour. The email also has a link if you're on the same device.

Didn't get it? You can ask again after 60 seconds.

Saves: Supabase Auth creates the user (auth.users). A trigger adds accounts with approval_status = 'pending', plan = 'pilot_free', max_active_students = 10.
Signed in as [email protected] EXAMPLE

Thanks! Your request is in.

The pilot is small, so a real person looks at every request.

  1. ✓Email confirmed
  2. 2We review your request
    Usually within [N] days. We'll email you.
  3. 3Short welcome call
    10 minutes by video. We explain what's kept about your child and check you're the parent. This is how we confirm consent.
  4. 4Add your children

You can't add children until you're approved. Changed your mind? Delete my request.

Other states

Waitlisted: "The pilot is full right now. You're next in line."
Declined: "We can't add you to this pilot." (with a contact link)

Reads: accounts.approval_status. Bruce changes it in the Supabase SQL editor with private.set_approval(...), which also writes account_events. Nobody can approve themselves (tested).
Step 1 of 2

About you

Your name
Family name, as your child will see it (or class name)
School or group (teachers only, optional)

What we keep, and your OK

Notice version 2026-10-18-draft. Read the full notice.

✓Lesson progress (required). Which sounds and words my child practised, right or not yet, and my notes.
✓Voice scoring (needed for speaking lessons). My child's spoken answers are sent to Microsoft Azure to be scored.
Keep recordings (optional, off). Keep audio after scoring so a teacher can listen back.
✓I'm the parent or legal guardian of the children I add. (Teachers: different wording, see plan §7.)

You can withdraw consent later in Settings. That stops new lessons and starts deleting the data.

Saves: accounts (full_name, role, organization, details_completed_at); workspaces (name, kind family/classroom; owner membership added by trigger); consent_records (notice_version, lesson_data, voice_to_azure, keep_voice_recordings, given_at). Bruce sets verified_at after the welcome call (private.verify_consent).
Step 2 of 2 · Child 3 of 10

Add a child

First name or nicknameThis is what your child sees and taps.
Grade
Pre-KK1234+
Where should Leo start?
The beginningA sound I chooseShort placement check
Teacher or class (optional)
More (most families skip this)
Microphone strictness
Young childAge 8 to 10Older
A reading test from somewhere else (optional)
This is a
Real childPractice / test child
Short note (optional, 280 letters, no medical details)
Not asked, on purpose: birthday, school name, photo, child email or password. Grade replaces birthday (the data dictionary flags an exact date of birth as unplanned).
Saves: students: id stu_+10, display_name, grade (-1..4), start_lesson / placement_source, teacher_class, speech_profile, outside_test_*, kind, intake_note. Blocked by the database unless the account is approved, owns the family and has verified consent, and has fewer than 10 active children (all tested).
The Example family EXAMPLE

Your children

3 of 10 children
Sam
Grade 1 · Starts at sound 1 · Real child
Edit
Mia
K · Placement check not done yet
Edit
Leo
Grade 1 · Starts at the beginning · New
Edit
Next
Set up your child's tablet

Open the app on the tablet while signed in and tap "Use this tablet for our family". Your children then pick their name to start. (Device set-up is a later step in the plan.)

Archive a child to free a place. Deleting a child, and downloading their data, come in a later step.

At 10 of 10

"You've added 10 children, the most for one account in the pilot. Archive one to add another." The Add button is greyed out.

Reads: students where the adult is a member of the family (RLS). Another family's children never show (tested). Archive sets archived; un-archiving past 10 is refused.