Changelog

What we shipped, when. Newest first.

Assessment review exports — polished progress PDFs

18 June 2026

What's new

New — Programme Review export

Status: Pending enablement (deploys with the next release)

  • From the Assessments screen there's a new Export Review action that

produces a clean PDF of the students and syllabus items that need review — defaulting to the Red and Amber scores, so you get a ready-made worklist for the next few weeks

  • The PDF is grouped by grade, then syllabus item, and each line shows

the student, their RAG status, the latest comment, how many comments there are, and when the score was last updated

  • You can tune it before exporting: choose the programme and grade

(or all grades), pick which of Red / Amber / Green to include, limit it to just the candidates you currently have filtered on screen, and decide whether to include the latest comment, all comments, or none

New — Student assessment progress PDF

Status: Pending enablement (deploys with the next release)

  • A parent/member-friendly progress report for a student's current grade,

available from the student profile actions menu and as a quick one-tap download on each assessment row

  • Uses friendly language instead of traffic-light jargon — **Red → Needs

practice, Amber → Developing, Green → Secure** — with an at-a-glance "percent secure" and a clear summary of where they're up to

  • Options let you include the coach's comments, show or hide the

already-secure items, and show or hide items not yet assessed

Both exports are generated securely on the server, scoped strictly to your own club's data, and don't change anything about how assessments are scored. They carry your club logo and name, a clean heading and the date generated, and show a tidy empty state when there's nothing to report.

Reliability — Exact-pence money model (behind the scenes)

Status: Pending enablement (rolls out in stacked, reviewed releases)

  • Money across invoices, line items, membership plans, charges and events is

moving to exact integer pence alongside the existing decimal amounts, so there's never any rounding drift in what you're invoiced, what's collected by card or Direct Debit, or what your reports add up to

  • Every place that writes money now records the exact pence at the same time,

and the change is fully backwards-compatible — existing amounts are preserved untouched and keep working

  • Card and Direct Debit collections, recurring Direct Debit set-ups, and

insurance/renewal payments of an existing invoice or plan now charge the exact stored amount

  • Reports, invoice and billing screens, payment pages and invoice PDFs now

read from the exact pence too (falling back to the older decimal only for historical records), so every figure on screen matches what's charged

  • Fix: the Financial report's headline revenue, outstanding and refund

figures were being shown at 1/100th of their true value (a recent display bug); they now show the correct amounts. No prices changed — only the Financial report's displayed totals are corrected

  • No prices or plan amounts are changed anywhere — this is a correctness and

reliability improvement to how money is stored, processed and displayed

Crisper, consistent icons across the app

14 June 2026

What's new

Improved — One clean icon set everywhere

Status: Pending enablement (deploys with the next release)

  • The main navigation, top bar and parent portal now use a single,

professionally drawn icon set instead of a mix of inline graphics and emoji — so every menu, tab and button looks like part of one product

  • The automation builder's step icons (email, SMS, wait, condition,

notify, tag, and so on) now share that same crisp set, in both the visual flow view and the simple list view

  • Activity feeds — both the dashboard "what just happened" widget and a

student's own timeline — now draw promotions, payments, notes, emails and the rest from one shared icon map, so the same event always looks the same wherever you see it

  • Tasks, Smart Planning tabs and the register's lock / warning / booking

banners have all moved to the new icons too

  • The register screen is now fully consistent end to end — class lists,

venue and headcount markers, trial counts, the health and lesson-plan buttons, over-capacity and closed-club notices, birthday and blocked markers, and the catch-up / cancel-booking controls all share one set

  • A student's activity timeline matches too: empty state, View PDF link,

the newer/older pagination controls and the email-preview close button

  • Reports now share the set as well — the summary stat cards on the

Accident, Owner Overview and Portal Analytics reports, the attendance alert flags (ghost, declining, comeback and the rest) on the Student Analytics report, and the field tick in scheduled-report setup

This is a polish pass: nothing about how these features work has changed — they just look sharper and more consistent. Icons that are purely decorative are hidden from screen readers, while icon-only buttons keep their proper labels.

Improved — Reports tell the truth about your programme lens

Status: Pending enablement (deploys with the next release)

For clubs running more than one programme (e.g. Martial Arts and Dance), reports are now honest and consistent about which programme's numbers you're looking at:

  • Every report now says exactly what it's showing — **"<Programme> lens

applied", "All programmes", "Club-wide report", or "Lens filtering not available for this report yet"** — so you never see a programme label sitting over whole-club numbers

  • Many more reports now actually filter by the lens: Membership, Renewals,

Progression, Student Analytics, Accidents, Waiting Lists, Households and the Owner Overview, alongside the ones that already did

  • Financial figures are attributed per programme from invoice line items,

so one programme's revenue is never visible under another's lens (outstanding, aging and refunds stay club-wide and say so)

  • Reports can now look back through an archived programme — archived

programmes are hidden from day-to-day menus but available in the reports lens picker under "Archived"

  • Historic reports attribute records to the programme they happened in

(and to who was enrolled at the time), so moving a member between programmes no longer rewrites their history

Under the hood, programmes are now lifecycle-safe: they're archived rather than deleted (a programme with linked history can't be hard-deleted), a member changing programme properly closes the old enrolment and opens a new one, and attendance now records which programme it was for.

A more consistent, polished interface

12 June 2026

What's new

Improved — Every page now shares one layout shell

Status: Pending enablement (deploys with the next release)

  • All signed-in pages now share a single layout foundation — the same

background colour, content width, padding and section rhythm — so moving between Dashboard, Households, Students, Automations, Tasks, Enrolments, Reports and the rest no longer shifts or jumps

  • Reading-style pages (changelog, feedback, inbox) use a narrower column

of the same shell so forms and articles stay comfortable to read

  • Menus, the navigation drawer and the mobile menu now share the same

panel colour as dialogs, so every floating panel feels like part of one product

Today is about consistency: one shared design system across the whole platform, so every page uses the same buttons, the same status colours and the same layout rhythm.

Fixed — Top-nav menus now work by tap and keyboard, not just hover

Status: Pending enablement (deploys with the next release)

  • The Students / Calendar / Gradings / More menus in the top bar were

hover-only, which is unreliable on tablets where the desktop nav shows but there's no mouse. They now open on click/tap, close on Escape (returning focus to the button), close when you click outside, and expose proper open/closed state to screen readers

Improved — Dialogs keep keyboard focus where it belongs

Status: Pending enablement (deploys with the next release)

  • Shared dialogs now trap keyboard focus inside while open and return it

to the control that opened them on close — the standard behaviour keyboard and screen-reader users expect

Fixed — Rounded corners no longer leak onto mobile

Status: Pending enablement (deploys with the next release)

  • Cards and panels that are only meant to be rounded on larger screens

(e.g. a layout that goes flush-to-edge on a phone) were getting a rounded corner on mobile anyway, because of how the global corner styling matched class names. The flat-12px corner rule now uses proper theme radius tokens, so responsive corners behave per screen size and the "bold" / "minimal" themes still get their own corner treatment

Fixed — Top navigation no longer overflows on smaller laptops

Status: Pending enablement (deploys with the next release)

  • On ~1280px-wide screens the top bar's right-hand icons could run off

the edge of the screen. The bar now uses tighter spacing on mid-size screens and tucks the two lowest-priority icons (Reports, Accident Report) into a "More" menu until there's room to show them inline

Improved — Bigger touch targets on phones and tablets

Status: Pending enablement (deploys with the next release)

  • Navigation pills, in-page tabs and the top-bar icons now meet the

44px minimum touch-target size on touch devices, so they're easier to tap accurately (no change on desktop with a mouse)

Improved — More status badges share the global colour language

Status: Pending enablement (deploys with the next release)

  • The household member list, external events, communications map and

email-template versions now draw their status chips from the same five-colour vocabulary as the rest of the app — so, for example, a "leaver" reads as a calm neutral grey everywhere instead of alarming red in one place and grey in another

  • Extended in a follow-up to the external-event detail page (event,

payment and organiser-approval chips) and the member profile header, with shared colours added for awaiting / confirmed / rejected, open / closed and partial-refund states

Fixed — The whole app now actually renders in its intended font

Status: Pending enablement (deploys with the next release)

  • The platform ships the Geist typeface, but a leftover line in the

base styles was silently overriding it with Arial everywhere — so the whole app had been rendering in the system fallback font. Geist now applies app-wide, with a clean fallback stack if it ever fails to load

  • Tightened the type scale for a more premium feel: a consistent base

body size and slightly larger card titles, matching the rest of the spacing and heading rhythm

Improved — Subtle motion (first pass)

Status: Pending enablement (deploys with the next release)

  • Introduced a shared motion system: the dashboard's sections and stat

tiles now ease in gently as the page loads, and dialogs animate both open and closed (previously they only animated open and then vanished)

  • All of it respects the "reduce motion" accessibility setting — if your

device asks for reduced motion, the movement is dropped and only a quick fade remains

Improved — Every page now eases in

Status: Pending enablement (deploys with the next release)

  • Navigating between pages now plays a quick, subtle fade-and-rise so the

app feels alive as you move around — applied globally to every signed-in page in one place, rather than page by page

  • Slightly more present than the first pass (a touch more movement, still

well under a third of a second), and dashboard cards now lift gently on hover. Fully disabled for anyone who's asked for reduced motion

Improved — Subtle motion (second pass)

Status: Pending enablement (deploys with the next release)

  • Building the steps of an automation now animates: adding a step slides

it gently into place, removing one eases it out, and re-ordering steps glides them to their new position instead of jumping

  • New shared building blocks for the rest of the rollout: page headers

ease in on load, a "Save → Saving… → ✓ Saved" button state for forms, and a soft one-time row highlight after a table row is saved, paused or retried (so tiny updates don't need a full pop-up notification)

  • Reordered the motion so heavy, frequently-used libraries only load

where they're needed (the automation builder), keeping everyday pages lean

Improved — Builder step editor + more consistent status colours

Status: Pending enablement (deploys with the next release)

  • The automation builder's step editor now uses the shared dialog, so it

gets the same focus trapping, Escape-to-close and open animation as every other dialog

  • The top-nav menu arrows now flip based on whether the menu is actually

open (they previously keyed off hover, which didn't fit the new tap-to-open menus)

  • Status chips on the Trials list, the Comms Flows settings tab and the

automation queue panel now use the shared colour vocabulary too

Improved — One colour language for every status

Status: Pending enablement (deploys with the next release)

  • Every status the platform shows — active, paused, sent, delivered,

failed, bounced, overdue, scheduled, running, succeeded, cancelled, suppressed and more — now draws from a single five-colour vocabulary: green = healthy, blue = in flight, amber = needs attention, red = failed or blocked, grey = inactive or historical

  • The same status is now the same colour and the same word on every

page, and a status the system hasn't seen before still renders as a tidy neutral chip instead of breaking

Improved — Shared building blocks for every page

Status: Pending enablement (deploys with the next release; pages adopt these progressively)

  • One standard kit now powers page headers, stat tiles, cards, forms,

tabs, tables and dialogs — so every page gets the same layout rhythm, the same loading and empty states, and the same button behaviour (including the double-click protection on anything that saves)

  • Tab strips that overflow on small screens now show a soft fade at the

edge so it's obvious there are more tabs, and the active tab always scrolls into view when you arrive from a link

  • Confirmation dialogs follow one pattern: they tell you exactly what

will happen ("This will send to 142 recipients") before you commit, and the confirm button can't be double-pressed

  • Tables get a consistent treatment everywhere: a loading shimmer, a

friendly empty state with a next step, a clear error with "Try again", and a card layout on phones instead of a squashed table

Improved — Students directory: clearer confirmations

Status: Pending enablement (deploys with the next release)

  • Bulk actions in the member directory now confirm in a proper dialog

that says exactly what will happen — "This will email 23 students who aren't linked to Telegram yet" or "This will set 8 selected students to leaver" — instead of a bare browser pop-up

  • Results arrive as quiet corner notifications ("Telegram invites

sent — 23 emailed, 2 skipped") rather than blocking alert boxes, and a failed bulk update keeps your selection so you can retry

Improved — Automations statuses join the shared colour language

Status: Pending enablement (deploys with the next release)

  • Run, send and delivery statuses across the Automations Command Centre

now use the platform-wide status colours — a failed run is the same red as a failed email everywhere else, and the colours follow your light/dark theme instead of fixed palette values

Improved — Invoice statuses match everywhere

Status: Pending enablement (deploys with the next release)

  • Paid / Unpaid / Overdue chips on the member transactions tab, the

household invoices view and the parent portal now share one colour treatment — previously each surface had its own slightly different shades

Improved — A focused top bar

Status: Pending enablement (deploys with the next release)

  • The top navigation bar now shows just the day-to-day essentials —

Dashboard, Households, Students and Register. Smart Planning and Settings have moved out of the top bar (they still live in the menu drawer), so the bar stays focused on what you reach for every session

Fixed — The number pad now appears for security codes on mobile

Status: Pending enablement (deploys with the next release)

  • Entering a two-factor / one-time login code on a phone was popping

the full text keyboard, which made no sense for a 6-digit number. The staff login, onboarding setup, parent-portal login and the security settings code fields now bring up the numeric keypad directly, so the digits are right there under your thumb

Improved — Marketing pages: clearer pricing, tidier copy

Status: Pending enablement (deploys with the next release)

  • Tightened the public homepage: fixed a sizing glitch on the price,

corrected the brand wording in the header to "AllSorted", and added the same "no per-student fees, no add-ons, no card required" reassurance the rest of the marketing pages carry

Improved — Pricing updated to £69 / month

Status: Pending enablement (deploys with the next release)

  • AllSorted's headline price is now £69 per month per club, flat — still

every feature included, unlimited students and staff, 14-day free trial with no card. Updated consistently across the homepage, pricing page, feature page, sport landing pages, comparison tables and the structured data search engines read

Improved — Marketing pages feel alive (and on-brand)

Status: Pending enablement (deploys with the next release)

  • Five new club-type landing pages: football, rugby, basketball,

cheerleading and performing arts — alongside the existing martial arts, gymnastics, dance, swimming and multi-sport pages

  • The animated 3D scene behind marketing headlines now picks up the

brand accent colour automatically (it was stuck on a hardcoded blue/purple), drifts gently as you scroll, and subtly follows your cursor — and it now stops rendering entirely once it's off screen, so scrolling the rest of the page costs nothing

  • Headlines, subheads and buttons now arrive in a quick sequence when

a page loads instead of all at once; the club-type grid cascades in as you reach it

  • The product mock-up panels now drift at different rates as you

scroll, giving the stack a sense of depth, and the dashboard numbers count up when they come into view

  • All of it is skipped for anyone who has asked their device for

reduced motion

Improved — Attendance marking now slides into place

Status: Pending enablement (deploys with the next release)

  • On the register, each student's Absent / Present / Late control is now

a proper segmented switch: a single highlight pill slides smoothly to the option you tap (green for present, amber for late, neutral for absent) instead of the state snapping on and off

  • The selected label settles in just after the pill starts moving, so

the change feels deliberate and tactile rather than instant — quick and confident, not bouncy

  • Bigger, easier tap targets on phones and tablets (44px), and the

movement is dropped entirely for anyone who's asked their device for reduced motion (the colour still changes, just without the slide)

  • Marking logic and saved attendance are unchanged — this is purely how

the control looks and feels

Fixed — Mobile header no longer overflows; bigger tap targets

Status: Pending enablement (deploys with the next release)

  • On narrow phones the top bar could run its icons off the right edge.

The changelog, theme and sign-out controls now move into the menu drawer's new "Account" section below the small breakpoint, leaving just the essentials (menu, logo, search, notifications) in the bar — so it fits cleanly even at 320px

  • Header buttons (menu, logo, search, notifications, drawer close) are

now full 44px touch targets, easier to tap accurately on phones

  • The dashboard activity feed's refresh and filter buttons, and the

inbox cards, also get 44px targets; long activity and inbox text now wraps to two lines instead of being cut off mid-word

  • The comms trigger-map gains a mobile pan hint and a soft right-edge

fade so it's obvious each flow scrolls sideways

Improved — A subtle buzz when you mark a register on mobile

Status: Pending enablement (deploys with the next release)

  • On phones and tablets that support it, marking a student Present or

Late now gives a tiny confirmation buzz — like a light native-app tap — so coaches taking a register quickly can feel each mark land without looking

  • Marking Absent doesn't buzz, and re-tapping a state that's already set

doesn't either; it only fires on a real change you tapped

  • It's progressive enhancement: devices without vibration (including

iPhones) behave exactly as before, and it's suppressed if you've asked your device for reduced motion. Attendance saving is unchanged

Improved — Settings tables now read as cards on phones

Status: Pending enablement (deploys with the next release)

  • A batch of dense settings and data tables that used to squash into an

unreadable grid on phones now render as clean stacked cards below the medium breakpoint — each row becomes a card with its key fields labelled and full-size (44px) action buttons

  • Covered in this pass: Venues, Fees, Timetable (classes), Event types,

Syllabus tags, Audit log (mutations + access), SMS gateway history, the drill library, the automation queue + send history, the billing arrears list and the external-events list

  • Desktop is unchanged — the existing tables still show at medium width

and up; this only adds the mobile card layout underneath

Improved — Phone-first grading and calendar screens

Status: Pending enablement (deploys with the next release)

  • Grading on a phone now uses a dedicated flow: instead of one

enormous flat list of every candidate, students are grouped into collapsible programme → rank sections (one open at a time) with a sticky filter/summary header and big promote/defer buttons. Desktop keeps its existing two-pane list unchanged

  • The calendar now opens to a clean "Agenda" view on phones — a

scannable, date-grouped list of upcoming classes, events and closures — instead of a cramped week grid. A new Agenda toggle appears on mobile only; the month / week / day views and the whole desktop calendar are unchanged

Improved — Class-limit warning is now a corner toast

Status: Pending enablement (deploys with the next release)

  • When you mark a student who's over their class limit for the period,

the "still recorded" warning no longer pushes the register down the page. It now appears as a toast in the bottom-right corner, keeping the same orange styling, with an ✕ to dismiss and an automatic fade-out after 10 seconds. Attendance is still recorded exactly as before

Improved — Attendance toggle slide now has momentum

Status: Pending enablement (deploys with the next release)

  • The Absent / Present / Late highlight pill now eases in and out as it

slides — building speed from rest and settling into place — instead of the previous snap-and-glide. Still quick (under a third of a second) and still dropped entirely for reduced-motion users

Improved — More pages tuned for phones

Status: Pending enablement (deploys with the next release)

  • A pass of page-level mobile polish across the app: the Tasks list gets

a proper mobile card with tap-to-pick status and action menus (instead of cycle-on-tap); grading-day and event-day screens get full-size 44px pass/unsuccessful/undo controls and stacked layouts; the bar charts in Reports become tap-selectable on touch; row actions that were hover-only (event detail, student notes) now stay visible on phones; and the accident-reports filters, Communications composer, Reports and Settings headers stack and size correctly on small screens

Improved — Register status filter matches the attendance switches

Status: Pending enablement (deploys with the next release)

  • The All / Present / Late / Absent filter at the top of the register now

uses the same sliding-pill control as the Present/Late/Absent switches on each student: the highlight glides between options with the same momentum easing, tinted to match the filter (green/amber/red, or the accent for "All"). Same look, same motion, reduced-motion respected

Improved — Trial students get the same attendance switch

Status: Pending enablement (deploys with the next release)

  • Trial students on the register now use the same sliding-pill attendance

control as regular members — No Show / Present / Late, with the same motion, colours and subtle haptic. A trial you haven't marked yet shows no highlight (so "unmarked" stays distinct from "No Show") and the pill glides in the moment you tap a choice

Improved — Register ad-hoc box moved + clearer input styling

Status: Pending enablement (deploys with the next release)

  • The "Ad-Hoc / Catch-up" student search on the register now sits below

the coaches & volunteers section and just above the roster filter, and matches the filter search box (search icon, same shape) so the two read as a set

  • Trialling a subtle blue-teal glow on input boxes so it's obvious at a

glance what's editable — applied first to the ad-hoc search and the ⌘K command palette. If it lands well it'll roll out to inputs app-wide

Fixed — Class usage now counts the attendance record, not taps

Status: Pending enablement (deploys with the next release)

  • Switching a student between Present, Late and Absent on the register

was nudging their billed class-usage counter every time, so flipping Present↔Late could show silly totals like "17/1 classes used". Usage now only moves when a student genuinely changes in or out of the "attended" state — marking present/late counts one class, switching between present and late (or re-tapping the same state) counts nothing, and going back to absent removes it. The attendance record itself was always saved correctly; this only fixes the usage tally and its warning

Added — Green confirmation toast when a catch-up student is added

Status: Pending enablement (deploys with the next release)

  • Adding an Ad-Hoc / Catch-up student to the register now shows a green

success toast in the top-right corner ("… added to the register"), matching the orange limit warning's style — it slides and fades in, holds, then fades down and out after 10 seconds, with an ✕ to dismiss early. If both toasts are showing they stack neatly

Fixed — Could not mark today's register late in the evening

Status: Pending enablement (deploys with the next release)

  • Marking attendance and adding ad-hoc / catch-up students could silently

do nothing on the current day at certain times of the evening. The register compares the selected day against "today", but that check used UTC while the selected day is your local date — so in UK summer time (and any timezone ahead of UTC) today's register briefly read as a future date and blocked edits. All these checks now use your local date

Improved — Teal glow on the header search box

Status: Pending enablement (deploys with the next release)

  • The Search / ⌘K box in the header now carries the same subtle blue-teal

input glow, so it's clearly an interactive search field

Improved — Every toast now drops in from below the header

Status: Pending enablement (deploys with the next release)

  • All pop-up notifications (toasts) across the app now behave the same:

they drop in from the very top and settle just below the menu header on the right, ease in over about 3 seconds with a gentle bounce, sit there for 10 seconds at a softly translucent 80% (with a blur behind so text stays crisp), then take a further 3 seconds to fade down and out — and can still be dismissed early with the ✕. Previously the app's general toasts slid up from the bottom and cleared after 4–6 seconds. Reduced-motion users get a plain fade instead of the drop/bounce

Improved — Register page header + stats rearranged

Status: Pending enablement (deploys with the next release)

  • The register top area is tidier and wastes less space. The "Class

Register" title is gone — the selected day is now the heading (weekday + date), with the live "On Mat" total beside it. The + button to add a class/ad-hoc session stays.

  • A small inline month calendar now sits top-right (tap any day to jump

there) in place of the date box with prev/next arrows. Future days are disabled; today and the selected day are highlighted in teal.

  • The "Updated · Refresh" control moved to a small button in the very

top-right corner instead of taking its own line.

  • Roster / On Mat / Health / Lesson Plan now sit in one even four-up row.

The Lesson Plan cell is a toggle that expands the full plan in place below the row (tap again to close).

  • Roster and Lesson Plan tiles, plus the selected class pill, now use the

teal-glow / no-fill style; volunteers in the staff panel now match the coaches' teal styling.

Improved — "On Mat" live count is snappier

Status: Pending enablement (deploys with the next release)

  • The live On-Mat total already updates the instant a register mark lands

(realtime, no polling); the class live/ended indicator now re-checks the clock every 20s (was 60s) so it flips promptly when a class starts or ends. No extra database load — it's a local clock check

Improved — Register header is now a day-view layout

Status: Pending enablement (deploys with the next release)

  • The register top area is now split 40 / 60: on the left, the day title,

the live "On the Mat" total (now bigger, with more room) and the month calendar; on the right, the day's classes listed top-to-bottom like a calendar day view (time on the left, class name beside it), newest-first by start time. The calendar moved from the right to the left.

  • The Roster / On Mat / Health / Lesson Plan tiles now have their labels

centred.

  • Coaches and Volunteers: Volunteers keep their purple panel; the Coaches

panel now uses the same soft translucent tint treatment (in teal) so the two match in weight.

Improved — Register day-view rows are richer

Status: Pending enablement (deploys with the next release)

  • The register header split is now 30 / 70 (calendar narrower). To fill

the wider class list, each class row now shows its venue under the name, a pulsing "Live" badge when the class is in session right now, and a chevron — so the day view reads as a proper agenda instead of leaving empty space. Events get an "Event" tag and chevron to match.

Improved — Class rows show headcounts; mobile keeps simple date nav

Status: Pending enablement (deploys with the next release)

  • Each class in the register day view now shows a head-count on the right:

how many are on the roster (or booked, for bookable classes) plus a trials count when there are any — so you can see the size of each class at a glance without opening it.

  • On phones the date control is the simple date box with ‹ › arrows again

(the full month calendar is desktop-only, where there's room for it).

Improved — Register header is now three columns

Status: Pending enablement (deploys with the next release)

  • The register top area is split 20 / 25 / 55: a left column with the

"Register" title, the selected day + date, the add + refresh buttons and the "On the Mat" card; a middle column with the month calendar; and the day's classes filling the right. The On-the-Mat card now breaks its headcount down by venue when more than one venue is live at once. The class rows have a little more breathing room between them.

Internal — UI system guide

Status: Local-only (developer documentation)

  • New docs/ui-system.md: the shared component kit, the status-tone

vocabulary, motion rules, the confirmation pattern and the standard trust microcopy ("Saved", "Queued", "This will send to X recipients"), plus the page-by-page migration playbook

Improved — Register header puts the class list first

Status: Pending enablement (deploys with the next release)

  • The day's classes now sit on the far left of the register — it's the

first thing you reach for, so it's the first thing you see

  • The big month calendar is now a compact single-week strip

(Monday–Sunday) tucked into the right sidebar, reclaiming a lot of wasted vertical space

  • The selected day, quick refresh and "add a lesson" controls move up

into a tidy title bar across the top

  • On phones the day picker (date + ‹ › arrows) stays on top so you set

the day first, then scroll the class list underneath

  • "On the Mat" live count keeps its place in the sidebar, with the

per-venue breakdown when more than one venue is running

Improved — The register now follows your programme lens

Status: Pending enablement (deploys with the next release)

For clubs running more than one programme (e.g. Dance + Martial Arts + Gymnastics), the register no longer mixes everything together:

  • Pick a programme from the lens switcher and the class list shows only

that programme's sessions — a Dance coach no longer scrolls past Taekwondo and Gymnastics to find their class

  • Classes that aren't tagged to any programme stay visible in every

lens, so nothing gets accidentally hidden

  • A clear banner shows which register you're viewing ("Showing Dance

register") with a one-tap "All programmes" escape hatch for owners and admins

  • The roster is always authoritative: once a class is selected, everyone

booked, ad-hoc or on trial for that class appears — even if their main programme is different. The lesson is the source of truth, not the lens

  • If you switch lens while a class from another programme is open, it

isn't yanked away — the banner turns amber to tell you the class is outside the current lens, with the switch-to-all option right there

  • Single-programme clubs see no change at all

Fix — Register lens now reads the programme each class is actually tagged with

The first cut of the register programme lens checked a column the timetable doesn't populate, so switching lens appeared to do nothing. The register now resolves a class's programme from its "Target Programme" (the same value shown in the timetable), so Dance really does show only Dance classes. Classes left as "Open" stay visible in every lens, as intended.

Improved — Programme lens works everywhere, and a new timetable filter

Status: Pending enablement (deploys with the next release)

  • The programme lens now reads a class's programme correctly across the

whole app — the register, the calendar and the day view all honour the same logic, so classes set up before the multi-programme switchover (which only carry the older "Target Programme" link) filter properly

  • Pick Dance and you see Dance everywhere; classes left as "Open" stay

visible in every lens, as before

  • New Programme filter on the Settings → Timetable page (shown only

when you run more than one programme) so you can quickly narrow the class list to Taekwondo, Dance, Gymnastics, or "Open" classes

Improved — The register's polish, spread across the app

Status: Pending enablement (deploys with the next release)

The sliding-pill toggle and the teal focus-glow that debuted on the register now show up in more places, for a more consistent feel:

  • Sliding-pill filters — the animated highlight that slides between

options is now used on the Households status / member-count / plan filters, the Calendar view switch (Month / Week / Day / Agenda) and event time filter, and the Dashboard retention period selector

  • Teal search glow — the Students, Households and Calendar search

boxes now carry the same subtle teal halo that brightens on focus

  • Dashboard header — gains a small "Dashboard" eyebrow above the

club name to match the register's title styling

Single-programme/simple pages are unaffected; this is styling only — no change to what any filter does.

Improved — Inbox now uses the standard page width

Status: Pending enablement (deploys with the next release)

  • The Action Inbox previously sat in a narrow reading column; it now

uses the same content width as Dashboard, Students, Households and the other main pages, so moving between them no longer shifts the layout.

Improved — Comms-flow pages now use the standard width

Status: Pending enablement (deploys with the next release)

  • The Trigger Map, Comms Flows hub and Flow Simulator all sat at

different widths (1400px / 1024px). They now use the same content width as the rest of the app, so the layout no longer jumps when you move between them.

Improved — Accident report pages now use the standard width

Status: Pending enablement (deploys with the next release)

  • The Accident Reports list and the individual report view were full

width (and uncapped); they now sit in the same content width and padding as Dashboard, Students, Households and the other main pages.

Improved — Every form field now has the teal glow

Status: Pending enablement (deploys with the next release)

  • The teal focus-glow that started on the search boxes now applies to

every text field, dropdown and text area across the signed-in app — search bars, settings forms, modals, everywhere — for one consistent, on-brand input style

  • The halo is gently visible at rest and brightens when you click into a

field, so it's always clear what's editable

  • Public pages (login, member portal, trial booking, the marketing site)

are deliberately left with their own styling

Improved — One consistent control language (rolling out)

Status: Pending enablement (deploys with the next release)

We're standardising the look of filters, status chips and buttons across the app so every page speaks the same visual language as the register:

  • Shared status chips and action/filter chips with one colour vocabulary
  • Sliding-pill filters (the register's animated toggle) replacing

hand-rolled tab/filter rows, page by page

  • Consistent press feedback on buttons and controls

This entry will grow as each area is converted.

Improved — Status chips share one colour vocabulary

Status: Pending enablement (deploys with the next release)

  • The SMS delivery log and the comms-flow trigger map had their own

hand-rolled status colours; they now read from the single app-wide status palette, so "failed" is the same red and "delivered" the same green everywhere.

Improved — Student record reads like a professional member file

Status: Pending enablement (deploys with the next release)

The student page is calmer and easier to scan — less "wall of edit buttons", more SaaS member record:

  • A single top-right Actions menu now holds every profile-level

action, grouped into Profile · Membership & Training · Communication · Finance · Admin · Danger zone (with "Forget student" clearly separated and still behind its confirmation)

  • The quick status tiles (Insurance, Direct Debit, Emergency & Medical,

Telegram) are now clean read-only summaries — no more "click to edit"

  • Inline Edit buttons removed from the read-only cards; editing happens

from the Actions menu, so there's one obvious place to make changes

  • A new Needs attention strip under the header surfaces urgent

states at a glance: insurance expiring/expired, no emergency contact, medical notes on file, unpaid invoices, no direct debit, portal invite not accessed, SMS unsubscribed — each jumps to the right place

  • All existing edit forms, status changes, transfers and exports work

exactly as before; this is a layout/placement refresh, not a rewrite

Improved — Student record polish (calmer, less blocky)

Status: Pending enablement (deploys with the next release)

Continuing the student-record refresh:

  • Actions menu labels are now uppercase for a tidier, more deliberate menu
  • Family and classes are combined into one "Household & Enrolment" card

instead of two loose chip rows

  • The Portal card is now status-only — invite/impersonate live solely in

the Actions menu, so no action appears in two places

  • The four quick tiles (Insurance, Direct Debit, Emergency & Medical,

Telegram) now look consistent, and only turn amber/red when the data genuinely needs attention — a healthy record stays calm and neutral

  • The attendance strip reads as a slim "Snapshot" row

Improved — Student view tabs slide like the register

Status: Pending enablement (deploys with the next release)

  • The student "view" tabs (Profile, Billing, Attendance, …) now use the

register's pill styling — squarer corners and a teal sliding highlight that glides to the selected tab

  • Switching tabs is instant client-side state — it no longer touches the

URL router, so the page never reloads

Improved — Student record header polish

Status: Pending enablement (deploys with the next release)

  • Household, Family and Classes now sit side-by-side as three short

sections (instead of stacked rows), using the full width

  • Photo consent is shown in a bordered box with a camera icon
  • Removed the redundant "View" label from the tab strip
  • A subtle status-coloured wash now fades down the top of the record

(green for active, amber paused, red leaver, …) for instant context

Improved — Student list mobile toolbar

Status: Pending enablement (deploys with the next release)

  • On mobile the student-list toolbar keeps the everyday controls

prominent — Search, Add, Sort and Filter — and tucks the rest (Select/bulk, Hide names, Group by family, Export CSV, Send enrolment form, Invite to Telegram) into a single "More" menu, so the toolbar is far less cluttered. Desktop is unchanged.

Improved — Student Actions is now a full command centre

Status: Pending enablement (deploys with the next release)

  • The student "Actions" button now opens a proper slide-over panel

instead of a small dropdown: a right-side drawer on desktop with grouped, multi-column sections, and a near-full-screen bottom sheet on mobile with large, easy-to-tap rows (icon, title and a one-line hint)

  • Actions are organised into clear groups — Status & Membership;

Personal & Household; Progression, Grades & Achievements; Communication & Portal; Billing, Export & Admin; and a visually separated Danger Zone

  • Unavailable actions explain why (e.g. "No email on file"); destructive

actions still ask for confirmation

  • Fully keyboard accessible (focus trap, Esc/!outside to close, focus

returns to the button) and respects reduced-motion

Improved — Student tab switches feel like a deliberate transition

Status: Pending enablement (deploys with the next release)

  • Switching student tabs now plays a subtle ~180ms fade-and-lift on the

new content, and the content area holds a minimum height while a tab loads — so the page no longer shifts under you mid-switch.

Improved — Dashboard & Reports follow the programme lens

Status: Pending enablement (deploys with the next release)

For clubs running more than one programme, picking a lens (e.g. Dance) now scopes the numbers, not just the lists:

  • The Dashboard shows that programme's members, attendance, trials,

insurance, direct-debit, retention and data-quality figures, with a "Showing Dance lens" cue in the header. "All programmes" is unchanged.

  • Reports gain a context chip ("All programmes" / "Dance lens"), and

the Attendance, Trial Funnel, Events, Insurance and Data-Quality reports now filter to the selected programme.

  • Single-programme clubs and "All programmes" behave exactly as before.

Improved — App-wide brand consistency pass

Status: Pending enablement (deploys with the next release)

A sweep across Reports, Settings, Communications, Calendar, Households and the public/enrolment pages to make everything look like one product:

  • Hard-coded colours (slate/blue/grey) swapped for the app's tokens, so

light/dark themes stay correct and "blue" reads as the brand accent

  • Emoji removed from report/tab/section icons in favour of clean text
  • Corner radii normalised (no more oversized one-off rounding)
  • Buttons, inputs, cards, tabs, modals and empty states aligned to the

same patterns used on the Dashboard and Students pages

  • Calendar/Register keep their full-width operational layout — only their

controls and chrome were restyled to match

Improved — Brand follow-up: Settings icons, Reports header

Status: Pending enablement (deploys with the next release)

  • The Settings navigation now uses clean line icons (lucide) instead of

emoji — on both the desktop sidebar and the mobile grid; the mobile dropdown is text-only.

  • Reports gains a compact header showing the current report, date range

and active programme lens at a glance.

  • Scheduled-report toggle knob now matches the rest of the app's toggles.
  • Functional white surfaces (QR codes, email previews, logo plates) and

the semantic category colours (event types, tags) are intentionally preserved.

Family-aware enrolment, annual requirements, speed + security sweep

11 June 2026

What's new

A big day: enrolment got family-smart, every vertical can now have its own annual costs, and the whole platform got faster and tighter under the hood.

All of today's work is pending enablement — committed locally, not yet deployed, and the new tables/indexes need migration items 23–25 applied (item 26 is a deliberate apply-later step).

Added — Annual Requirements (per-vertical costs & tracking)

Status: Pending enablement (migration item 25; item 26 later)

  • Every programme can now define its own annual requirements: TKD

insurance, a dance registration fee, or a gymnastics governing-body membership — each answering three questions: *is there a cost?* (£0 = track-only), *is a date tracked?*, and *can members continue once expired?* (block / warn / nothing)

  • Fees are billed automatically onto the family's one consolidated

invoice by a new nightly job — safe to re-run, can never double-charge

  • Three new automation events (requirement due / expired / renewed)

so you can build your own chase emails in the Automations builder

  • New Settings → Annual Requirements tab with one-click presets, and

a status card on each member profile with a "Mark renewed" button

  • Existing insurance keeps working untouched; a later switch-over step

converges it onto the new system when you're ready

Added — Enrolment recognises returning families

Status: Pending enablement (migration items 22–23)

  • When a trial parent or a staff invite uses an email the club already

knows, the enrolment link is automatically family-linked: details pre-filled, the new member joins the right household, and the email says "enrol another family member" instead of a cold welcome

  • The "Add Another Family Member" button on the enrolment success screen

now works for parents (it previously only worked for logged-in staff)

  • New families at GoCardless-connected clubs can set up their Direct

Debit right from the enrolment success screen — and a same-household second child is never asked twice

  • Members can switch bank accounts from the portal with no gap and no

double-collection window

Fixed — Enrolment form answers now save properly

Status: Pending enablement (deploys with the next release)

  • Custom "about the new member" questions answered on the public

enrolment form were not being saved — they now land on the member's profile and in Forms responses

  • Programme-specific enrolment links now strictly enforce their

programme — a tampered request can't sign up onto another programme's plan or classes

  • No-payment enrolments no longer record a "payment received" note

against an unpaid invoice (history and welcome emails now say "invoiced — to be collected")

Security — Trial links and webhooks tightened

Status: Pending enablement (deploys with the next release)

  • Rescheduling a trial now requires the secret link from the email — a

leaked booking reference can no longer be used to view or move someone's trial (and rescheduled trials get working cancel links, which they previously lacked)

  • The trial-count checker is rate-limited so it can't be used to test

whether an email address belongs to a club

  • All emailed links are built from the club's canonical web address, so

preview/proxy domains can't end up in parents' inboxes

  • Telegram account-linking codes only work through the club that issued

them

Performance — Built for 1,000 clubs

Status: Pending enablement (index pack = migration items 23–24)

  • The nightly billing run now processes whole clubs in a few queries

instead of thousands — it stays well inside its time budget at scale

  • Staff pages load noticeably faster: the app's startup data is fetched

in one parallel batch and cached for five minutes

  • A new database index pack makes portal login, duplicate checking and

email suppression checks instant even with hundreds of thousands of members (apply migration item 23)

  • Portal pages no longer download a family's entire multi-year history

on every visit

Internal — Local test data for multi-vertical clubs

Status: Local-only (developer tooling, never runs in production)

  • npm run seed:verticals builds a complete test club on the local

database: Taekwondo + Gymnastics + Dance with belts/badges/grades, timetables, pricing, 60 households (some spanning two or all three verticals), 90 days of registers, billing agreements and trials

Security — Trial endpoints sweep-proofed (follow-up)

Status: Pending enablement (deploys with the next release)

  • The trial-count checker and trial enrolment-link sender now share one

request budget per visitor — previously each email address checked got its own allowance, so a script could still sweep a mailing list

Internal — Release confidence

Status: Local-only (docs + developer tooling)

  • New release checklist (docs/release-checklist.md) answering "what turns

on when we deploy vs what's built but off" — flags, crons, migrations and the staged rollout order for real automation sends

  • New npm run smoke:requirements proves the annual-requirements engine

against realistic seeded data: 105 members billed onto 60 consolidated family invoices, a re-run bills nothing twice, and expiry blocking only affects genuinely lapsed members

  • The smoke immediately caught and fixed two would-be production issues:

an invoice status the database would have rejected, and a filter on a column that doesn't exist

Fixed — Duplicate-member check actually works now

Status: Pending enablement (deploys with the next release)

  • The duplicate-email warning on public enrolment was silently disabled

by a filter on a database column that doesn't exist — the same family could create duplicate member records without any warning. Fixed in both enrolment endpoints

  • The club-closure notification list had the same hidden fault and could

show no affected members; it now correctly lists everyone except leavers

  • A new automated guard stops this class of bug from being reintroduced

Security — Trial booking privacy pass

Status: Pending enablement (deploys with the next release; embedding clubs need their website added to the new embed allowlist before launch)

  • The public trial-availability check no longer reveals how many trial

sessions a child or family has already used — it now answers only "can this email book a trial?", with the real limit still enforced at the moment of booking

  • Class capacity is shown as "Spaces available" or "Last spot" instead

of exact numbers — operational detail stays private without hurting the booking experience

  • Trial pages can no longer be embedded inside arbitrary websites: only

the club sites you approve can iframe the booking flow, protecting parents from fake-embed and clickjacking tricks

Fixed — Event waitlist promotion is now race-proof

Status: Pending enablement (deploys with the next release)

  • Two staff members promoting from an event waitlist at the same moment

(or a promote racing a parent's claim link) could both win the last seat. Staff promotion now goes through the same capacity-checked path as the public claim link, so the second attempt gets a clear "back at capacity" message instead of an overbooked event

  • A draft event can no longer have waitlisted members promoted onto it

Added — Waiting lists for full classes

Status: Pending enablement (migration item 27; waitlists are OFF per class until staff switch them on)

  • Clubs can now run a waiting list for any full class — built for dance,

gymnastics and swim schools. Share one public signup link; parents give just their name, email and the child's first name (full details are only asked for if a space opens and they enrol)

  • New Settings → Waiting Lists tab: switch a class's list on, set its

capacity, see the queue in joined order, add or remove people

  • Automatic offers (email the longest-waiting with a time window, or

everyone at once, or staff-picked) come in the next phase — the plan is agreed and the queue collection works today

  • Staff adding members directly to an event now see a clear warning when

the booking takes the event over capacity (the override still works — it's just never silent)

Added — The Join page: trials, waiting lists and multi-activity in one flow

Status: Pending enablement (migration items 27–28; per-class waitlists stay off until staff enable them)

  • Every club now has a public Join page (/join/your-club): parents pick

the activity (for multi-activity clubs), enter just their name, email and child's birth month, and see exactly the classes that fit — each one either "Spaces available — book a trial" or "Full — join the waiting list"

  • Parents can join the waiting list for several full classes at once;

winning a space in one automatically takes them off the others

  • When a space opens, offers go out automatically per class policy:

first refusal for the longest-waiting (48-hour window), everyone at once with first-to-claim-wins, or staff-picked — claiming is race-proof and leads straight into the normal enrolment wizard

  • Two new automation events (space offered / space claimed) for custom

follow-ups, and a "Send offer" button on the Waiting Lists settings tab

Improved — Waiting lists: club policies, self-removal and demand insight

Status: Pending enablement (migration item 29)

  • Every offer email now includes a one-click "remove from the waiting

list" link, and quiet entries lapse automatically after a configurable period (checked weekly)

  • New settings (behind the ⚙ on Waiting Lists): how long offers are held,

the default offer mode, and what happens when an offer isn't actioned — removed, kept at the front for the next space, or moved to the back

  • Classes at member capacity no longer offer trial bookings — a trial for

a class nobody can join led nowhere

  • "Book a trial" from the Join page now lands with that class pre-selected
  • New Reports → Waiting Lists view: queue depth by class — the signal for

when to open a second session

Security — Public endpoint hardening (third review pass)

Status: Pending enablement (deploys with the next release)

  • Rate limits added across the remaining public endpoints: trial

availability, the examiner scoring links (generous for live scoring, per-examiner so a venue's shared wifi can't stall a panel), insurance renewal links, and external-event invites

  • Coach review clips can only be saved to their own member's storage

area — a crafted request can no longer point a member's playback at an arbitrary file

  • Audio, recording and certificate uploads are now checked by file

CONTENT, not just the declared type — a disguised file is rejected

  • External-event invite pages return only the fields the entry form

needs, and event payment confirmations build links from the club's canonical web address

Internal — Audit follow-through

Status: Pending enablement / Local-only (docs + guard tests)

  • All seven P1/P2 items from the independent SaaS audit were already

fixed in the preceding security passes — confirmed line by line

  • Eight more external-event emails (invites, entry confirmations,

organiser updates) now build their links from the club's canonical address, and an automated guard prevents any future route from baking a preview/proxy domain into an emailed link

  • The public class-availability lookup is cached for 30 seconds per

club — an open-day rush re-reads one snapshot instead of hitting the database per family

  • The release checklist gains three audit-recommended gates: live

database schema verification SQL, automation volume watching before wide enablement, and a manual accessibility pass before public launch

Added — Expired requirements now actually block (with a human override)

Status: Pending enablement (needs migration item 25; only affects clubs that set a requirement to "block")

  • When a club's annual requirement (e.g. insurance) is set to block and

a member's has expired, the class register and grading day now show a clear red marker on that member

  • Marking them present or recording a grading outcome asks staff to

confirm first — the kid already on the mat can still be recorded, but never by accident

  • Members with no recorded date are chased, never locked out — switching

the feature on can't strand a class

Internal — Local testing unblocked

Status: Local-only

  • The local development database now allows two-factor enrolment, so the

full app (including everything behind login) can finally be tested in a local browser

Public launch + super-admin dashboard

11 May 2026

What's new

The big Phase 16 work has landed. ClubCRM is now public-ready and we can finally tell people about it without "but…" disclaimers.

Public signup

  • New marketing landing page at the root URL for unauthenticated visitors
  • 14-day free trial; no card required
  • One-click demo at /demo — poke around a fully populated club without

signing up

  • Founder tier (Creative Ways Taekwondo) is grandfathered, no billing

changes

Parent payments (Stripe Connect)

  • Each club connects its own Stripe account
  • Parent payments land in your balance directly; we take a small platform

fee per transaction

  • Set up under Settings → Payments

Customer ops layer

  • Changelog (you're looking at it) — bell icon pulses red when there's

a new entry

  • Feedback board at /feedback — submit + upvote requests for things

you'd like to see next

  • Status page at /status — green/amber/red across API, crons,

webhooks

Mobile-first sweep

We did a thorough mobile audit:

  • iOS auto-zoom on inputs killed
  • Hover-only action buttons now tappable on phones
  • Filter rows + cards no longer overflow on narrow screens
  • Sticky save bars on long forms so the keyboard doesn't bury the action
  • Activity timeline now paginates (50 per page)
  • Attendance date pills swap in place rather than re-loading the page

Smaller wins

  • Demo club seeded with 300 fake students, 12 months of attendance,

household structure, grading history

  • Settings → Billing tab with trial countdown
  • Ardent Edge admin dashboard (super-admin only)