CoachEval
Evaluaciones semanales de los jóvenes deportistas de un club: un mazo de cartas para los entrenadores, palabras para las familias.
- Rol
- Todo: el diseño del producto, la app web en Vue, la API .NET, la base de datos y el servidor
- Cliente
- Un entrenador de tenis y propietario de un club
- Periodo
- 2026 – actualidad
- Plataformas
- App web instalable en el teléfono (PWA); una app complementaria en Flutter, en desarrollo
El producto
CoachEval sigue a los jóvenes deportistas de un club a lo largo de la temporada. Una vez por semana, los entrenadores valoran lo que han visto en un mazo de cartas que les lleva unos minutos; a partir de esas valoraciones, la app compone la carta de cada deportista, las tendencias de los grupos e ideas para el próximo entrenamiento. A su alrededor están el calendario del club, las convocatorias, las alineaciones y las actas del día del partido, y un tablón donde cada familia ve la semana de su propio hijo.
La construí en solitario para un entrenador de tenis que dirige un club: el producto y su interfaz, la API, la base de datos y el servidor en el que funciona. Empezó con el tenis y ahora también abarca el fútbol.
- 100%
- de los commits son míos (536 desde julio de 2026)
- 92k
- líneas de C#, Vue y TypeScript, sin contar las pruebas ni las migraciones
- 1,7k
- pruebas automatizadas: 901 en la API, 795 de extremo a extremo en el navegador
- 2
- deportes, tenis y fútbol, en italiano e inglés
Recorrido
La app en acción
Elige una grabación o salta directamente a un capítulo.

Grabado a partir de la versión actual en tamaño de teléfono, como la usan los entrenadores, en una copia local con los clubes de demostración. Se muestra en italiano, el idioma de sus clubes. Sin sonido.
Qué hace
De las valoraciones de una semana al tablón de una familia
01
La semana en un mazo
Los entrenadores valoran a sus deportistas una vez por semana, carta a carta. Cada carta es un atributo (la derecha, el juego de pies, la actitud en los partidos) para todo un grupo, valorado del 1 al 10 con un toque en una barra: comparar a un grupo en lo mismo es más rápido y más justo que ir abriendo deportista por deportista. A quien no se ha visto se le deja tranquilo: nadie recibe una nota por defecto. El mazo se dimensiona según el plan de la temporada y termina cuando se cumple el objetivo de la semana; los puntos de experiencia y los hitos mantienen vivo el hábito.
02
La carta de un deportista
Los deportistas del club, como un álbum de cartas. Cada una se abre con la media y las áreas, y después las cuatro dimensiones (técnica, táctica, física, mental) con su tendencia y la última nota de cada atributo. «Quanto lo conosciamo» (cuánto lo conocemos) mide la observación, no al deportista: crece cuando un entrenador observa, y señala dónde mirar a continuación.
03
El Radar y el registro de entrenamientos
El Radar es un feed de lo que ha cambiado en los grupos del entrenador: quién se ha visto demasiado poco en un atributo, el punto fuerte o el punto débil de un grupo, una tendencia, un ejercicio para el próximo entrenamiento. Las cartas sobre un grupo salen de datos agregados y nunca señalan a un niño. La bombilla enumera los entrenamientos y partidos que quedan por cerrar; el entrenamiento de ayer se cierra con tres toques.
04
El día del partido
En el club de fútbol de demostración: la convocatoria parte de la anterior, con dorsales y capitán, y viene con un mensaje para los jugadores con la hora y el lugar de encuentro. La alineación se coloca sobre un campo, cada jugador con su rol y sus atributos más fuertes, y se comparte con el cuerpo técnico del grupo como un enlace, así que los nombres se quedan en la app. El acta para el árbitro se rellena sola a partir de la plantilla y se imprime: nada de lo que se escribe en ella se guarda nunca.
05
El tablón de las familias
Los padres entran con un código de seis cifras enviado a la dirección que tiene el club: sin contraseña que inventar. Ven la semana, el calendario y las convocatorias de su propio hijo, y los de nadie más. La carta habla con palabras (puntos fuertes, el siguiente paso), nunca con notas, y las fichas que se ganan por asistir la decoran. Un check-in de dos toques cuenta a los entrenadores cómo ha ido la semana y si conviene hablar.
Por dentro
Cómo se construyó
Un núcleo funcional
Cada número que calcula el producto (la carga de trabajo de la semana, a quién observar primero, el calendario de la temporada, los niveles y las rachas) es una función pura en la capa de aplicación, probada sin base de datos; los endpoints de la API que la rodean se ocupan de la entrada y la salida. Los invariantes viven en las propias entidades: no se puede adjuntar una foto sin un consentimiento registrado, sea cual sea el endpoint que lo intente.
Una base de datos, muchos clubes
Los clubes comparten una única base de datos PostgreSQL: cada fila propia de un club lleva el club al que pertenece, y un filtro de consulta global de EF Core (Finbuckle.MultiTenant) lo aplica a cada consulta. Los roles son permisos que se leen de una única tabla y se comprueban de forma exhaustiva, así que un rol nuevo que nadie ha clasificado detiene la app al arrancar en lugar de heredar el acceso de otro.
Diseñada en torno a los menores
La app guarda datos de niños, así que el diseño parte de ahí. Ningún dato de salud (la disponibilidad es un sí o un no, nunca un porqué); fotos que solo se sirven tras autenticación; el acta, nunca guardada; palabras en lugar de números para las familias; ningún ranking de entrenadores; informes de errores que identifican la ruta, nunca a una persona. Las pruebas fijan las reglas: la prueba del acta, por ejemplo, falla si algo de lo que se escribe en ella sale del navegador.
Del teléfono al servidor
Una PWA en Vue 3 y TypeScript (Pinia, Tailwind, shadcn-vue) con tipos generados a partir de la descripción OpenAPI de la API; .NET 8 y EF Core sobre PostgreSQL; italiano e inglés en todas partes. Funciona en Docker en un servidor ARM de Oracle Cloud, detrás de Cloudflare, con seguimiento de errores autoalojado, y los clubes pueden darse de alta por su cuenta: una dirección verificada y el contrato de servicio aceptado en línea. Hay una app complementaria en Flutter en desarrollo.
Grabar un producto en uso
Su propio código, sus clubes de demostración, nadie real
CoachEval está en uso, con datos de menores. Nada de eso tiene cabida en un portfolio, así que las grabaciones ejecutan el código actual de la app sobre una base de datos creada en mi máquina para la ocasión.
- 1
Una copia del código
La app web y la API de la versión actual se ejecutan en mi máquina en Docker, con una base de datos PostgreSQL nueva. El navegador que graba puede comunicarse con esa API y con nada más.
- 2
Los clubes de demostración que incluye
El código carga dos clubes de muestra, de tenis y de fútbol, hechos para parecer ficticios a primera vista: cada apellido es un término del deporte (Rovescio, Smorzata, Contropiede), cada dirección es @example.com. Abrí una temporada y acepté el acuerdo del club como lo haría un propietario, a través de la propia API de la app.
- 3
Todas las tomas, desde la misma semana
Una toma guarda valoraciones, una convocatoria, una alineación, una sesión de una familia. Antes de cada una, la base de datos vuelve a una instantánea, así que cada grabación empieza desde el mismo estado.
- 4
Mostrada en italiano
La app habla italiano e inglés, pero el catálogo del deporte y los clubes son italianos, así que se graba en italiano, tal como la ven sus entrenadores.
La interfaz es la de la propia app. Los clubes, los entrenadores, los deportistas, las familias, las valoraciones y los partidos son los datos de demostración sintéticos que vienen con su código.

Aquí no hay demo que probar: CoachEval está en producción y guarda datos de menores, así que esta página muestra grabaciones de sus clubes de demostración.
Todas las pantallas
La colección completa de capturas
Una carta, un atributoTodo el grupo en el mismo atributo, valorado del 1 al 10: comparar es más rápido y más justo que ir abriendo deportista por deportista. Semana completadaObjetivo de la semana alcanzado: de vuelta en el panel, el contador está completo. Hay más cartas para quien las quiera. El álbumLa plantilla en forma de cartas, con la última vez que se observó a cada deportista. La carta del deportistaMedia y áreas para el cuerpo técnico: los números son la herramienta de trabajo de los entrenadores y nunca se muestran a las familias. Una dimensión, desplegadaCada atributo con su última nota y hacia dónde se ha movido. Cuánto lo conocemosLo completa que está la observación, no lo bueno que es él: crece cuando un entrenador lo observa. A quién observarDeportistas que se han visto demasiado poco en un atributo: el foco de hoy. El punto fuerte de un grupoLas cartas de grupo salen de datos agregados: no se señala a ningún niño. Entrenamientos y partidosLo que hay que cerrar y lo que toca hoy. Cerrar un entrenamientoIntensidad, participación y atención, en tres toques. El partidoConvocatoria, alineación y acta, desde un mismo sitio. ConvocatoriaPropuesta a partir de la anterior: quién va convocado, los dorsales, el capitán. Compartir la convocatoriaLa hora y el lugar de encuentro se guardan en el partido; el mensaje para los jugadores está listo para enviar. AlineaciónLos jugadores sobre el campo, cada uno con su rol y sus atributos más fuertes. Acta del partidoSe rellena a partir de la plantilla y se imprime para el árbitro. Nada de lo que se escribe aquí se guarda. Acceso de las familiasUn código enviado a la dirección que el club tiene registrada. Sin contraseña que inventar. La semana del niñoCalendario y convocatorias, solo de este niño. La cartaPuntos fuertes y el siguiente paso, con palabras; las fichas por asistir decoran la carta. Check-in semanalCómo ha ido la semana y si conviene hablar con el entrenador: dos toques, que leen los entrenadores del grupo.
Siguiente caso de estudio
Indennizzo Diretto →