CoachEval
Valutazioni settimanali per i giovani atleti di un club sportivo: un mazzo di carte per gli allenatori, parole per le famiglie.
- Ruolo
- Tutto: progettazione del prodotto, la web app Vue, l’API .NET, il database e il server
- Cliente
- Un maestro di tennis, titolare di un circolo
- Periodo
- 2026 – oggi
- Piattaforme
- Web app installabile sul telefono (PWA); un’app companion in Flutter in sviluppo
Il prodotto
CoachEval segue i giovani atleti di un club sportivo per tutta la stagione. Una volta a settimana gli allenatori valutano ciò che hanno visto, con un mazzo di carte che richiede pochi minuti; da quelle valutazioni l’app ricava la card di ogni atleta, l’andamento delle squadre e spunti per il prossimo allenamento. Intorno ci sono il calendario del club, le convocazioni, le formazioni e le distinte del giorno della partita, e una bacheca dove ogni famiglia vede la settimana del proprio figlio.
L’ho realizzata da solo per un maestro di tennis che gestisce un circolo: il prodotto e la sua interfaccia, l’API, il database e il server su cui gira. È nata per il tennis e ora gestisce anche il calcio.
- 100%
- dei commit sono miei (536 da luglio 2026)
- 92k
- righe di C#, Vue e TypeScript, esclusi test e migrazioni
- 1,7k
- test automatici: 901 sull’API, 795 end-to-end nel browser
- 2
- sport, tennis e calcio, in italiano e in inglese
Tour guidato
L’app in azione
Scegli una registrazione, o salta direttamente a un capitolo.

Registrate dalla versione attuale in formato smartphone, come la usano gli allenatori, su una copia locale con i club demo. L’app è in italiano, la lingua dei suoi club. Senza audio.
Cosa fa
Dalle valutazioni della settimana alla bacheca di una famiglia
01
La settimana in un mazzo
Gli allenatori valutano i loro atleti una volta a settimana, carta per carta. Ogni carta è un attributo (il dritto, gli spostamenti, l’atteggiamento in match) per un’intera squadra, con un voto da 1 a 10 dato toccando una barra: confrontare una squadra sulla stessa cosa è più rapido e più equo che aprire un atleta dopo l’altro. Chi non è stato visto si lascia stare: nessuno riceve un voto d’ufficio. Il mazzo è dimensionato sul piano della stagione e finisce quando l’obiettivo della settimana è raggiunto; punti esperienza e traguardi aiutano a mantenere l’abitudine.
02
La card di un atleta
Gli atleti del club come un album di card. Ognuna si apre sulla media e sulle aree, poi sulle quattro dimensioni (tecnica, tattica, fisica, mentale) con il loro andamento e l’ultimo voto di ogni attributo. “Quanto lo conosciamo” misura l’osservazione, non l’atleta: cresce quando un allenatore guarda, e dice dove guardare la prossima volta.
03
Il Radar e il registro degli allenamenti
Il Radar è un feed di ciò che è cambiato nelle squadre dell’allenatore: chi è stato visto troppo poco su un attributo, un punto di forza o un punto debole della squadra, un andamento, un esercizio per il prossimo allenamento. Le schede su una squadra nascono da dati aggregati e non indicano mai un singolo ragazzo. La lampadina elenca gli allenamenti e le partite ancora da completare; per l’allenamento di ieri bastano tre tocchi.
04
Il giorno della partita
Nel club demo di calcio: la convocazione parte dalla precedente, con i numeri di maglia e il capitano, e arriva con un messaggio per i giocatori con ora e luogo di ritrovo. La formazione si dispone su un campo, ogni giocatore con il suo ruolo e i suoi attributi migliori, e si condivide con lo staff della squadra tramite un link, così i nomi restano nell’app. La distinta per l’arbitro si compila da sola dalla rosa e si stampa: niente di ciò che ci si scrive viene mai salvato.
05
La bacheca delle famiglie
I genitori entrano con un codice di sei cifre inviato all’indirizzo registrato dal club: nessuna password da inventare. Vedono la settimana, il calendario e le convocazioni del proprio figlio, e di nessun altro. La card parla a parole (i punti di forza, il prossimo passo), mai con i voti, e la personalizzano i gettoni guadagnati con le presenze. Un check-in in due tocchi dice agli allenatori com’è andata la settimana e se c’è bisogno di parlarne.
Sotto il cofano
Come è stato realizzato
Un nucleo funzionale
Ogni numero che il prodotto calcola (il carico della settimana, chi osservare per primo, il calendario della stagione, livelli e serie consecutive) è una funzione pura nel livello applicativo, testata senza database; gli endpoint dell’API che la circondano si occupano di input e output. Gli invarianti stanno sulle entità stesse: una foto non si può allegare senza un consenso registrato, qualunque sia l’endpoint che ci prova.
Un database, tanti club
I club condividono un unico database PostgreSQL: ogni riga che appartiene a un club porta con sé il suo club, e un global query filter di EF Core (Finbuckle.MultiTenant) lo applica a ogni query. I ruoli sono permessi letti da un’unica tabella e verificati in modo esaustivo, così un nuovo ruolo che nessuno ha classificato blocca l’app all’avvio invece di ereditare gli accessi di qualcun altro.
Progettata pensando ai minori
L’app conserva dati su bambini e ragazzi, quindi il progetto parte da lì. Nessun dato sulla salute (la disponibilità è un sì o un no, mai un perché); foto servite solo dietro autenticazione; la distinta mai salvata; alle famiglie parole invece di numeri; nessuna classifica degli allenatori; segnalazioni di errore che riportano la route, mai una persona. I test fissano le regole: quello della distinta, per esempio, fallisce se qualcosa che ci si scrive esce dal browser.
Dal telefono al server
Una PWA in Vue 3 e TypeScript (Pinia, Tailwind, shadcn-vue) con i tipi generati dalla descrizione OpenAPI dell’API; .NET 8 ed EF Core su PostgreSQL; italiano e inglese ovunque. Gira in Docker su un server ARM su Oracle Cloud, dietro Cloudflare, con il tracciamento degli errori self-hosted, e i club possono iscriversi da soli: un indirizzo verificato e il contratto di servizio accettato online. È in sviluppo un’app companion in Flutter.
Registrare un prodotto in uso
Il suo codice, i suoi club demo, nessuna persona reale
CoachEval è in uso e contiene dati su minori. Niente di tutto questo può finire in un portfolio, quindi le registrazioni fanno girare il codice attuale dell’app su un database creato apposta sulla mia macchina.
- 1
Una copia del codice
La web app e l’API della versione attuale girano sulla mia macchina in Docker, con un database PostgreSQL nuovo. Il browser che registra può parlare con quell’API e con nient’altro.
- 2
I club demo inclusi nel codice
Il codice popola due club dimostrativi, uno di tennis e uno di calcio, fatti per sembrare inventati a prima vista: ogni cognome è un termine dello sport (Rovescio, Smorzata, Contropiede), ogni indirizzo è @example.com. Ho aperto una stagione e accettato il contratto del club come farebbe un titolare, tramite l’API dell’app stessa.
- 3
Ogni ripresa dalla stessa settimana
Una ripresa salva valutazioni, una convocazione, una formazione, l’accesso di una famiglia. Prima di ognuna il database torna a uno snapshot, così ogni registrazione parte dallo stesso stato.
- 4
In italiano
L’app parla italiano e inglese, ma il catalogo dello sport e i club sono italiani, quindi è registrata in italiano, come la vedono i suoi allenatori.
L’interfaccia è quella dell’app. Club, allenatori, atleti, famiglie, valutazioni e partite sono i dati demo sintetici inclusi nel suo codice.

Qui non c’è una demo da provare: CoachEval è un prodotto attivo che contiene dati su minori, quindi questa pagina mostra le registrazioni dei suoi club demo.
Ogni schermata
La raccolta completa degli screenshot
Una carta, un attributoTutta la squadra sullo stesso attributo, con un voto da 1 a 10: confrontare è più rapido e più equo che aprire ogni atleta. Settimana completataObiettivo della settimana raggiunto: tornati sulla dashboard, il conteggio è completo. Altre carte restano a disposizione di chi le vuole. L’albumLa rosa come album di card, con l’ultima volta in cui ogni atleta è stato osservato. La card dell’atletaMedia e aree per lo staff: i numeri sono uno strumento di lavoro degli allenatori, e le famiglie non li vedono mai. Una dimensione, apertaOgni attributo con il suo ultimo voto e la direzione in cui si è mosso. Quanto lo conosciamoQuanto è completa l’osservazione, non quanto è bravo: cresce quando un allenatore guarda. Chi osservareAtleti visti troppo poco su un attributo: il focus di oggi. Un punto di forza della squadraLe schede sulla squadra nascono da dati aggregati: non indicano mai un singolo ragazzo. Allenamenti e matchCosa completare e cosa c’è in programma oggi. Completare un allenamentoIntensità, partecipazione e attenzione, in tre tocchi. La partitaConvocazione, formazione e distinta, da un’unica schermata. ConvocazioneProposta a partire dalla precedente: chi è convocato, i numeri di maglia, il capitano. Condividere la convocazioneOra e luogo di ritrovo restano salvati sulla partita; il messaggio per i giocatori è pronto da inviare. FormazioneI giocatori in campo, ognuno con il suo ruolo e i suoi attributi migliori. DistintaPrecompilata dalla rosa, stampata per l’arbitro. Niente di ciò che si scrive qui viene salvato. Accesso famigliaUn codice all’indirizzo registrato dal club. Nessuna password da inventare. La settimana del ragazzoCalendario e convocazioni solo di questo ragazzo. La cardPunti di forza e prossimo passo, a parole; i gettoni guadagnati con le presenze personalizzano la card. Check-in settimanaleCom’è andata la settimana e se serve parlare con il mister: due tocchi, e lo leggono gli allenatori della squadra.
Prossimo caso di studio
Indennizzo Diretto →