Si tienes una peluquería, esto te suena
Clientes que escriben por Instagram, llaman mientras atiendes a otra persona o mandan mensajes por la noche. Respondes cuando puedes, pero las citas terminan repartidas entre el calendario del móvil, una libreta, un chat o tu memoria.
Cuando el salón crece un poco, esto se vuelve difícil. Hay que controlar servicios, precios, empleados, ausencias y horas libres, mientras los clientes esperan reservar fácil.
Nordic Cuts muestra cómo se puede resolver con una aplicación web propia para una peluquería pequeña.
Qué es Nordic Cuts
Nordic Cuts es una aplicación web completa para peluquerías y salones. El cliente elige servicio, peluquero, fecha y hora directamente en el navegador, desde el móvil o el ordenador, y ve el precio y la duración antes de enviar la reserva.
Detrás de la parte pública hay un panel de administración donde el salón gestiona servicios, peluqueros, ausencias y reservas. Está construida con Java, Spring Boot, React y PostgreSQL. Es una aplicación de verdad, no una página de contacto con un formulario.
Para tus clientes
El cliente elige el servicio y ve qué peluqueros lo hacen. Si no tiene preferencia, elige «Hvem som helst» (cualquiera) y el sistema busca el primer peluquero disponible.
Después elige fecha y hora libre, deja nombre, teléfono y email y acepta las condiciones de privacidad. La reserva se guarda en la misma base de datos que usa el panel de administración.
Para ti como dueño del salón
Ves qué está reservado, quién hace cada trabajo y qué servicios ofrece el salón. Los peluqueros se vinculan a los servicios que hacen, las ausencias se registran y cada reserva tiene un estado: pendiente, confirmada, cancelada o terminada.
La solución puede enviar una confirmación por email al cliente, un email cuando cambia el estado y un aviso al salón por cada reserva nueva. No pagas comisión por reserva, y los datos de los clientes se quedan en la base de datos del propio salón.
Lo que incluye
- Landing pública para el salón, con un diseño oscuro y moderno.
- Reserva online en cuatro pasos: servicio, peluquero, hora y datos de contacto.
- «Hvem som helst» (cualquiera): el sistema elige el primer peluquero disponible que hace el servicio.
- Protección contra reservas dobles, comprobada en el backend.
- Servicios con precio, duración y descripción.
- Peluqueros con foto, estado y los servicios que hacen.
- Registro de ausencias de empleados.
- Reservas con estado: pendiente, confirmada, cancelada y terminada.
- Confirmación por email al cliente y avisos al salón.
- Consentimiento de privacidad (RGPD) en el formulario de reserva.
- Inicio de sesión con roles de administrador y usuario.
Para quién encaja
Encaja para peluquerías, barberías y salones pequeños que quieren tener su propio flujo de reservas. También sirve para otros negocios con citas donde el cliente elige persona, servicio y hora.
Si hoy gestionas mucho a mano, una solución así puede ahorrarte tiempo y hacer que reservar sea más fácil para tus clientes.
Cómo trabajamos
No es una plantilla cerrada donde todos reciben exactamente lo mismo. Usamos la demo como punto de partida y la adaptamos a tu salón: servicios, precios, empleados, idiomas, diseño y forma de trabajar.
Hay un coste inicial de desarrollo y configuración, y después mantenimiento y hosting acordados de forma clara. Sabes qué incluye antes de empezar.
La tecnología detrás de Nordic Cuts
Esta parte es para los curiosos, o para el desarrollador al que quieras pedir consejo. En resumen: una sola aplicación Spring Boot que sirve tanto la API como la aplicación React, con PostgreSQL como base de datos.
| Capa | Tecnología | Qué hace |
|---|---|---|
| Backend | Java 21, Spring Boot 4.1, JHipster 9.4 | API REST, reglas de reserva, email y seguridad |
| Base de datos | PostgreSQL | Guarda servicios, peluqueros, ausencias y reservas |
| ORM | Hibernate 7 con Spring Data JPA y Ehcache | Conecta las clases Java con las tablas, con caché para lecturas frecuentes |
| Cambios de esquema | Liquibase | Cambios versionados que se aplican solos al arrancar |
| Build | Maven Wrapper y frontend-maven-plugin | Compila backend y frontend en un único JAR ejecutable |
| Frontend | React 19, TypeScript 5.9, Tailwind CSS | Web pública y flujo de reserva, pensados primero para móvil |
| Administración | React, Redux Toolkit, Bootstrap 5 | Servicios, peluqueros, ausencias, reservas y usuarios |
| Seguridad | Spring Security con JWT | Inicio de sesión y roles de administrador y usuario |
| Hosting | Docker en Railway (UE) | Health check, despliegue automático desde main y reinicio si falla |
| Calidad | GitHub Actions, JUnit, Jest, Cypress, Testcontainers | Cada cambio se prueba antes de llegar a producción |
Backend: Java 21 y Spring Boot 4.1
La base se generó con JHipster 9.4 y después se adaptó y amplió para un salón. El código está organizado en capas: los recursos REST reciben las peticiones, las clases de servicio contienen las reglas de negocio y los repositorios hablan con la base de datos. Los DTO se mapean con MapStruct, y todo lo que entra se valida con Bean Validation antes de guardarse.
Las reglas de reserva viven en el backend, no solo en el navegador. Antes de guardar una reserva, el sistema comprueba que el peluquero no tenga otra reserva que se solape en el tiempo. Las citas canceladas no cuentan. Si el cliente elige «Hvem som helst», el backend busca un peluquero activo que haga el servicio y esté libre a esa hora. El calendario consulta las horas ocupadas en un endpoint propio y las muestra como no disponibles.
Los emails se envían con Spring Mail y plantillas Thymeleaf: confirmación al cliente, aviso cuando cambia el estado y notificación al salón.
Base de datos: PostgreSQL, Hibernate y Liquibase
Cuatro entidades JPA describen el salón: Tjeneste (servicio), Frisor (peluquero), Fravaer (ausencia) y Bestilling (reserva). Un peluquero puede hacer muchos servicios (many-to-many), una reserva apunta a un servicio y a un peluquero, y una ausencia pertenece a un peluquero. Hibernate 7 traduce entre los objetos Java y las tablas de PostgreSQL, y Ehcache hace de caché de segundo nivel para los datos que se leen a menudo.
El esquema de la base de datos nunca se cambia a mano. Cada cambio es un changelog versionado de Liquibase en Git, que se aplica solo cuando arranca la aplicación. En local usamos H2, los tests se ejecutan contra un PostgreSQL real en Docker con Testcontainers y producción usa PostgreSQL en Railway.
Seguridad y API
El panel está protegido con Spring Security y tokens JWT, con roles separados de administrador y usuario. Sin iniciar sesión solo se puede hacer lo que necesita un cliente: leer servicios y peluqueros activos, ver horas ocupadas y enviar una reserva. Todo lo demás requiere sesión, y la API de administración exige el rol de administrador.
La API está documentada con OpenAPI (springdoc). Spring Boot Actuator ofrece health check y métricas en formato Prometheus, para saber en todo momento que la aplicación está viva.
Frontend: React 19 y TypeScript
El frontend está escrito en TypeScript con React 19, React Router 7 y Redux Toolkit, y se empaqueta con Webpack 5. Los formularios usan react-hook-form con validación en cada campo, las llamadas a la API van con Axios y las fechas se manejan con Day.js.
La parte pública usa Tailwind CSS con un diseño oscuro propio, «amber glass»: paneles de cristal, manchas de luz cálida, grano de película y animaciones suaves. Las animaciones se desactivan cuando el usuario ha elegido reducir el movimiento en su sistema. El panel de administración usa Bootstrap 5.
Maven lo compila todo en un archivo
Un solo comando de Maven construye toda la solución. Maven Wrapper fija la versión de Maven, y frontend-maven-plugin instala Node 24 y compila la aplicación React dentro del build de Maven. El resultado es un único JAR ejecutable con backend y frontend.
El Dockerfile construye en dos etapas. Una imagen con JDK compila y empaqueta la aplicación, y la imagen final solo contiene el runtime de Java 21 y el JAR. Así la imagen es más pequeña y hay menos cosas que puedan fallar.
Tests y CI
Cada pull request pasa por GitHub Actions antes de fusionarse: ESLint, comprobación de TypeScript, tests de Jest, build de producción del frontend, control de formato de Java con Prettier y Spotless y, al final, Maven verify con tests unitarios y de integración contra PostgreSQL. Todo el proceso tarda unos cinco minutos.
En total hay más de 500 tests automáticos: 318 en Java y 219 en el frontend. Además hay tests end-to-end con Cypress y tests de arquitectura con ArchUnit que vigilan que se respeten las capas.
Hosting en Railway
La aplicación corre como contenedor Docker en Railway, en la UE, con PostgreSQL como servicio aparte. Cuando cambia main, Railway construye una imagen nueva y solo le manda tráfico cuando /management/health responde. Si la aplicación se cae, se reinicia sola, y se puede volver a una versión anterior.
El flujo de trabajo es igual para cada cambio: rama propia, pull request, CI en verde, merge a develop y después una release a main, que se despliega automáticamente.
«¿Esto no se hace en cinco minutos con vibe coding?»
Claro que sí. Escribes «hazme una app de reservas para una peluquería», pulsas Enter y cinco minutos después tienes algo que parece una app de reservas. Luego llega el sábado por la mañana: dos clientes en la puerta con la misma cita, nadie sabe dónde se guardaron las reservas y la app solo funciona en el portátil del desarrollador.
Nordic Cuts tardó algo más de cinco minutos: 88 commits, 39 pull requests y más de 500 tests automáticos desde enero de 2026. Lo único que de verdad tarda cinco minutos es la CI. Nosotros también usamos IA todos los días y nos ahorra muchas horas, pero son las reglas del backend, los tests y la operación lo que mantiene las reservas funcionando un sábado con el salón lleno.
Prueba la demo y hablamos
La demo está abierta. Prueba el flujo de reserva y mira cómo lo viviría un cliente. Si tienes dudas, hablamos y vemos qué encaja para tu salón.
¿Te preguntas si una app propia compensa en tu peluquería? Lee la guía Sistema de reservas para peluquerías: ¿app propia o solución lista?.