The problem
A fight coach with a dozen athletes in camp spends Sunday evening texting. How is the weight? Did you run? Did you do the work I set? The answers come back late, partial and in twelve different formats, and by the time a problem shows up on the scale it is a week old. The fighter, meanwhile, is already logging all of it in Fighter Cut, the athlete app we built to plan a safe weight cut. The data existed. It just had no window for the person in the corner.
The obvious answer is a coach login to the athlete app. We rejected it. What a fighter eats is private in a way a weigh-in is not, and once a coach can see everything a fighter can, the athlete app's whole pitch, that this is your data and nobody else's, is gone. So The Corner is a separate product, in a separate repository, that can only see what a fighter chooses to send it, one switch at a time. The companion-app pattern behind that decision is written up separately.
The rules we wrote before the first screen
- Nothing from the athlete app: No cut planning, no food logging, no macro maths, no onboarding questionnaire. A feature request that sounds like one of those is aimed at the wrong app.
- The fighter holds the switch: Sharing is opt-in from the fighter's side and revocable with one toggle, which deletes the shared stream.
- Food detail needs its own switch: Progress and nutrition are separate consents. The first version shared no food at all; since 2 September 2026 a fighter can additionally share daily totals, meals and recipes. Photos and their own notes never cross, under any switch.
- Server-owned, not local-first: The athlete app works offline on IndexedDB. A roster cannot, and pretending otherwise would let a stale cache impersonate a live team.
What we built
Five screens, one question
Every screen answers "how is my fight team doing?" for someone who is not the fighter. Signed out, a coach sees a marketing page with a live count of founding spots and a sign-in. Signed in without a gym, they land in one-time setup. After that, four tabs.
Getting a gym
- Claim: When a fighter names a gym in their app and nothing matches, the server creates an unclaimed club and files the request against it. The Corner's setup search finds those clubs, shows how many fighters are waiting, and hands the claimant ownership with every waiting fighter attached.
- Create: A new club, with the creator inserted as its owner in the same step. A club whose creator is not a member looks like success and then reads back empty forever, so that insert failing is surfaced, not swallowed.
- Join with a staff code: Redeems an owner's invite and joins as a coach, not an owner. Coaches see the roster; they cannot remove staff or spend the founding spot.
How it works
Shared backend, split ownership
Consent as a data shape
Row-level security that does not recurse
Founding gyms, enforced in one place
Timeline
- 17 August 2026: Clubs and fighter profiles land in the athlete app's schema.
- 23 August 2026: Org dashboard migration: members, progress events, assignments and roster invites. The Corner repo starts the next day.
- 25 August 2026: Emailed links fixed after both were silently landing coaches in the athlete app.
- 30 August to 1 September 2026: Founding codes, club claiming, staff management and sub-admin migrations. corner.fightercut.com live, build 3 on TestFlight with the bot check, public join link on the landing page.
- 2 to 4 September 2026: Nutrition sharing lands: daily totals first, then meals and recipes behind an expanding day row. Fighters shown by public name.
- 7 September 2026: Landing redesign: three photographs, a shorter centred hero, and the descenders the animation had been clipping off the headline.
Problems worth talking about
Coaches waking up in the wrong app
A deploy that says yes and does nothing
Duplicates that orphan fighters
Tests without a DOM
Where it stands
Beta, reported honestly
The Corner is live on the web and in TestFlight as Fight Corner, alongside the Fighter Cut athlete app, with public release gated to October 2026. The numbers on this page are counts from the code and schema: event types, consent switches, roles, dates from the commit and migration history. Known gaps are documented too: no in-app billing beyond the founding code, no referral capture, and per-fighter assignments modelled but not yet in the UI. We do not publish gyms, coaches or fighters on a roster for a product that has not launched.
Meal photos and the fighter's own notes stay on their phone. This app never receives them. Everything here is shared by their choice and disappears the moment they switch it off.
— The Corner, fighter detail screen
What This Project Does Well
Technologies Used
React 19, Vite, TypeScript, Tailwind CSS 4, Zustand, Framer Motion springs, hand-built SVG, Supabase (Postgres, Auth, row-level security, SQL functions) shared with the Fighter Cut athlete app, Capacitor 8 for iOS with Swift Package Manager, Vitest, Cloudflare Pages, App Store Connect
Ready to Build Something Similar?
Let's discuss how we can help transform your business with a custom digital solution.
