Volver al blog
[ ES ]EN

[ Blog ] / 18 de octubre de 2026

Broslunas Link: tu página de enlaces en tu propio subdominio

Un Linktree multi-tenant hecho en un día: subdominios por cliente, datos aislados, siete temas y QR. Cómo está montado y qué decisiones pesaron más.

Quería un proyecto de portfolio que demostrara algo más difícil que un CRUD: una arquitectura multi-tenant de verdad. Elegí una página de enlaces tipo Linktree porque es pequeña, se entiende en diez segundos y obliga a resolver lo importante: cada persona tiene su propia dirección, sus propios datos y su propia apariencia.

El resultado es Broslunas Link: cada página vive en su subdominio, por ejemplo marta.broslunas.link. Es una demo gratuita; no procesa pagos.

§ 01Un subdominio por persona

El DNS tiene un registro comodín hacia Vercel y un proxy.ts lee el host de cada petición. Si es marta.broslunas.link, reescribe internamente a /tenant/marta sin cambiar la URL visible; app. sirve el panel y la raíz, la landing. Hay una sola app y una sola base de datos, no un despliegue por cliente.

Cada alta, además, registra el subdominio en Vercel por API para que emita su certificado. Si ese paso falla, la página se crea igualmente y no se pierde nada.

§ 02El aislamiento no se delega en la memoria

La regla es sencilla: ninguna consulta se escribe sin tenantId. Para que no dependa de acordarse, todo el acceso a datos pasa por forTenant(id), que devuelve enlaces, tema y eventos ya acotados a ese tenant. Un test crea dos tenants y comprueba que ninguna lectura ni escritura cruza datos. Si alguien rompe la regla, falla CI.

§ 03Rápida porque casi no hace nada

La página pública se cachea con una etiqueta por tenant (tenant:<slug>) y se invalida solo cuando su dueño guarda un cambio. Entre guardados es contenido estático. Las visitas y los clics se registran aparte, sin cookies, para tener estadísticas simples por enlace.

§ 04Seguridad en lo pequeño

  • +Los enlaces solo admiten http, https, mailto y tel; un javascript: no llega a guardarse.
  • +Los vídeos incrustados solo salen de YouTube y Spotify, y la URL del usuario nunca se usa como src: se convierte a la del reproductor.
  • +Los slugs se validan por formato y contra una lista de reservados (www, app, admin, api…).
  • +Registro y creación tienen límite de frecuencia, guardado en MongoDB con un índice TTL para no añadir Redis solo por esto.

§ 05Lo que ve quien lo usa

Siete temas prefabricados, ajuste de fuente, colores y estilo de tarjeta, botón de WhatsApp con mensaje inicial, código QR descargable en PNG o SVG y dominio propio opcional. El motion graphic de la landing y de este proyecto está hecho con Remotion.

§ 06Qué me llevo

Ponerle un nombre y un límite a la parte difícil —el aislamiento— y rodearla de un test hace que el resto vaya rápido. Lo construí en un solo día, con 65 tests en verde, y la capa de acceso con tenantId ya me sirve de base para el siguiente proyecto: un sistema de reservas.

Puedes verlo en broslunas.link y leer el caso de estudio completo en la ficha del proyecto.

■ Fin del post↑ Volver arriba

[ Newsletter ]

Nuevos posts y proyectos, por email

Un email corto cuando publico algo nuevo. Sin spam, date de baja cuando quieras.