Task Tracker
Gestor de tareas diario con cuenta regresiva en vivo al fin del día. Monorepo pnpm con API Fastify, frontend Next.js y una CLI, con los tipos compartidos entre las tres aplicaciones y despliegues separados para web y API.
- Rol
- Autor del proyecto — full stack
- Estado
- En vivo. API en Render, web en Vercel, base en Neon.
Stack
- API
- Fastify · TypeBox · Prisma
- Web
- Next.js App Router · Tailwind CSS
- Datos
- PostgreSQL (Neon)
- Monorepo
- pnpm workspaces · tipos compartidos
- Despliegue
- Vercel (web) · Render (API)
Problema
Hacer la cuenta regresiva del día tiene un problema de fondo: la hora de cierre depende de la zona horaria del usuario, y casi ninguna app la resuelve bien. El dato tiene que viajar por la API sin perder precisión.
Enfoque
Un monorepo pnpm con cuatro paquetes: `apps/api`, `apps/web`, `apps/cli` y `packages/core`, donde `core` contiene los tipos TypeScript compartidos. La API usa Fastify con TypeBox para la validación de esquemas, y Prisma sobre PostgreSQL.
La CLI guarda en JSON en vez de pegarle a la API, así que la app sigue siendo usable sin servidor. Es la razón de que el paquete de tipos exista: la CLI y la web hablan el mismo idioma que la API.
Resultado
Tres aplicaciones, un solo contrato. Reutilizar los tipos entre la API, la web y la CLI eliminó la clase de errores en la que el frontend y el backend discrepan sobre la forma de un dato, y el frontend y el backend se despliegan por separado, de modo que cada uno se opera sin tocar el otro.
Límites conocidos
La API y la web viven en los planes gratuitos de Render y Vercel, así que la primera carga puede tardar unos segundos mientras el servicio se activa. Para uso real con carga constante, ese arrangement no sostiene.