Portfolio · Full-stack · Open Source
💼 LinkedIn ✉️ Email

Proyecto destacado · Backend · Full Stack

KAVANA Route AI — Plataforma de reparto con OCR, optimización 2-opt y firma digital

Proyecto portfolio de backend y full-stack. Construí un sistema completo de gestión de reparto con dos frontends (Torre de Control + app web del repartidor), API REST, OCR, optimización de rutas, firma digital, métricas de coste real y documentación técnica (ADRs).

Tecnologías: Node + Express, React + Vite, PostgreSQL, Nominatim, Tesseract.js, 2-opt, GitHub Actions + Pages, Render. Ver arquitectura completa →

50
Tests automatizados
2
Workflows CI/CD
24
Endpoints API
7
ADRs documentados
📋 ADR: IA → 2-opt 🗺️ ADR: Geocoding 🚀 ADR: Deploy 📐 Decisiones técnicas
El origen

Por qué construí esto

Trabajé en un entorno donde los repartidores llegaban cada mañana a una pila de albaranes en papel. Tenían que ordenarlos manualmente, decidir por dónde empezar, y al final del día devolver los papeles firmados — que a menudo se perdían. La oficina no sabía qué se había entregado hasta que el repartidor volvía.

Esa desconexión entre el repartidor y la oficina me pareció un problema técnicamente interesante de resolver: ¿cómo digitalizar ese flujo con herramientas accesibles, sin infraestructura cara, y que además demostrara criterio de ingeniería?

Kavana Route AI es mi respuesta. Un MVP que cubre el ciclo completo: OCR de albaranes → optimización de ruta → firma digital → Torre de Control con métricas de coste real.

Lo que demuestra

Capacidades técnicas visibles en este proyecto

🏗️

Arquitectura backend real

API REST con Express, 25 endpoints, middlewares JWT, carga de archivos, generación de PDF, OCR, geocodificación. Separación clara de responsabilidades en servicios.

🗄️

Base de datos dual

PostgreSQL en producción (Neon) + JSON file en desarrollo. Misma interfaz de queries, dos implementaciones. Sin cambiar código de negocio al cambiar de BD.

🧮

Algoritmo 2-opt propio

Implementé el algoritmo de optimización de rutas desde cero. Vecino más cercano + 2-opt. Mejor que IA gratuita, sin coste, <1ms. Decisión documentada.

🔍

Geocoding con fallbacks + validación

Nominatim gratuito pero impreciso. 8 formatos de query por dirección + bounding box de Valencia. ~80% acierto. ADR →

📸

OCR con Tesseract.js + pdftotext

Escanea imágenes (Tesseract), PDFs (pdftotext) y CSVs. Extrae direcciones y las limpia semánticamente para geocodificación.

🔐

Auth JWT + RBAC

Dos roles (office, driver) con endpoints protegidos. Login por PIN, token 8h, crypto nativo.

📱

App web pensada para móvil

La app del repartidor es una SPA responsive: se añade a la pantalla de inicio y se abre como una app más. Sin store, actualización instantánea.

📋

7 ADRs documentados

Cada decisión clave documentada con contexto, alternativas y consecuencias. Ver ADRs →

🧪

50 tests

Tests con node:test (sin framework). Pruebas de API, base de datos, geocoding, OCR, PDF, blindaje de la demo y asistente. CI en GitHub Actions.

💬

Asistente técnico integrado

Un asistente con RAG sobre la documentación real (ADRs, decisiones, docs) responde preguntas técnicas en la propia demo. Pruébalo en la Torre de Control (botón 💬).

🚀

CI/CD real en dos plataformas

GitHub Actions build frontends → GitHub Pages. Backend en Render. Push a main = deploy automático.

Decisiones técnicas

Criterio aplicado, no solo código

Más allá de las tecnologías, aquí hay decisiones de arquitectura que responden a restricciones reales: coste cero para MVP, disponibilidad sin conexión, simplicidad operativa.

🧮 2-opt en vez de IA para rutas

La IA parecía la opción obvia, pero los modelos gratuitos daban resultados inconsistentes y tardaban 30s. El algoritmo 2-opt es determinista, milisegundos, 0€ de coste y no necesita internet. ADR →

🗺️ Nominatim con validación geográfica

Geocodificar direciones españolas gratis no es trivial. Implementé 8 formatos de query por dirección + bounding box de Valencia para filtrar resultados de otras ciudades. ADR →

🗄️ BD dual: PostgreSQL y JSON

El sistema funciona con PostgreSQL en producción o con un archivo JSON en desarrollo — sin cambiar una línea de código de negocio. Misma interfaz de queries, dos implementaciones. Ideal para desarrollar sin infraestructura.

📐 7 ADRs documentados

Cada decisión importante tiene su Architecture Decision Record: contexto, alternativas evaluadas, consecuencias. Ver ADRs →

🚀 CI/CD en dos plataformas

GitHub Actions build los frontends y los despliega a GitHub Pages. El backend Node vive en Render. Despliegue automático con cada push a main. ADR →

📱 App web para el repartidor

La app del repartidor es una web responsive: se añade a la pantalla de inicio desde el navegador y se actualiza sola, sin store ni build. Se evaluó PWA con service worker y app nativa; se descartaron por mantenimiento (ADR-001).

📐 Ver todas las decisiones técnicas
Stack tecnológico

Arquitectura real, no mockups

🔙 Backend

Node 20+Express 4pgJSONJWTPDFKitpdftotextOpenRouter
  • API REST 25 endpoints
  • BD dual: PostgreSQL (Neon) + JSON fallback
  • Geocoding Nominatim + validación Valencia
  • Optimización 2-opt (0€, <1ms)
  • Asistente RAG sobre la documentación (TF-IDF + OpenRouter)

🎨 Frontend

React 18ViteCanvasjsPDF
  • App web del repartidor responsive
  • Torre de Control desktop
  • Estilo oscuro Electric Gold

🏗️ Infraestructura

RenderNeonGitHub PagesNamecheapGitHub ActionsNominatimLet's Encrypt
📚 Decisiones técnicas · README completo · ADRs (6 documentos)
El flujo completo

Cómo circula un reparto

Oficina │ sube albaranes (OCR de imagen / PDF / CSV) ▼ API REST (Express + JWT) │ geocodifica direcciones (Nominatim + validación Valencia) │ optimiza la ruta (2-opt, <1ms) ▼ PostgreSQL (Neon) · JSON en desarrollo │ ▼ App del repartidor (web, móvil) │ entrega en orden optimizado │ firma digital del cliente (Canvas → POD en PDF) ▼ Torre de Control entregas cerradas · coste por repartidor y combustible
Demo en vivo

Pruébalo ahora

La demo incluye una empresa ficticia con 90 días de historia: 6 repartidores, más de 12.000 paradas, firmas digitales, PODs en PDF y km reales de jornada. Un cron simula las rutas de cada día (la demo sigue viva sola) y los datos históricos están blindados: nadie puede editarlos ni borrarlos. Cualquier cosa que crees tú para probar (repartidores, albaranes) se elimina automáticamente a las 24 horas.

🏢 Torre de Control

Gestiona repartidores, envía rutas, sigue entregas, consulta costes reales.

PIN oficina: 0000

Accede desde cualquier navegador.

💬 Asistente técnico integrado

Pulsa el botón 💬 abajo a la derecha y pregúntale cómo funciona el proyecto: responde con la documentación real.

Abrir Torre de Control →

📱 App Repartidor

Escanea albaranes, entrega con firma.

PIN repartidor: 5855

Los repartidores del histórico son solo lectura (protegidos). Para probar la app, crea un repartidor propio en la Torre de Control: caduca a las 24h.

Abrir App →

¿Quieres ver más?

Este es uno de los proyectos de mi portfolio. Si quieres ver el código, las decisiones técnicas documentadas, o simplemente conectar: