ixiclinicDocs
Desarrolladores

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

UnidadStackPropósitoPuerto / URL
apps/apiFastify 5, Drizzle ORM, PostgreSQL, Zod 4API REST backend:5000 · api.ixiclinic.com
apps/adminNext.js 16 (App Router), Tailwind 4, shadcn/uiPanel del laboratorio (por tenant):3000 · admin.ixiclinic.com
apps/consoleNext.js 16 (App Router), Tailwind 4Consola SaaS interna:3001 · console.ixiclinic.com
apps/portalNext.js 16 (App Router), Tailwind 4Portal de pacientes y empresas:3002 · portal.ixiclinic.com
apps/landingNext.js 16, Framer MotionLanding público:5174 · ixiclinic.com
apps/lab-siteReact 19, Vite, React Router, ZustandSitio público por tenant:5173 · *.ixiclinic.com
apps/docsFumadocs, Next.js 16Documentación (este sitio):5175 · docs.ixiclinic.com
apps/mobileReact Native 0.79, Expo 54, expo-routerApp móvilExpo
packages/typesTypeScriptTipos compartidos (@ixiclinic/types)
bridge/tsx (dev) / Bun (compilación a binario), Socket.IO clientixiclinic Connect — agente de hardware en la LANinstalado en sucursal
ixiclinic-desktop/Tauri (Rust) + BunApp de escritorio (shell de UX con SSO)instalador nativo

Nota: apps/landing se migró de Vite SPA a Next.js 16 (multipágina/SSG). La documentación más antigua (incluido CLAUDE.md) todavía lo describe como React 19 + Vite — verifica siempre contra apps/landing/package.json, donde el script dev es next 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:

  • build depende de ^build (las dependencias de cada paquete se construyen primero) y emite dist/** y .next/**. Como todas las apps dependen de packages/types, los tipos se compilan antes que cualquier app.
  • dev es persistente y sin caché (cache: false).
  • typecheck tambié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.

On this page