Brawler
Il tuo allenatore di boxe, sempre con te
Incasso mensile: 23.000 USD (fonte indicata nella scheda)
Cosa fa
App che fa da allenatore di boxe: allenamenti guidati, combinazioni di colpi e correzioni, ovunque e quando vuoi.
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 da allenare da soli: corda, kickboxing, padel.
- Allenamenti brevi per chi ha 15 minuti in pausa pranzo.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Round": un allenatore di boxe nel telefono: allenamenti a round con una voce che chiama le combinazioni di colpi. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con esempio di allenamento, livelli e prezzi
2. Registrazione e scelta del livello (principiante, intermedio, avanzato)
3. Elenco degli allenamenti
4. Schermata di allenamento a tutto schermo
5. Progressi: allenamenti fatti, minuti, serie di giorni
Stile: energico e sportivo: sfondo nero #0A0A0A, rosso guantone #EF4444, giallo #FACC15 per il timer, carattere "Bebas Neue" per i numeri e "Inter" per i testi; durante l'allenamento numeri enormi leggibili a 2 metri. 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:
- "allenamenti_fatti": allenamento, livello, round completati, durata, data, collegati all'utente
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi allenamenti
- 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. La schermata di allenamento
Crea la schermata di allenamento a tutto schermo: timer del round grande al centro, numero del round, combinazione corrente scritta in grande (es. "1-2-GANCIO").
Una voce in italiano chiama le combinazioni a ritmo regolabile usando la sintesi vocale del browser (codice nei Dettagli tecnici); suono di campana a inizio e fine round, avviso "10 secondi!" alla fine. Pausa di 60 secondi tra i round con un consiglio tecnico.
Livelli: principiante (combinazioni di 2 colpi, 3 round da 2 minuti), intermedio (3–4 colpi e schivate, 5 round da 3 minuti), avanzato (fino a 6 colpi, 8 round da 3 minuti). Lo schermo non deve spegnersi durante l'allenamento (Wake Lock).
4. Progressi e motivazione
Al termine di ogni allenamento salva round, durata e livello e mostra una schermata di riepilogo da condividere come immagine.
Pagina progressi: allenamenti della settimana, minuti totali, serie di giorni consecutivi e un calendario con i giorni di allenamento colorati. Promemoria facoltativo all'orario scelto.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 6,99 € al mese. Gratis l'utente ha: solo il livello principiante e 3 allenamenti. Con il piano Pro sblocca: tutti i livelli, allenamenti personalizzati e statistiche complete.
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. Allenamento: completa un allenamento con il telefono bloccato e uno con l'app in secondo piano: il timer e la voce devono restare sincronizzati.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Tabella degli allenamenti
Ogni allenamento completato, per le statistiche.
create table allenamenti_fatti (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
allenamento text not null,
livello text not null check (livello in ('principiante', 'intermedio', 'avanzato')),
round_completati int not null,
durata_secondi int not null,
fatto_il timestamptz not null default now()
);
alter table allenamenti_fatti enable row level security;
create policy "le mie righe" on allenamenti_fatti
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);La voce che chiama i colpi
Usa la sintesi vocale già presente nel browser, gratis e senza internet, per dire le combinazioni a intervalli regolari.
const COMBINAZIONI: Record<string, string[]> = {
principiante: ["uno due", "uno uno due", "due gancio"],
intermedio: ["uno due gancio", "uno due schiva due", "gancio montante gancio"],
avanzato: ["uno due gancio montante", "doppio uno due schiva gancio", "uno due tre due schiva"],
};
export function avviaRound(livello: string, secondiTraColpi: number, durataSecondi: number) {
const voce = speechSynthesis.getVoices().find((v) => v.lang.startsWith("it"));
const lista = COMBINAZIONI[livello];
const intervallo = setInterval(() => {
const combo = lista[Math.floor(Math.random() * lista.length)];
const frase = new SpeechSynthesisUtterance(combo);
if (voce) frase.voice = voce;
frase.rate = 1.2; // un po' più veloce, come in palestra
speechSynthesis.speak(frase);
}, secondiTraColpi * 1000);
// Ferma la voce alla fine del round
setTimeout(() => clearInterval(intervallo), durataSecondi * 1000);
return () => clearInterval(intervallo);
}
Pezzi comuni a tutti i progetti
Glossario
- Web Speech API
- La funzione del browser che legge un testo ad alta voce, senza servizi esterni.
- Wake Lock
- La funzione che impedisce allo schermo del telefono di spegnersi mentre usi l'app.