# ROADMAP SKEEN Derma Experts: WACRM + Hermes + Odoo

## Arquitectura Tecnica Actualizada | Reemplazo Twilio → WACRM | FastAPI → Hermes

**Consultoria Alcaraz Salazar, S.A.S.**
**5 de julio de 2026**

---

## Tabla de Contenidos

1. Comparativa: Arquitectura Original vs Nueva
2. Arquitectura Detallada con WACRM + Hermes
3. Stack Tecnologico Actualizado
4. Estructura de Proyecto Actualizada
5. Skills de Hermes para SKEEN
6. Integraciones Detalladas
7. Configuracion de WACRM
8. Configuracion de Hermes
9. Roadmap Actualizado por Fase
10. Ventajas y Desventajas de esta Arquitectura
11. Requisitos del Cliente (Actualizados)
12. Presupuesto de Infraestructura Actualizado

---

## 1. Comparativa: Arquitectura Original vs Nueva

### 1.1 Tabla Comparativa General

| Componente | Arquitectura ORIGINAL | Arquitectura NUEVA (WACRM + Hermes) | Justificacion |
|------------|----------------------|-------------------------------------|---------------|
| WhatsApp Gateway | Twilio API ($0.005/msg) + webhook custom | WACRM + Meta WhatsApp Cloud API directo | Sin intermediario, inbox nativo, costo solo Meta fees (~$0.003-0.008/msg) |
| Inbox / CRM | Inbox custom en React (a construir) | WACRM shared inbox (listo) | Inbox multi-agente con asignacion, notas internas, Kanban pipelines, broadcast — sin desarrollo |
| Backend IA | FastAPI custom + GPT-4o directo | Hermes gateway + skills (SKILL.md) | Agente autonomo con 25+ tools, memoria persistente SQLite, cron nativo, multi-model, subagentes |
| Agente "Sofia" | API endpoint REST stateless | Agente autonomo Hermes con contexto | Memoria persistente, proactive (cron), skills modulares, handoff a humano, context compression |
| Pipelines de ventas | A construir en Odoo/Odoo + custom | WACRM Kanban pipelines nativos | Drag-drop, deals vinculados a conversaciones, win-rate analytics |
| Base de datos CRM | PostgreSQL custom | Supabase (PostgreSQL + RLS + Auth) | Auth built-in, Row-Level Security, Realtime subscriptions, Storage |
| Automatizaciones | Codigo custom en FastAPI | WACRM no-code automations + Hermes skills | Visual builder (Figma-like) + agente IA con razonamiento |
| Broadcasts | Twilio API custom | WACRM broadcasts con templates Meta | Templates aprobados por Meta, delivery tracking, segmentacion |
| Contactos / Leads | Tabla custom en PostgreSQL | WACRM contacts + tags + custom fields | Deduplicacion automatica, CSV import, tags, campos custom |
| AI Assistant | GPT-4o directo via API | WACRM AI Assistant (BYOK) + Hermes skills | Draft replies, auto-reply bot, knowledge base, handoff a humano |
| Costo mensual infra | ~$150-250 USD/mes | ~$80-150 USD/mes | WACRM es MIT (gratis), Hermes es MIT (gratis), solo hosting + API fees |
| Tiempo de desarrollo inbox | ~2 semanas | ~0 dias (listo) | WACRM inbox funcional dia 1 post-configuracion |
| Tiempo de desarrollo agente IA | ~3 semanas | ~1 semana (skills + config) | Hermes ya tiene tools, memoria, gateway, cron — solo configurar skills |

### 1.2 Diferencias Clave por Dimension

| Dimension | Original | Nueva | Impacto |
|-----------|----------|-------|---------|
| Complejidad de codigo | Alto (inbox + agente + CRM desde cero) | Medio (solo skills + integraciones) | ~60% menos codigo custom |
| Mantenimiento | Equipo propio mantiene todo | Comunidad open-source mantiene WACRM/Hermes | Menos deuda tecnica |
| Escalabilidad | Manual | WACRM escala con Supabase; Hermes con gateway | Mejor arquitectura cloud-native |
| Vendor lock-in | Twilio (API propietaria) | Meta Cloud API (estandar) + MIT code | Codigo propio, migrable |
| Onboarding de agentes | Desarrollo custom | WACRM invita por link, roles nativos | Minutos vs dias |
| Analytics | A construir | WACRM dashboard real-time nativo | Disponible dia 1 |
| Subagentes | No disponible | Sí — delegacion aislada con terminal propio | Tareas paralelas sin costo de contexto |
| Fallback providers | No disponible | Sí — cadena de failover automatico | Mayor resiliencia |
| Context compression | No disponible | Sí nativo — hasta 50% de ventana | Manejo de conversaciones largas |
| Credential pools | No disponible | Sí — rotacion de API keys | Mayor tolerancia a rate limits |

### 1.3 Mapa de Reemplazo de Componentes

```
Twilio API ──────────────→ Meta WhatsApp Cloud API (via WACRM)
Twilio webhooks ─────────→ WACRM webhooks (/api/v1/webhooks)
Inbox React custom ──────→ WACRM shared inbox (Next.js 16 App Router)
FastAPI backend ─────────→ Hermes gateway (Python daemon)
GPT-4o directo ──────────→ Hermes agent runtime (multi-model + fallback)
PostgreSQL CRM ──────────→ Supabase PostgreSQL + RLS
Automatizaciones code ───→ WACRM no-code automations + Hermes skills + cron
Dashboard analytics ─────→ WACRM dashboard real-time
Contact management ──────→ WACRM contacts + tags + pipelines
OpenClaw gateway ────────→ Hermes gateway (Python, mas plataformas nativas)
OpenClaw heartbeat ───────→ Hermes cron nativo (mas flexible)
OpenClaw skills ─────────→ Hermes skills (compatible agentskills.io)
OpenClaw memory MD ──────→ Hermes SQLite + MEMORY.md + plugins
```

---

## 2. Arquitectura Detallada con WACRM + Hermes

### 2.1 Diagrama de Componentes Completo

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                              LAYER: PACIENTE                                │
│  WhatsApp Business (telefono SKEEN) ─── App movil del paciente              │
└─────────────────────────────────────────────────────────────────────────────┘
                                       │
                                       ▼ Meta Cloud API (HTTPS webhook)
┌─────────────────────────────────────────────────────────────────────────────┐
│                           LAYER: WACRM (CRM)                                │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │  WACRM — Next.js 16 + Supabase PostgreSQL                           │    │
│  │  Puerto: 3000 (interno) / HTTPS via Nginx                           │    │
│  │                                                                     │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │ Shared Inbox │  │   Contacts   │  │   Sales Pipelines (Kanban)│  │    │
│  │  │ Multi-agente │  │ + Tags +     │  │   Deals → Conversaciones  │  │    │
│  │  │ Asignacion   │  │ Custom Fields│  │   Win-rate analytics      │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │  Broadcasts  │  │ Automations  │  │   AI Assistant (BYOK)    │  │    │
│  │  │  Templates   │  │   No-code    │  │  OpenAI/Anthropic key    │  │    │
│  │  │  Meta        │  │   Triggers   │  │  Auto-reply + Handoff    │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │   Dashboard  │  │    Flows     │  │   Templates Manager      │  │    │
│  │  │  Real-time   │  │  Chatbots    │  │   Meta approval sync     │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │  API REST PUBLICA: /api/v1                                          │    │
│  │  ├── POST   /messages          (enviar WhatsApp)                    │    │
│  │  ├── GET    /contacts          (listar contactos)                   │    │
│  │  ├── POST   /contacts          (crear/find-or-create)               │    │
│  │  ├── GET    /conversations     (listar conversaciones)              │    │
│  │  ├── GET    /conversations/:id/messages (thread)                    │    │
│  │  ├── POST   /broadcasts        (campaña broadcast)                  │    │
│  │  ├── POST   /webhooks          (registrar webhook outbound)         │    │
│  │  └── GET    /me                (info cuenta + scopes)               │    │
│  │                                                                     │    │
│  │  Webhooks outbound (a Hermes):                                     │    │
│  │  ├── message.received          (nuevo mensaje)                      │    │
│  │  ├── message.status_updated    (delivery/read)                      │    │
│  │  └── conversation.created      (nueva conversacion)                │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
                                       │
                    ┌──────────────────┼──────────────────┐
                    │                  │                  │
                    ▼                  ▼                  ▼
┌───────────────────────┐   ┌─────────────────┐   ┌──────────────────────────┐
│  LAYER: Hermes        │   │ LAYER: Odoo 17  │   │  LAYER: Frontend React   │
│  (Agente IA "Sofia")  │   │  (Backend ERP)  │   │  (app.skeen.mx)          │
│                       │   │                 │   │                          │
│  Gateway Python       │   │  Modulos:       │   │  Dashboard clinicos      │
│  Puerto: 8080 (HTTP)  │   │  ├── Pacientes  │   │  Agenda citas            │
│  + WS API (cron)      │   │  ├── Citas      │   │  Monedero digital        │
│  Daemon (systemd)     │   │  ├── Historial  │   │  Pagos (Stripe/MP)       │
│                       │   │  ├── Inventario │   │  Reportes                │
│  ┌──────────────────┐ │   │  ├── POS        │   │                          │
│  │  Agent Runtime   │ │   │  ├── Monedero   │   │  Auth: Odoo JWT          │
│  │  ├─ SOUL.md      │ │   │  └── Website    │   │  API: Odoo REST +        │
│  │  ├─ AGENTS.md    │ │   │                 │   │       WACRM REST         │
│  │  ├─ SKILL.md (5) │ │   │  API REST XML/   │   │                          │
│  │  ├─ MEMORY.md    │ │   │  JSON (custom)   │   │  Puerto: 5173 (dev)      │
│  │  └─ SQLite state │ │   │                 │   │         80/443 (prod)    │
│  └──────────────────┘ │   └─────────────────┘   └──────────────────────────┘
│                       │
│  ┌──────────────────┐ │
│  │  Cron (nativo)   │ │
│  │  ├─ Recordatorios│ │
│  │  ├─ Follow-ups   │ │
│  │  └─ Re-engagement│ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  Tools Built-in  │ │
│  │  ├─ web_search   │ │
│  │  ├─ web_fetch    │ │
│  │  ├─ exec (python)│ │
│  │  ├─ shell        │ │
│  │  ├─ browser      │ │
│  │  └─ file R/W     │ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  Custom Plugins  │ │
│  │  ├─ odoo_api_call│ │
│  │  ├─ wacrm_send   │ │
│  │  └─ calendar_check│ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  API Server      │ │
│  │  /v1/chat/completions│ │
│  │  /api/jobs (cron)│ │
│  └──────────────────┘ │
└───────────────────────┘
```

### 2.2 Flujo de Datos Paso a Paso

#### FLUJO 1: Primera vez que un paciente escribe por WhatsApp

```
[1] Paciente envia "Hola, quiero agendar una cita" por WhatsApp
         │
         ▼
[2] Meta WhatsApp Cloud API recibe el mensaje
         │
         ▼
[3] Meta envia webhook HTTPS a WACRM: POST /api/whatsapp/webhook
         │
         ▼
[4] WACRM procesa:
     - Crea/actualiza contacto (telefono, nombre si disponible)
     - Crea conversacion en inbox
     - Almacena mensaje en Supabase
     - Dispara trigger de automatizacion ("Nuevo mensaje")
         │
         ├──► WACRM AI Assistant (opcional, si auto-reply activo)
         │
         └──► Webhook outbound a Hermes: POST http://hermes:8080/webhook/wacrm
                  │
                  ▼
[5] Hermes Gateway recibe webhook via HTTP endpoint custom
     - Parsea payload: { event: "message.received", data: { from, text, conversation_id } }
     - Inicia/continua sesion para ese contacto (SQLite session store)
     - Inyecta skills relevantes al contexto
         │
         ▼
[6] Hermes Agent Runtime procesa con LLM (GPT-4o):
     - Lee skills: skeen-rag.md (catalogo) + skeen-agendar.md (citas)
     - Detecta intencion: "agendar_cita"
     - Consulta disponibilidad via plugin odoo_api_call
         │
         ▼
[7] Hermes → Odoo API (XML-RPC/JSON-RPC):
     - Consulta slots disponibles del dermatologo
     - Recibe: ["2026-07-05 10:00", "2026-07-05 14:00", "2026-07-06 09:00"]
         │
         ▼
[8] Hermes formatea respuesta y envia a WACRM:
     POST /api/v1/messages
     { "to": "+526641234567", "type": "text",
       "text": "Hola! Soy Sofia de SKEEN. Puedo agendarte para:
               1. Sab 5 jul 10:00 AM
               2. Sab 5 jul 2:00 PM
               3. Dom 6 jul 9:00 AM
               Cual prefieres?" }
         │
         ▼
[9] WACRM envia via Meta Cloud API → WhatsApp → Paciente
         │
         ▼
[10] Respuesta del paciente: "El sabado a las 10"
          │
          └──► Repite [2]→[6], Hermes confirma cita
               └──► Odoo: crea cita + WACRM: envia confirmacion
```

#### FLUJO 2: Confirmacion de cita + Recordatorio automatico

```
[1] Hermes crea la cita en Odoo via odoo_api_call
     - Modelo: salon.booking (o calendar.event)
     - Datos: paciente_id, servicio_id, fecha_hora, estado='confirmada'
         │
         ▼
[2] Hermes programa recordatorio via cron nativo:
     - hermes cron schedule --name "recordatorio-cita-[ID]" \
       --at "2026-07-04 18:00" \
       --command "skill skeen-recordatorios --phone +526641234567 --cita 2026-07-05T10:00"
         │
         ▼
[3] Cron de Hermes ejecuta a la hora programada:
     - Skill skeen-recordatorios se activa
     - Consulta Odoo: citas para manana (5 jul)
     - Para cada cita sin recordatorio enviado:
       └──► WACRM API: POST /api/v1/messages
            { "to": "+526641234567", "type": "template",
              "template": { "name": "recordatorio_cita_skeen",
                            "language": "es_MX",
                            "params": ["Sofia", "5 de julio", "10:00 AM"] } }
         │
         ▼
[4] WACRM envia template aprobado por Meta → WhatsApp → Paciente
     "Hola Sofia! Te recordamos tu cita manana 5 de julio a las 10:00 AM
      en SKEEN Derma Experts. Ubicacion: Blvd. Popotla 123, Rosarito."
         │
         ▼
[5] Odoo marca recordatorio como enviado
```

#### FLUJO 3: Pago de cita + Monedero digital

```
[1] Paciente despues de cita: "Quiero pagar mi tratamiento"
         │
         ▼
[2] WACRM → Hermes (webhook message.received)
         │
         ▼
[3] Hermes skill skeen-pagos.md:
     - Consulta Odoo: citas del paciente + servicios pendientes de pago
     - Calcula total
     - Genera link de pago (Stripe Checkout / MercadoPago preference)
         │
         ▼
[4] Hermes responde via WACRM:
     "Tu tratamiento de Acne Control tiene un saldo de $1,200 MXN.
      Puedes pagar aqui: [Link Stripe] o [Link MercadoPago]
      Tambien acumulas 120 puntos en tu monedero SKEEN!"
         │
         ▼
[5] Paciente paga via Stripe/MP
         │
         ▼
[6] Webhook Stripe/MP → Odoo (confirmacion de pago)
     - Odoo actualiza estado de factura
     - Odoo acumula puntos en monedero del paciente
         │
         ▼
[7] Hermes cron detecta pago confirmado:
     - WACRM: envia confirmacion + saldo de monedero
     "Pago confirmado! Gracias Sofia. Tu monedero SKEEN: 450 puntos
      (equivalente a $450 MXN). Los puedes usar en tu proxima visita."
```

### 2.3 Diagrama de Secuencia: Agendar Cita Completa

```
Paciente          WhatsApp         Meta API        WACRM          Hermes        Odoo
   │                  │                │              │               │             │
   │ "Hola, quiero    │                │              │               │             │
   │  agendar"        │                │              │               │             │
   │─────────────────>│                │              │               │             │
   │                  │                │              │               │             │
   │                  │  Webhook msg   │              │               │             │
   │                  │<───────────────│              │               │             │
   │                  │                │              │               │             │
   │                  │                │  POST /webhook              │             │
   │                  │                │─────────────>│               │             │
   │                  │                │              │  message.received             │
   │                  │                │              │  webhook outbound             │
   │                  │                │              │──────────────>│             │
   │                  │                │              │               │             │
   │                  │                │              │               │ odoo_api_call│
   │                  │                │              │               │ (slots libres)│
   │                  │                │              │               │─────────────>│
   │                  │                │              │               │             │
   │                  │                │              │               │<─────────────│
   │                  │                │              │               │  ["10:00",   │
   │                  │                │              │               │   "14:00"]   │
   │                  │                │              │               │             │
   │                  │                │  POST /api/v1/messages       │             │
   │                  │                │<─────────────│               │             │
   │                  │                │  (WACRM envia opciones)      │             │
   │                  │                │              │               │             │
   │                  │  Template msg  │              │               │             │
   │                  │<───────────────│              │               │             │
   │  "Hola! Opciones:│                │              │               │             │
   │   1. 10:00..."  │                │              │               │             │
   │<─────────────────│                │              │               │             │
   │                  │                │              │               │             │
   │ "Opcion 1"       │                │              │               │             │
   │─────────────────>│                │              │               │             │
   │                  │ ... (mismo flujo) ...          │               │             │
   │                  │                │              │               │             │
   │                  │                │              │               │ odoo_api_call│
   │                  │                │              │               │ (crear cita) │
   │                  │                │              │               │─────────────>│
   │                  │                │              │               │             │
   │                  │                │  POST /api/v1/messages       │             │
   │                  │                │<─────────────│               │             │
   │                  │                │              │               │             │
   │  "Cita confirmada│                │              │               │             │
   │   para 5 jul 10AM│               │              │               │             │
   │   con Dra. Ana"  │                │              │               │             │
   │<─────────────────│                │              │               │             │
   │                  │                │              │               │             │
```

### 2.4 Comunicacion entre Componentes

| De | A | Protocolo | Auth | Payload |
|----|---|-----------|------|---------|
| Meta API | WACRM | HTTPS webhook | Verify Token HMAC | JSON mensaje |
| WACRM | Meta API | HTTPS REST | Bearer Access Token | JSON mensaje/template |
| WACRM | Hermes | HTTPS webhook outbound | HMAC-SHA256 signature | JSON evento |
| Hermes | WACRM | HTTPS REST | Bearer API Key (wacrm_live_*) | JSON mensaje |
| Hermes | Odoo | XML-RPC / JSON-RPC / HTTP | API Key / OAuth | XML/JSON |
| Odoo | Frontend | HTTPS REST (CORS) | JWT Token | JSON |
| Frontend | WACRM | HTTPS REST | Bearer API Key | JSON (dashboard unificado) |
| Hermes | LLM Provider | HTTPS SSE/REST | Bearer API Key | JSON (OpenAI/Anthropic format) |
| Hermes | Hermes API | HTTPS REST | Bearer Token | JSON (OpenAI-compatible) |

---

## 3. Stack Tecnologico Actualizado

### 3.1 Tabla Completa de Tecnologias

#### WACRM (CRM WhatsApp)

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| Framework | Next.js | 16 (App Router) | SSR + API routes + ISR | MIT / Gratis |
| UI | React | 19 | Componentes interactivos | MIT / Gratis |
| Lenguaje | TypeScript | 5.x | Tipado estatico | OSS / Gratis |
| Estilos | Tailwind CSS | v4 | Utility-first CSS | MIT / Gratis |
| UI Kit | shadcn/ui + base-ui | latest | Componentes accesibles | MIT / Gratis |
| Database | Supabase (PostgreSQL) | 15+ | Datos + Auth + RLS + Realtime | OSS Cloud / ~$25/mes |
| Auth | Supabase Auth | built-in | Email/password + JWT | Incluido |
| Storage | Supabase Storage | built-in | Avatares + media | Incluido |
| WhatsApp | Meta Cloud API | v18.0+ | Mensajeria oficial | Meta fees |
| Encriptacion | node:crypto | built-in | AES-256-GCM tokens | built-in |

#### Hermes (Agente IA)

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| Runtime | Python | 3.11+ | Gateway daemon | OSS / Gratis |
| Package | uv / pip | latest | Gestor de paquetes | OSS / Gratis |
| Gateway | hermes-agent | 0.14.0+ | Gateway HTTP + WS + API | MIT / Gratis |
| Comunicacion | HTTP / WebSocket | RFC 6455 | Gateway ↔ clients | built-in |
| Skills | SKILL.md (Markdown) | agentskills.io | Capacidades del agente | MIT / Gratis |
| Memory | SQLite + MEMORY.md | - | Memoria persistente + FTS5 search | File system |
| Cron | hermes cron | built-in | Tareas programadas | built-in |
| LLM Provider | OpenAI GPT-4o | latest | Modelo principal | ~$0.005-0.015/token |
| Fallback LLM | Claude 3.5 Sonnet | latest | Fallback / tareas complejas | ~$0.003-0.015/token |
| Fallback chain | Hermes nativo | 0.6.0+ | Failover automatico | built-in |
| Local LLM | Ollama / LM Studio | 0.4+ / 0.12.0+ | Desarrollo offline | OSS / Gratis |
| Context compression | Hermes nativo | built-in | Compresion de contexto | built-in |
| Credential pools | Hermes nativo | 0.7.0+ | Rotacion de API keys | built-in |
| Subagentes | Hermes delegate | built-in | Tareas aisladas | built-in |
| API Server | OpenAI-compatible | 0.4.0+ | /v1/chat/completions | built-in |
| TUI | Ink (React) | 0.11.0+ | Interfaz terminal interactiva | built-in |
| Plugins | Python files | 0.3.0+ | Custom tools | built-in |
| MCP | Model Context Protocol | 0.4.0+ | Integracion MCP | built-in |

#### Odoo 17 (ERP)

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| ERP | Odoo Community | 17.0 | Backend negocio completo | LGPL / Gratis |
| Lenguaje | Python | 3.10+ | Logica de servidor | OSS |
| Database | PostgreSQL | 15+ | Datos ERP (compartido con Supabase o separado) | OSS |
| Cache | Redis | 7.x | Cache + sessions + queue | BSD / Gratis |
| Queue | Celery + Redis | 5.x+ | Tareas asincronas | OSS |

#### Frontend SKEEN

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| Framework | React | 18 | UI components | MIT / Gratis |
| Lenguaje | TypeScript | 5.x | Tipado estatico | OSS |
| Build | Vite | 5.x+ | Bundler + dev server | MIT / Gratis |
| Estilos | Tailwind CSS | v3+ | Estilos utility-first | MIT / Gratis |
| Routing | React Router | v6+ | SPA routing | MIT / Gratis |
| HTTP Client | Axios | 1.6+ | Llamadas API | MIT / Gratis |
| Estado | Zustand | 4.x+ | State management | MIT / Gratis |
| Calendario | react-big-calendar | 1.x+ | Vista agenda citas | MIT |
| Charts | Recharts | 2.x+ | Graficos dashboard | MIT |

#### Infraestructura

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| VPS | Hetzner Cloud | CPX31 | 4 vCPU / 8 GB / 160 GB SSD | ~$15/mes |
| OS | Ubuntu Server | 24.04 LTS | Sistema operativo | Gratis |
| Proxy | Nginx | 1.24+ | Reverse proxy + SSL + rate limit | BSD |
| SSL | Let's Encrypt | latest | Certificados HTTPS gratis | Gratis |
| Contenedores | Docker | 25.x+ | Container runtime | Apache 2.0 |
| Orquestacion | Docker Compose | 2.24+ | Multi-container local | Apache 2.0 |
| DNS | Cloudflare | Free tier | DNS + CDN + DDoS protection | Gratis |
| Monitoreo | Uptime Kuma | 1.x+ | Health checks + alerting | MIT |

#### Pagos

| Capa | Tecnologia | Version | Proposito | Costo |
|------|-----------|---------|-----------|-------|
| Pagos intl | Stripe | latest | Tarjetas internacionales | 2.9% + $0.30 |
| Pagos MX | MercadoPago | latest | OXXO, tarjetas MX, SPEI | 3.5-4.5% |

#### Desarrollo

| Capa | Tecnologia | Version | Proposito | Licencia/Costo |
|------|-----------|---------|-----------|---------------|
| Git | GitHub | - | Repositorios + CI/CD | Free/Pro |
| IDE | VS Code | latest | Editor + extensions | Gratis |
| API Testing | Postman / Hoppscotch | latest | Test APIs | Gratis |
| DB Admin | pgAdmin / Tableplus | latest | Admin PostgreSQL | Gratis |

### 3.2 Diagrama de Puertos y Servicios

| Servicio | Puerto Interno | Puerto Externo | Path Nginx |
|----------|---------------|----------------|------------|
| WACRM (Next.js) | 3000 | 443 | /crm/* → localhost:3000 |
| Hermes Gateway | 8080 | 443 | /webhook/* → localhost:8080 |
| Hermes API Server | 8080 (mismo) | - | Solo interno (localhost) |
| Hermes TUI | - | - | Interactivo local |
| Odoo | 8069 | 443 | /odoo/* → localhost:8069 |
| Odoo Longpolling | 8072 | - | Solo interno |
| Frontend React | 5173 (dev) / 80 (prod) | 443 | / → localhost:80 |
| PostgreSQL | 5432 | - | Solo interno |
| Redis | 6379 | - | Solo interno |
| Nginx | 80, 443 | 80, 443 | Reverse proxy principal |
| Uptime Kuma | 3001 | 443 | /status → localhost:3001 |

---

## 4. Estructura de Proyecto Actualizada

### 4.1 Repositorios Git

```
skeen-derma-experts/                          (organizacion GitHub)
├── wacrm/                                    (fork de ArnasDon/wacrm)
│   ├── src/
│   │   ├── app/
│   │   │   ├── (auth)/                       # login, signup
│   │   │   ├── (dashboard)/                  # UI autenticada
│   │   │   │   ├── dashboard/                # home / metrics
│   │   │   │   ├── inbox/                    # shared inbox
│   │   │   │   ├── contacts/                 # contactos + tags
│   │   │   │   ├── pipelines/                # Kanban deals
│   │   │   │   ├── broadcasts/               # campañas
│   │   │   │   ├── automations/              # flow builder
│   │   │   │   └── settings/                 # perfil / WhatsApp / API keys
│   │   │   ├── api/                          # endpoints server-only
│   │   │   │   ├── whatsapp/webhook/         # inbound desde Meta
│   │   │   │   ├── whatsapp/send/            # outbound a Meta
│   │   │   │   ├── automations/              # engine + cron
│   │   │   │   └── v1/                       # API publica (messages, contacts, etc.)
│   │   ├── components/
│   │   ├── lib/
│   │   │   ├── supabase/                     # client, server, middleware
│   │   │   ├── whatsapp/                     # Meta API client
│   │   │   └── automations/                  # engine, steps, validation
│   │   └── types/
│   ├── supabase/migrations/                  # SQL idempotente
│   ├── .env.local                            # variables de entorno
│   └── package.json
│
├── hermes/                                   # Gateway + Skills SKEEN
│   ├── .hermes/
│   │   ├── config.yaml                       # config principal
│   │   ├── plugins/
│   │   │   ├── odoo_api_call.py              # plugin Odoo XML-RPC
│   │   │   ├── wacrm_send.py                 # plugin WACRM API
│   │   │   └── calendar_check.py             # plugin disponibilidad
│   │   └── workspace/
│   │       ├── AGENTS.md                     # instrucciones operativas
│   │       ├── SOUL.md                       # personalidad "Sofia"
│   │       ├── MEMORY.md                     # memoria persistente
│   │       ├── TOOLS.md                      # notas de tools
│   │       ├── IDENTITY.md                   # nombre/vibe/emoji
│   │       └── USER.md                       # perfil clinica
│   ├── skills/
│   │   ├── skeen-rag/
│   │   │   └── SKILL.md                      # catalogo servicios
│   │   ├── skeen-agendar/
│   │   │   └── SKILL.md                      # agendamiento citas
│   │   ├── skeen-pagos/
│   │   │   └── SKILL.md                      # pagos Stripe/MP
│   │   ├── skeen-monedero/
│   │   │   └── SKILL.md                      # monedero digital
│   │   └── skeen-recordatorios/
│   │       └── SKILL.md                      # recordatorios citas
│   ├── webhooks/
│   │   └── wacrm_webhook_server.py           # servidor HTTP para webhooks WACRM
│   ├── pyproject.toml
│   ├── requirements.txt
│   └── Dockerfile
│
├── odoo-backend/                             # Odoo 17 + modulos custom
│   ├── odoo/
│   │   ├── addons/
│   │   │   ├── skeen_pacientes/              # gestion pacientes
│   │   │   ├── skeen_citas/                  # agendamiento
│   │   │   ├── skeen_monedero/               # monedero digital
│   │   │   ├── skeen_pagos/                  # integracion Stripe/MP
│   │   │   ├── skeen_whatsapp/               # webhook WACRM → Odoo
│   │   │   └── skeen_reportes/               # reportes clinicos
│   │   └── odoo.conf
│   ├── Dockerfile
│   └── docker-compose.yml
│
├── frontend/                                 # React 18 + TypeScript
│   ├── src/
│   │   ├── components/                       # UI components
│   │   ├── pages/                            # vistas (Home, Agenda, Pagos)
│   │   ├── hooks/                            # custom hooks
│   │   ├── services/                         # API clients (Odoo + WACRM)
│   │   ├── store/                            # Zustand state
│   │   └── types/                            # TypeScript types
│   ├── package.json
│   └── Dockerfile
│
└── infra/                                    # Docker Compose completo
    ├── docker-compose.yml                    # orquestacion total
    ├── .env                                  # variables globales
    ├── nginx/
    │   ├── nginx.conf                        # reverse proxy
    │   └── ssl/                              # certificados Let's Encrypt
    ├── scripts/
    │   ├── init-supabase.sh                  # migraciones SQL
    │   ├── setup-wacrm.sh                    # post-install WACRM
    │   └── setup-hermes.sh                   # post-install Hermes
    └── monitoring/
        ├── uptime-kuma/                      # health checks
        └── prometheus/                       # metrics (opcional)
```

### 4.2 Estructura de Docker Compose

```yaml
# infra/docker-compose.yml — Resumen de servicios

services:
  # ── WACRM (CRM WhatsApp) ──────────────────────────────
  wacrm:
    build: ../wacrm/
    ports: ["3000:3000"]
    environment:
      - NEXT_PUBLIC_SUPABASE_URL=${SUPABASE_URL}
      - NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY}
      - SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE}
      - ENCRYPTION_KEY=${WACRM_ENCRYPTION_KEY}
      - WHATSAPP_PHONE_NUMBER_ID=${META_PHONE_ID}
      - WHATSAPP_BUSINESS_ACCOUNT_ID=${META_BUSINESS_ID}
      - WHATSAPP_ACCESS_TOKEN=${META_ACCESS_TOKEN}
      - WHATSAPP_VERIFY_TOKEN=${META_VERIFY_TOKEN}
    depends_on: [postgres, redis]

  # ── Hermes (Agente IA) ──────────────────────────────
  hermes:
    build: ../hermes/
    ports: ["8080:8080"]
    environment:
      - HERMES_MODEL_PROVIDER=openai
      - HERMES_MODEL=gpt-4o
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - ODOO_URL=http://odoo:8069
      - ODOO_DB=skeen
      - ODOO_API_KEY=${ODOO_API_KEY}
      - WACRM_URL=http://wacrm:3000
      - WACRM_API_KEY=${WACRM_API_KEY}
      - HERMES_WEBHOOK_PORT=8080
      - HERMES_API_SERVER_ENABLED=true
      - HERMES_CRON_ENABLED=true
    volumes:
      - hermes_workspace:/root/.hermes/workspace
      - hermes_plugins:/root/.hermes/plugins
      - ./../hermes/skills:/skills:ro
    depends_on: [odoo, wacrm]
    command: ["hermes", "gateway", "start"]

  # ── Odoo 17 (ERP) ─────────────────────────────────────
  odoo:
    build: ../odoo-backend/
    ports: ["8069:8069", "8072:8072"]
    environment:
      - HOST=postgres
      - PORT=5432
      - USER=odoo
      - PASSWORD=${POSTGRES_PASSWORD}
      - DB_NAME=skeen
    volumes:
      - odoo_data:/var/lib/odoo
      - ./../odoo-backend/odoo/addons:/mnt/extra-addons:ro
    depends_on: [postgres, redis]

  # ── Frontend React ────────────────────────────────────
  frontend:
    build: ../frontend/
    ports: ["80:80"]
    depends_on: [odoo, wacrm]

  # ── PostgreSQL ────────────────────────────────────────
  postgres:
    image: postgres:15-alpine
    ports: ["5432:5432"]
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=skeen
    volumes:
      - postgres_data:/var/lib/postgresql/data

  # ── Redis ─────────────────────────────────────────────
  redis:
    image: redis:7-alpine
    ports: ["6379:6379"]
    volumes:
      - redis_data:/data

  # ── Nginx (Reverse Proxy) ─────────────────────────────
  nginx:
    image: nginx:1.24-alpine
    ports: ["443:443"]
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
    depends_on: [wacrm, odoo, frontend, hermes]

  # ── Uptime Kuma ───────────────────────────────────────
  uptime-kuma:
    image: louislam/uptime-kuma:1
    ports: ["3001:3001"]
    volumes:
      - uptime_data:/app/data

volumes:
  hermes_workspace:
  hermes_plugins:
  odoo_data:
  postgres_data:
  redis_data:
  uptime_data:
```

### 4.3 Variables de Entorno (.env)

```bash
# ============================================================
# INFRA — infra/.env
# ============================================================

# PostgreSQL
POSTGRES_PASSWORD=skeen_postgres_2026_secure
POSTGRES_USER=odoo
POSTGRES_DB=skeen

# Redis
REDIS_PASSWORD=skeen_redis_2026

# WACRM
SUPABASE_URL=http://postgres:5432
SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE=eyJ...
WACRM_ENCRYPTION_KEY=a1b2c3d4e5f6... # 64 chars hex AES-256
META_PHONE_ID=123456789012345
META_BUSINESS_ID=987654321098765
META_ACCESS_TOKEN=EAA...
META_VERIFY_TOKEN=skeen_webhook_verify_2026

# Hermes
OPENAI_API_KEY=sk-proj-...
ANTHROPIC_API_KEY=sk-ant-...
HERMES_MODEL_PROVIDER=openai
HERMES_MODEL=gpt-4o
HERMES_FALLBACK_PROVIDERS=anthropic,openrouter
HERMES_API_SERVER_ENABLED=true
HERMES_CRON_ENABLED=true
HERMES_WEBHOOK_PORT=8080
HERMES_TUI_ENABLED=false
ODOO_API_KEY=skeen_odoo_api_key_2026
WACRM_API_KEY=wacrm_live_xxxxxxxx

# Stripe / MercadoPago
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
MP_ACCESS_TOKEN=TEST-...
MP_PUBLIC_KEY=TEST-...

# Dominio
DOMAIN=skeen.mx
WACRM_SUBDOMAIN=crm.skeen.mx
ODOO_SUBDOMAIN=erp.skeen.mx
APP_SUBDOMAIN=app.skeen.mx
HERMES_SUBDOMAIN=hermes.skeen.mx
```
