Meltype
This is Japanese input that melts the wall between half-width and full-width, like thawing snow.
AI translation
Reserve lab time slots and manage approvals
Translation pending
AI summary · website content
ProductivityJavaScript · CSSGitHub @itoo1OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Aplicación web (Node.js + Express) para reservar bloques horarios del laboratorio de finanzas y visualizar la ocupación a lo largo de todo el año. Diseño oscuro tipo terminal financiera.
minAdvanceDays;
0 = sin restricción, que es el valor actual). Las reglas se muestran en la barra superior y en el formulario de reserva./admin (o el ícono
⚿) con pestañas Pendientes / Aprobadas / Todas y acciones aprobar · rechazar · eliminar.
Un bloque pendiente aparece rayado en el calendario hasta que se resuelve.maxHoursPerReservation.maxRecurringWeeks, 20 por defecto) y crea el mismo día y horario cada semana de una vez.
Si alguna semana choca no se crea ninguna y se listan las fechas en conflicto. Toda la serie
comparte un código (se puede cancelar una semana o todas) y el administrador la aprueba o
rechaza con un solo clic.minAdvanceDays, el administrador puede reservar sin esa anticipación.npm install
npm run schedule # carga el horario académico del semestre (ver más abajo)
npm start
Luego abre http://localhost:3000. El panel de administración está en http://localhost:3000/admin.
npm start lee el archivo .env (ignorado por git). Define ahí la clave:
ADMIN_PASSWORD="tu-clave-secreta"
Si no hay .env ni variable ADMIN_PASSWORD, se usa bloomberg-admin
(solo para pruebas locales). Para cambiar la clave, edita .env y reinicia.
Para desarrollo con recarga automática:
npm run dev
schedule.js borra todas las reservas y carga el horario recurrente
del semestre (lun 10-ago-2026 → vie 11-dic-2026). Edita la constante WEEKLY para
cambiar bloques, responsables o correos, y vuelve a ejecutar:
npm run schedule
Edita LAB_CONFIG en server.js para ajustar horario, días de apertura,
número de terminales, duración máxima por reserva y el listado de cursos.
Dos backends, elegidos automáticamente:
data/reservations.json, escritura atómica) — por defecto en
local, Render, Railway, etc. La ruta se cambia con DATA_DIR.UPSTASH_REDIS_REST_URL y
UPSTASH_REDIS_REST_TOKEN. Necesario en hostings serverless como Vercel.En ambos casos, si la base arranca vacía se carga solo el horario del semestre.
GitHub guarda el código pero no ejecuta el servidor. Hay que conectar el repo a un hosting que corra Node.
Ambos tienen plan gratuito permanente y no piden tarjeta.
git push -u origin main (el remoto origin ya está configurado).UPSTASH_REDIS_REST_URL y UPSTASH_REDIS_REST_TOKEN.
(O desde Vercel: Storage → Marketplace → Upstash, y las variables se inyectan solas.)vercel.json (funciones + api/index.js).ADMIN_PASSWORD = tu claveUPSTASH_REDIS_REST_URL y UPSTASH_REDIS_REST_TOKEN (del paso 2)render.yaml)Usa el backend de archivo + disco persistente. En Render: New → Blueprint,
define ADMIN_PASSWORD. El disco persistente requiere plan starter (~US$7/mes);
en plan free los datos se reinician en cada despliegue y el servicio se suspende
tras 15 min de inactividad.
| Método | Ruta | Descripción |
|---|---|---|
GET | /api/config | Configuración del laboratorio |
GET | /api/reservations?from=YYYY-MM-DD&to=YYYY-MM-DD | Reservas en el rango |
GET | /api/stats?from=&to= | Métricas de ocupación del rango |
POST | /api/reservations | Crear reserva (queda pending) |
GET | /api/reservations/:id?code= | Consultar estado de una reserva por código |
POST | /api/reservations/:id/cancel | Cancelar reserva (requiere { code }) |
POST | /api/admin/login | Inicia sesión de administrador → { token } |
GET | /api/admin/reservations?status= | Listado completo (Bearer token) |
POST | /api/admin/reservations/:id/approve | Aprobar |
POST | /api/admin/reservations/:id/reject | Rechazar ({ note } opcional) |
DELETE | /api/admin/reservations/:id[?scope=series] | Eliminar una reserva; con scope=series, todas las del mismo bloque semanal |
Para operar sin aprobación (reservas confirmadas al instante), pon
requireApproval: false en LAB_CONFIG.
| Variable | Descripción |
|---|---|
ADMIN_PASSWORD | Clave del panel de administración (obligatoria en producción). |
PORT | Puerto del servidor (por defecto 3000; el hosting suele fijarlo). |
DATA_DIR | Carpeta donde se guarda reservations.json (backend de archivo). |
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN | Activan el backend Redis (serverless). |
BOOTSTRAP_SCHEDULE | 0 desactiva la carga automática del horario en una base vacía. |