Changelog

What's new in OLM.

Releases, improvements, fixes, and deprecations. Last update: August 10, 2026.

August 2026

  • ImprovementAugust 10, 2026

    You can now message the OLM team from inside the app

    Messages from OLM arrive in your Messages tab instead of only as a notification, and you can reply to them.

    • A conversation with the OLM team sits at the top of your Messages, separate from your gym's threads
    • It works before you've joined a gym too — find it under More › Messages
    • Replies go straight back to the team; nothing you write here is visible to your gym
    • Read receipts are now scoped to the gym you're viewing, so opening one inbox no longer marks another gym's message as read
  • ReleaseAugust 4, 2026

    Follow-up journeys arrive on the Marketing page

    Pre-written follow-up sequences for new leads, trials, and lapsed members — flip one on and it runs itself.

    • Six ready-to-use journeys: one per lead-funnel offer, trial-to-member, and a win-back for members who've been away.
    • Every step's words and timing are editable inside guardrails — steps stay a day apart, sequences end by day 60, and restore-defaults is always one click.
    • Journeys stop themselves the moment someone books, joins, comes back, or opts out.
    • Emails send with your gym's branding, mailing address, and a working unsubscribe link on every message; trial nudges arrive as push notifications right after training.
  • ImprovementAugust 3, 2026

    Two new guides, and free tools linked from every relevant post

    The blog gained guides on the 6-week challenge money model and speed-to-lead for martial arts gyms, and posts now point you to the matching free tool — savings calculator, challenge calculator, or schedule widget — right where it's useful.

    • New guide: The 6-week challenge money model for martial arts gyms
    • New guide: Speed to lead — the first five minutes decide who gets the trial
    • Cost, switching, and check-in guides now end with the matching free tool instead of a generic sign-up link
    Related:/blog/tools

July 2026

  • FixJuly 31, 2026

    Checking out gives your class-pack credit back

    Undoing a check-in now returns the pack credit you spent instead of losing it, and removing a family profile can no longer leave a membership quietly billing.

    • Check out of a class and the credit comes back with its original expiry — as long as you're before your gym's cancellation cutoff
    • After the cutoff the credit is still spent, the same as a no-show
    • Paid drop-ins can't be checked out by mistake any more — ask the gym for a refund instead, which keeps your payment on record
    • Removing a family profile now asks you to cancel that member's plan first, so a removed profile can't keep being charged
    • Someone who was removed as an admin and later rejoins — or is re-approved — comes back as a regular member, not an admin
  • ImprovementJuly 28, 2026

    Light-first marketing site with a guided product tour

    The public site now defaults to a light theme with a dark-mode toggle, and the homepage walks through six fresh screens of the real product.

    • Every marketing page supports light and dark via the header toggle
    • Homepage product tour auto-advances through dashboard, members, classes, billing, reports, and messaging
    • Contact form rebuilt — same-hour founder reply, no more full-page embed
  • ReleaseJuly 27, 2026

    A simpler, faster homepage

    Homepage redesigned around a single free-trial CTA, real product screenshots, and the savings calculator.

  • ReleaseJuly 24, 2026

    Your training log, rebuilt around your week

    The Log tab now groups your training by week so classes never pile up — clear a whole week in a tap, talk through it out loud, and see your focus as numbers or a chart.

    • Classes you haven't journaled are grouped into one 'this week' card with a calendar of the days you trained — no more endless to-do list
    • 'Mark reviewed' clears a whole week at once; 'Edit each' still lets you tag or voice-journal any class
    • New 'Talk through your week' recap — describe your week out loud and AI pulls out what you drilled
    • Tap the % on your focus breakdown to flip between the numbers and the radar chart
    • Set training reminders right from the Log tab
    • Works even without a gym — log your own open-mat and solo sessions the same way
  • ReleaseJuly 23, 2026

    Follow the greats — get pinged when they post a new system

    On any athlete's page you can now Follow them, and you'll get a notification the moment a new game-plan system attributed to them is published.

    • The 'Follow for new systems' button on a great's page is now live (no more 'soon')
    • When a community system credited to someone you follow is approved, you get a push + in-app notification linking straight to it
    • Each athlete page shows how many people follow them
    • Follows live on your account and travel with you between gyms
    Related:/systems
  • ImprovementJuly 23, 2026

    AI system builder now shows what it understood — and checks itself

    When you describe a game plan and let AI build the tree, it now echoes back what it understood, verifies the tree actually covers what you asked for, and lets you preview before saving.

    • A 'Here's what I understood' summary confirms your position, goals, and techniques before anything is saved
    • The AI grounds every technique against the real library and drops anything it made up
    • If the first draft misses part of your request, it quietly regenerates once to cover it
    • You get a full preview of the tree with Save / Regenerate / Edit before it's committed
  • ImprovementJuly 22, 2026

    Techniques library, redesigned — and you can tell what has video

    The technique library now opens as one fast, scrollable list with one-tap category filters, and every position and move makes clear which ones actually have community footage behind them versus a plain search.

    • One-tap filter chips (All, Guards, Top, Back, Legs…) replace the collapsed drawers — the whole library is one scroll, and the filter stays pinned as you go
    • Favorites and Saved shrink to a slim row with live counts, and search now leads the screen
    • Inside a position, moves with real community footage get a ▶ count badge and stand out; the rest show a quiet 'Search' instead of an identical red button
    • A header count and an 'Only footage' toggle let you collapse a position to just the moves you can actually watch
  • ImprovementJuly 22, 2026

    A sharper home screen — your numbers up top, drills that cycle

    The app's home now leads with your session count and focus map side by side, followed by a 'Drill this' card that cross-fades through the newest technique videos the community has added.

    • Your training charts sit near the top instead of below a tall intro panel
    • A slim 'Work on' line calls out your least-trained area at a glance
    • 'Drill this' auto-cycles through the newest community-uploaded videos — tap any one to watch it in the app
    • Brand-new members see the same layout drawn empty, so logging your first session grows the screen instead of replacing it
  • FixJuly 20, 2026

    Demo links now work for a full week, on every device

    The link we email you when you request a demo academy stays good for seven days and can be opened as many times as you like — reloading it, opening it on a second device, or retrying after a hiccup no longer says 'Magic link already used.'

    • Opening your demo link more than once signs you back into the same demo academy instead of erroring
    • Your demo academy stays alive for the whole life of the link, so a link clicked days later still lands somewhere real
    • If something does go wrong mid-setup, the page now offers a 'Try again' button
    • Requesting a second demo with the same email works again instead of being told you already have an account
    Related:/demo
  • ImprovementJuly 13, 2026

    Browse featured systems by athlete

    The 'From the greats' section now leads with the athletes themselves — tap a card to see every featured system credited to that grappler, with photos and bios where we have them.

    • Athlete cards up top with a 'See all' view of everyone with a featured system
    • Each athlete page shows their bio, team, and all of their approved systems in one place
    • Your own systems keep their spot right below — nothing about your library changes
    Related:/systems
  • ReleaseJuly 9, 2026

    Featured systems from the greats

    Learn from game plans modeled on elite grapplers — browse community-submitted systems attributed to athletes like Marcelo Garcia, get recommendations matched to what you've actually been logging, and add any featured system straight into your own library.

    • New Systems page layout: recommended and featured systems up top, your own systems below
    • Recommendations are driven by your training log — each suggestion tells you why (e.g. which technique of yours it builds on)
    • Submit your own system for review: credit the athlete it's based on, optionally link a source video
    • Every submission is reviewed before it goes public
    • Adding a featured system makes your own private copy you can edit freely — attribution stays with it
    Related:/systems
  • ImprovementJuly 8, 2026

    Backdate and edit the date on your training journal entries

    Forgot to log a session? Free-form journal entries now default to today but let you set an earlier date, and you can change the date later from the entry's edit screen.

    • New entries default to today's date, with a date picker to move them to the day you actually trained
    • Edit the date on an existing entry any time from its edit screen
    • Future dates are blocked, and your journal list stays sorted by the day each session happened
    • Entries logged at a gym still follow their class date automatically — no change there
  • ImprovementJuly 8, 2026

    A nudge to journal your class while it's still fresh

    About 30 minutes after your class ends, we'll send a friendly reminder to log what you learned — so your training journal captures the details while they're still sharp.

    • Fires automatically off your check-in — no setup needed if you train at a gym on OLM
    • Only nudges once per class, and never if you've already journaled that session or chosen to skip it
    • Tap the notification to jump straight to your journal
  • ReleaseJuly 3, 2026

    Free tools for gym owners, a referral program, and clearer pricing

    A new set of free gym-owner tools (cost calculator, challenge revenue calculator, embeddable schedule widget), a both-sides referral program for gyms on OLM, and a pricing page that spells out exactly what the one-time setup covers.

    • New /tools hub: a software cost calculator you can email to yourself, a 6-week challenge revenue calculator, and a free embeddable class-schedule widget for your website
    • Refer a gym you'd vouch for: share your gym's referral link from Settings — when they go live on OLM, you both get a platform-fee credit
    • Pricing page now itemizes the $499 one-time setup: roster import, hand-held Stripe Connect setup, white-label theming, and a founder onboarding call — migration is on us, not on you
    • Comparison pages add a 'Beyond the invoice' section covering per-location fees, add-on creep, and contract lock-in — and how OLM removes each
    • The savings calculator can email you your breakdown, honestly — including when a flat-fee vendor beats OLM at your numbers

June 2026

  • ImprovementJune 29, 2026

    A quick welcome walkthrough for new accounts

    New members are greeted with a short, skippable setup that captures your martial art and current belt up front, so your dashboard is personalized from your very first visit.

    • Pick your main discipline and current belt/rank — beltless arts show experience levels instead, and BJJ adds a stripe picker
    • Your rank is portable: it's saved to your profile and travels with you to any gym on OLM
    • Tell us whether you train at a gym so we can route you to find one or straight into solo tracking
    • Each step now has a Back button, so you can revisit and change an earlier answer
    • Shown once on first sign-in and always skippable; every answer saves as you go
    • When a gym search comes up empty, you can now recommend your gym — or, if you run one, raise your hand to bring it onto OLM
  • ImprovementJune 28, 2026

    Video counts in the technique library + a community Discord

    The technique library now shows how many community videos each position has before you tap in, and you can jump straight into our Discord from your profile.

    • Each position in Techniques shows its community-video count, so you can see where the videos are before drilling in
    • Added a 'Join our Discord' link in the profile menu to connect with other members
  • FixJune 28, 2026

    Child profiles and smarter training analysis

    Child (dependent) profiles now keep their own systems and a true-empty start, and the AI training analysis better understands how athletes actually describe their rolls.

    • Fixed a bug where a child profile showed the parent's saved systems — each profile's systems are now fully separate
    • Brand-new and child profiles now show a clear empty state instead of placeholder charts, so an account with no logged sessions reads as empty
    • Training analysis now recognizes attacking vs. defending, maps loose or misspelled move names (e.g. 'rnc', 'knee slice'), and infers the position even when you don't name it
  • ImprovementJune 27, 2026

    Contact support right from the app

    The Help & support screen now has a Contact support form — describe what you need help with and our team replies to your account email, usually within a business day.

    • Replaces the old email link with an in-app form, so there's nothing to copy or paste
    • Your message arrives with helpful diagnostics attached automatically (app version, device, screen) so we can help faster
    • Support requests are tracked separately from feature requests and bug reports on our side
  • ReleaseJune 26, 2026

    New public pages: Train Hub and The BJJ Meta

    Two new public pages are now live and crawlable — a Train Hub showcase of the portable AI training suite, and The BJJ Meta with trending techniques and training-data insights.

    • The Train Hub page (/train) introduces the portable, AI-assisted training suite that travels with each member across gyms
    • The BJJ Meta page (/meta) surfaces trending techniques and aggregate training-data insights
    • Both pages are reachable without signing in, so prospects and search crawlers can find them, and they're included in the sitemap
    Related:/train/meta
  • ImprovementJune 23, 2026

    Separate brand themes for your app and your admin portal

    In Settings → Theme you now pick a brand theme for your member app and, separately, one for your admin portal — by clicking a preset, no color codes to fiddle with.

    • Choose from nine curated themes for each surface; the app theme is what members see in the mobile app, emails, and the check-in kiosk
    • The web theme recolors just your admin portal, so the two never get confused — set them the same or different
    • Replaces the old primary/secondary hex color inputs with simple click-to-apply swatches
    Related:/settings
  • ImprovementJune 23, 2026

    One click to go live from your demo

    The "Ready to go live?" button on the demo banner now sends your request straight to the OLM team — no email app required — so we can activate your account and get you set up.

    • Tapping the button notifies us instantly with your gym's details; you'll see a confirmation right in the banner
    • We reach out to convert your demo into a real account and walk you through setup
    • Replaces the old email-link CTA that depended on your device having a mail app configured
  • ReleaseJune 20, 2026

    Put your live class schedule on your own website

    A new Embed tab on the Classes page gives you a copy-paste snippet that drops a live, always-up-to-date class schedule onto your own website — themed to your brand color and updated automatically whenever you change a class.

    • Visitors can flip between a weekly schedule grid and an upcoming-7-days view right inside the widget
    • It restyles itself to your gym's brand color (or pick a custom one) and supports light, dark, or automatic themes
    • Fully mobile-responsive — the weekly grid collapses to a clean day-by-day list on phones
    • Live preview and one-click copy in the admin portal; paste it into Squarespace, Wix, WordPress, or your CRM
    • Cancelled classes show struck-through in the upcoming view, so what your site shows always matches reality
    Related:/classes
  • ReleaseJune 19, 2026

    Find upcoming tournaments — automatically kept fresh

    The Competitions tab now fills itself with real upcoming grappling tournaments from IBJJF, NAGA, and AGF, refreshed daily, with a tap-through to register on the organizer's own page.

    • Browse hundreds of upcoming events — IBJJF championships plus NAGA and AGF circuit stops — with dates, city, and gi/no-gi at a glance
    • Every listing links straight to the organizer's official registration page; we send you there to sign up, we don't get in the middle
    • The list keeps itself current on its own: new events appear automatically, and once an event is over (or gets cancelled) it drops off without anyone having to clean it up
    • Hand-picked major events still lead the list, so the marquee championships never get buried under regional stops
    Related:/app
  • ImprovementJune 18, 2026

    Women's classes, easier member management, and a polished portal

    Admins can now schedule women's-only classes, remove (and restore) members in one click, set belts with a sleeker visual picker, and run a curriculum built around their gym's art — all on a refreshed light/dark portal.

    • New "Women's" class category alongside Adult and Kids — filter the schedule by it, and members see a Women's badge on the class in the app
    • Remove a member from your gym with a clear confirm step; their check-in history, journal, and belt rank stay portable on their account, and you can restore them anytime
    • Reworked the belt/rank controls on a member's page into a visual picker — a quick Adult/Kids toggle and tap-to-select belt chips in your gym's colors, replacing the old dropdowns
    • Curriculum now follows your gym's primary discipline: categories, the coverage radar, and starter presets adapt to BJJ, judo, muay thai, wrestling, MMA and more — set the art in Settings
    • Brushed-up admin portal in both light and dark mode — cards, borders, and shadows now have real depth, and buttons, hovers, and highlights track your gym's accent color throughout
    Related:/app
  • ReleaseJune 17, 2026

    Injury tracking, and a clearer way to drill your systems

    The app now tracks the injuries and surgeries you're working around — and your AI training suggestions route around them — plus systems trees got a tap-to-drill view that's far easier to read on a phone.

    • Log injuries or surgeries (More → Injuries) with what to avoid, e.g. "no heavy takedowns"; they follow you across gyms like your journal and rank, and mark them recovered when you're back
    • Your active injuries now flavor the AI: when it drafts or extends a system decision tree, it avoids suggesting movements that load the hurt area — no "work on takedowns" advice when your knee's out
    • Systems trees added a focused drill-down: tap a position to step into just that branch with a breadcrumb back up, on higher-contrast cards that are easy to read at a glance
    • The floating "+" button is now labeled and context-aware — it says "System" and creates one on the Systems tab, "Log" for a journal entry elsewhere
    • Today's "Drill this" technique on your home screen now links straight to its community videos to watch and vote
    Related:/app
  • ImprovementJune 16, 2026

    New check-in guides on the blog — now linked in the top nav

    The blog is now reachable straight from the site navigation, and we've added a set of in-depth, screenshot-driven guides on gym check-in and attendance tracking for martial arts academies.

    • Blog added to the main site navigation so it's no longer buried in the footer
    • Three new guides: how modern gym check-in works (kiosk, QR, and the member app), what check-in data reveals about retention, and a practical attendance-tracking guide for BJJ academies
    • Posts now support product screenshots and related-reading links, so the guides show the real app and cross-link to each other and to features and pricing
    Related:/blog
  • ReleaseJune 11, 2026

    Community-curated videos for every technique

    Every technique now has its own community video shelf: save your favorite YouTube breakdowns, submit the ones you swear by, and upvote the best so the strongest video rises to the top — curated across the whole OLM community, not just your gym.

    • Tap the YouTube button on any technique to open its videos, watch them in-app, upvote the best, and bookmark favorites — your saved videos follow you across gyms, just like your journal and rank
    • Submit a YouTube link for a technique; it's reviewed before it goes public, and you'll see your own submission marked "In review" until then
    • Best videos are ranked by community upvotes with a freshness boost, so newer great breakdowns can climb instead of the first post staying on top forever
    • Approved videos also appear on the public technique pages at /techniques, with structured data so they can show up in Google and AI search
  • ReleaseJune 10, 2026

    A new look for the mobile app — glass chrome, real logo, faster flows

    The mobile app got a full visual refresh: a frosted-glass navigation bar with a dedicated check-in button, a color-banded home header with gym and profile switching in one place, slimmer buttons everywhere, and the official OLM mark on the app icon, splash screen, and boot animation.

    • New bottom navigation: Home · Log · Activity · More in a glass pill, with check-in as its own always-reachable button (your gym's color, not a fixed red) and a floating quick-log button on every tab
    • Home header now carries your color and opens the gym/profile switcher (gyms + kid profiles together) on the left, with notifications and your profile — belt-color ring included — on the right
    • Activity tab: one inbox for notifications and gym messages; your last-used gym is remembered across restarts for multi-gym members
    • Check-in got a celebration moment and a cleaner "who's on the mat" view; the training-log entry flow and profile page were redesigned to match
    • Systems trees now open much larger with pinch-zoom everywhere, bigger touch targets, and a simpler creation flow
    • New app icon, splash screen, and animated boot logo using the official OLM stamp
    Related:/app
  • ImprovementJune 8, 2026

    Make the app yours — pick your own accent color

    You can now choose a personal accent color for the app. By default it follows your gym's brand (or OLM's when you haven't joined one), but you can override it with one of nine presets — your pick follows you across every gym and works before you've joined one.

    • Personal accent picker in mobile settings (Account → Appearance) and the web admin portal (Settings → Theme)
    • Cascade: your chosen color → your gym's white-label color → OLM crimson; "Auto"/"Inherit gym" goes back to following your gym
    • Buttons, links, active states, and charts all follow your accent in both light and dark mode — your gym's outbound branding (emails, member-facing surfaces) is never affected
    Related:/app
  • ImprovementJune 8, 2026

    Control whether teammates can add you to their training notes

    Training notes can reference the people you train with. A new privacy setting lets you opt out of being suggested as a training partner — notes are always private to their author and never shown to the person they describe.

    • "Allow training-partner notes" toggle in mobile settings (Account → Privacy), on by default
    • Suggestions only ever include fellow gym members from classes you both attended — drop-in visitors are never shown or gathered, and anyone who opts out is excluded; if you're dropping in, you just keep a normal private log
    • An acceptable-use clause in the platform terms prohibits harassing or inappropriate notes about other members
    Related:/app

May 2026

  • ReleaseMay 29, 2026

    Systems: AI builds your whole game-plan tree from a prompt (mobile)

    The "new system" flow is no longer a blank canvas. Describe a position and your plan ("Half guard top, I want to pass, react to underhook + knee shield + sit-up") and AI drafts the entire decision tree — root + branches + reactions — in one shot. You land on the populated tree ready to refine.

    • Multi-line "Build with AI" prompt replaces the bare title input on the mobile My Systems screen
    • New system.generateFromPrompt procedure validates the AI response, caps trees at 30 nodes and depth 6, and inserts the whole tree atomically
    • Drafts are seeded by the techniques you've actually worked in your rolls — the tree prioritizes your game, not generic recommendations
    • Empty-state and offline fallback preserved: "or start an empty system" link below the AI prompt creates an unpopulated tree the old way
    Related:/app
  • ImprovementMay 29, 2026

    Systems: AI-suggested branches on every node (mobile)

    Every node in your game-plan tree now has a ✨ Suggest button. Tap it and OLM proposes 2–4 likely opponent reactions and the response for each — seeded by the techniques you've actually been working in your rolls — so you can build a full decision tree without staring at a blank canvas.

    • Per-node ✨ Suggest button on the mobile system editor — calls a coach-style AI that knows the position you're in and the techniques you already train
    • Each suggestion shows the opponent's reaction, your response, an optional technique tag, and a "Stretch" badge when it's outside your usual game
    • One tap inserts the suggestion as a child node — situation auto-derived from the parent move + reaction, so the new branch reads as a story
    Related:/app
  • ReleaseMay 29, 2026

    Train Hub reshape — one Log, an AI Coach, and "You vs the world" on by default

    The mobile training suite got sharper. Rolls and the journal merged into a single Log stream, the Mastery map became a forward-looking Coach that tells you exactly what to drill next, the training journal now works without joining a gym, and "You vs the world" is on by default so you can see how your game stacks up across the sport from day one.

    • Rolls + Training journal are now one Log — a single chronological stream of every session and roll, with filter chips (All / Sessions / Rolls) and one "Log" button that asks whether you're logging a class session or a roll. Partner scouting and the leak finder still live here
    • Mastery map → Coach: instead of just showing where each technique sits, it now leads with "Drill this next" — a prioritized plan built from your own training (situations you keep getting caught in, techniques going stale, and staples you've never logged). Your state-of-game breakdown moved below the fold
    • Training journal no longer requires joining a gym — your focus-area radar is portable and works from your first session, whether or not you're a member anywhere yet
    • "You vs the world" is on by default — your training is anonymized and only ever shown as an aggregate across many athletes (never tied to you), and you can opt out anytime from the You-vs-the-world screen
    Related:/app
  • ReleaseMay 28, 2026

    Frictionless demo claim + demo-to-real promotion + transparent invoicing

    Homepage prospects now go from form submission to a fully-seeded admin dashboard in one click — no Clerk sign-in screen, no re-acceptance of terms, no dead-ends if a stale session is active. Super admins can promote a demo org into a real customer in one move that auto-fires the itemized setup-fee invoice. Member-facing Stripe invoices now carry a per-plan "what's included" line so customers see exactly what they're paying for.

    • Magic-link demo claim is now invisible — server mints the Clerk identity + sign-in ticket, client consumes it via signIn.create({ strategy: "ticket" }), no <SignIn /> UI ever shown. If a stale session is active, the page signs out first then claims, so a single click always works regardless of prior auth state
    • The homepage form's Terms of Service acceptance now carries forward onto the new user's row at claim time (with the original IP + user-agent preserved in terms_acceptances), so prospects don't get re-prompted for an acceptance they already made
    • New superadmin.promoteDemoToReal procedure: wipes seeded @olmdemo.local synthetic members + their check-ins / subscriptions / promotion needs, detaches auto-attached super admins, flips is_demo + demo TTL columns, strips the -demo suffix from the slug (overridable), and audit-logs the transition. Comp orgs keep fees waived; paying customers flip to PENDING
    • Setup-fee invoice now auto-fires during promotion (default ON; comp orgs skip). Stripe failures don't roll back the promote — the demo flip still succeeds and the existing Send invoice button can retry
    • Setup-fee invoice line items now itemize what the $499 covers: Founder-led onboarding & training call · Stripe Connect setup + payouts verification · Member roster import assistance · Theme + branding customization · Going-live launch support
    • Member subscription invoices now carry a per-plan description (Stripe Product.description) so members see what's included on their hosted invoice + emailed receipt. New billing_plans.description column + textarea in the admin plan dialog; updates mirror to Stripe so existing subscriptions get the new copy on their next invoice
    • Demo organizations seed with 16 members spanning every belt color (WHITE 0-4 stripes through BLACK), 4 promotion needs covering the full belt arc (WHITE→BLUE through BROWN→BLACK), a published Lachlan Giles guard-retention seminar with 12 confirmed registrations, and 2 sample broadcasts in /messaging
    • Demo org banner now reads three tiers of urgency: muted amber >7 days, warning amber 3-7 days with "X days left" pill, urgent red <3 days. Readable in both light + dark (no more cream-on-cream), CTA pre-fills a kevin@trainolm.com mailto with the demo slug + expiry baked in
    • Lead notification emails now fan out to multiple inboxes via DEMO_REQUEST_INBOX (comma-separated); transactional emails reference the canonical OLM mark at /api/email-assets/olm-mark instead of an inline-CSS reconstruction
    • FIXED: /demo/claim was being blocked by Clerk middleware (sent to accounts.dev/sign-in); /api/email-assets was 404'ing because Turbopack ignored route.tsx + the route wasn't in the public matcher; demo claim was redirecting to /{slug}/dashboard which doesn't exist (admin layout group, no slug prefix)
    • FIXED: provisioner crashed with "Invalid time value" because demo-seed appended :00 to Postgres time columns that already had seconds; SES rejected magic-link emails because the helper was passing Reply-To as a custom header instead of using the dedicated replyTo field
    • Park City Jiu Jitsu "design partner" framing on /app rewritten — Kevin trains there but PCJJ isn't an OLM customer. New copy: "Built by a practitioner, not a software company — an app for grapplers, built by a grappler." The four phone mockups (Check-in, Journal, Belt, Schedule) are now clickable with hover-lifts and the 8 Edition 06 cards are real Links with hover glows + arrow reveals
  • ImprovementMay 19, 2026

    Per-org auto-grant trial toggle + dismissible dashboard waiver prompt

    Admins can flip auto-grant trials on/off per org from settings (defaults to on). The mobile dashboard's waiver prompt is now dismissible with an X — the soft nudge clears, the check-in hard gate stays. The dismissal is per-doc-id, so a NEW required document the gym adds later re-surfaces the card.

    • New organizations.auto_grant_trial_on_join column (default true) — admins control whether self-service member.join grants the org's default trial automatically
    • Toggle surfaced in Admin → Settings → Membership & Trials next to the trial-value field, with copy explaining the dashboard impact
    • Mobile dashboard waiver prompt now has an X dismiss button; dismissed doc ids are persisted in AsyncStorage per-org and auto-pruned when docs get signed
    • REGRESSION: a freshly-added required doc re-surfaces the prompt even if previous docs were dismissed (1 vitest contract pinning this)
    • Seed file now creates 2 active waivers for Park City BJJ (Liability Waiver + Photo & Media Release) so the multi-doc form of the prompt is visible in dev without manual setup
  • ReleaseMay 19, 2026

    Free trial auto-grants on join + dashboard surfaces trial / waiver state

    Members now get their gym's free trial automatically the moment they join — no Skip button required. The mobile dashboard surfaces a free-pass CTA, trial countdown, grace-period nag, and an unsigned-waiver prompt as cards at the top, so members never get surprised at check-in time.

    • member.join now routes through computeMembershipFields just like the admin-invite path — trial-abuse suppression, org defaultTrialValue, and the CLASSES-vs-DAYS trial type are all honored
    • Members with an existing ACTIVE subscription at the joined org skip the trial (they don't need one); reactivating an INACTIVE membership never re-grants
    • member.getMembershipStatus now returns a trialAvailable boolean so the dashboard can show a success-toned "Start free trial" CTA when the member has never had one
    • New dashboard access banner: ACTIVE_TRIAL shows days/classes remaining (warning tone at ≤1 left), GRACE_PERIOD shows update-card CTA, TRIAL_EXPIRED shows pick-a-plan, NO_ACCESS with free trial available shows the success-toned trial CTA
    • New dashboard waiver prompt: lists unsigned required documents with a one-tap CTA to /sign-waiver/[id]; auto-disappears once all required docs are signed
    • Decision logic is pure (apps/expo/src/app/(tabs)/dashboard/_access-banner-logic.ts) and unit-tested — 16 contracts covering every access reason + waiver-count edge case
    Related:/billing
  • ReleaseMay 19, 2026

    Skip-for-now trial + App Store links in invites + Powered-by-OLM signature

    Three onboarding-flow changes ship together: members who hit the billing screen can tap Skip for now to start a free 7-day trial and check in immediately, member invite emails include real App Store + Play Store badges so recipients can download the app from the same email, and a small Powered by OLM signature now sits under the sign-in and pre-org screens so users always see the platform behind their gym.

    • New billing.startSelfServiceTrial mutation: idempotent, grants 7 days, only shown when the member is in NO_ACCESS state (won't appear after a trial expires); audited as MEMBER_TRIAL_UPDATE with method=self_service_skip
    • Member invite emails now include Apple-provided "Download on the App Store" and Google-provided "Get it on Google Play" badges next to the existing Join button; store URLs default to the official OLM listings and can be overridden via IOS_APP_STORE_URL / ANDROID_PLAY_STORE_URL env vars
    • Powered by OLM badge renders on the auth carousel and the pre-org profile screen — single OLM binary, runtime gym rebrand, OLM always visible as the foundation
    • Per-org native binary pipeline (apps/expo/scripts/generate-org-build-config.ts + OLM_ORG_SLUG-aware app.config.ts) is wired and tested but treated as an opt-in premium offering, not the default — the standard path is one OLM binary with runtime theming that switches as members join, leave, and re-join gyms
    • Check-in gating is unchanged — waiver + active subscription / trial / comp / grandfathered is still required
    Related:/billing
  • ImprovementMay 19, 2026

    OLM now lives at trainolm.dev

    All app and email links — terms, privacy, help, support, contact, billing, deep links — now point at trainolm.dev. Existing mobile installs continue to work; the iOS Universal Link and Android App Link configs were updated to the new domain in the same change.

    • User-facing URLs (privacy, terms, help, billing, sign-up, join, check-in) resolve at https://trainolm.dev
    • Contact emails moved to @trainolm.dev (hello@, support@, privacy@, noreply@, unsubscribe@)
    • JSON-LD organization metadata, OpenGraph cards, llms.txt, and middleware allowed-origins updated to the new domain
    • Mobile bundle identifier (com.olm.app) is unchanged, so existing app installs and in-app purchases keep working
  • ImprovementMay 18, 2026

    Mobile dashboard auto-focuses on your home gym

    For members who train at multi-location gyms, the dashboard's Today's Classes now defaults to the location you actually train at — derived from your last 3 check-ins — instead of showing every location at once. The full schedule is still one tap away on the Check In tab.

    • Majority of last 3 check-ins wins; on a 1/1/1 tie the most-recent location wins (so switching gyms shows up within a few sessions)
    • Members with fewer than 3 check-ins still see all locations on the dashboard until a pattern emerges
    • A subtle '<Location> · See all' caption above the list links to the full check-in screen so visiting members can see other locations' classes
  • FixMay 17, 2026

    Mobile check-in works again for classes with a capacity cap

    Checking in to any class that had a capacity set was failing with a database error. The capacity-locking query has been rewritten so members can check in normally.

    • Today's classes also now show on the mobile dashboard reliably — the dashboard and check-in screens share a single timezone-aware "is this session over?" helper so they can no longer disagree
  • ImprovementMay 15, 2026

    Home-page hero: branded iOS home-screen mockup

    The first phone in the white-label hero fan now shows an iOS home screen with the gym's branded app icon installed among muted placeholder apps — re-labeled "01 · installed" — to make the real-download / white-label moment unmistakable.

    • New `home` PhoneFrame variant: brand-color-glowing app icon with a "↓ just installed" badge sits in a 3×4 grid of muted placeholder apps + dock
    • Left and right phones now lock to the same min-height so the side phones in the fan render at equal sizes
    • Homepage wrapper now uses `overflow-x-clip` so the hero phone fan + marquee can't introduce horizontal page scroll
    Related:/
  • ImprovementMay 15, 2026

    Private (invitation-only) billing plans

    Admins can now mark a billing plan as Private when creating it. Private plans are hidden from the member-facing list and can only be subscribed to by members the admin has explicitly invited via the new "Private plan invite" picker on the member detail page. Useful for friends-and-family rates, scholarship tiers, founding-member deals, or any one-off arrangement.

    • New Visibility selector on the create/edit plan dialog (Public — anyone can subscribe / Private — invite-only)
    • Private plans show a Private badge in the Plans & Pricing table
    • Member-facing plan list filters out private plans the member hasn't been invited to
    • Self-serve subscribe endpoints reject private plans unless the member is on the invite list (assigned_plan_id)
  • ReleaseMay 14, 2026

    Public BJJ knowledge surfaces: /techniques, /creators, /athletes

    Three new DB-backed public pages — a library of 378 Brazilian Jiu-Jitsu techniques across 38 positions, a directory of 20 instructors and channels, and a directory of 211 notable competitors seeded from Wikidata + Wikipedia. Heavily cross-linked, ISR-revalidated daily, with schema.org HowTo / Person / BreadcrumbList markup for AI search and Google.

    • Technique pages grouped by position with type chips (submission / sweep / pass / escape / transition / control / attack)
    • Creator profiles with YouTube / Instagram / website links and the techniques they teach
    • Athlete profiles with bios sourced from Wikipedia under CC BY-SA attribution + Wikidata structured data
    • Sitemap now exposes ~720 URLs total; llms.txt and llms-full.txt advertise the new surfaces to AI crawlers
    • Long-form technique content gated behind an editor-approved flag — drafts stay invisible until reviewed
  • ImprovementMay 9, 2026

    /api/health endpoint for uptime monitors

    Added `GET /api/health` returning DB + Redis probe results, commit SHA, and env. 200 when all deps respond, 503 if any required dep is degraded. Redis probe gracefully passes when Upstash isn't configured (dev / preview). No auth — pingable from UptimeRobot, Better Stack, Pingdom, etc.

  • ImprovementMay 9, 2026

    E2E test coverage: invites, refunds, CSV exports, Stripe Connect entry

    Added Playwright spec files for the invite-member, refund, CSV-export, and Stripe-Connect-onboarding admin flows. Specs are smoke-level (no real Stripe / mailbox dependencies) and skip gracefully when seed data isn't available. Covers OLM-17/18/19/20 manual-test checklist surfaces.

  • FixMay 8, 2026

    Security hardening: drop-in track gate, verified email source, dev bypass double-lock

    Three urgent security fixes — drop-in checkout now enforces the KIDS/ADULTS rank-track gate, ensureUser pulls the verified email from Clerk instead of trusting client input, and the dev OTP bypass requires both NODE_ENV !== production AND an explicit ALLOW_DEV_OTP_BYPASS=1 opt-in.

  • FixMay 8, 2026

    Find-a-gym: hide drop-in price when no class is scheduled

    Find-a-gym list now only advertises a drop-in price for gyms that actually have an upcoming SCHEDULED class. Gyms with drop-ins enabled but no class on the books no longer show a price for a class that doesn't exist.

  • FixMay 7, 2026

    Drop-in availability: late-night classes + transient errors

    Two fixes to the drop-in eligibility logic introduced earlier today, plus removal of the now-unused requiresDropInApproval setting.

    • Fix: classes that cross midnight (e.g. 22:00–01:00) no longer drop out of drop-in eligibility the moment they begin. prepareDropIn now treats endTime ≤ startTime as +1 day in the org's local timezone.
    • Fix: 'No class today' badge on the gym card / map sheet no longer renders during a transient API error or before the query has run — only when the schedule has been confirmed empty.
    • Schema: removed organizations.requiresDropInApproval (column + admin toggle). Drop-ins are pure self-service now; the field had no remaining server-side enforcement after the join-request consolidation.
  • ImprovementMay 7, 2026

    Join requests simplified: drop-ins are now self-service only

    Removed the duplicate 'Drop in for a class' option from the Join Request dialog. Drop-ins are paid self-service via the gym card's Drop-in button; the dialog is now exclusively for full-membership requests. Message field is also now optional.

    • Mobile JoinRequestDialog: dropped the intent picker entirely. The dialog now always sends a FULL_MEMBER request and explains that visitors should use the 'Drop in' button to walk in for one class.
    • Server: joinRequest.request no longer accepts an intent input — always inserts FULL_MEMBER. Existing DROP_IN rows preserved for history.
    • Message field is now optional (no min length). Footer reads 'X/1000 · optional', label is 'Message to the gym (optional)', Send button enables regardless of message length.
  • ImprovementMay 7, 2026

    Drop-in: today-only availability + 'No class today' state

    The Drop-in CTA now surfaces only when there's actually a SCHEDULED class today in the gym's local timezone. When a gym allows drop-ins but has nothing on the schedule, the gym card and join sheet show a clear 'No class today' state instead of a dead-end Drop-in button.

    • API: prepareDropIn filters cs.date == today-in-org-tz and skips sessions whose end time has passed (was returning any future session).
    • Mobile join sheet: 3-state copy — 'Not accepting drop-ins' / 'No class scheduled today — try again tomorrow.' / available with fee.
    • Find-a-gym list + map: 'No class today' badge replaces the Drop-in $X pill when the org allows drop-ins but no session is on.
  • ReleaseMay 6, 2026

    Drop-ins: ticket model + admin payments page + auto-refunds

    Drop-ins now work like event tickets — each paid drop-in is a ticket with three states (Upcoming, Past, Refunded). Admins get a dedicated payments page; members get a 'My visits' screen across both pre-org and in-org contexts.

    • New admin page: /billing/drop-ins. KPI cards (revenue, count, refunded, avg fee), Frequent Droppers panel surfacing 3+ paid visits as sales leads, status + date filters, refund action with internal-note dialog, CSV export.
    • New mobile screen: 'My visits' on the More tab. Segmented Upcoming / Past / Refunded tabs, ticket cards with org logo + class details, tap-through detail view with Get Directions and Cancel & Refund (>24h policy).
    • Server-side webhook finalize: drop-in tickets are now written when Stripe confirms payment, not when the user re-enters the app. Closing the app after checkout no longer loses a paid ticket.
    • Auto-refunds when a session is cancelled or capacity-full at finalize time — Stripe refund + ticket flagged with reason, no manual admin work.
    • Post-class push notifications: journal prompt at +1h, conversion prompt at +24h (suppressed if user has already joined or was refunded).
    • Refund visibility: refunded tickets stay in history with the reason ('Class cancelled', 'Cancelled by you', etc.) instead of vanishing.
  • ImprovementMay 4, 2026

    Curriculum: coverage radar + preset library

    Two more layers on /curriculum — a balance-view radar chart (filterable 1/3/6/12 month windows) and a preset library that scaffolds weeks/months from canonical BJJ curricula.

    • Coverage radar: complementary view to the heatmap. One axis per category in your discipline's taxonomy; shape shows balance at a glance — a balanced gym fills the whole web, a guard-heavy gym spikes on one side.
    • Filter window: Last month / Last 3 months / Last 6 months / Last 12 months, defaulting to last month so it's meaningful from week one.
    • Preset picker in the focus dialog: pick from "Fundamentals of Self-Defense (White → Blue)" (81 techniques) or "Blue → Purple (Pedro Sauer)" (88 techniques). Clicking a category fills title + appends technique bullets to the description + auto-tags coverage categories.
    • Renders gracefully for brand-new gyms — no "need 4 weeks" gate; shape stabilizes as data accrues.
    Related:/curriculum
  • ReleaseMay 4, 2026

    Curriculum: weekly calendar + coverage heatmap

    Curriculum got a real spine — a Mon–Sun weekly calendar with drag-to-reschedule, plus a coverage heatmap that tells you what you've been ignoring.

    • Weekly calendar on /curriculum showing the past 4 weeks + this week + next 8 weeks. Click any week to set or edit its focus; drag a filled week onto another to move or swap.
    • Per-discipline category taxonomy (BJJ, judo, striking, wrestling, MMA, generic) lets you tag months and weeks with what you covered.
    • Coverage heatmap: 12-week × N-category grid showing what's been hit and what's been ignored. Pulls from both weekly tags and the parent month's tags.
    • Gap report flags the top 3 categories with zero coverage in the last 12 weeks ('No takedowns since Feb 16').
    • Mobile members get a new 'This Week' card and a 'Coming Up' list of the next 4 weeks on the curriculum screen.
    Related:/curriculum
  • ReleaseMay 4, 2026

    Curriculum: monthly focus for every gym

    A simple, opinionated v1: one paragraph per month telling members what your gym is working on. Available to every org out of the box.

    • Admin portal — new /curriculum page in the sidebar. Set this month's focus, plan next month, see past months.
    • Mobile dashboard — shows a 'Working on…' card with the current month's title + description. Tap through to a dedicated screen with full history.
    • Designed around how gyms actually behave: coaches set an intent and partially adhere. The feature embraces drift instead of nagging coaches with a checklist.
    • Intentionally minimal — no per-class lessons, no technique-library wiring, no coverage heatmap yet. Those land only if real gyms ask for them after using v1.
    Related:/curriculum
  • ImprovementMay 3, 2026

    Compare pages — added 'Demand pipeline' row + sharpened white-label copy

    Every /compare page now calls out the consumer-facing OLM app as a discovery channel for gyms, and clarifies what 'true white-label' actually means (members never see OLM branding).

    • Added a 'Demand pipeline / member discovery' comparison row to all 5 competitor pages.
    • Tightened the white-label rows so it's clear the member-installed app shows your colors and logo only.
    Related:/compare
  • ImprovementMay 3, 2026

    Added /compare pages for Wodify and BJJLink

    Two new competitor breakdowns — Wodify (per-location SaaS with HYROX/Two-Brain co-marketing) and BJJLink (BJJ-only flat-rate, closest philosophical competitor). Honest tradeoffs included.

    • /compare/wodify — leads with per-location pricing + add-on creep critique; acknowledges Wodify wins on programming/WOD tools, reporting depth, and HYROX/Two-Brain ecosystem.
    • /compare/bjjlink — leads with multi-discipline rank portability and Stripe Connect ownership; acknowledges BJJLink CORAL is genuinely cheaper at scale and has a curriculum builder OLM doesn't yet.
    • Both pages auto-flow into the existing /compare index, OG image generator, and 'Other comparisons' carousel — no template changes needed.
    • Background research lives in plan/competitors.md.

April 2026

  • ReleaseApril 29, 2026

    Removed $500/mo platform fee cap

    Platform fees now scale linearly with what your members actually pay. Pricing stays $0/mo subscription, 2% on memberships ($2 min), 3% on add-ons, $0 POS — but with no monthly ceiling.

    • Removed the $500/calendar-month per-org cap on platform fees.
    • applyMonthlyCap and the cap-refund webhook branch were deleted; payments now record the full membership fee.
    • The motivation: a gym hosting a $24K seminar after their members had already renewed shouldn't pay zero on the seminar — that's a feature working, not a tax to refund.
    • Practical impact: a 100-member academy still pays ~$200/mo on memberships; a 300-member academy pays $600 instead of capping at $500. Average gym (~150 members per industry data) pays roughly $300.
  • ReleaseApril 29, 2026

    Public-site SEO overhaul

    Per-competitor compare pages, 30 BJJ city landing pages, llms.txt for AI crawlers, FAQ blocks across discipline / feature / compare pages, and a /blog with 6 launch posts.

    • Per-competitor pages at /compare/[slug] for OLM vs Mindbody, Zen Planner, Kilo, Glofox, PushPress, GymRocket — each with FAQPage JSON-LD and a competitor-specific OG image.
    • 30 BJJ city landing pages at /for/bjj/[city] with substantial unique copy per market (Austin, Boulder, Chicago, Denver, Honolulu, Houston, etc.).
    • /llms.txt and /llms-full.txt route handlers serving the OLM index and full content reference for AI crawlers.
    • FAQ blocks (5-6 questions each) on every discipline, feature, and competitor page with FAQPage JSON-LD.
    • /blog with 6 launch posts: switching guides, AI Monitor explainer, Stripe Connect explainer, training journal deep-dive, portable belt history founder note, drop-in marketplace guide.
    • /about page with Person + AboutPage JSON-LD.
    • Dynamic OG images via next/og for every public route.
  • ReleaseApril 20, 2026

    Pay-as-you-grow pricing model

    Removed the $150/mo SaaS subscription and the /subscribe gate. Platform revenue is now pure per-transaction.

    • Memberships: 2% on each invoice with a $2 minimum (was: 2.9% of revenue tier).
    • Seminars / merchandise / drop-ins: 3% per transaction.
    • In-gym POS (drinks, snacks, retail): $0 platform fee.
    • Removed platform_subscriptions table and /subscribe gate; existing subscriptions grandfathered to $0/mo platform fee forever.
    Related:/pricing
  • ReleaseApril 15, 2026

    Portable belt history + per-discipline ranks

    Belt promotions and rank records are now keyed by (user, discipline) instead of (user, gym), so members carry verified lineage across OLM academies.

    • New user_ranks table — one row per (user, discipline). Disciplines: BJJ, Judo, Muay Thai, Boxing, Kickboxing, Karate, Taekwondo, Wrestling, MMA, Other.
    • New belt_promotions table — append-only lineage with user, issuing org, discipline, from-rank, to-rank, promoter user, free-text note.
    • org_members.rank caches the org's primary-discipline rank for query performance; member.updateRank writes through to user_ranks.
    • Member API exposes getUserRanks, getBeltLineage, and analytics.getMemberLifetimeStats endpoints.
  • ImprovementApril 10, 2026

    Guardian / dependent profiles for kids classes

    Guardian accounts can now manage one or more dependent (kid) profiles — each with their own training data, but billing rolls up to the guardian.

    • users.guardianUserId column links a kid profile to a guardian account.
    • resolveTargetUser helper reads the right user context for journals, check-ins, drop-ins.
    • Guardian can sign waivers on behalf of dependents; second-signer flow for forms requiring two signatures.
    • One Stripe billing relationship per guardian, with line items per dependent membership.
  • ReleaseApril 5, 2026

    AI Monitor — churn prediction with 14-day lead time

    New AI Monitor surface that flags members trending toward cancellation 14 days early based on attendance drop-off relative to baseline.

    • Per-member attendance baseline (rolling 90-day window).
    • At-risk flags fire when recent 14-day attendance drops >50% from baseline.
    • Org-level pattern detection separates seasonal dips from individual churn signals.
    • Each at-risk member surfaces a recommended action (outreach, free private, schedule suggestion, billing pause).
    • Opt-in at the org level; analytics dashboard exposes the same data without the predictive layer if disabled.

March 2026

  • ReleaseMarch 28, 2026

    Training journal with 8-axis chart and voice notes

    Members can log post-class training as tags or voice notes; OLM transcribes and maps to an 8-axis radar chart per discipline.

    • Tag-based and voice-note entry modes (under 30 seconds typical).
    • 8-axis radar chart per discipline (BJJ: Guard, Passing, Subs, Sweeps, Takedowns, Escapes, Pressure, Conditioning).
    • AI coach surfaces suggested drills based on weak axes.
    • Aggregate journal data at the academy level surfaces curriculum gaps.
    • Journal entries are member-portable — they travel across OLM academies.
  • ImprovementMarch 15, 2026

    Stripe Connect Standard onboarding

    Onboarding flow now creates a Stripe Connect Standard account for every gym, replacing the legacy platform-account model.

    • Each gym is the merchant of record for member charges; payouts land directly in the gym's bank account.
    • Platform fee is collected on top of Stripe processing — Stripe charges Stripe, OLM charges its capped fee separately.
    • Refunds automatically reverse the OLM platform fee in proportion to the refund amount.
    • If a gym ever leaves OLM, they keep their Stripe account, customer relationships, and card-on-file vault intact.
  • ReleaseMarch 1, 2026

    Multi-location support

    Organizations can now run multiple physical locations under one Stripe billing setup, each with its own class schedule and instructor pool.

    • locations table with per-location class templates.
    • Member-facing schedule filters by preferred location.
    • Per-location utilization metrics in the admin reports.
    • One Stripe Connect account per organization across all locations.