Home
← Back
2026

Task Tracker

A daily task tracker with a live countdown to the end of the day. A pnpm monorepo with a Fastify API, a Next.js frontend and a CLI, with types shared across all three and separate deployments for web and API.

Role
Sole author — full stack
Status
Live. API on Render, web on Vercel, database on Neon.

Stack

API
Fastify · TypeBox · Prisma
Web
Next.js App Router · Tailwind CSS
Data
PostgreSQL (Neon)
Monorepo
pnpm workspaces · tipos compartidos
Deployment
Vercel (web) · Render (API)

Problem

A countdown to the end of the day has a deeper problem than it looks: the closing time depends on the user's timezone, and very few apps get that right. The value has to travel through the API without losing precision.

Approach

A pnpm monorepo with four packages: `apps/api`, `apps/web`, `apps/cli` and `packages/core`, where `core` holds the shared TypeScript types. The API uses Fastify with TypeBox for schema validation, and Prisma over PostgreSQL.

The CLI stores in JSON instead of calling the API, so the app stays usable without a server. That is why the types package exists: the CLI and the web speak the same language as the API.

Result

Three applications, one contract. Sharing the types across API, web and CLI removed the class of bugs where frontend and backend disagree about the shape of a piece of data, and frontend and backend deploy separately, so each is operated without touching the other.

Known limits

The API and the web live on the free tiers of Render and Vercel, so the first load can take a few seconds while the service spins up. For real usage with steady traffic, that arrangement does not hold.

Links