Arquitectura
Stack
| Capa | Tecnologia |
|---|---|
| Frontend | React 19, Tailwind CSS, Vite |
| Backend | Express, TypeScript, Drizzle ORM |
| Base de datos | PostgreSQL 15 |
| Infra | Docker, Docker Compose |
| CLI | Commander.js, Inquirer |
Estructura del monorepo
apps/ server/ API REST + logica de negocio web/ Frontend Reactpackages/ cli/ CLI (@openfactu/cli) ui/ Componentes UI compartidos common/ Hooks y utilidades React pdf/ Generacion de PDFs sdk/ SDK para integraciones externas plugin-sdk/ SDK para desarrollo de pluginsplugins/ Plugins instaladosMulti-tenancy
Cada empresa tiene su propio schema de PostgreSQL. Las tablas globales viven en public, las de negocio en tenant_nombre. El middleware tenantContext resuelve el tenant del JWT y crea un cliente Drizzle para ese schema.