GastroOS — Restaurant POS System
19 de junio de 2026
SaaS de gestión restaurantera: punto de venta, comandas, cocina, inventario, caja y reportes. Next.js + Supabase con 7 roles de acceso y modo offline.
1 canal
SaaS
proyecto central
Contexto
GastroOS es un sistema POS (Point of Sale) completo para restaurantes, diseñado para centralizar la operación diaria en una sola plataforma web progresiva. El proyecto nació de la necesidad de reemplazar sistemas legacy costosos y poco flexibles con una solución moderna, accesible desde cualquier dispositivo y con capacidades offline.
El sistema cubre todo el ciclo operativo de un restaurante: desde la apertura de mesas y toma de comandas hasta el cierre de caja, pasando por cocina, inventario, promociones y reportes.
Reto
Construir un SaaS multiinquilino que funcionara de forma confiable en entornos con conectividad intermitente (cocinas, bodegas, zonas de servicio). El sistema debía soportar 7 roles operativos distintos con permisos granulares, y ser lo suficientemente rápido para usarse en horarios pico sin fricción.
Además, el frontend necesitaba ser 100% responsivo para tablets y celulares usados por meseros, cocineros y cajeros, con actualizaciones en tiempo real entre módulos (una comanda nueva debía aparecer al instante en la pantalla de cocina).
Mi aporte
- Arquitectura y desarrollo full-stack: diseñé la estructura completa del frontend con Next.js, el sistema de 7 roles, los servicios de backend sobre Supabase y la lógica de caché que permite seguir operando sin conexión.
- Módulo de mesas: mapa visual del restaurante con estados (libre, ocupada, reservada, cerrada), creación y edición de mesas con zonas, y apertura de sesiones por mesa con temporizador.
- Módulo de comandas: panel de toma de pedidos con búsqueda de productos por categoría, carrito persistente, selección de variantes y extras, y envío instantáneo a cocina con actualización en tiempo real.
- Panel de cocina: tablero kanban por áreas de preparación (cocina, barra, parrilla) con tickets agrupados, filtros por estado y confirmación de entregado con hora exacta.
- Módulo de caja: apertura y cierre de caja registradora con conteo de fondo, cobros mixtos (efectivo, tarjeta, transferencia), resumen de ventas diarias y corte de cajero.
- Módulo de inventario: control de existencias con entradas, salidas, ajustes y mermas, alertas de stock mínimo, y movimientos trazables por producto.
- Módulo de productos: catálogo de productos con variantes (tamaños, sabores), precios, categorías, áreas de preparación y extras configurables.
- Módulo de promociones: descuentos por monto, combo, porcentaje o producto específico con validación de fechas y condiciones.
- Autenticación y roles: 7 roles con acceso protegido en servidor y en cliente, menú lateral que cambia según los permisos y selección de rol para usuarios con varios perfiles.
- PWA y offline: instalable como app, con caché propia, notificaciones push y sincronización automática al recuperar la conexión.
- Despliegue en Cloudflare: renderizado en servidor, headers de seguridad, caché y entrega optimizada de imágenes y assets.
- Base de datos: PostgreSQL con seguridad a nivel de fila para que cada restaurante solo vea sus propios datos, y cambios de esquema versionados para mantener todo trazable.
Stack
Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, shadcn/ui, Zustand, Supabase (PostgreSQL, Auth, Realtime), PWA, Recharts y Cloudflare Workers.
Resultado
SaaS de gestión restaurantera completo y funcional, desplegado en Cloudflare Workers con SSR. El sistema maneja 7 roles operativos, 15+ módulos funcionales y notificaciones en tiempo real entre todos los puntos del restaurante. La arquitectura offline-first permite operar sin interrupciones incluso en zonas sin cobertura, con sincronización automática al recuperar la conexión.
Decisiones técnicas clave Mostrar más
- Arquitectura de 3 capas por dominio: tipos → servicios → hooks. Cada módulo (mesas, comandas, caja, etc.) sigue el mismo patrón, garantizando separación de responsabilidades y código testeable.
- Autenticación de doble capa: la sesión se verifica en el servidor y se vuelve a validar en el cliente, redirigiendo si hace falta. Dos capas evitan accesos no autorizados incluso si una falla.
- Roles con ruteo dinámico: 7 perfiles con rutas permitidas definidas en una capa central de permisos. El menú lateral se genera según el rol activo y cada página sensible queda envuelta por un guard.
- Estado con Zustand: store mínimo y tipado para sesión, menú y preferencias. Sin Redux ni Context inflado. Cada store solo actualiza los componentes que lo consumen.
- Realtime con Supabase: el panel de cocina recibe las comandas nuevas al instante mediante canales en tiempo real. Un hook propio abstrae la suscripción y su limpieza.
- PWA sin framework: Service Worker escrito a mano, con caché primero para los recursos estáticos y red primero (con respaldo en caché) para los datos. Manifiesto con iconos en varios tamaños y splash screens.
- Modales paginados: el panel de productos carga resultados de forma paginada mientras el usuario busca, sin bloquear la interfaz.
- Aviso de sin conexión: la app detecta cambios de conectividad y muestra una barra no intrusiva cuando se pierde la conexión.
- Manejo de errores tipado: todos los servicios devuelven un resultado tipado (datos o error) y exponen estados de carga, error y datos para que cada pantalla los maneje explícitamente.
- Cambios de esquema versionados: las migraciones llevan marca de tiempo y las políticas de seguridad se crean junto con ellas, no a mano desde el panel.
Arquitectura de módulos Mostrar más
El sistema está organizado en 15+ módulos funcionales, cada uno con su propia capa de componentes, servicios y hooks:
| Módulo | Propósito |
|---|---|
| Mesas | Mapa de mesas, estados, zonas y sesiones |
| Comandas | Toma de pedidos, carrito, variantes y extras |
| Preparación | Tablero kanban de cocina por área |
| Caja | Cobro, cierre de caja y pagos mixtos |
| Inventario | Stock, entradas, salidas y mermas |
| Productos | Catálogo, categorías, precios y variantes |
| Promociones | Descuentos, combos y ofertas por fecha |
| Usuarios | Gestión de usuarios y roles |
| Tickets | Impresión de tickets y pre-cuentas |
| Reportes | Estadísticas y gráficos |
El estado de autenticación es el punto central compartido (Zustand con persistencia parcial del rol activo), de modo que cualquier módulo conoce el rol y los permisos vigentes.
Seguridad y performance Mostrar más
- Aislamiento por restaurante: todas las tablas usan seguridad a nivel de fila que filtra por el restaurante del usuario autenticado. Cada usuario solo ve los datos de su negocio.
- Roles con permisos granulares: 7 roles con rutas permitidas y componentes visibles definidos en una capa central. Los guards se aplican tanto en el servidor como en el cliente.
- Caché de Service Worker: caché primero para los recursos estáticos y red primero para los datos, con respaldo en caché cuando hay error de red.
- Optimización de imágenes: transformación en tiempo real sobre Cloudflare, con carga diferida y placeholder difuminado.
- Rendimiento en tiempo real: las suscripciones en vivo se limpian al desmontar los componentes, evitando fugas de memoria y conexiones huérfanas.
- Código tipado: TypeScript estricto en toda la base de código, con tipos centralizados y compartidos entre servicios, hooks y componentes.