FIGHTMINDCombat Scouting OS
Pre-Fight Opponent IntelligenceLive read

Scout the fight before camp begins

A coaching-grade scouting report — seven tabs, every read traced to a recorded bout — built from the full pro record before camp opens. It compresses 20–40 hours of tape into a report your fighter reads in twenty minutes.

Every claim citedGaps named, not filledPrivate to your gym
The contract

Three promises you can hold us to

The credibility spine: every read is cited, every gap is named, and every report stays inside your gym.

Cited, or it doesn't ship

Every claim names the recorded bout it came from. The schema hard-fails any claim that can't be traced to source data.

source_bout_ids ≥ 1
Gaps named, not filled

When the data isn't there, the section says so plainly. You never build a game plan on a number we invented.

insufficient_data panel
Private to your gym

Reports live behind team auth in your library — magic-link sign-in, Postgres row-level security. Not a public feed your opponent can read.

auth-gated · noindex · no-store
How a report is built

The trust is mechanical, not a tagline

Four steps from public record to a published report. Sources are named; citations are enforced before anything reaches your library.

Pipeline
1
Structured data pull

Every recorded pro bout across all promotions — strikes, takedowns, control time, finish methods — pulled from public sources and normalized into one record per fighter, with provenance on every field.

UFCStats · Sherdog · Tapology · Wikipedia
2
Opponent cross-reference

Each fighter's tendencies are scored against the specific opponent's recorded profile — combination patterns, strike-to-takedown setups, chain transitions — not generic style notes.

src/pipeline
3
In-app generation

Pick your fighter and the opponent from your roster. The report is generated against both fighters' structured records, citing the bouts behind every read.

/request
4
Citation validation

Every cited bout id is checked against the two source records. Any claim that can't be traced hard-fails the report — it does not publish.

validate.ts · referential check
See it

A cited read, beside an honest gap

The difference made visible: a claim traced to the bout behind it, next to a section that admits what the record doesn't show.

Cited read

“Concedes the takedown off the cage when pressured backing up — gives up the body-lock entry rather than circling out.”

source_bout02 Strengths / Weaknesses · traced to the bout it happened in
Honest gap
INSUFFICIENT DATA
No career striking metrics on record for this non-UFC fighter. Shown as a panel with the reason — never a fabricated rate.
06 Evidence · insufficient_data
The deliverable

One report, seven tabs

The outer shell a coach first sees: both corners, the matchup frame, a confidence score, and the seven-tab rail. Everything that follows is one artifact, not seven loose panels.

Tab by tab

Feature depth, tied back to evidence

Seven tabs, each cited to the bouts behind it. Read it corner-side; act on what we can prove.

01Prediction

Probabilistic outcome — win probability with a confidence interval, method-to-win breakdown per corner, round-of-finish distribution, and a graded confidence score.

Probabilistic Outcome
02Strengths / Weaknesses

Per-fighter strength and weakness tables with cited precedents and direction arrows, plus the strength-vs-weakness collision points for this matchup.

cited precedents
03Tactical Report

Paths to victory for each corner and dual exploitation plans — every gap targeted with concrete counters to drill.

drill these
04Sequence Intelligence

Combination and chain breakdowns as step pills — strike, kick, takedown, sub, feint — with a stance pill and three stats per row. Every row cited.

source_bout_ids
05Camp Targets

Drill priorities and a suggested camp-time split, plus a graded medical-suspensions table. With nothing on record it reads “no suspensions on record” — never invented medical tracking.

graded · insufficient state
06Evidence

An audit panel — each fighter's last-five trend rows, a style-stat comparison, comparable-opponent notes, a data-completeness meter, and the cited sources.

Data Completeness
07Coach Notes

A notes textarea and a working Print / Save as PDF. Type it, print it, hand it to your fighter.

window.print()
How it's made

Pick two corners, watch the real work

Pick your fighter and the opponent from your roster. A full-screen overlay narrates the actual pipeline stages with an elapsed timer and a ~2–3 minute estimate — the wait is real work, not a spinner.

Your fighter
Charles Oliveira
VS
Opponent
Islam Makhachev
Both corners drawn from your gym roster.
Generation overlay
Validating citations
Pulling bouts · per-round profile · cross-referencing styles · scoring · mapping paths · validating citations · assembling
Elapsed 1:4862%Est. ~2–3 min
From the roster

Two views a coach opens beside the report

The single-fighter dossier and the two-fighter percentile comparison — both driven by scraped record, both honest about thin data.

Fighter Profile
COCharles Oliveira35-10-0 · Lightweight · Southpaw
Sig. strikes / min62%
Striking defense54%
Takedown defense48%
Finish rate79%
/fighters/[slug] · bio, record, streak, win-methods, per-round tendencies, finish profile, career timeline. Non-UFC fighters get an insufficient panel, not invented rates.
Percentile Comparison
Striking volume78th · 60th pct
Grappling60th · 70th pct
Cohort built live from your gym roster · below 8 fighters it reads insufficient and the radar is hidden, never plotted as zero.
Home base

A private team library

Where it all lives: the gym roster, the reports list, and the entry point for a new matchup — scoped to your gym, not a one-off tool.

Roster
FighterDivisionRecord
Charles OliveiraLightweight35-10-0
Islam MakhachevLightweight27-1-0
Justin GaethjeLightweight25-5-0
Reports
Oliveira vs MakhachevLightweight · 5 roundsPublishedOliveira vs GaethjeLightweight · 3 roundsDraft
Add a fighter with a short form — the gym is derived from your signed-in profile. Accounts not yet linked to a gym get a graceful state, not an empty error.
Private by default

Behind team auth, not on a feed

Reports live in your gym's library behind magic-link sign-in and Postgres row-level security. Not a public scouting feed your opponent can read.

Magic-link sign-in

No shared passwords. A link to your inbox, scoped to your gym.

/login
Gym-scoped by RLS

Postgres row-level security keeps every report, profile, and comparison inside your gym. Report pages are noindex and never cached.

RLS · noindex · no-store
Fight Mind — Combat Scouting Operating System

Game-plan from evidence, not vibes

One report, every read traced to the tape, before the camp clock starts. Sign in and pull the opponent.