CheckForm Gymnastics
L'AI analizza i tuoi esercizi di ginnastica e ti corregge
Incasso mensile: 1200 USD (fonte indicata nella scheda)
Cosa fa
App per ginnaste e ginnasti: si filma un esercizio e l'AI analizza la posizione del corpo e dà consigli per migliorare.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Per altri sport dove conta la posizione: palestra, yoga, tiro a canestro.
- Per gli allenatori: confronto tra due tentativi affiancati.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Postura Giusta": permette a ginnaste, ginnasti e ai loro allenatori di filmare un esercizio e vedere angoli e allineamento del corpo, calcolati direttamente nel telefono. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con un esempio di analisi e prezzi
2. Registrazione dell'allenatore o del genitore (gli atleti minorenni non hanno un account proprio)
3. Atleti: profili con nome ed età
4. Analisi: registra o carica un video, scegli l'esercizio
5. Risultato con scheletro disegnato sul video, angoli e confronto nel tempo
Stile: sportivo ed elegante: sfondo bianco, viola #6D28D9, magenta #DB2777, carattere "Poppins", scheletro disegnato in verde brillante sul video. 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:
- "atleti": nome, età, livello, collegati all'allenatore o al genitore
- "analisi": esercizio, angoli misurati in JSON, note dell'allenatore, data. Il video NON si salva
Regole di sicurezza obbligatorie:
- ogni allenatore o genitore vede solo i suoi atleti e le loro analisi
- i video restano nel telefono: nel database finiscono solo i numeri
- il piano non si modifica dal browser
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. Analisi nel telefono
Usa MediaPipe Pose Landmarker (Google) direttamente nel browser: individua 33 punti del corpo in ogni fotogramma del video, senza inviare il video a nessun server. Importante perché gli atleti sono spesso minorenni.
Per l'esercizio scelto (spaccata, ponte, verticale, candela, salto) calcola gli angoli che contano (codice nei Dettagli tecnici): per esempio l'apertura delle gambe nella spaccata o l'allineamento spalle-anche-caviglie nella verticale. Disegna lo scheletro sul video e mostra gli angoli in grande nel fotogramma migliore.
Il risultato è descrittivo ("apertura 165°, obiettivo 180°"), non un giudizio: le correzioni le decide l'allenatore.
4. Progressi e note
Per ogni atleta, grafico dei valori nel tempo per ogni esercizio (es. apertura della spaccata settimana per settimana) e note dell'allenatore per ogni analisi.
Confronto affiancato tra due analisi. Esportazione di un riepilogo in PDF senza immagini dell'atleta, solo con i numeri.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 7,99 € al mese. Gratis l'utente ha: un atleta e 5 analisi al mese. Con il piano Pro sblocca: fino a 30 atleti, analisi illimitate, grafici dei progressi e confronti.
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. Privacy: controlla nella scheda Rete del browser che durante l'analisi il video non venga mai inviato, e che nel database ci siano solo numeri.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Angoli del corpo dai punti di MediaPipe
MediaPipe restituisce le coordinate dei punti del corpo; questa funzione calcola l'angolo in un'articolazione, ad esempio l'apertura delle gambe.
import { FilesetResolver, PoseLandmarker } from "@mediapipe/tasks-vision";
type Punto = { x: number; y: number };
// Angolo in B formato dai segmenti B→A e B→C, in gradi
export function angolo(a: Punto, b: Punto, c: Punto): number {
const r = Math.atan2(c.y - b.y, c.x - b.x) - Math.atan2(a.y - b.y, a.x - b.x);
let gradi = Math.abs((r * 180) / Math.PI);
if (gradi > 180) gradi = 360 - gradi;
return Math.round(gradi);
}
// Numeri dei punti di MediaPipe Pose
const P = { anca_sx: 23, anca_dx: 24, ginocchio_sx: 25, ginocchio_dx: 26, caviglia_sx: 27, caviglia_dx: 28 };
export async function preparaAnalisi() {
const visione = await FilesetResolver.forVisionTasks(
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.14/wasm",
);
return PoseLandmarker.createFromOptions(visione, {
baseOptions: { modelAssetPath: "/modelli/pose_landmarker_full.task" },
runningMode: "VIDEO",
});
}
// Apertura della spaccata: angolo tra le due gambe, al centro delle anche
export function aperturaSpaccata(punti: Punto[]): number {
const centro = {
x: (punti[P.anca_sx].x + punti[P.anca_dx].x) / 2,
y: (punti[P.anca_sx].y + punti[P.anca_dx].y) / 2,
};
return angolo(punti[P.caviglia_sx], centro, punti[P.caviglia_dx]);
}Atleti e analisi (solo numeri)
Gli atleti dell'allenatore e le analisi: si salvano solo gli angoli, mai il video.
create table atleti (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade, -- allenatore o genitore
nome text not null,
eta int not null check (eta between 4 and 80),
livello text
);
create table analisi (
id uuid primary key default gen_random_uuid(),
atleta_id uuid not null references atleti(id) on delete cascade,
utente_id uuid not null references auth.users(id) on delete cascade,
esercizio text not null,
angoli jsonb not null, -- es. { "apertura": 165, "busto": 82 }
note text not null default '',
fatta_il timestamptz not null default now()
);
alter table atleti enable row level security;
create policy "le mie righe" on atleti
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);
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- MediaPipe
- Una libreria gratuita di Google che riconosce la posizione del corpo in un video, direttamente nel telefono.