URL Shortener
Plataforma completa de acortamiento de URLs con analytics en tiempo real
Sistema de acortamiento de URLs con backend en Fastify, frontend en Next.js, y analytics avanzados. Incluye tracking de clicks con GeoIP, parsing de User-Agent, sistema de tiers, expiración lazy, y actualizaciones en tiempo real vía WebSocket.




1. Arquitectura
Routes
Handlers HTTP con validación de schemas y rate limiting
Services
Lógica de negocio con generación de códigos, analytics y gestión de URLs
Database
Persistencia con Prisma ORM y PostgreSQL
2. Características
Core
Acortamiento de URLs
Generación de códigos únicos con nanoid y validación de URLs con normalización automática
Analytics Avanzados
Tracking de clicks con desglose por país, navegador, OS, dispositivo y referrer
Sistema de Tiers
Tiers free/premium con límites configurables de URLs por usuario
Expiración de URLs
URLs con fecha de expiración configurable y verificación lazy al acceder
Tiempo Real
WebSocket Real-time
Actualizaciones en tiempo real de clicks y analytics vía Socket.IO con rooms por URL
GeoIP Tracking
Geolocalización de clicks con base de datos MaxMind y cálculo de confianza
User-Agent Parsing
Extracción de navegador, OS y dispositivo con ua-parser-js
Frontend
Dashboard Interactivo
UI moderna con Next.js 16, React 19 y Tailwind CSS con diseño responsive
Visualización de Datos
Gráficos interactivos con Recharts mostrando analytics de clicks y distribución
API Client Generation
Generación automática de cliente API con Orval desde OpenAPI spec
Infraestructura
Observabilidad
Métricas Prometheus con contadores de URLs creadas, clicks y operaciones
Rate Limiting
Limitación de requests por usuario y endpoint con configuración granular
Production Ready
Docker multi-stage, health checks y configuración por entorno
3. Tech Stack
4. API Reference
| Módulo | Endpoints |
|---|---|
| URLs | 5 |
| Usuario | 4 |
| Estadísticas | 1 |
| Health | 2 |
5. Decisiones de Diseño
Fire-and-Forget Click Logging
El redirect 302 se devuelve inmediatamente sin esperar a que el click se persista. Esto mejora la latencia percibida y desacopla el tracking del redirect.
GeoIP con Score de Confianza
En lugar de confiar ciegamente en GeoIP, se calcula un score de confianza basado en la coincidencia entre GeoIP y el Accept-Language header.
Tier-based URL Limits
Los usuarios tienen un campo urlLimit configurable por tier. Free tier tiene límite de 50 URLs, premium es ilimitado.
Lazy Expiration
En lugar de un job que marque URLs como expiradas periódicamente, se verifica la expiración al acceder. Esto simplifica la arquitectura.