Changelog
A record of all notable changes to the Kittd platform.
v0.3.0
2026-04-08- RLS policies across packages, products, clubs, teams, profiles, orders, and approvals updated to use `'role' = ANY(current_user_roles())` — fixes silent insert/update failures for multi-role users where admin was not the first role in the array
v0.2.9
2026-04-08- Resend confirmation email button on the verify screen with 60-second cooldown
v0.2.8
2026-04-08- Registration flow now shows a "Check your email" confirmation screen after signup instead of redirecting to login
- Login page shows a friendly message when sign-in is attempted before email is confirmed
v0.2.7
2026-04-07- Notifications silently dropped when `notification_channel` is `null` — defaults to `email` in both `notifyRole` and `notifyUser`
- Migration adds `DEFAULT 'email'` to `profiles.notification_channel` and back-fills existing `NULL` rows
v0.2.6
2026-04-07- Help Centre page (`/help`) — 8 topic categories, 45 FAQ articles with animated accordion, popular articles grid, and support CTA
- Contact page (`/contact`) — categorised contact form with Resend auto-reply, response-time panel, quick-link sidebar, and submission tips
- `SUPPORT_EMAIL` env var for routing contact form submissions
v0.2.5
2026-04-07- Email delivery switched from AWS SES (via Lambda + API Gateway) to Resend
- Production emails now sent via Resend SDK, gated on `RESEND_API_KEY` env var
- Local dev Mailpit SMTP fallback unchanged
v0.2.4
2026-04-07### Fixed - Full TypeScript audit —
- Full TypeScript audit — zero errors across the codebase
- Supabase `setAll` cookie handlers typed explicitly in server and middleware clients
- `ROLE_LABELS` record updated with all six roles (`club_approver`, `supplier`, `supplier_admin`)
- Email template SMTP path used wrong prop name `notificationType` instead of `type`
- Recharts `formatter` callbacks cast to avoid overly strict generic mismatch
- Admin orders page `status !== 'all'` comparison removed now that `'all'` maps to `undefined`
v0.2.3
2026-04-07- Next.js 15 async `params` type error in admin order status API route
v0.2.2
2026-04-07- Next.js 15 async `searchParams` type error in admin orders page
v0.2.1
2026-04-07- Next.js 15 async `params` type error in admin order detail and reorder pages — `params` must now be awaited as a `Promise`
v0.2.0
2026-04-07### Added - Multi-role support — users can hold multiple roles simultaneously (e.g. coach and club approver) - `supplier_admin` role for supplier business administrators - Kittd Admin super-user bypass — admin role passes all role guards automatically - Nav badges showing outstanding My Orders and pending Approvals counts - Notification dismiss — individual X button per notification and Dismiss all - Club badge displayed on the My Club page - Version number and build date in the app sidebar and public footer - Changelog page (`/changelog`) parsing `CHANGELOG.md` with coloured section badges - Roadmap page (`/roadmap`) with four status tiers, per-item audience badges - Redesigned landing page with club and supplier value propositions, How it works, and CTAs - FreeAgent admin page shows per-club connection status with links to each club's settings - `supplier_admin` added to nav and role management UIs
- Multi-role support — users can hold multiple roles simultaneously (e.g. coach and club approver)
- `supplier_admin` role for supplier business administrators
- Kittd Admin super-user bypass — admin role passes all role guards automatically
- Nav badges showing outstanding My Orders and pending Approvals counts
- Notification dismiss — individual X button per notification and Dismiss all
- Club badge displayed on the My Club page
- Version number and build date in the app sidebar and public footer
- Changelog page (`/changelog`) parsing `CHANGELOG.md` with coloured section badges
- Roadmap page (`/roadmap`) with four status tiers, per-item audience badges
- Redesigned landing page with club and supplier value propositions, How it works, and CTAs
- FreeAgent admin page shows per-club connection status with links to each club's settings
- `supplier_admin` added to nav and role management UIs
- `profile.roles` undefined crash — added `?? []` fallback in `guardRole`
- Migration `20240104` split to avoid PostgreSQL error using new enum values in same transaction
- Admin FreeAgent page was calling non-existent `isFreeAgentConnected()` / `disconnectFreeAgent()` — corrected to per-club functions
- Dashboard supplier redirect now only fires when supplier/supplier_admin is the user's only role
v0.1.0
2026-04-07Initial release of the Kittd platform — football kit ordering built for clubs.
- #### Platform & Auth
- Email / password authentication with Supabase Auth
- Role-based access control with multi-role support per user
- Roles: Kittd Admin (super-user), Club Admin, Coach, Club Approver, Supplier, Supplier Admin
- Kittd Admin bypasses all role guards as a global super-user
- Profile management with notification channel preference (email, SMS, WhatsApp)
- #### Club Management
- Club creation and management by Kittd Admin
- Club badge and sponsor logo upload (PNG, JPEG, WebP, SVG — max 2 MB)
- Club primary and secondary colour pickers
- FreeAgent accounting integration per club (OAuth connect/disconnect)
- Team management within clubs (add, rename, delete)
- Member management with multi-role checkboxes
- Club Approver toggle for coaches on the My Club page
- Club badge displayed on the My Club page
- #### Kit Catalogue & Configurator
- Product catalogue with active/inactive state
- Kit packages (bundles) with configurable items and pricing
- 2D kit configurator with colour customisation
- Coaching attire mode: replaces squad number with initials
- Spare kit option (hides player name/number fields)
- Duplicate squad number validation within a basket
- Add-on pricing: club badge, sponsor logo, number print, initials
- Configurable add-on prices via admin pricing panel
- #### Ordering & Basket
- Basket with persistent local state per club
- Checkout with team selection and order notes
- Sponsor logo upload at checkout
- Bundle items grouped in order summary (sub-items shown without individual prices)
- Order submission with status history audit trail
- #### Approval Workflow
- Orders move through: draft → submitted → approved/rejected → confirmed → in production → shipped → delivered
- Club Approvers review submitted orders for their club
- Approval and rejection notifications to coaches
- Supplier notification when an order is approved
- Order status history with timestamps for time-based analytics
- #### Notifications
- In-app notification bell with unread badge count
- Real-time updates via Supabase Realtime (insert, update, delete)
- Notifications page with per-item dismiss (X) and Dismiss all
- Email notifications via AWS SES (production) or Mailpit SMTP (local dev)
- SMS notifications via Twilio
- WhatsApp notifications via Twilio WhatsApp API
- Notification templates: editable title, body, channel override per notification type
- Template variable substitution (e.g. `{{order_reference}}`, `{{coach_name}}`)
- #### Admin Dashboard
- Revenue KPIs: total revenue, this month, average order value, outstanding value
- Revenue bar chart (last 12 months) and order status donut chart
- Time-based KPIs: average submit→approval, approval→complete, total duration
- Outstanding orders section with longest open duration
- Top clubs and top products leaderboards
- Platform counts: clubs, users, products, packages
- 5-minute ISR cache for performance
- #### Supplier View
- Suppliers see approved+ orders ready for production
- Order items with player, garment, size, and add-on details
- #### Navigation & UX
- Responsive sidebar (desktop) and drawer (mobile)
- Live nav badges: outstanding My Orders count, pending Approvals count
- Favicon: 👕 shirt emoji via Next.js ImageResponse
- Styled HTML emails with status badge, CTA button, and footer
- #### Infrastructure
- AWS CDK v2: Lambda + API Gateway + SES/SNS notification API
- Supabase local dev stack with Mailpit for email preview
- Row-level security policies throughout
- Kittd is built and maintained by the Kittd team.*