Volver al blog
[ ES ]EN

[ Blog ] / 21 de octubre de 2026

Notas: tu nota final, sin sorpresas

Un registro de calificaciones con ponderaciones de verdad, nota necesaria, horario con IA y avisos. Cómo está montado y qué decisiones pesaron más.

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

[ Newsletter ]

Nuevos posts y proyectos, por email

Un email corto cuando publico algo nuevo. Sin spam, date de baja cuando quieras.