Saltar al contenido
Documentación

Decisiones técnicas

Cada pieza del stack se eligió con un criterio: control sobre los datos, coste cero en la demo y una experiencia de desarrollo que mantenga la calidad alta. Aquí está el porqué de cada decisión, con sus contrapartidas.

El stack de un vistazo

CoreLink es una aplicación full-stack autoalojable. Esta tabla resume las tecnologías; debajo se desarrolla el razonamiento de cada una.

Resumen del stack técnico de CoreLink por área
ÁreaTecnología
FrameworkNext.js 16 · React 19 · TypeScript estricto
AutenticaciónBetter Auth (self-host, roles)
Base de datosPostgreSQL 16 · Prisma ORM
Tiempo realSSE sobre Postgres LISTEN/NOTIFY
BúsquedaFull-text nativo de PostgreSQL
InterfazTailwind CSS v4 · shadcn/ui · diseño propio
MultimediaStorage abstracto (local / Vercel Blob) · sharp
CalidadBiome · Vitest · Playwright · axe · CI en GitHub Actions
DespliegueVercel · Neon (planes gratuitos)

Por qué cada elección

Ninguna decisión es absoluta: casi todas tienen alternativas válidas. Lo importante es que cada una responda a una necesidad concreta del proyecto y que sus contrapartidas estén asumidas conscientemente.

Next.js 16 + React 19 + TypeScript

Next.js 16 (App Router) con React 19 y TypeScript estricto como base de toda la aplicación.

Ventajas
  • Renderizado en servidor por defecto: páginas rápidas y menos JavaScript en el cliente.
  • Server Actions evitan tener que construir y mantener una API REST aparte.
  • TypeScript estricto detecta errores antes de llegar a producción.
A tener en cuenta
  • El modelo de Server Components y Server Actions tiene curva de aprendizaje.
  • Es un framework que evoluciona rápido; conviene seguir sus versiones.

Autenticación con Better Auth

Better Auth en lugar de Auth.js o Clerk: queríamos la sesión y los roles bajo nuestro control, sin servicios de terceros.

Ventajas
  • Self-host total: los usuarios y las sesiones viven en nuestra propia base de datos.
  • Control completo sobre roles y permisos (empleado, administrador) sin un proveedor externo.
  • Sin coste por usuario ni dependencia de un servicio de pago, a diferencia de Clerk.
A tener en cuenta
  • Al autoalojar la autenticación, la seguridad de la sesión es responsabilidad nuestra.
  • Ecosistema más joven que el de alternativas consolidadas.

PostgreSQL + Prisma

Prisma sobre PostgreSQL. La elección de Prisma frente a Drizzle es debatible; primamos la experiencia de desarrollo y las migraciones.

Ventajas
  • PostgreSQL es una base de datos relacional robusta, estándar y sin sorpresas.
  • Prisma da un modelo de datos tipado y migraciones reproducibles con buena experiencia de desarrollo.
  • El esquema es la fuente de verdad: cambios de datos versionados y revisables.
A tener en cuenta
  • Frente a Drizzle, Prisma añade una capa de generación de cliente y algo de peso.
  • Es una elección debatible: Drizzle ofrece SQL más cercano; aquí pesó más la DX.

Tiempo real con SSE sobre Postgres

Notificaciones y chat en vivo con SSE sobre el LISTEN/NOTIFY de Postgres, en vez de un servicio externo de tiempo real.

Ventajas
  • Tiempo real sin servicios de pago como Pusher o Ably: todo se queda en casa.
  • Reutiliza la propia base de datos (LISTEN/NOTIFY de Postgres) como bus de eventos.
  • Server-Sent Events es un estándar simple del navegador, sin librerías pesadas en el cliente.
A tener en cuenta
  • SSE es unidireccional (servidor → cliente); para enviar se usan acciones normales.
  • Requiere gestionar las conexiones abiertas con cuidado para no agotar recursos.

Búsqueda full-text de PostgreSQL

Búsqueda con el full-text nativo de PostgreSQL en lugar de Elastic o Algolia: suficiente para el volumen interno de una empresa.

Ventajas
  • La búsqueda full-text nativa de Postgres cubre el caso sin Elasticsearch ni Algolia.
  • Una infraestructura menos que desplegar, mantener y pagar.
  • Los datos no salen de la base de datos: menos superficie y mayor privacidad.
A tener en cuenta
  • Menos potente que un motor dedicado en relevancia avanzada o idiomas múltiples.
  • Para volúmenes muy grandes, un buscador especializado escalaría mejor.

Interfaz: Tailwind v4 + shadcn/ui + diseño propio

Tailwind CSS v4 con shadcn/ui como cimiento, sobre el que se construye un sistema de diseño propio (tokens, marca, dark mode).

Ventajas
  • Tailwind v4 (CSS-first) y shadcn/ui dan una base accesible y rápida de iterar.
  • Sistema de diseño propio con marca teal: identidad distintiva, no una plantilla genérica.
  • Iconos vectoriales y emojis Twemoji: aspecto consistente en cualquier sistema operativo.

Multimedia con storage abstracto

Multimedia con una capa de almacenamiento abstracta (driver local o Vercel Blob) y optimización de imágenes con sharp.

Ventajas
  • Almacenamiento abstracto: el mismo código usa disco local en desarrollo o Vercel Blob en producción.
  • Cambiar de proveedor de archivos no obliga a tocar la lógica de la aplicación.
  • Las imágenes se optimizan con sharp, así cargan rápido en cualquier dispositivo.

Calidad: tipos, tests, a11y y CI

La calidad es parte del producto: tipado estricto, análisis estático, pruebas automáticas y accesibilidad verificada en cada cambio.

Ventajas
  • TypeScript estricto y Biome (lint + formato) mantienen el código consistente y sin errores triviales.
  • Tests unitarios e integración con Vitest y end-to-end con Playwright.
  • Accesibilidad verificada con axe (0 violaciones) e integración continua en GitHub Actions.

Despliegue en Vercel + Neon

Despliegue en Vercel con base de datos PostgreSQL gestionada en Neon, todo dentro de planes gratuitos.

Ventajas
  • Despliegue en Vercel y base de datos en Neon, ambos en sus planes gratuitos.
  • La demo de portfolio no tiene coste de infraestructura recurrente.
  • Integración natural con Next.js: previsualizaciones por cada cambio y métricas reales de rendimiento.

En resumen

CoreLink demuestra que se puede construir una herramienta interna completa —feed, procedimientos oficiales, chat en vivo, búsqueda, administración— de forma autoalojable, con control total sobre los datos y sin coste de licencias, sin renunciar a la calidad ni a la accesibilidad.