Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Proyecto portfolio: MES para plantas que transforman bobinas de acero. Sabe qué bobina se gasta en cada orden, calcula los kilos que quedan a partir del radio y bloquea el material equivocado. Hecho p
Translation pending
BusinessPython · TypeScriptGitHub @kavanasystemsinfo-uiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
MES especializado en metalurgia: gestión de la producción en perfiladoras y transformación de bobina de acero, de la recepción de la bobina a la orden terminada. Demo con una planta de ejemplo.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗MES/MOM para el sector metalúrgico: control de bobinas de acero, consumo FIFO, reconciliación industrial, OEE, calidad y trazabilidad ISO 9001. Desplegado en producción como demo (Fly.io + Vercel) y construido con desarrollo guiado por tests en las partes críticas (dominio, seguridad y concurrencia).
Este repo es la reconstrucción moderna (v4) de un sistema legacy. La lógica de dominio única (bobinas, FIFO, reconciliación) proviene de años de experiencia real en planta, y se portó a un stack moderno con TDD, ADRs y despliegue profesional.
Este sistema nació en el suelo de la fábrica, de 8 años trabajando como operario en fábricas metalúrgicas (CNC, turnos, empresas medianas y grandes). Nadie lo diseñó en un despacho: lo diseñó alguien que vivió la pérdida de tiempo del papel, los Excel que no cuadraban y los sistemas que se enteraban de lo que pasaba en planta horas o días después.
Es un MES (Manufacturing Execution System) con alcance MOM, especializado en la transformación de bobinas de acero. Cubre las 4 actividades de operaciones del estándar ISA-95: producción, calidad, mantenimiento e inventario. No es un ERP: no gestiona finanzas ni recursos de la empresa, su frontera es la planta.
ADR-001: clasificación del sistema
| Capa | Tecnología |
|---|---|
| Backend | Python + FastAPI + WebSockets |
| Base de datos | PostgreSQL (Alembic) |
| Frontend | React + TypeScript (Vite) |
| Tests | pytest + Vitest |
| Despliegue | Fly.io (backend) + Vercel (frontend) + GitHub Actions |
✅ Reconstrucción completa por fases (0-7). Backend en
steelworks-api.fly.dev con PostgreSQL
gestionado (migraciones + seed demo en el entrypoint) y frontend en Vercel
(steelworks.kavanasystems.com) con
rewrites /api/*. CI verde en cada push: ruff + pytest + migraciones + build
TS + vitest.
Motor FIFO de bobinas: cascada por fecha de entrada con burbuja de
vinculación, herencia entre bobinas, JIT Move y tolerancia de superávit
max(15%, 150kg).
Reconciliación industrial: retales medidos en milímetros de radio, merma oculta entre lo que el FIFO cree y lo que pesa la báscula, coste real por lote.
Fin de bobina: el operario mide el radio en mm y el sistema calcula kg con densidad calibrada (7.7807 kg/dm³). Botón Retirar devuelve picos como sugerencia, nunca imposición.
OEE y KPIs: disponibilidad, rendimiento y calidad con datos reales; sin datos muestra 0, nunca inventa.
Trazabilidad ISO 9001: ProductionLog inmutable (trigger de UPDATE/DELETE) y timeline en el panel Supervisor.
Autocontroles de calidad e incidencias de planta con evidencia fotográfica desde el móvil (sesión QR + validación magic bytes).
WebSockets de planta (ADR-014) con fallback a polling.
Auth JWT 8h con roles (operario, materiales, supervisor, admin) y administración multi-tenant (Fase 7): usuarios, secuencias, puestos, roles.
233+ tests backend (pytest, incluye E2E contra PostgreSQL real y tests de aislamiento cross-tenant) + 71 frontend (vitest), ejecutados en CI.
Asistentes IA con RAG sobre la documentación real (2 bots sobre el mismo
corpus): bot de usuario (POST /api/v1/assistant/ask) que explica el
producto desde el punto de vista de planta, y asistente técnico para
reclutadores (POST /api/v1/assistant/ask-tech) que responde arquitectura,
decisiones (ADRs), seguridad y limitaciones documentadas. TF-IDF en memoria +
OpenRouter; regla de honestidad: si no está en la documentación, lo dice.
Métricas verificables: los números reales se mantienen al día en el changelog
docs/audit/changelog.md.
Este repo es una pieza de portafolio con un solo usuario real: su autor, y está construido para costar ~0 €/mes. Esa restricción no es un detalle de infraestructura: ha decidido el transporte de eventos, dónde viven las fotos, el motor de búsqueda de los asistentes y el tamaño de la máquina. Aquí está cada partida con lo que hay hoy, el porqué y qué cambiaría con usuarios reales y presupuesto. El detalle completo, con alternativas descartadas, está en ADR-017.
cpu_kind = "shared" de 1
CPU y 256 MB con min_machines_running = 0 y auto_stop_machines = "stop",
es decir, se apaga cuando nadie la usa (fly.toml). Con usuarios reales:
réplicas mínimas fijas para eliminar el arranque en frío, más memoria y un
entorno de staging separado de la demo.EventBroker vive en memoria del proceso, así que
el push de WebSockets funciona dentro de una única instancia (ADR-014,
ADR-016). Con usuarios reales: Redis Pub/Sub o PostgreSQL LISTEN/NOTIFY detrás
de la misma interfaz publish/subscribe/consume, sin tocar el dominio ni los
clientes.alembic upgrade head y el seed demo idempotente se
ejecutan en el entrypoint del contenedor (backend/docker-entrypoint.sh), que
es suficiente con una instancia. Con usuarios reales: mover las migraciones a
un flyctl release_command y dejar el seed solo para la demo.incidencias.foto_data), sin Cloudinary ni almacenamiento de objetos: el
legacy usaba Cloudinary y no se portó. Con usuarios reales: object storage +
CDN y liberar esos bytes de la base de datos, conservando el flujo de sesión
de un solo uso por QR.:free; los contadores anti-abuso (15 preguntas/día por IP y 500
caracteres por pregunta) también viven en el proceso. Con usuarios reales:
embeddings con pgvector o un índice gestionado, y rate limit en un almacén
compartido para que valga con varias instancias.<rol>@demo.local, password kavana)
sobre datos ficticios; SECURITY.md dice explícitamente que no debe
desplegarse con datos reales. Con usuarios reales: identidad corporativa
(SSO/IdP), MFA, secretos por entorno y retirada de las cuentas de demo.Lo que no cambia entre los dos escenarios es el dominio y su verificación:
la cascada FIFO con burbuja de vinculación, la conversión radio→kg con densidad
calibrada (7.7807 kg/dm³), la guardia de seguridad max(15%, 150kg) antes de
descontar stock, el ProductionLog inmutable por trigger de PostgreSQL, la
validación de material por características (±2 mm de ancho, ±10 % de espesor) o
el aislamiento por tenant resuelto desde el JWT son decisiones de ingeniería,
no de factura; con un usuario o con cincuenta se implementan igual. Tampoco
cambian las specs extraídas del legacy, los ADRs, el changelog por fases ni la
suite de tests que los respalda: eso es lo que se puede verificar leyendo el
repositorio. Lo que sí cambiaría con presupuesto está escrito arriba y en
ADR-017, no escondido.
docs/audit/changelog.md para el detalle por
fase y docs/decisions-log.md para decisiones.backend/e2e_*.py/health/live/health/ready