Las hojas de cálculo aguantan hasta que un profesor dice «se descarta la peor práctica» o «necesitas un 4 en el final para que haga media». Quería una herramienta que guardara mis notas y me contestara a una sola pregunta: cuánto necesito sacar para aprobar.
El resultado es Notas, una web app multiusuario en español, con acceso con Google e instalable como PWA. La construí en dos días, con 80 commits y 758 tests en verde.
§ 01Ponderaciones de las de verdad
Una asignatura tiene categorías con peso (Parciales 30 %, Prácticas 20 %, Final 50 %), pesos individuales dentro de cada una, evaluaciones con subpartes y series periódicas: indicas «Práctica 1…N» y se expande en evaluaciones normales que luego editas una a una. Cada asignatura configura su escala, sus decimales, su redondeo y su nota de aprobado.
Sobre eso van las reglas que aparecen en las guías docentes: nota mínima por parte (con suspenso forzado o solo aviso), descartar la peor nota, recuperaciones con varios modos, tope máximo y puntos extra.
§ 02El motor es una librería, no un componente
Todo el cálculo vive en src/lib/grading, sin dependencias de interfaz ni de base de datos y con aritmética decimal para no arrastrar errores de coma flotante en los redondeos. Tiene tests de ejemplos y tests de propiedades con fast-check. La interfaz solo pinta lo que el motor devuelve, incluida la traza de «¿cómo se calcula?».
§ 03Nota necesaria y simulador
Con lo ya calificado, el motor calcula la nota necesaria en lo pendiente para llegar al aprobado o a un objetivo propio, el rango entre el mejor y el peor caso, y avisa cuando aprobar ya es imposible. El simulador deja probar notas hipotéticas que no se guardan. Las medias del periodo y de la titulación se ponderan por créditos ECTS.
§ 04Un horario que propone la IA
Cada periodo tiene su horario semanal. Un asistente de IA puede crearlo a partir de lo que le cuentas y se edita en lenguaje natural, pero nunca guarda a ciegas: muestra una vista previa editable y solo se aplica lo que confirmas. Las clases salen en el calendario, avisan por push antes de empezar y usan la zona horaria de la titulación.
§ 05Avisos y calendario
Las evaluaciones con fecha aparecen en un calendario mensual y en una agenda. Los recordatorios llegan por push de la PWA y por correo, disparados desde un cron en la base de datos. Hay además una sincronización opcional con Google Calendar, apagada por defecto con una variable de entorno.
§ 06Compartir sin abrir la cuenta
Puedes compartir una titulación, un periodo o una asignatura con un enlace de solo lectura que se revoca cuando quieras y puede caducar. También hay exportación e importación en JSON, CSV y PDF, y plantillas para reutilizar un esquema de ponderación.
§ 07Seguridad en la base de datos
Cada tabla tiene RLS con user_id = auth.uid(), y las reglas no se dan por buenas: hay 19 archivos SQL que las comprueban contra la base de datos enlazada (npm run test:rls). Los adjuntos van a un bucket privado con límites en el servidor y URL firmadas de vida corta, y los endpoints públicos tienen límite de frecuencia.
§ 08Qué me llevo
Escribir los requisitos y el modelo de dominio antes de la primera línea —con cuestionarios para cada módulo grande— hizo que construir fuera rápido y que los cambios de opinión costaran un documento y no una reescritura. Y tener el motor aislado y bien probado me dejó tocar la interfaz sin miedo.
Puedes verlo en notas.broslunas.com y leer el caso de estudio completo en la ficha del proyecto.
■ Fin del post↑ Volver arriba
