Desde Vitoria-Gasteiz

Pencho

Estudiante de DAW. Veo un problema real y construyo la herramienta que lo resuelve.

Trabajo seleccionado

Cuatro proyectos propios.
Elige uno para abrirlo.

Control de Caducidades

Fechas de caducidad convertidas en un estado claro para cada producto.

Proyecto 1 de 4Cerrar

Control de
Caducidades

Cada producto perecedero tiene una fecha en el frente y otra en el almacén. En lugar de mostrar fechas, el sistema las compara y devuelve un estado concreto para cada producto.

En uso en restaurantes reales

Qué entra de cada producto

Fecha de frente, fecha de almacén, cajas en almacén y fechas que esperan detrás.

calculateProductStatus()server/services/productStateService.js
  • ¿Hay fecha en el almacén?
  • ¿Coincide con la del frente?
  • ¿Es la última caja? ¿Hay más detrás?

Frente y cambia

La fecha del frente y la del almacén no coinciden.

Frente y agota

No hay fecha en el almacén.

Sin clasificar

Misma fecha y más de una caja.

Abierto y cambia

Misma fecha, última caja y más fechas detrás.

Abierto y agota

Misma fecha, última caja y nada detrás.


Horizonte de aviso

Lo que cae dentro,
avisa.

Desde hoy hasta dentro de 14 días, ambos incluidos. Lo demás espera.

Hoy+7+14, fin del aviso+21+28
DanoninoFrente 21/10, dentro del aviso
FilipinosFrente 13/11, fuera de la ventana

Datos históricos de la demo, a 20/10/2026.

Cómo lo pensé

Problema

Los productos perecederos están repartidos entre el frente y el almacén. Si nadie revisa las fechas a tiempo, caducan.

Restricciones

Varios restaurantes en la misma infraestructura, personas con responsabilidades distintas y una conexión que no siempre está.

Decisión

Que el sistema calcule el estado de cada producto a partir de sus fechas y su stock, y avise desde hoy hasta dentro de 14 días, ambos incluidos.

Salas y roles

Una plataforma.
Salas estancas.

Cada restaurante solo ve y recibe lo suyo.

AdministradorPlataforma y restaurantesSupervisorCatálogo y empleados de su restauranteEncargadoFechas y cantidades
Otro restaurante

Tres roles, alcances que se estrechan. Ninguna sala ve los datos de otra.

Cuando se va la red

La conexión se corta.
El trabajo continúa.

Solo en el módulo de caducidades.

Con red

Cada cambio llega al servidor al instante.

Sin red

La app sigue respondiendo. Cada cambio se guarda en una cola local (IndexedDB) y espera.

Vuelve la red

La cola se envía al servidor, que la reparte al resto del restaurante.

Captura real, 20/10/2026

Así se ve en el restaurante.

Cada grupo de la lista es uno de los estados que salen del prisma:

  • Frente y cambia
  • Frente y agota
  • Abierto y cambia

El “1” junto al título es Danonino: el único producto dentro de la ventana de aviso.

Listado real de productos y fechas en Control de Caducidades. Danonino es el único producto dentro de la ventana de aviso.
Tecnologías
React, Node.js, MongoDB y Socket.IO
Mi papel
Producto y especificación. Implementación con Claude Code.

Reitera

Repetición espaciada: tu respuesta decide cuándo vuelves a cada tema.

Proyecto 2 de 4Cerrar

Reitera

Repetición espaciada para estudiantes. Al terminar cada repaso indicas cómo te ha ido, y Reitera calcula cuándo debes volver a ese tema.

Desplegado en reitera.dev

Cuatro futuros

Tu respuesta decide
cuándo vuelves.

Dos repasos “Normal”. Hoy, día 14, un mismo tema abre cuatro futuros.

La altura y el ancho de cada arco son los días hasta el siguiente repaso. La línea continua es el pasado; la de puntos, un futuro posible.

Reglas reales: ReviewSessionService.calculateNextReviewDate()

Con 30 días o más, el tema queda dominado: no se agenda otra fecha.

Ver el ejemplo en texto

Hoy es el día 14. El intervalo actual es de 10 días y el factor es 2,5. La respuesta decide qué ocurre después:

Los cuatro resultados del gráfico
RespuestaCálculoResultado
Otra vezReinicia a 1 díaRepaso el día 15
Difícil10 × 2,5 × 0,8 = 20 díasRepaso el día 34
Normal10 × 2,5 = 25 díasRepaso el día 39
Fácil10 × 2,5 × 1,3 = 32,5 → 33 díasTema dominado; sin próxima fecha

Los intervalos se redondean al alza. Al alcanzar 30 días, el tema queda dominado y deja de programarse.

Cómo funciona

El gráfico de arriba muestra un momento de este ciclo.

  1. Organizas

    Asignaturas, temas y exámenes.

  2. Repasas

    Al terminar marcas Fácil, Normal, Difícil u Otra vez, y si quieres una nota del 1 al 10.

  3. Reitera programa

    Calcula la próxima fecha. Con 30 días de intervalo, el tema queda dominado.

  4. Ves tu progreso

    Actividad de 35 días, puntos débiles y temas en riesgo.

Cómo cambia el intervalo

Cuatro respuestas,
cuatro reglas.

Sobre intervalo × factor actual:

Otra vez
Vuelve a 1 día; factor −0,2
Difícil
Intervalo ×0,8; factor −0,15
Normal
Intervalo ×1; factor igual
Fácil
Intervalo ×1,3; factor +0,15

Redondeo al alza. El factor se ajusta después, con un mínimo de 1,3.

Captura real: al terminar un repaso

Ventana de Reitera al terminar el repaso del tema “Consultas SQL”: pregunta “¿Cómo fue este repaso?” con las opciones Fácil, Normal (seleccionada), Difícil y Otra vez, una puntuación opcional y el botón Confirmar repaso.
La decisión ocurre aquí: una valoración al terminar el repaso.

Cómo lo pensé

Recordar no debería
exigir planificar.

Problema

Repasar siempre lo mismo o llegar al examen con temas olvidados.

Restricciones

El esfuerzo cambia por tema. La fecha depende del intervalo anterior y de cómo fue el repaso.

Decisión técnica

Recalcular en el servicio, no en la interfaz. Guardar la sesión y actualizar el tema en una sola transacción.

Captura real: qué toca hoy

Fragmento del panel de Reitera: 6 temas pendientes, 8 % del curso afianzado y, en “Para hoy”, Consultas SQL (Bases de Datos, 10 días de retraso) y Direccionamiento IP (Redes de Ordenadores, 7 días de retraso), cada uno con su barra de progreso.
Fragmento del panel real. La barra de progreso es visual; no determina el próximo intervalo.
Tecnologías
Java 21, Spring Boot, PostgreSQL, JWT y React
Mi papel
Backend propio: API, modelo de datos y lógica de planificación. Front-end React implementado con Claude Code.

Disponible online, con registro abierto

Cualquiera puede crear una cuenta y probarlo. Los intervalos del gráfico salen de las reglas reales del servicio de repasos.

Motavia

Precios oficiales de carburantes, ordenados para decidir dónde repostar.

Proyecto 3 de 4Cerrar

Motavia

Los precios oficiales de los carburantes en España, sobre un mapa y ordenados para decidir dónde repostar. Sin anuncios, sin registro y sin coste de infraestructura.

Publicada en motavia.es y en el catálogo de datos.gob.es

El territorio

Todo un país.
Punto a punto.

Actualización programada cada 2 h

11.386 estaciones.
Una sola respuesta.

Álava, gasolina 95 E565 estaciones públicas, ordenadas
1,649 €/L
EROSKI, Ribabellosa
7,54 €
Menos que la media, en 50 L(1,7998 − 1,649) × 50 L
Media provincial: 1,800

Islas reubicadas.
Misma geografía,
otro encuadre.

Brillo = precio de la gasolina 95 E5 frente al resto de su provincia

Cada punto, una estación.
Más luz: menor precio en su provincia.

11.386 estaciones. Datos del MITECO del 21/10/2026, 09:17.

Acercarse

Álava, bajo la luz.

65 estaciones públicas con gasolina 95 E5.
Dos puntos de esa red, vistos de cerca.

Comparar

La luz se vuelve precio.

A: EROSKI

Ribabellosa (Ribera Baja / Erribera Beitia)

1,649 €/L

B: EUROCAM

Nanclares de la Oca (Iruña Oka / Iruña de Oca)

1,679 €/L

Media provincial: 1,7998 €/L

7,54 €

Menos que la media en 50 L.
Volumen ilustrativo; precios reales.

MITECO, 21/10/2026 a las 09:17.
Gasolina 95 E5, venta al público.
No son precios en tiempo real.
Límite provincial © Instituto Geográfico Nacional (CC BY 4.0), vía es-atlas.

Cómo lo pensé

El trabajo ocurre
antes de tu visita.

0 €al mes de infraestructura. GitHub Actions y Cloudflare Pages, en sus planes gratuitos.

  1. Cada 2 horas

    GitHub Actions descarga y valida los precios del MITECO y pasa las pruebas.

  2. Si falla, no publica

    Sigue en línea la última versión buena.

  3. 52 ficheros

    Un JSON por provincia en Cloudflare Pages. Sin base de datos.

  4. Tu navegador decide

    Descarga solo tu zona, la ordena y calcula el ahorro.

Del concepto a la web

La misma zona.
El producto real.

motavia.es con la zona Araba/Álava y gasolina 95: lista “Más baratas” encabezada por Eroski a 1,649 €/L y, al lado, el mapa de la provincia con los precios de cada estación.
motavia.es, en Araba/ÁlavaCaptura de la web publicada: mapa y lista, tal como los ve cualquiera.Misma zona, edición del 20/10/2026, 23:23
motavia.es en el móvil con Araba/Álava y gasolina 95: el mapa alrededor de Vitoria-Gasteiz y la lista “Más baratas”, con Eroski a 1,649 €/L y Eurocam a 1,679 €/L.
motavia.es, en Araba/ÁlavaCaptura de la web publicada: mapa y lista, tal como los ve cualquiera.Misma zona, edición del 21/10/2026, 09:17
Tecnologías
Astro, TypeScript, MapLibre GL, zod, GitHub Actions y Cloudflare Pages
Mi papel
Concepción y dirección propias. Implementación con Claude Code.

DAW Notebook

Grabaciones y temarios sueltos convertidos en qué estudiar hoy.

Proyecto 4 de 4Cerrar

DAW Notebook

Un sistema personal de estudio asistido por agentes de IA. Recoge grabaciones, temarios y tareas sueltas y devuelve una sola cosa: qué estudiar hoy.

En uso durante el curso 2026–27

Del material suelto
a una sola decisión.

Del material suelto
a una sola decisión.

Memoria

Casillas y notas no se pierden: cada cambio queda guardado en Git.

Sale

Una guía por tema y una agenda que cabe en las horas reales de cada día.

Criterio

Primero, lo que el profesor dice que evalúa; después, el PDF. Si no coinciden, se señala.

Entra

Grabaciones .vtt, el PDF de cada tema y los cronogramas, tal como llegan.

Hoy
  1. Dispersión

    Todo llega por separado.

    Grabaciones .vtt, temario PDF y cronograma. El orden parte del material real.

  2. Transformación

    El criterio da forma.

    Primero, las indicaciones de evaluación del profesor; después, el PDF. Las discrepancias quedan señaladas.

    CLAUDE.md y AGENTS.md
  3. Claridad

    Una sola decisión.

    Una guía por tema y una agenda que cabe en las horas reales de cada día.

  4. Memoria

    Nada se pierde.

    Casillas y notas: cada cambio queda guardado en Git.

Entran 53 clases, 40 PDF y 9 cronogramas. Salen 20 guías, 86 avisos señalados, 27 erratas del PDF y 42 versiones en Git.Datos del propio notebook, a 20/10/2026.

Por dentro

Un caso real, de la clase a la agenda.

Lo que el esquema de arriba resume, paso a paso, con fragmentos reales del notebook en un commit concreto.

Python, tema 2: identidad y decimales (commit e9b54a5)

Asignar

El cronograma propone.
El contenido confirma.

Cada grabación llega con un número, no con un tema. La fecha la sitúa en una semana del curso; el cronograma dice qué tema toca esa semana; lo que se explica en la clase lo confirma o lo corrige.

53 clases y 9 cronogramas

Python/_clases.mdl. 27
617359 → la clase permite situar la fecha → miércoles 07/10
Python/_cronograma.mdl. 15
| sem. | fechas | tema |
| 4 | 05–09/10 | T2 |
Contenido de la claseconfirmado
operadores is e in → Tema 2, apartado 2.2

Cruzar

Lo dicho en clase,
frente al PDF del tema.

Con la clase ya asignada, cada concepto se lee dos veces: en la transcripción y en el temario de ese mismo tema.

40 PDF de temario

Clase del 07/1029:31
En clase
La explicación de is lo presenta como una comparación de igualdad.
Transcripción .vtt, parafraseada
Tema 2, PDFp. 9
Temario
is comprueba si dos variables apuntan al mismo objeto en memoria.
Operadores de identidad, parafraseado

Contrastar

Las dos fuentes
pueden equivocarse.

En el mismo tema, una vez la clase corrige al PDF y otra el PDF corrige a la clase. La guía no elige en silencio: deja las dos versiones, cuál es la correcta y un ejemplo que las distingue.

86 avisos y 27 erratas en 20 guías

⚠ Aviso: clase ≠ PDFT2, l. 218
is comprueba identidad de objeto; == compara los valores.
a = [1, 2, 3]; b = [1, 2, 3]
a == b → True
a is b → False
Correcto: lo del PDF.
Se equivoca el PDFT2, l. 126–127, PDF p. 65
La solución escribe altura = 1,75. Con coma, Python no crea un decimal: crea una tupla.
altura = 1,75
altura * 2 → (1, 75, 1, 75)
altura = 1.75
altura * 2 → 3.5
Correcto: altura = 1.75. El aviso de clase coincide con la referencia oficial de Python ↗.
Y decide qué mandaskill guia-estudio
1. Aviso explícitoSi el profesor indica explícitamente cómo evalúa o cómo se pregunta algo, manda ese criterio.
2. Si no, el PDFLos tests salen del PDF. Ante una contradicción sin aviso explícito, gana el PDF; la explicación de clase queda como matiz señalado con ⚠️. Sirve para entender y razonar, no como definición.
3. Fuentes externasEl conocimiento externo o más actual nunca sustituye las fuentes anteriores. Si el temario o la clase contienen algo desfasado o incorrecto, se añade una nota de actualidad de una o dos frases con lo que ha cambiado. Solo si puede confundir de verdad o importa para el TFC o las prácticas. Para el examen se responde lo del temario.

Planificar y seguir

Cabe en las horas
reales de cada día.

El tema pasa a la agenda con tareas concretas y su tiempo estimado, repartidas según las horas reales de cada día. El progreso se marca por tema: estudiado, test hecho con su nota y repasado.

42 versiones en Git: nada se pierde

Agenda.mdl. 10–13
Mar 203 hPython, ejercicios 02–05, 1 h 15
5 de trabajo, 3 h2 libres, 7 h
Progreso.mdl. 157–160
T2, sintaxis de Python, test en semana 5EstudiadoTest hecho, nota:Repasado para el examen

Una semana tipo, unas 29 h. Los días libres cambian cada semana, y la agenda se rehace con ellos.

ReglasDefinidas en una skill propia (guia-estudio) y en CLAUDE.md: cómo asignar, qué contrastar y qué fuente manda. Los agentes las aplican y yo reviso el resultado.LímitesEl cronograma asigna temas a semanas, no a grabaciones: el contenido decide. El seguimiento es por casillas y nota, no por horas estudiadas.
Tecnologías
Claude Code, Codex, Markdown, Obsidian y Git
Mi papel
Definí el problema y el flujo. Diseñé las reglas, las prioridades y la estructura (skill propia, CLAUDE.md y AGENTS.md). Uso agentes de IA para procesar y mantener los archivos.

Los apuntes siguen siendo archivos Markdown: puedo leerlos en Obsidian, editarlos y conservar su historial en Git.

Perfil

Me fijo en lo que no funciona
y busco cómo arreglarlo con código.

Soy Pencho. Estudio 2.º de DAW mientras trabajo. Antes de programar pasé años en restauración, parte de ellos coordinando equipos; de ahí me queda la costumbre de mirar cómo se trabaja de verdad antes de proponer nada.

Ahora uso programación, arquitectura, automatización y agentes de IA para construir herramientas pequeñas y útiles. Aprendo construyendo, y me interesa entender el porqué de cada decisión, no solo que funcione.

Sigo aprendiendo: empecé por backend con Java y Spring Boot y ahora estoy con JavaScript.

Contacto

Si quieres hablar de un proyecto, de una oportunidad o de una idea, escríbeme.

pencho.deskov@gmail.com