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

Proyecto destacado · Product Engineering · Full Stack

KAVANA Warehouse — WMS multi-tenant diseñado para un problema real de inventario

Proyecto portfolio de full-stack. Mi cuñado no sabía cuánto producto gastaba cada centro de su empresa de limpieza. Cada semana compraba de más o de menos. Le dije que iba a hacer algo sencillo para llevar la cuenta. Eso fue el inicio de Kavana Warehouse.

Tecnologías: React 19, Node.js + Express, PostgreSQL 16, Prisma, Docker. Ver arquitectura completa →

45
Tests API (Jest)
45
Endpoints API
5
ADRs documentados
31.000+
Movimientos simulados
📐 Decisiones técnicas 📋 ADRs (5) 📚 README
El origen

Por qué construí esto

Mi cuñado es el responsable de una empresa de limpieza que gestiona varios centros de trabajo. Un día me comentó que no sabía cuánto producto gastaba cada centro: cada semana compraba de más o de menos, y nadie tenía una foto clara del stock real. Me pidió una forma de llevar la cuenta sin depender de que cada trabajador avisara desde su móvil.

Así nació Kavana Warehouse. Lo construí como proyecto personal, pensando exclusivamente en su problema. Podría usarse en cualquier sector, pero lo diseñé a medida para esa empresa de limpieza. Quise demostrar que podemos crear soluciones específicas, pegadas a un cliente real, y no productos genéricos que intentan servir para todo. Esa es la mentalidad de producto que quiero mostrar con este proyecto.

Lo que demuestra

Capacidades técnicas visibles en este proyecto

🏗️

API REST con Express + Prisma

Backend en Node.js 20 con Express y Prisma ORM. 45 endpoints para productos, centros, inventarios, movimientos, costes y el asistente técnico. Respuestas tipadas de extremo a extremo.

🔒

Multi-tenant shared schema

Aislamiento lógico por client_id en PostgreSQL 16. Todos los tenants comparten esquema pero los datos están separados a nivel de aplicación. ADR →

👥

Auth JWT + RBAC

Autenticación stateless con JWT + refresh tokens. Dos roles: oficina (gestión total) y supervisor (recuento de inventario). El usuario se identifica con nombre de usuario, no con email.

🐳

Docker Compose

PostgreSQL, API y dashboard como servicios orquestados con docker-compose. Entorno replicable con un comando.

📦

Inventario multi-centro

Gestión de productos con categorías. Entradas, salidas, consumos por centro y recuentos físicos con detección de desviaciones y propuesta de compra.

📊

Dashboard con KPIs

Vista operativa con métricas de consumo, evolución mensual, alertas de stock bajo y control de presupuesto por centro.

📋

Trazabilidad completa

Registro histórico de todos los movimientos con filtros por fecha, centro, producto y usuario. Nada desaparece sin dejar rastro.

🔗

API REST documentada

API diseñada para integraciones con ERPs o sistemas externos. Documentación técnica de endpoints disponible en el repositorio.

🧪

45 tests de API + 3 de frontend

45 tests de integración con el stack real (supertest + PostgreSQL), incluido el flujo completo conteo → desviación → propuesta de compra y el asistente técnico. 3 tests de componente con Vitest + Testing Library. Ejecutables con npm test y en CI con GitHub Actions.

🤖

Asistente técnico RAG

Chat que responde sobre la documentación real del proyecto: README, DECISIONS.md, ADRs y código. Indexa los documentos con búsqueda por similitud y genera respuestas con modelos de IA, con límite de uso por IP para proteger la demo.

🛡️

Blindaje de demo (modo solo lectura)

Los supervisores de visita solo pueden consultar y crear recuentos; la gestión global devuelve 403. Sus datos expiran a las 24 horas, dejando la demo limpia para el siguiente visitante. Patrón RouteAI.

📋

5 ADRs documentados

Multi-tenant, JWT + refresh tokens, Prisma ORM, despliegue Vercel+Render+Neon y asistente RAG + blindaje demo, cada uno con contexto, alternativas y consecuencias. Decisiones técnicas →

Decisiones técnicas

Criterio aplicado, no solo código

Decisiones de arquitectura que responden a restricciones reales: un desarrollador solo, un cliente concreto, necesidad de desplegar rápido y de forma reproducible.

🔒 Shared Schema multi-tenant

Todos los clientes comparten esquema con aislamiento por client_id. Simple de mantener, eficiente en recursos, y suficiente para el dominio. Para proyectos más grandes se migraría a RLS. ADR →

👤 JWT + RBAC en vez de sessions

Arquitectura stateless: sin estado en servidor, escalable horizontalmente. Refresh tokens para no pedir login cada 15 minutos. Dos roles: oficina (gestión total) y supervisor (recuento de inventario).

🐳 Docker Compose

PostgreSQL, API y dashboard separados como contenedores con docker-compose. Un comando levanta todo el stack en local.

🗄️ Prisma ORM en vez de SQL raw

Schemas declarativos, migraciones automáticas y type-safety desde la BD hasta el frontend. Menos errores, más velocidad de iteración.

👤 Dos roles, no cuatro

Primero se diseñaron roles para controlar al personal (limpiadores, operarios), pero la app evolucionó a gestión de stock pura. Se simplificó: oficina lo gestiona todo y supervisor hace el recuento de inventario. Menos roles, menos fricción, más foco en el problema real.

📋 Decisiones documentadas

La arquitectura multi-tenant, la autenticación JWT, la elección de Prisma, el despliegue y el asistente RAG están documentados en 5 ADRs con contexto, alternativas y consecuencias, consolidados en DECISIONS.md.

Stack tecnológico

Arquitectura real, no mockups

🔙 Backend

Node.js 20ExpressPrismaPostgreSQL 16JWTRBAC
  • API REST multi-tenant
  • Shared schema con client_id
  • Auth stateless JWT + refresh tokens
  • Dos roles: oficina y supervisor

🎨 Frontend

React 19ViteTypeScriptCSS propio
  • Dashboard para la oficina
  • Vista de recuento para supervisores
  • Tipado end-to-end con Prisma

🏗️ Infraestructura

DockerDocker ComposeGitHub ActionsVercelRenderNeon PostgreSQL
📚 README completo · Documentación · Repositorio
El flujo completo

Cómo circula el inventario

Oficina │ gestiona productos, centros y presupuestos ▼ API REST (Express + Prisma + JWT) │ valida rol y aisla datos por client_id ▼ PostgreSQL 16 (Neon) │ ▼ Supervisor (dashboard) │ registra consumos y recuentos físicos ▼ Dashboard desviaciones · alertas de stock bajo · coste por centro
Capturas reales

La aplicación funcionando, no mockups

Capturas de la demo desplegada: cada pantalla corresponde al código real del repositorio.

Dashboard con KPIs

📊 Dashboard

KPIs, evolución mensual y alertas de stock bajo.

Coste por centro

💰 Costes por centro

Presupuesto mensual, porcentaje consumido y estado por centro.

Desviaciones de inventario

📉 Desviaciones

Stock registrado vs conteo físico, mermas y coste de la desviación.

Inventario multi-centro

📦 Inventario

Stock por centro y producto, mínimos y propuesta de compra.

Gestión de centros

🏢 Centros

Cada centro con su presupuesto, productos asociados y responsables.

Pantalla de login

🔐 Login

Acceso por nombre de usuario con JWT + refresh tokens.

Todas las capturas son de la demo desplegada: warehouse.kavanasystems.com · usuario warehouse · kavana

Demo en vivo

Pruébalo ahora

🏭 Landing + Dashboard

Escenario demo: empresa de limpieza con 10 centros, 31 productos y 3 meses de histórico simulado. Dashboard con KPIs, evolución de consumo mensual, alertas de stock bajo y control de presupuesto por centro.

Demo: usuario warehouse · contraseña kavana

Abrir demo →

💻 Código completo

Repositorio público con docker-compose: levanta PostgreSQL, API y dashboard en local con un solo comando.

Ver en GitHub →

¿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: