尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Aplicación para gestionar invitados, colaboradores, mesas y pagos de un evento (pensada originalmente para una boda, pero reutilizable para futuros eventos). Empezó como un boceto ("Artifact") en Claude.ai y ahora es una web real: Vite + React, con Supabase (Postgres + Auth) como base de datos compartida entre el anfitrión y sus colaboradores, desplegada en Vercel, con avisos automáticos por email vía Resend.查看完整 README ↗
Aplicación para gestionar invitados, colaboradores, mesas y pagos de un evento (pensada originalmente para una boda, pero reutilizable para futuros eventos). Empezó como un boceto ("Artifact") en Claude.ai y ahora es una web real: Vite + React, con Supabase (Postgres + Auth) como base de datos compartida entre el anfitrión y sus colaboradores, desplegada en Vercel, con avisos automáticos por email vía Resend.
Este README cubre cómo poner en marcha el proyecto y cómo está organizado. El historial de decisiones, bugs ya resueltos y gotchas conocidos vive en
CLAUDE.md— consúltalo antes de tocar nada que suene a "esto ya se intentó una vez".
src/App.jsx — cascarón: decide qué rol/vista mostrar y reparte lo que de
verdad comparten dos o más ventanas (asignar colaborador, panel
flotante activo, filtros, motor de invitaciones).useLedgerData.js — toda la carga y guardado de datos contra Supabase
(RPCs), un persistX/acción por tabla o gesto.vistas/ — VistaLogin.jsx, VistaAnfitrion.jsx, VistaColaborador.jsx,
y dentro de vistas/anfitrion/ cada ventana flotante del anfitrión en
su propio fichero (Colaboradores, Mesas, Cuentas, Avisos, Invitaciones,
Configuración, Versiones...).components/ — piezas de presentación reutilizadas por más de una
vista (ColaboradorCard, MiCuenta, VentanaFlotante/ModalFlotante,
Portada, etc.).lib/ — funciones puras (formato, validación, cálculos sobre
invitados) con sus tests co-localizados (*.test.js).theme.js / constants.js — paleta de colores compartida y
VERSION_APP.npm install
.env.example a .env y rellena los dos valores con los de tu
proyecto de Supabase (Project Settings → API):
cp .env.example .env
npm run dev
npm run lint # detecta al instante variables no importadas (no-undef)
npm run build # detecta imports de módulo equivocado que el lint no ve
npm test # funciones puras de lib/ — puede no arrancar en algunos Mac,
# ver "Vitest no arranca" en CLAUDE.md; lint+build ya cubren
# la mayoría de fallos reales del día a día.
supabase/schema.sql.
Es re-ejecutable de forma segura (usa if not exists/create or replace en todo), así que también es el mismo archivo que se vuelve
a pegar cuando se le añade algo nuevo.anon public (Project Settings
→ API) a tu .env local. Nunca uses ni compartas la clave
service_role — esa da acceso total sin restricciones.https://tu-dominio.com) — los enlaces de
confirmación/recuperación de email de Supabase apuntan ahí..env como VITE_TURNSTILE_SITE_KEY — ver .env.example). Sitio
nuevo gratis en
dash.cloudflare.com → Turnstile.config_secretos
(usada por la función SQL enviar_email para mandar los avisos
automáticos) — ver supabase/schema.sql para el nombre exacto de la
fila esperada..env local (VITE_SUPABASE_URL,
VITE_SUPABASE_ANON_KEY).git push a main despliega una versión nueva automáticamente.Login real (email + contraseña, Supabase Auth) para el anfitrión y para cada colaborador:
vincular_cuenta_nueva) la enlaza sola comparando ese email; si no
coincide con nadie conocido, la cuenta se crea igual pero sin ningún
acceso.colaborador_* filtran siempre por
"authUserId" = auth.uid()), no solo ocultando cosas en pantalla.VITE_TURNSTILE_SITE_KEY configurada no se exige (útil para
desarrollo local).El enlace-token antiguo (?rol=<secreto>) sigue existiendo solo como
plan B para el anfitrión — para colaboradores ya no funciona (retirado
tras confirmarse en pruebas en vivo que seguía dando acceso sin sesión
real). Guarda ese enlace en un sitio privado: quien lo tenga, tiene
acceso total a los datos del evento.
Página de solo lectura, sin login ni cuenta, en ?tablon=<token> —
pensada para compartir UN único enlace en un grupo de WhatsApp "solo
lectura" con los ya confirmados, en vez de saturarlo con avisos largos.
Muestra fecha/hora/lugar fijos arriba y, debajo, las novedades que
escriba el anfitrión (ventana "Novedades"), plegadas por secciones. El
enlace vive en su propio secreto (tablon_secreto, tabla cerrada como
anfitrion_secreto) — nadie sin él lo encuentra, y es el mismo enlace
para todo el grupo (no uno por persona), así que crece solo con el
número de confirmados sin que haga falta repartir enlaces nuevos. El
tablón avisa con un candado de que el enlace es privado y no debe
reenviarse. Un botón "Novedades" en la portada (visible para el
anfitrión y para cada colaborador logueado) lleva directo ahí y permite
volver sin perder la sesión.
Capa extra opcional: una pregunta con respuesta (configurable en Novedades) que hay que responder antes de ver nada del tablón, ni siquiera la fecha del evento — protege de verdad la propia API, no es solo una pantalla decorativa. Cada dispositivo la recuerda tras la primera vez.
Puede sonar música ambiental de fondo mientras el tablón está abierto (Configuración → Fondo musical, sube uno o varios archivos de audio a Supabase Storage). Un botón flotante la activa: los navegadores bloquean el audio automático sin que la persona interactúe antes con la página, así que nunca suena sola de verdad al cargar.
Al pegar cualquier enlace de esta web en WhatsApp/Facebook aparece una
miniatura con imagen (etiquetas og:image estáticas en
index.html — el rastreador no ejecuta React, así que no pueden leer
datos de la base en tiempo real). La imagen se sube en Configuración →
Datos del evento, a un segundo bucket de Storage
(og-imagen, nombre de archivo fijo para que la URL nunca cambie).
Ya en producción, probado en vivo. Vía Resend, disparado desde la
propia base de datos (función SQL enviar_email, llamada
fire-and-forget con pg_net — nunca espera de forma bloqueante la
respuesta HTTP, ver el porqué en CLAUDE.md):
Backup diario vía GitHub Actions
(.github/workflows/backup.yml),
también lanzable a mano desde la pestaña Actions. El volcado se guarda
como artifact de la ejecución (90 días), nunca commiteado al
repositorio (los datos de config_secretos/anfitrion_secreto se
excluyen del volcado a propósito). Requiere el secreto de repositorio
SUPABASE_DB_URL (cadena de conexión "Session pooler" de Supabase).
.github/workflows/pruebas.yml).src/lib/registroErrores.js.CLAUDE.md para el detalle):
Proyecto privado. Todos los derechos reservados: el código se publica para poder enseñarlo, no para reutilizarlo sin permiso.
Confirmado por el autor el 2026-09-20.