← Tutte le idee Sport e benessere

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.