Sistema de Optimizacion de Rutas y Gestion de Entregas
Una alternativa open-source a SimpliRoute, OptimoRoute y LogiNext — sin costos por conductor.
- Por que BetterRoute?
- Caracteristicas
- Arquitectura
- Requisitos
- Instalacion
- Configuracion
- Uso
- Estructura del Proyecto
- Base de Datos
- API Reference
- App Movil
- Roadmap
- Contribuir
- Licencia
Las empresas de logistica y distribucion enfrentan un problema critico: las soluciones SaaS de optimizacion de rutas como SimpliRoute, OptimoRoute o LogiNext cobran por conductor activo, lo que resulta en costos prohibitivos:
| Solucion | Precio por conductor/mes | 50 conductores/mes |
|---|---|---|
| SimpliRoute | ~$35-50 USD | $1,750 - $2,500 |
| OptimoRoute | ~$40-60 USD | $2,000 - $3,000 |
| LogiNext | ~$50-80 USD | $2,500 - $4,000 |
| BetterRoute | $0 (self-hosted) | $0 + hosting |
BetterRoute es un sistema completo de optimizacion de rutas que puedes hospedar en tu propia infraestructura. Pagas solo por el servidor (desde ~$20/mes en un VPS) sin importar cuantos conductores tengas.
Ahorro potencial: Una empresa con 50 conductores puede ahorrar $24,000 - $48,000 USD al ano.
- Dual Engine: VROOM + PyVRP — Dos motores de optimizacion de clase mundial, seleccionables por el usuario
- VROOM + OSRM — Rapido, ideal para operaciones de ultima milla con muchas paradas
- PyVRP (Python) — Avanzado, soporta restricciones complejas, multi-depot, multi-start solving
- Multi-start solving — PyVRP ejecuta 3 corridas con distintas semillas y conserva la mejor solucion
- Distancias reales — Calculo basado en red vial via OSRM, no linea recta
- Presets de optimizacion — Configuraciones reutilizables (factor de trafico, distancia maxima, ventanas flexibles, rutas abiertas, balance de carga, etc.)
- Intercambio de vehiculos — Swap completo de rutas entre vehiculos con reoptimizacion automatica
- Restricciones avanzadas:
- Capacidad de vehiculos (peso, volumen, bultos)
- Ventanas horarias de entrega (con tolerancia flexible configurable)
- Habilidades requeridas (cadena de frio, carga pesada, etc.)
- Horarios de trabajo de conductores
- Zonas de servicio
- Distancia maxima por ruta
- Factor de trafico configurable (0-100%)
- Rutas abiertas (sin retorno a origen)
- Minimizacion de vehiculos basada en capacidad real
- Importacion masiva desde CSV/Excel
- Geocodificacion automatica de direcciones
- Estados de entrega en tiempo real
- Evidencia fotografica de entregas
- Motivos de no entrega configurables
- Vehiculos con capacidades y restricciones
- Asignacion de conductores
- Historial de mantenimiento
- Seguimiento GPS en tiempo real
- Cada empresa define sus propios campos en pedidos sin cambios de codigo
- Tipos:
text,number,select,date,currency,phone,email,boolean - Configurables por visibilidad: tabla, app movil, CSV import
- Validacion automatica (min/max, required, pattern)
- Renderizado dinamico en formularios, tablas, CSV import y app movil
- Cada empresa define sus propios estados de entrega
- Transiciones configurables entre estados
- Requisitos por estado: foto, firma, motivo, notas
- Colores e iconos personalizables
- Integrado con app movil Flutter
- Aislamiento completo de datos por empresa
- Roles y permisos personalizables
- Perfiles de optimizacion por empresa
- Mapa con ubicacion de conductores
- Estado de entregas actualizado
- Alertas configurables
- Dashboard con metricas clave
- Visualizacion de ruta asignada
- Navegacion integrada (Google Maps/Waze)
- Captura de evidencia
- Envio de ubicacion GPS al servidor
- Funciona offline (cola de sincronizacion)
+------------------------------------------------------------------+
| FRONTEND |
| +----------------+ +----------------+ +------------------+ |
| | Next.js Web | | Flutter App | | API Clients | |
| | (React 19) | | (Android/iOS) | | (Integraciones) | |
| +-------+--------+ +-------+--------+ +--------+---------+ |
+----------|-------------------|---------------------|---------------+
| | |
v v v
+------------------------------------------------------------------+
| BACKEND |
| +--------------------------------------------------------------+ |
| | Next.js API Routes | |
| | * /api/auth/* * /api/orders/* | |
| | * /api/optimization/* * /api/mobile/driver/* | |
| | * /api/monitoring/* * /api/vehicles/* | |
| +--------------------------------------------------------------+ |
| | |
| +---------------+---------------+ |
| v v v |
| +-------------+ +-------------+ +------------------+ |
| | PostgreSQL | | Redis | | Cloudflare R2 | |
| | (Drizzle) | | (Upstash) | | (S3 Storage) | |
| +-------------+ +-------------+ +------------------+ |
+------------------------------------------------------------------+
|
v
+------------------------------------------------------------------+
| ROUTING ENGINES |
| +------------------+ +------------------+ +----------------+ |
| | VROOM | | PyVRP | | OSRM | |
| | (Fast VRP, | | (Advanced VRP, | | (Road network | |
| | last-mile) | | multi-start, | | distances) | |
| | | | multi-depot) | | | |
| +------------------+ +------------------+ +----------------+ |
+------------------------------------------------------------------+
- Bun 1.0+ (recomendado) o Node.js 20+
- Python 3.11+ (para motor PyVRP)
- PostgreSQL 15+
- Docker (para VROOM/OSRM/PyVRP)
- 4GB RAM, 2 CPU cores
- VPS con 8GB RAM, 4 CPU cores
- SSD 50GB+ (para mapas OSRM)
- Redis (Upstash o self-hosted)
- S3-compatible storage (Cloudflare R2, MinIO)
git clone https://github.com/tu-usuario/betterroute.git
cd betterroute# Con Bun (recomendado)
bun install
# O con npm
npm installcp .env.example .envEdita .env con tus valores:
# Base de datos PostgreSQL
DATABASE_URL=postgresql://user:password@localhost:5432/betterroute
# JWT Secret (genera uno seguro para produccion)
JWT_SECRET=tu-secreto-super-seguro-minimo-32-caracteres
# Redis para cache (opcional pero recomendado)
UPSTASH_REDIS_REST_URL=https://tu-instancia.upstash.io
UPSTASH_REDIS_REST_TOKEN=tu-token
# Motores de rutas
VROOM_URL=http://localhost:5000
OSRM_URL=http://localhost:5001
PYVRP_URL=http://localhost:8000
# Cloudflare R2 para almacenamiento (fotos de evidencia)
R2_ACCOUNT_ID=tu-account-id
R2_ACCESS_KEY_ID=tu-access-key
R2_SECRET_ACCESS_KEY=tu-secret-key
R2_BUCKET_NAME=betterroute-files
R2_PUBLIC_URL=https://tu-bucket.tu-dominio.comDescarga los datos de tu pais/region:
# Crear directorio para datos
mkdir -p docker/osrm
cd docker/osrm
# Descargar mapa (ejemplo: Peru)
wget https://download.geofabrik.de/south-america/peru-latest.osm.pbf
# Procesar mapa (puede tardar 10-30 minutos)
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/peru-latest.osm.pbf
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-partition /data/peru-latest.osrm
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-customize /data/peru-latest.osrm
cd ../..Mapas disponibles: https://download.geofabrik.de/
docker compose --profile routing up -dEsto inicia:
- OSRM en
http://localhost:5001— calculo de distancias/tiempos - VROOM en
http://localhost:5000— optimizacion de rutas (motor rapido) - PyVRP en
http://localhost:8000— optimizacion avanzada (motor Python)
# Ejecutar migraciones
bun run db:migrate
# Cargar datos de ejemplo (opcional)
bun run db:seed# Desarrollo
bun run dev
# Produccion
bun run build
bun run startLa aplicacion estara disponible en http://localhost:3000
Despues de ejecutar el seed:
| Rol | Usuario | Contrasena |
|---|---|---|
| Admin Sistema | admin |
admin123 |
| Admin Flota | jgarcia |
test123 |
| Planificador | mlopez |
test123 |
| Monitor | aruiz |
test123 |
| Conductor | carlos.mendoza |
test123 |
Importante: Cambia estas contrasenas en produccion.
Cada empresa puede configurar:
- Campos de pedido — Que columnas mostrar en CSV
- Restricciones de vehiculos — Capacidad, peso maximo, etc.
- Parametros de optimizacion — Balance velocidad/calidad
- Ventanas horarias — Presets reutilizables
| Rol | Descripcion |
|---|---|
ADMIN_SISTEMA |
Acceso total, gestion multi-empresa |
ADMIN_FLOTA |
Gestion completa de una empresa |
PLANIFICADOR |
Crear y optimizar rutas |
MONITOR |
Ver monitoreo y reportes |
CONDUCTOR |
Solo app movil |
Los permisos son personalizables desde la interfaz de administracion.
planeamiento/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (auth)/ # Paginas de autenticacion
│ │ ├── (protected)/ # Paginas protegidas
│ │ │ ├── dashboard/
│ │ │ ├── orders/
│ │ │ ├── vehicles/
│ │ │ ├── planificacion/
│ │ │ ├── monitoring/
│ │ │ ├── custom-fields/ # Admin campos personalizados
│ │ │ ├── workflow/ # Config workflow states
│ │ │ └── ...
│ │ └── api/ # API Routes (~70 handlers)
│ │ ├── auth/
│ │ ├── orders/
│ │ ├── companies/ # CRUD empresas + field definitions
│ │ ├── optimization/ # Jobs, config, swap, confirm, reassign
│ │ ├── mobile/ # APIs para app movil
│ │ └── monitoring/
│ ├── components/ # Componentes React
│ │ ├── ui/ # shadcn/ui components
│ │ ├── layout/ # AppShell, Sidebar, CompanyProvider
│ │ ├── custom-fields/ # Admin campos personalizados
│ │ ├── orders/ # Formularios y tablas de ordenes
│ │ ├── monitoring/ # Vista monitoreo con mapa
│ │ └── optimization/ # Dashboard con swap, presets, resultados
│ ├── db/ # Drizzle ORM
│ │ ├── schema.ts # Definicion de tablas
│ │ └── seed.ts # Datos de ejemplo
│ ├── tests/ # Tests de integracion
│ │ └── integration/ # 170+ tests, real PostgreSQL
│ └── lib/ # Logica de negocio
│ ├── auth/ # Autenticacion, RBAC, autorizacion
│ ├── optimization/ # VROOM optimizer + PyVRP adapter + runner
│ ├── custom-fields/ # Validacion y seed de campos custom
│ ├── workflow/ # Seed de workflow states
│ ├── infra/ # Infraestructura (cache, tenant)
│ └── services/ # Servicios externos (VROOM, S3)
├── pyvrp-service/ # Microservicio Python (PyVRP)
│ ├── solver.py # Motor VRP con multi-start
│ ├── models.py # Modelos Pydantic
│ ├── main.py # FastAPI server
│ ├── requirements.txt # PyVRP==0.13.3, FastAPI, etc.
│ └── Dockerfile
├── drizzle/ # Migraciones SQL
├── docker/ # Configuracion Docker
│ ├── osrm/ # Datos de mapas
│ └── vroom/ # Config VROOM
├── docker-compose.yml
├── .env.example
└── package.json
# Ver estado de migraciones
bun run db:studio
# Generar nueva migracion
bun run db:generate --name nombre_descriptivo
# Aplicar migraciones pendientes
bun run db:migrate
# Sincronizar schema (desarrollo)
bun run db:push| Tabla | Descripcion |
|---|---|
companies |
Empresas/tenants |
users |
Usuarios y conductores |
vehicles |
Vehiculos de la flota |
fleets |
Flotas/grupos de vehiculos |
orders |
Pedidos a entregar |
optimization_jobs |
Trabajos de optimizacion |
route_stops |
Paradas de ruta confirmadas |
driver_locations |
Historial de ubicaciones GPS |
company_workflow_states |
Estados de workflow custom por empresa |
company_workflow_transitions |
Transiciones entre estados |
company_field_definitions |
Campos personalizados por empresa |
roles / permissions |
Sistema RBAC |
| Archivo | Descripcion |
|---|---|
0000_amused_night_nurse.sql |
Schema inicial completo |
0001_stormy_ironclad.sql |
Ajustes menores |
0002_white_rumiko_fujikawa.sql |
Alertas y notificaciones |
0003_brave_secret_warriors.sql |
Historial de estados |
0004_kind_post.sql |
Campos adicionales |
0005_add-vehicle-skill-assignments.sql |
Habilidades de vehiculos |
0006_add_driver_locations.sql |
Tracking GPS de conductores |
# Login
POST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
# Response
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"user": { ... }
}Authorization: Bearer <accessToken>
X-Company-Id: <uuid> # Para endpoints multi-tenant
| Metodo | Endpoint | Descripcion |
|---|---|---|
| GET | /api/orders |
Listar pedidos |
| POST | /api/orders/import |
Importar CSV |
| POST | /api/optimization/configure |
Crear configuracion de optimizacion |
| POST | /api/optimization/jobs |
Crear y ejecutar optimizacion |
| GET | /api/optimization/jobs/:id |
Estado de optimizacion |
| POST | /api/optimization/jobs/:id/confirm |
Confirmar plan |
| POST | /api/optimization/jobs/:id/swap-vehicles |
Intercambiar rutas entre vehiculos |
| GET | /api/optimization/engines |
Motores disponibles (VROOM, PyVRP) |
| GET | /api/optimization-presets |
Presets de optimizacion |
| POST | /api/driver-assignment/manual |
Asignacion manual de conductor |
| POST | /api/driver-assignment/suggestions |
Sugerencias de conductor |
| POST | /api/reassignment/options |
Opciones de reasignacion |
| GET | /api/monitoring/geojson |
GeoJSON para mapa |
| GET | /api/monitoring/summary |
Resumen de monitoreo |
| POST | /api/mobile/driver/location |
Enviar ubicacion GPS |
| GET | /api/mobile/driver/my-route |
Ruta del conductor |
| PATCH | /api/route-stops/:id |
Actualizar parada |
| GET | /api/companies/:id/field-definitions |
Listar campos custom |
| GET | /api/mobile/driver/workflow-states |
Estados de workflow |
| GET | /api/tracking/:token |
Tracking publico de pedido |
La app movil esta en un repositorio separado: better-route-mobile (Flutter).
- Lista de paradas del dia
- Navegacion a cada parada (Google Maps / Waze)
- Marcar entregas como completadas
- Capturar foto de evidencia
- Registrar motivo de no entrega
- Envio automatico de ubicacion GPS cada 20 segundos
- Cola offline para envios fallidos
- Workflow states dinamicos — Botones de accion generados segun la configuracion de la empresa
- Campos personalizados — Muestra campos custom definidos por la empresa en el detalle de cada parada
Editar lib/core/constants.dart:
class ApiConfig {
// Cambiar para produccion
static const String baseUrl = 'https://tu-api.com';
}
class AppConstants {
// Configuracion de tracking
static const int trackingIntervalSeconds = 20;
static const int trackingRetryAttempts = 3;
}flutter pub get
flutter build apk --releaseMotor PyVRP integrado como microservicio Python. Multi-start solving (3 corridas), soporte completo de presets, multi-depot, restricciones avanzadas. Seleccionable junto a VROOM desde la configuracion de optimizacion.
Cada empresa puede definir campos personalizados en sus pedidos desde la UI de admin. Los campos se renderizan dinamicamente en formularios, tablas, CSV import y la app movil.
Configuraciones reutilizables que fluyen desde la UI hasta ambos motores (VROOM y PyVRP): factor de trafico, distancia maxima, ventanas flexibles, rutas abiertas, balance de carga, minimizacion de vehiculos, etc.
Swap completo de rutas entre vehiculos con reoptimizacion automatica via VROOM desde la interfaz de planificacion.
Pagina publica de seguimiento de pedidos via token unico. Los clientes finales pueden ver el estado de su entrega sin necesidad de cuenta.
- Reoptimizacion en vivo — Recalcular rutas automaticamente cuando un conductor reporta un problema
- ETA en tiempo real — Notificaciones al cliente final con hora estimada de llegada actualizada
- Reportes y analytics — Dashboards con KPIs historicos (cumplimiento, tiempos, costos)
- Webhooks — Notificaciones push a sistemas externos en eventos clave
- Multi-dia — Planificacion de rutas que abarcan multiples dias
App Movil — better-route-mobile
Evolucionar la app Flutter con nuevas funcionalidades: tracking GPS en tiempo real (SSE), firma digital de recepcion, modo offline mejorado y notificaciones push.
| Categoria | Tecnologia |
|---|---|
| Frontend | Next.js 16, React 19, TailwindCSS 4 |
| UI Components | shadcn/ui, Radix UI |
| State | SWR |
| Maps | MapLibre GL |
| Backend | Next.js API Routes |
| Database | PostgreSQL + Drizzle ORM |
| Cache | Upstash Redis |
| Storage | Cloudflare R2 (S3) |
| Auth | JWT (jose) |
| Routing Engine | VROOM + PyVRP + OSRM |
| PyVRP Service | Python 3.11, FastAPI, PyVRP 0.13 |
| Mobile | Flutter + Riverpod |
| Testing | Bun Test (integration), Playwright (e2e) |
| Linting | Biome |
- VROOM Project — Motor de optimizacion rapido
- PyVRP — Motor de optimizacion avanzado
- OSRM — Calculo de rutas
- Next.js — Framework web
- Drizzle ORM — ORM TypeScript
- shadcn/ui — Componentes UI
- MapLibre — Mapas open-source
Las contribuciones son bienvenidas. Consulta CONTRIBUTING.md para conocer las convenciones del proyecto y como enviar tu primer Pull Request.
Este proyecto esta licenciado bajo la Licencia MIT.
BetterRoute — Optimiza tus entregas, no tu presupuesto.