Baller
Il tuo allenatore di calcio personale nel telefono
Incasso mensile: 2200 USD (fonte indicata nella scheda)
Cosa fa
App con piani di allenamento personalizzati per il calcio: esercizi, preparazione fisica, alimentazione e analisi dei video con l'AI.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Per i ragazzi delle scuole calcio italiane e per i loro genitori.
- Esercizi per ruolo: portiere, difensore, attaccante.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Campione": dà ai giovani calciatori e agli amatori piani di allenamento personalizzati per ruolo e livello, con esercizi spiegati e consigli tecnici da un breve video. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con esempi di piani e prezzi
2. Registrazione con età, ruolo, livello, giorni disponibili e attrezzatura
3. Il piano della settimana con gli allenamenti del giorno
4. Scheda dell'esercizio con spiegazione e video
5. Analisi del gesto tecnico: carica un video breve
Stile: da campo da calcio: sfondo bianco, verde prato #15803D, nero #0A0A0A, giallo #FACC15 per gli obiettivi raggiunti, carattere "Barlow Condensed" per i titoli e "Inter" per i testi. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "giocatori": età, ruolo, livello, giorni disponibili, attrezzatura, uno per utente
- "piani": settimana, allenamenti in JSON, allenamenti completati
- "analisi": video, gesto (tiro, passaggio, dribbling), consigli ricevuti
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi dati
- per i minori di 14 anni serve l'account di un genitore
- i video si cancellano dopo 30 giorni
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Il piano della settimana
Partendo dal profilo, la Edge Function "piano" chiede a Claude un piano di 7 giorni in JSON: per ogni giorno di allenamento riscaldamento, 4–6 esercizi (tecnica, fisico, velocità) con durata, ripetizioni e spiegazione semplice, e defaticamento. Adatto a età, ruolo e attrezzatura (es. solo un pallone e dei coni).
Ogni settimana un piano nuovo che tiene conto degli allenamenti completati e delle difficoltà segnate ("troppo difficile", "facile").
Avviso fisso: "Fermati se senti dolore e chiedi a un medico o al tuo allenatore".
4. Consigli dal video
Nella pagina analisi il giocatore carica un video di massimo 15 secondi di un gesto (tiro, passaggio, controllo). Il browser estrae 6 fotogrammi (codice nei Dettagli tecnici) e solo quelli vengono inviati a Claude, che restituisce 3 cose fatte bene, 3 da migliorare e 2 esercizi specifici.
Il video intero non lascia mai il telefono: si inviano solo i fotogrammi. Storico delle analisi per vedere i progressi.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 5,99 € al mese. Gratis l'utente ha: il piano della prima settimana e un'analisi. Con il piano Pro sblocca: piano nuovo ogni settimana, analisi illimitate e statistiche.
A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Età: verifica che con un'età sotto i 14 anni si chieda l'email del genitore e che gli esercizi non includano carichi con pesi.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Estrarre i fotogrammi da un video
Prende dal video 6 immagini a intervalli regolari, direttamente nel browser. Si inviano all'AI solo queste, non il video intero.
export async function estraiFotogrammi(file: File, quanti = 6): Promise<string[]> {
const video = document.createElement("video");
video.src = URL.createObjectURL(file);
video.muted = true;
await new Promise((ok) => (video.onloadedmetadata = ok));
const tela = document.createElement("canvas");
const scala = Math.min(1, 768 / video.videoWidth); // massimo 768 pixel di larghezza
tela.width = Math.round(video.videoWidth * scala);
tela.height = Math.round(video.videoHeight * scala);
const ctx = tela.getContext("2d")!;
const immagini: string[] = [];
for (let i = 1; i <= quanti; i++) {
video.currentTime = (video.duration * i) / (quanti + 1);
await new Promise((ok) => (video.onseeked = ok));
ctx.drawImage(video, 0, 0, tela.width, tela.height);
immagini.push(tela.toDataURL("image/jpeg", 0.8).split(",")[1]); // base64
}
URL.revokeObjectURL(video.src);
return immagini;
}Tabelle del database
Profilo del giocatore, piani settimanali e analisi.
create table giocatori (
utente_id uuid primary key references auth.users(id) on delete cascade,
eta int not null check (eta between 8 and 70),
email_genitore text,
ruolo text not null,
livello text not null,
giorni int[] not null default '{2,4,6}',
attrezzatura text[] not null default '{pallone}',
check (eta >= 14 or email_genitore is not null)
);
create table piani (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
settimana date not null,
allenamenti jsonb not null,
completati int[] not null default '{}',
unique (utente_id, settimana)
);
create table analisi (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
gesto text not null,
consigli jsonb not null,
creato_il timestamptz not null default now()
);
alter table giocatori enable row level security;
create policy "il mio profilo" on giocatori for all
using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table piani enable row level security;
create policy "le mie righe" on piani
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table analisi enable row level security;
create policy "le mie righe" on analisi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);Istruzioni per l'AI: piano
La Edge Function che crea il piano. Con l'abbonamento, al posto dei crediti si controlla il piano dell'utente nella tabella profili. Il resto della funzione (accesso, crediti, rimborso se l'AI rifiuta) è uguale per tutti i progetti: è nella guida "Chiamare l'AI dal server".
Sei un preparatore di calcio giovanile e amatoriale. Crea un piano di 7 giorni adatto a età, ruolo, livello, giorni disponibili e attrezzatura indicati. Esercizi sicuri, senza pesi per i minori. Rispondi solo con JSON: {"giorni": [{"giorno": 1-7, "riposo": bool, "riscaldamento": "...", "esercizi": [{"nome", "tipo", "durata_minuti", "ripetizioni", "spiegazione"}], "defaticamento": "..."}]}.
Pezzi comuni a tutti i progetti
- Pagamenti con Stripe
- Profili, piano e crediti
- Chiamare l'AI dal server
- Controllo finale prima di pubblicare
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Fotogramma
- Una singola immagine ferma presa da un video.