GoalTrack
Seguidor de hábitos (Angular + Rust)
GoalTrack es un seguidor de hábitos que reduce el seguimiento a un cuadrado por día: una vista Hoy con los hábitos del día, un toque para completar y rachas que se ven (racha actual, mejor racha y mapa de calor de 26 semanas por hábito). PWA instalable en cinco idiomas con el día calculado en la zona horaria del usuario, no en la del servidor. Frontend Angular 22 + Tailwind 4 con service worker; backend Rust (Axum + SQLx) sobre PostgreSQL, desplegado con systemd y nginx.

Tecnologías utilizadas
Front-end
Back-end
PostgreSQLHerramientas
Funcionalidades principales
Un cuadrado por día
La vista Hoy muestra los hábitos del día como tarjetas con un cuadrado de color: un toque lo rellena, marcado queda. Progreso del día arriba (4 de 7), frecuencia por hábito (cada día, 3× por semana) y nada más que estorbe. El seguimiento entero cabe en una pantalla.

Rachas que se ven: mapa de calor de 26 semanas
El detalle de cada hábito reúne racha actual, mejor racha y check-ins totales, con un mapa de calor estilo GitHub de las últimas 26 semanas. Las rachas se calculan en el servidor desde los check-ins reales: un día fallido corta la racha y se ve al instante.

PWA instalable, pensada primero para el móvil
Angular 22 con Tailwind 4 y service worker: instalable desde el navegador, navegable con una barra inferior (Hoy, Hábitos, Ajustes) y revisada a 390 px. Tipografía Space Grotesk e Inter, tema oscuro por defecto y objetivos táctiles grandes para usarlo con una mano.

El día del usuario, no el del servidor
«Hoy» es una fecha de calendario en la zona horaria del usuario, nunca la del servidor: el cliente envía su offset (semántica de Date#getTimezoneOffset) y el backend resuelve el día antes de tocar la base de datos. Un check-in a medianoche en Madrid nunca cae en el día equivocado.

Backend en Rust sobre PostgreSQL
API Axum con SQLx: auth con registro y login, CRUD de hábitos y toggle de check-in idempotente por día (único goal_id + day en la base). Binario único detrás de systemd y nginx, con migraciones SQL versionadas y despliegue propio en un VPS.

Cinco idiomas desde el primer día
Inglés, español, alemán, francés y portugués con detección de idioma del navegador y cambio en la propia pantalla de acceso. Toda la copy pasa por i18n: ninguna cadena pintada a mano, ningún idioma a medias.

Videos del proyecto
Galería de imágenes
