A running log of updates to the Bellevue Ski School registration platform, newest first. See Keep a Changelog for the full developer changelog.
June 2026
Edit your contacts, plus a clearer 'waiver signed' moment
v0.8.10
Two family-portal polish fixes. First, signing a waiver now ends with a clear "Waiver signed" confirmation and automatically takes you back to your family portal after a moment — no more staring at a finished form wondering if it worked. Second, the emergency contacts and guardians you add from the portal are now fully editable: each shows up as a proper card (instead of a plain row that looked out of place) with an Edit button to fix a typo and a Remove option for contacts you no longer need. Any guardian in your household can update another guardian's details, so you can correct a co-parent or grandparent you added earlier.
Read Only admin accounts can no longer make changes
v0.8.9
Admin accounts with the Read Only role are now blocked from every change — enrollments, buses, seasons, households, students, volunteers, messages, broadcasts, and site settings — by a server-side check, not just hidden buttons. Deactivated accounts are blocked the same way. If a Read Only user attempts a change, they get a clear message explaining their role doesn't permit it.
Admins can see who they're signed in as — and sign out
v0.8.8
The admin sidebar now shows your actual name and role (President, Registrar, VP, and so on) instead of a placeholder, so it's always clear which account you're working under. There's also a new Sign out button right below it that ends your session and returns you to the sign-in page — no more clearing cookies to switch accounts.
May 2026
A real, easier-to-scan FAQ
v0.8.7
The registration page's FAQ now answers the questions families actually ask — passes and lift tickets, what to bring, injuries and safety, early pickup, refunds, and more — pulled straight from the Bellevue Ski School FAQ. Every question now starts collapsed and expands when you tap it, so you can jump straight to what you need instead of scrolling a wall of text.
Volunteers can sign their forms in the family portal
v0.8.6
Each required document is now marked as either a Registration form (signed by a guardian for a child) or a Volunteer form (signed by the volunteer themselves), and only shows up in the right place. If anyone in your household has volunteered for the season, a new "Volunteer waivers" section appears in your family portal with a Sign now link for each volunteer form — same online signing experience your child waivers already use, no waiting for an email. Admins gain a Waivers section on the enrollment detail sheet (so 'did Jane sign yet?' is answerable without leaving the page) and a Waivers column on the Volunteer table showing aggregate signing status per volunteer.
Registration now shows your season's real forms
v0.8.5
The waiver step of new-family registration used to show placeholder documents. It now shows exactly the forms your ski school configured for the season — and only the ones that apply to each child's chosen program. Right after payment you're taken straight into your family portal, already signed in, to sign everything online — no waiting for an email link, no printing, no paperwork.
Add guardians, contacts, and children from your portal
v0.8.4
Returning family? You no longer need to start a whole new registration to update your household. Right from your family portal you can now add another guardian (they'll be able to sign in with their own email), add as many emergency contacts as you need, and add another child — then enroll that child in a program for the season without leaving the page. Adding a child asks for a photo, just like the original sign-up, so instructors can recognize them on the mountain. Your existing primary emergency contact and everything else stays exactly as it was.
Request early dismissal from the portal
v0.8.3
Need to pick your child up at the mountain instead of putting them on the bus home? You can now request an early dismissal right from your family portal — pick the student(s), the class date, and a pickup time, and we'll email you the exact pickup instructions for their program. Requests can be cancelled from the portal up until 8:00am on the class day, and the other parent on your account gets a heads-up copy. After 8:00am, call the on-mountain line. This is the first phase; the chaperone and check-in side of the workflow is coming next.
Family portal — edit your emergency contact
v0.8.2
Your family's emergency contact now appears in the portal and can be edited inline, the same way you edit your own guardian details. Because it's shared across the whole family, saving updates the contact for every child at once — no need to repeat it per kid. Adding a relationship and a second contact is planned for a later release.
April 2026
Per-product sport + grade gating
v0.8.1
Each product can now narrow the sport(s) and grade range it inherits from its program. That makes it easy to offer "Snowboarding for grade 4+" and "Skiing for grade 2+" inside the same Elementary program without splitting the program in two. The wizard shows ineligible-but-active products as disabled cards with a clear reason, and Season Config → Products gains an Eligibility editor with inherit-by-default controls. Overrides can only narrow — the database rejects anything that widens the parent program.
Family portal — V1
v0.8.0
Signed-in guardians now have a real family portal at /portal. See your household address, every guardian on file, and every child with their current-season enrollment status (Active / Waitlist / Withdrawn / Pending / Not enrolled). Edit your own name, email, and phone number inline — changes save instantly. Each un-enrolled child shows a one-click "Enroll" button (pre-fill from your existing info is coming in a follow-up). Split-custody multi-household view, add-a-child, and medical-notes editing are tracked for subsequent releases.
The new-family registration wizard now runs end-to-end. Step 3 is a per-child program picker with eligibility gating (grades, sport, skill floor) and a waitlist banner when any selection is at capacity. Step 4 sequences through 4 waivers per child via a DocuSeal stub. Step 5 is a review + itemized total with an EARLYBIRD coupon stub and a Stripe Elements placeholder. Step 6 shows a confirmation number, active/waitlist summary, and next-steps. Real DocuSeal and Stripe integrations land in a follow-up — the wizard works end-to-end in dev without those credentials.
New-family registration wizard — Steps 1 & 2
v0.6.0
The new-family registration wizard is live at /register/wizard for Steps 1 (guardians + address + emergency contacts, 1–4 guardians with the first as primary, 1–2 household-level emergency contacts) and 2 (per-child details with photo upload validated both client-side and server-side against a 5 MB / JPEG · PNG · WEBP contract). Single-session by design — your entries are not saved, and the browser warns before you close mid-flow. Steps 3–6 (programs, waivers, pay, confirmation) land next.
Magic-link sign-in for returning families
v0.5.0
Returning families can now sign in with just their email. The /register page routes to two tiles (new family / returning family); the returning form sends a one-click, single-use, 24-hour magic link that opens /portal. Rate-limited to 3 requests per hour per person; enumeration-safe (the response is always the same neutral "check your inbox" regardless of whether the email matched). Tokens are 256-bit CSPRNG, SHA-256-hashed at rest; the portal session is a separate HMAC-signed cookie so guardian and admin auth surfaces stay isolated.
Public registration landing page
v0.4.0
First user-facing feature is live. The landing page automatically shows a countdown when registration is about to open, a "Start registration" call-to-action during the open window, and a neutral closed-state message afterward. Programs are listed with grade ranges, allowed sports, and starting prices; the FAQ renders admin-authored season content when available or falls back to a curated set. Families can leave their email to be notified when the window opens. Full keyboard accessibility, 375px mobile layout, and ISR caching (5-minute revalidation) keep it fast and accessible.
Supabase schema + domain logic port
v0.3.0
Ported 22 Supabase migration files, seed data, and 10 domain logic modules from the prior build. Includes typed Database schema (23 tables, 30+ enums), Supabase client helpers (browser/server/service-role), auth role helpers, Resend email wrapper with 4 transactional templates, DocuSeal API client, photo storage helpers, bus assignment optimizer, automation engine, and auth middleware protecting /admin routes.
Testing harness + CI pipeline
v0.2.0
Added ESLint 9 flat config with Prettier integration, husky pre-commit hooks with lint-staged, Playwright E2E smoke tests (5 passing), and a GitHub Actions CI workflow that gates every PR on lint, format, typecheck, unit tests, build, and E2E. The full pipeline now runs automatically on every push and pull request.
Theming system + component library foundation
v0.1.0
Installed Tailwind CSS v4, shadcn/ui with 22 Radix-based primitives, and 5 custom BSS components (Field, Spinner, EmptyState, ThemeToggle, IconButton). Built the full semantic token system with BSS navy branding, light and dark themes, and OS-preference fallback — all 42 foreground/background pairs verified against WCAG AA contrast ratios via automated test. Added Vitest for unit testing and Geist font via next/font.
Started the Bellevue Ski School registration platform over from scratch with a reusable-components-first philosophy. Landed the operating manual (CLAUDE.md), design constitution (design.md), GitHub issue/PR templates, and a minimal Next.js 15 skeleton including the dynamic sitemap and this release-notes page. No features yet — subsequent sessions add theming, the test harness, and port the Supabase migrations from the prior build.