Arquitectura
Visión general del monorepo ixiclinic, sus apps desplegables y el orden de build de Turbo.
ixiclinic es un monorepo gestionado con pnpm workspaces y Turbo. El workspace
incluye todo lo que está bajo apps/* y packages/* (ver pnpm-workspace.yaml). Además
del workspace, el repo contiene dos componentes de hardware/escritorio que viven en la raíz
fuera del workspace: bridge/ (ixiclinic Connect) y ixiclinic-desktop/ (Tauri).
Unidades desplegables
| Unidad | Stack | Propósito | Puerto / URL |
|---|---|---|---|
apps/api | Fastify 5, Drizzle ORM, PostgreSQL, Zod 4 | API REST backend | :5000 · api.ixiclinic.com |
apps/admin | Next.js 16 (App Router), Tailwind 4, shadcn/ui | Panel del laboratorio (por tenant) | :3000 · admin.ixiclinic.com |
apps/console | Next.js 16 (App Router), Tailwind 4 | Consola SaaS interna | :3001 · console.ixiclinic.com |
apps/portal | Next.js 16 (App Router), Tailwind 4 | Portal de pacientes y empresas | :3002 · portal.ixiclinic.com |
apps/landing | Next.js 16, Framer Motion | Landing público | :5174 · ixiclinic.com |
apps/lab-site | React 19, Vite, React Router, Zustand | Sitio público por tenant | :5173 · *.ixiclinic.com |
apps/docs | Fumadocs, Next.js 16 | Documentación (este sitio) | :5175 · docs.ixiclinic.com |
apps/mobile | React Native 0.79, Expo 54, expo-router | App móvil | Expo |
packages/types | TypeScript | Tipos compartidos (@ixiclinic/types) | — |
bridge/ | tsx (dev) / Bun (compilación a binario), Socket.IO client | ixiclinic Connect — agente de hardware en la LAN | instalado en sucursal |
ixiclinic-desktop/ | Tauri (Rust) + Bun | App de escritorio (shell de UX con SSO) | instalador nativo |
Nota:
apps/landingse migró de Vite SPA a Next.js 16 (multipágina/SSG). La documentación más antigua (incluidoCLAUDE.md) todavía lo describe como React 19 + Vite — verifica siempre contraapps/landing/package.json, donde el scriptdevesnext dev.
bridge/ se publica como el paquete @ixiclinic/connect y ixiclinic-desktop/ como @ixiclinic/desktop,
pero no forman parte del pnpm workspace (que solo cubre apps/* y packages/*).
pnpm workspaces + Turbo
Todas las apps importan los tipos compartidos vía @ixiclinic/types (referenciado como
workspace:*). Turbo orquesta las tareas declaradas en turbo.json:
builddepende de^build(las dependencias de cada paquete se construyen primero) y emitedist/**y.next/**. Como todas las apps dependen depackages/types, los tipos se compilan antes que cualquier app.deves persistente y sin caché (cache: false).typechecktambién depende de^build.
Hay overrides explícitos para los servidores de desarrollo que necesitan los tipos compilados antes de arrancar:
"@ixiclinic/api#dev": { "dependsOn": ["^build"], "cache": false, "persistent": true },
"@ixiclinic/console#dev": { "dependsOn": ["^build"], "cache": false, "persistent": true },
"@ixiclinic/portal#dev": { "dependsOn": ["^build"], "cache": false, "persistent": true },
"@ixiclinic/landing#dev": { "dependsOn": [], "cache": false, "persistent": true }Es decir: api, console y portal esperan a que terminen los builds upstream antes de
levantar su dev, mientras que landing arranca sin dependencias de build (es
autónomo). El resto de apps usa la tarea dev genérica.
Flujo de datos
Todas las aplicaciones cliente hablan con el mismo API REST, que es la única pieza con acceso a PostgreSQL. Las apps Next.js (admin, console, portal) llaman al API desde el servidor (server actions), no desde el navegador.
┌──────────────────────────────────────────┐
admin (:3000) ─────────┤ │
console (:3001) ───────┤ │
portal (:3002) ────────┤ apps/api (Fastify, :5000) ├──▶ PostgreSQL
landing (:5174) ───────┤ api.ixiclinic.com │
lab-site (:5173) ──────┤ REST + Socket.IO (tiempo real) │
mobile (Expo) ─────────┤ │
└──────────────────────────────────────────┘
▲
│ Socket.IO (saliente desde la LAN)
bridge / ixiclinic Connect ──▶ hardware de la sucursal- REST para todas las operaciones de datos (todo filtrado por
tenantId). - Socket.IO para tiempo real (cola de turnos, notificaciones, estado de órdenes).
- ixiclinic Connect se conecta saliente al cloud por Socket.IO (atraviesa NAT) y es la única pieza que alcanza el hardware del laboratorio dentro de la LAN.
Para el detalle por aplicación ver Apps del monorepo; para el esquema y los entornos de base de datos ver Base de datos.