Turn a match performance into a professional scouting report, in one tap.
The problem: thousands of talented amateur footballers across Pakistan play every week in local leagues and street tournaments, and stay completely invisible to the scouts who could change their career. Scouting stays word-of-mouth, unstructured, and limited to whoever happens to be watching that day.
FootyFolio fixes the visibility problem. Players log their match stats. AI turns that data into a scouting report a real academy would take seriously. Scouts get a live, filterable feed of local talent instead of relying on luck.
Live. Deployed. Fully functional. Sign up as a Player or a Scout and see it work end to end.
Players β amateur and grassroots footballers who play regularly (local leagues, street tournaments, five-a-side, college teams) but have no formal way to prove their performance to anyone outside the pitch.
Scouts & coaches β academy scouts, local club coaches, and anyone trying to find talent outside the small pool of players who happen to already be visible. Instead of relying on word-of-mouth, they get a searchable, filterable feed of real, self-reported performance data.
| π½ Dual-role onboarding | A tailored first-run flow for Players and Scouts β not the same generic signup form |
| π Match performance tracker | Log goals, assists, minutes, and tactical notes after every match |
| π€ AI scouting dossier | Gemini turns raw stats into an executive summary, strengths, development areas, and a scout's verdict β structured like a real report, not a chatbot reply |
| π Scout discovery feed | Browse and filter local talent by position, city, and age |
| β Shortlisting | Scouts build and revisit a personal shortlist of prospects worth following up on |
| π Real authentication | Supabase email/password + Google OAuth β persistent sessions, not a demo toggle |
| π€ Guest mode | Try the full flow with zero signup β data saves locally and syncs to a real account whenever you're ready |
| π± Mobile-first | Built for the phone-first way players and scouts actually use it on the ground |
This isn't "summarize this text" wrapped in a football theme. Every report is generated from a system prompt written specifically to sound like a scout, not an assistant β grounded only in what the player actually logged, with an explicit instruction never to invent stats or skills that aren't in the data.
Flow: player logs a match β data is sent server-side to /api/generate-report β Gemini 3.6 Flash returns a strict JSON object β the app renders it as a structured dossier (Summary / Strengths / Areas to Develop / Verdict).
π View the exact system prompt
You are an experienced football scout writing an internal scouting note about an
amateur player, based on match stats and notes they've logged themselves.
Write a scouting report with exactly this structure in JSON:
1. "summary": A 2-3 sentence player summary in a professional scouting tone β
confident, specific, not generic praise. Reference actual patterns in the data
(e.g. high goal involvement relative to minutes played, consistency across
matches, positioning) rather than restating raw numbers.
2. "strengths": 2-3 short bullet points, each grounded in something specific from
the data or notes provided. Do not invent skills not supported by the input.
3. "areasToDevelop": 1-2 honest, constructive bullet points, based on gaps in the
data (e.g. limited minutes, low involvement in certain match types) or
reasonable inference from the position.
4. "verdict": A single sentence a scout might write in a report margin, e.g.
"Worth a closer look at trial stage" or "Promising for age group, needs more
competitive minutes."
Tone: professional, direct, concise scout notes.
Do not fabricate specific statistics that were not provided. Only reason from
what's given.
Enforced JSON response schema:
{
"type": "OBJECT",
"properties": {
"summary": { "type": "STRING" },
"strengths": { "type": "ARRAY", "items": { "type": "STRING" } },
"areasToDevelop": { "type": "ARRAY", "items": { "type": "STRING" } },
"verdict": { "type": "STRING" }
},
"required": ["summary", "strengths", "areasToDevelop", "verdict"]
}| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) Β· React 19 Β· TypeScript |
| AI Engine | Google Gemini 3.6 Flash (@google/genai) |
| Database & Auth | Supabase β Postgres, Row Level Security, @supabase/ssr |
| Styling | Tailwind CSS v4 Β· Lucide Icons Β· Motion |
| Deployment | Vercel β auto-deploys on every push to main |
Prerequisites: Node.js 20+, npm
# 1. Clone and install
git clone https://github.com/salmanazamdev/footyfolio
cd footyfolio
npm install
# 2. Configure environment variables β create a .env file:
NEXT_PUBLIC_SUPABASE_URL="https://your-supabase-project.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="your-supabase-anon-key"
GEMINI_API_KEY="your-gemini-api-key"
# 3. Run the dev server
npm run devOpen http://localhost:3000.
Production build:
npm run build
npm startFull migration script at schema.sql.
| Table | Purpose |
|---|---|
profiles |
User ID, role (talent / scout), name, age, city, onboarding status |
talent_details |
Position, preferred foot, bio |
matches |
Per-match stats: opponent, goals, assists, minutes, notes, date |
scouting_reports |
AI-generated dossiers linked to each player |
scout_preferences |
A scout's default search filters |
shortlists |
Saved prospects per scout |
Row Level Security is enforced on every table β players can only write their own data, scouts can browse talent but only manage their own shortlist.
Ideas on the table for future work β not built yet, and open to contributors:
- Real-time messaging between scouts and players
- Video highlight clips / media uploads
- Coach or team endorsements
- Public, shareable player profile links (no login required to view)
- Email/push notifications
- Smarter scout-side talent recommendations beyond position/city filters
FootyFolio is open source and open to contributors β bug fixes, design polish, or picking something off the roadmap above. See CONTRIBUTING.md for how to get started.
FootyFolio β because talent shouldn't need a lucky break to get noticed.




