Plataforma de reserva de turnos online (Demo en vivo). El demo incluye un negocio de ejemplo (Barbería Norte) con dos caras:
- Vista pública (
/): el cliente elige servicio, profesional, día y horario en un calendario semanal, deja sus datos y recibe un ticket de confirmación. Diseñada mobile-first, porque la mayoría reserva desde el celular. - Panel de administración (
/admin): agenda del día y de la semana, con acciones para marcar turnos como completados o cancelados, y métricas simples (turnos de la semana, servicio más pedido, horarios pico).
⚠️ Demo / Portfolio Showcase por Lykos - Performance-Driven Web Solutions
Este repositorio es un showcase técnico y demostración comercial. No contiene autenticación, pasarela de pagos ni multi-tenant. El acceso a/admines público y los turnos se abonan en el local.
No utilizar en producción sin implementar autenticación, backups, control de acceso y SSL.
Horely is an online appointment booking platform built with Next.js 16 (App Router), TypeScript, Tailwind CSS v4, Prisma, and SQLite.
Features include:
- Public Booking View (
/): Mobile-first design where clients select services, staff members, dates, and time slots to receive a confirmation ticket. - Admin Panel (
//admin): Real-time daily and weekly agenda management with appointment status controls (completed/canceled) and key analytics (weekly bookings, top services, peak hours).
Created as a technical portfolio showcase by Lykos - Performance-Driven Web Solutions.
| Elegir servicio | Día y horario | Ticket de confirmación |
|---|---|---|
![]() |
![]() |
![]() |
Agenda del día, con acciones para completar o cancelar turnos:
Vista semanal:
Métricas de la semana — turnos, ingresos estimados, servicio más pedido y horarios pico:
- Next.js (App Router) + TypeScript
- Tailwind CSS v4
- Prisma + SQLite
- Server Actions para reservas y cambios de estado, sin librerías de UI
Requisitos: Node.js 20 o superior.
# 1. Instalar dependencias
npm install
# 2. Configurar variables de entorno
cp .env.example .env
# 3. Crear la base SQLite y cargar datos de ejemplo
# (3 profesionales, 3 servicios y ~40 turnos entre la semana pasada y la próxima)
npm run db:setup
# 4. Levantar el servidor de desarrollo
npm run devAbrí http://localhost:3000 para la vista pública y http://localhost:3000/admin para el panel.
Para volver a generar los datos de ejemplo en cualquier momento:
npm run db:seedEl seed genera los turnos en fechas relativas a hoy, así la agenda siempre se ve poblada.
El proyecto está preparado para correr en Dokploy con SQLite sobre un volumen persistente:
- Variable de entorno:
DATABASE_URL=file:/app/data/horely.db - Volumen: montar un volumen en
/app/data(ahí vive la base SQLite) - Build:
npm run build— correprisma generatey despuésnext build - Start:
npm run start— aplica las migraciones pendientes conprisma migrate deploy, ejecuta el seed solo si la base está vacía (primer deploy), y levantanext start
En cada redeploy las migraciones se aplican automáticamente y los datos del volumen se conservan: el seed nunca pisa una base con datos. Para regenerar los datos de ejemplo en producción, borrá el archivo de la base del volumen y redeployá.
app/
page.tsx # Vista pública de reserva
actions.ts # Server actions: crear reserva, cambiar estado
api/slots/ # Disponibilidad de horarios
admin/ # Agenda del día, semana y métricas
components/
booking/ # Flujo de reserva y ticket de confirmación
admin/ # Navegación y badges del panel
lib/
availability.ts # Lógica de horarios libres
format.ts # Fechas y moneda en es-AR
prisma/
schema.prisma # Professional, Service, Appointment
seed.mjs # Datos de ejemplo (--if-empty en producción)
MIT © 2026 Lykos - Performance-Driven Web Solutions





