Saltar al contenido principal

Seguridad laboral, capacitación y EPP · Desarrollo Web

Grupo CAEMP

Una sola base de código que se comporta como tres sitios distintos: cada marca de Grupo CAEMP vive en su propio dominio, con su color y su logo, pero comparte un único proyecto y un único despliegue.

TanStack StartTanStack RouterReact 19TypeScriptTailwind CSS v4Nitro v2ViteVercelResendZod
Vista del sitio de Grupo CAEMP

Cliente

Grupo CAEMP

Duración

≈4 meses de desarrollo (noviembre 2025 – marzo 2026).

Lanzamiento

Marzo 2026 — en producción en los cuatro dominios desde el lanzamiento.

Mi rol

Desarrollo full-stack end-to-end

El problema

Grupo CAEMP agrupa tres líneas de negocio claramente diferenciadas: CAEMP OTEC (capacitación certificada SENCE para minería, energía y telecomunicaciones), CAEMP PLUS (comercialización de equipos de protección personal) y Crecimiento (habilidades blandas, liderazgo y talleres vivenciales). Cada una se dirige a un público distinto y necesitaba presentarse con identidad propia —su color, su logotipo y su dominio— para no diluir su propuesta dentro de una marca paraguas genérica.

La salida intuitiva era levantar un sitio por marca. Esa decisión multiplica el costo: tres bases de código que mantener, tres pipelines de despliegue, tres veces el trabajo para corregir un bug transversal o publicar un componente compartido, y una deriva visual inevitable a medida que cada sitio evoluciona por su cuenta.

El desafío de negocio era sostener tres marcas con identidad fuerte y dominios independientes sin pagar el precio de mantener tres proyectos separados, y sin sacrificar el SEO propio de cada dominio.

La solución

La solución es una arquitectura multi-dominio: un único proyecto TanStack Start que sirve cuatro dominios (grupocaemp.cl más los tres de marca) desde un solo despliegue. En cada request, el sistema lee el host y resuelve a qué línea de negocio pertenece mediante un match exacto de dominio —deliberadamente exacto para evitar falsos positivos como que grupocaemp.cl coincida con caemp.cl.

El corazón del mecanismo es un rewrite bidireccional a nivel de router. En la entrada, una visita a caempplus.cl/productos se reescribe internamente a la ruta /plus/productos; en la salida, los links que el router genera hacia /plus/productos se devuelven al usuario como /productos, de modo que la URL del dominio de marca permanece limpia y sin el prefijo interno.

Sobre esa resolución de tenant, cada marca compone su propia experiencia: su set de rutas, su configuración de header y footer, sus colores de Tailwind y sus datos de contenido. Los componentes de UI, el layout y la lógica de formularios y envío de correo se comparten; lo específico de cada negocio vive en módulos separados. El resultado son tres sitios con personalidad propia y un solo lugar donde corregir, mejorar y desplegar.

En números

4

dominios servidos

grupocaemp.cl y las tres marcas, desde una sola base de código y un solo despliegue.

3

marcas con identidad propia

color, logo y dominio diferenciados por línea de negocio

Arquitectura

Frontend en TanStack Start con React 19 y TypeScript estricto, renderizado en servidor sobre Nitro v2 y empaquetado con Vite. El ruteo es file-based con TanStack Router, y la condición multi-dominio se resuelve en tres capas: un mapa de host→tenant (getTenantFromHost con match exacto), un rewrite bidireccional input/output en el router que traduce entre la URL pública por marca y el prefijo de ruta interno (/crecimiento, /plus, /otec), y un middleware de tenant que inyecta marca y prefijo en el contexto de cada request. El theming por marca se aplica con clases de Tailwind v4 condicionadas al prefijo activo; los componentes de UI usan Radix y shadcn con class-variance-authority. Los formularios se validan con TanStack Form y Zod, y las solicitudes de contacto y cotización se canalizan a través de API routes alojadas en el dominio del grupo (grupocaemp.cl) que envían correo transaccional con Resend y React Email. Todo se entrega como un único despliegue en Vercel, con los cuatro dominios apuntando al mismo build y una whitelist de CORS por origen.

Cada elección respondió a una restricción concreta del proyecto, no a una moda.

Decisiones técnicas

TanStack Start + TanStack Router

Multi-tenant

Framework full-stack con SSR sobre Nitro y ruteo file-based que expone un hook de rewrite a nivel de router.

Restricción
Servir tres marcas con dominios independientes desde un mismo proyecto, manteniendo URLs limpias por marca y SEO propio de cada dominio.
Decisión
Resolver el tenant por host y aplicar un rewrite bidireccional en el router: la entrada agrega el prefijo de marca (/plus, /otec, /crecimiento) y la salida lo elimina de los links generados.
Resultado
Un solo despliegue atiende cuatro dominios; el dominio de acceso determina la marca renderizada sin duplicar bases de código ni romper la navegación interna.

Resolución de dominio por host (capa de tenant)

Multi-tenant

Mapa explícito host→marca con match exacto y middleware que inyecta marca y prefijo en el contexto de cada request.

Restricción
Distinguir dominios cuyos nombres son subcadenas unos de otros (grupocaemp.cl contiene caemp.cl), donde un includes ingenuo enrutaría al tenant equivocado.
Decisión
Comparación exacta de hostname (con soporte de prefijo www y descarte de puerto) y un fallback explícito al dominio del grupo para cualquier host no reconocido.
Resultado
Enrutamiento por marca determinista y sin ambigüedad, con un único punto de verdad para agregar o cambiar dominios.

Tailwind CSS v4 + theming por marca

Branding

Tokens de color por línea de negocio (azul OTEC, verde PLUS, púrpura Crecimiento) aplicados según el prefijo activo.

Restricción
Cada marca debe verse distinta —color, logo, header y footer propios— sin fragmentar el sistema de componentes.
Decisión
Componentes de UI compartidos (Radix + shadcn + class-variance-authority) y diferenciación visual mediante clases de Tailwind condicionadas al tenant resuelto.
Resultado
Identidad visual diferenciada por marca reutilizando un único design system, sin estilos duplicados por sitio.

Nitro v2 + Vercel

Performance

Servidor SSR universal que despliega los cuatro dominios como un único build en Vercel.

Funcionalidades

Arquitectura multi-dominio de marca

Un solo proyecto sirve cuatro dominios. El host de cada request resuelve la línea de negocio y un rewrite bidireccional traduce entre la URL pública de la marca y el prefijo de ruta interno, manteniendo URLs limpias por dominio.

Tres líneas de negocio diferenciadas

CAEMP OTEC (capacitación certificada SENCE), CAEMP PLUS (equipos de protección personal) y Crecimiento (habilidades blandas y talleres), cada una con su catálogo, sus secciones y su contenido propios.

SEO independiente por dominio

Cada dominio se presenta como un sitio propio con su metadata y locale es_CL, preservando la autoridad y el posicionamiento individual de cada marca.

Catálogos y detalle por negocio

Cursos para OTEC y Crecimiento, productos EPP para PLUS, y talleres, programas y teatro aplicado para Crecimiento, con páginas de listado filtrable y de detalle.

Contenido compartido vs. específico

UI, layout, navegación cross-tenant y lógica de formularios son comunes; las secciones, los datos y la identidad de cada marca viven en módulos separados.

Contacto y cotización con correo transaccional

Formularios validados por marca cuyas solicitudes se centralizan en API routes del dominio del grupo y se envían por correo con plantillas en React Email.

Línea de tiempo

  1. Noviembre 2025

    Kickoff

    Arranque del proyecto y definición de la arquitectura multi-dominio para las tres líneas de negocio del grupo.

  2. Nov 2025 – Mar 2026

    Desarrollo

    Implementación de la resolución de tenant por host, el rewrite bidireccional de rutas, el theming por marca sobre un design system compartido y la carga de contenido de cada línea de negocio.

  3. Marzo 2026

    Lanzamiento en producción

    Publicación de los cuatro dominios apuntando a un único despliegue en Vercel.

  4. Hoy

    En producción

    Los cuatro dominios operan sobre una única base de código, con mejora continua de contenido y secciones de cada marca.

¿Tienes un proyecto similar?

Construyo sistemas a medida de extremo a extremo. Conversemos.