Updated weekly. No marketing fluff — just what we shipped, when, and why. Built in public because operators deserve to see the velocity before they sign.
Admin · Portal
Sentence-case overhaul + gym-driven accent system
Stripped the platform-amber accent that was bleeding onto every surface, replaced with a 4-tier cascade derived from each gym's own accent_color. Sentence case headlines everywhere. Avatar dropdown reduced to profile + account + settings + sign out. Codemod touched 204 files (1,293 uppercase removed, 1,037 trackings loosened).
·Gym accent flows through admin, desk, coach, and portal — not just member surfaces
·CSS color-mix() derives accent / hot / deep / muted from a single gym setting
·Onboarding checklist collapsed from a 50%-viewport panel to a 40px banner with click-to-expand
·Public marketing site (this one) intentionally stays in its bold-allcaps register
Platform
Pilot-#2 unblocker — content.ts retired
Every Gas-House-specific string used to be reachable via a fallback in content.ts. Today: deleted. Site-wide content now reads from gym_settings DB exclusively. New tenants land on a generic blank-gym shape, never Gas House defaults.
·Site routes moved to a properly-named module (was misleadingly called `pushpress`)
·getGymSettings fallback rewritten to safe blank-gym defaults
·Ready to onboard pilot #2 with no codebase changes
Desk
/desk counter portal — 12 shipped items
Front-desk staff get a purpose-built counter portal (not a stripped-down admin). Multi-modal check-in, walk-in capture, photo-grid attendance, counter payments — all the verbs a front desk actually uses, none of the admin clutter.
Three admin surfaces shipped in their final shape. Schedule gets a 7-day Calendar grid + List bulk-ops. Comms consolidates Inbound + Outbound + Templates into one tabbed surface. Billing pivots from analytics-first to operator-first.
·/admin/schedule — Calendar week view + List bulk-cancel/bulk-uncancel
·/admin/billing — Today queue (failed payments + refunds + manual) as the default tab; analytics moved to History
Build
Deploy loop hardened
Three real build failures in one day prompted three guardrails: pre-push hook runs pnpm build locally, @sentry/cli postinstall approval, Enhanced Build Machines (16GB / 8 vCPU). Net effect: the deploy loop is no longer the bottleneck.
·Husky pre-push hook: 15s local build vs 5–15 min Vercel cycle
·Sentry config migrated from deprecated `disableLogger` to `webpack.treeshake.removeDebugLogging`
Platform
Notification severity tiers
Three-tier severity model (critical / important / informational) per the admin brief. Bell badge counts only critical + important. Informational rows live in history but never drive a badge.
·Bell renders red bg for critical, accent for important, no badge for informational
·Failed payment + coach no-show flagged critical; new lead + churn ≥75 flagged important
Platform
Multi-tenant RLS isolation (21 tables)
Tenant data isolation enforced at the database layer. RESTRICTIVE policies on every tenant-scoped table. JWT carries gym_id via Supabase Auth Hook for per-query authorization without round-trips.
·21 tables wrapped in tenant_isolation RESTRICTIVE policies
·custom_access_token_hook live — JWT-fast-path RLS
·effective_gym_id() Postgres helper with hook-first / lookup-fallback semantics
Want changelog updates by email? Join the waitlist and you'll get every weekly digest until launch.