Dyna — Generador automático de planners imprimibles
Web app que convierte el diseño de un planner en un PDF listo para imprimir en minutos, con las fechas correctas para cualquier año. Nace de un problema muy concreto que viví durante años como creadora de mis propios planners.
- Product Engineering
- Editor visual
- Herramientas para creadoras
- React/TS
En esta página
El problema
Llevo unos 5 años diseñando mis propios planners. Al principio usaba plantillas “vacías” — el típico planner sin fechas donde tú rellenas los huecos a mano — pero tenían un defecto de base: asumían el mismo número de semanas para cada mes, así que nunca encajaban bien con el calendario real.
La alternativa era diseñar los planners completos en Canva, con las fechas ya puestas. Mejor resultado, pero un coste enorme: cada trimestre tenía que revisar y modificar fechas, duplicar y borrar hojas manualmente, página por página. Entre comprobar y ajustar, el proceso me llevaba unas 8 horas cada vez — solo para actualizar algo que, conceptualmente, es pura lógica de calendario.
Dyna nace de automatizar exactamente ese paso: diseñas tu planner una vez, marcas dónde va cada dato (año, mes, día…), y generas el PDF actualizado para cualquier rango de fechas en segundos.
El producto
El flujo de usuario, de principio a fin:
- 1
Crear proyecto
Nombre + tamaño de papel (A4/A5, vertical/horizontal).
- 2
Subir diseño
Una imagen (PNG/JPG/WebP) por cada tipo de página del planner: portada, mensual, semanal, diaria...
- 3
Marcar zonas dinámicas
Dibujar rectángulos sobre el diseño e indicar qué representa cada uno: año, mes, día, inicio/fin de semana.
- 4
Configurar
Idioma del calendario (EN/ES), primer día de la semana (lunes/domingo), estilos de texto.
- 5
Elegir rango
Mes/año de inicio y fin. La app estima cuántas páginas se generarán.
- 6
Exportar
Todo se procesa en el navegador y descarga el PDF final, con barra de progreso.
Hay también una demo pública sin registro (/landing-demo/home) con plantillas de ejemplo, para que cualquiera pueda probar el flujo sin fricción.
El reto técnico
Esta es la parte central del proyecto: convertir un diseño estático en una plantilla dinámica que genera calendarios correctos para cualquier fecha, manteniendo calidad de impresión.
1. Marcado de zonas: un editor visual tipo Figma
El marcado de zonas se resolvió con Konva + react-konva (canvas HTML5 de alto nivel) en lugar de SVG puro o Fabric.js. El usuario dibuja rectángulos sobre la imagen, los redimensiona con handles, y puede usar una herramienta de rejilla que genera varios bloques a la vez de un solo arrastre — clave para mapear rápido una cuadrícula mensual de 7×5 celdas. También hay multi-selección con marquee y guías de alineación automática (snap), al estilo Figma.
Cada zona se guarda como coordenadas absolutas en píxeles, relativas a la imagen original — no como porcentajes:
interface Rectangle {
x: number;
y: number;
width: number;
height: number;
fieldType: 'year' | 'month' | 'day' | 'startDay' | 'endDay';
order: number; // orden para mapear días en rejillas
}El reto real aquí fue que el zoom y el pan del editor no desalinearan las zonas marcadas. La solución: las coordenadas siempre viven en el espacio de la imagen original, y solo la vista se escala visualmente. La conversión de puntero a coordenadas de imagen queda así de simple:
const pointerToImage = useCallback(
(pos: { x: number; y: number }) => ({
x: (pos.x - offset.x) / scale,
y: (pos.y - offset.y) / scale,
}),
[offset, scale]
);2. Generación del calendario correcto
El motor de fechas se apoya en date-fns:
getMonthsBetween(start, end)genera la lista de meses del rango elegido.- Por cada mes,
getCalendarWeeksygetMonthDatesForGridcalculan semanas completas y la rejilla mensual, respetando el día de inicio de semana configurado. getFieldValueresuelve qué texto va en cada bloque marcado, según sufieldTypey el contexto (año, mes, semana o día concreto).- Los días “leading/trailing” (los del mes anterior o siguiente que aparecen en una vista mensual) se pintan en un color secundario para diferenciarlos.
El sistema soporta 6 tipos de página (portada, separador mensual, vista mensual, vista semanal, vista diaria, extras), y el orden de generación replica cómo se usa un planner en la vida real: portadas → por cada mes, separador + vista mensual → si hay vistas semanal y diaria, por cada semana se genera la semana y luego solo los días de esa semana que caen en ese mes → páginas extra al final.
También soporta i18n completo: idioma inglés/español (con locales de date-fns), formato de año (2026 vs 26), formato de mes (Enero vs 1) y formato de día (6 vs Lunes), todo configurable por plantilla.
3. De canvas a PDF imprimible
La exportación es 100% client-side, en dos fases:
- Rasterizado de páginas — cada página se pinta en un HTML Canvas 2D (imagen de fondo + texto de fechas) y se convierte a PNG en base64.
- Ensamblado del PDF — con
pdf-lib, corriendo en un Web Worker para no bloquear el hilo principal, cada PNG se embebe como página del PDF con el tamaño real en puntos (por ejemplo, 595×842 pt para A4).
Para mantener calidad de impresión, el sistema asume 300 DPI por defecto y detecta automáticamente si el diseño subido corresponde a A4 o A5 comparando sus dimensiones en píxeles contra varios DPIs conocidos (72/96/144/150/300).
Un planner anual con vista diaria puede generar cientos de páginas, así que el cuello de botella es el rasterizado. Para mitigarlo: progreso visible en dos fases (85% generación + 15% ensamblado), caché de páginas ya generadas si el rango no cambia, y una estimación previa del número de páginas antes de lanzar la exportación.
Stack
Arquitectura feature-sliced + hexagonal, con puertos/adaptadores separados por módulo (auth, template, editor, export, landing) — lo que permitió que el núcleo de generación (marcado → cálculo de fechas → PDF) sea independiente de la capa de persistencia.
Resultado
De ~8 horas manuales por trimestre en Canva a un proceso de minutos: subir el diseño una vez, marcar las zonas una vez, y generar cualquier rango de fechas cuando haga falta.
Estado actual y próximos pasos
Dyna está en early access: el core completo funciona (subir → marcar → generar → PDF), con acceso gestionado por waitlist y una demo pública sin registro. Es desktop-first por ahora (pensado para viewports ≥ 900×560px).
No he validado el producto con otras creadoras todavía — es una herramienta que resuelve mi propio problema, y ese sería el siguiente paso lógico: sacarlo de mi caso de uso personal y probarlo con otras personas que diseñan planners.
Roadmap pendiente:
- Colaboración y planners compartidos
- Librería de templates prediseñados
- Optimización mobile/tablet
- Sangrado y perfiles de color para imprenta profesional
- Paralelización de la generación de páginas (rendimiento)
Proyecto en producción: planner-maker-spa.vercel.app
Pruébalo tú misma
La demo interactiva funciona sin registro — sube un diseño, marca unas zonas y ve el flujo de generación en menos de dos minutos.