Skip to content
Proyecto propio · Full-stack

GhostSwap

Las apps de amigo secreto están llenas de anuncios, te obligan a crear cuentas en sitios dudosos y no soportan múltiples grupos ni exclusiones. GhostSwap tiene magic link, wishlists editables, multi-moneda para LATAM y privacidad garantizada en la base de datos.

Algoritmo de derangementRow Level SecuritySupabaseCloudflare WorkersMulti-moneda LATAMAuth sin fricción
El proyecto

GhostSwap es una aplicación web completa para organizar intercambios de regalos tipo Amigo Secreto. Implementa un algoritmo de derangement verificado matemáticamente para garantizar que nadie se regale a sí mismo, con privacidad by design, o sea Row Level Security en todas las tablas de Supabase para que nadie pueda ver asignaciones ajenas, ni siquiera el admin. Incluye autenticación con Google OAuth y Email/Password, sistema de invitaciones por código con auto-join, notificaciones automáticas por email al realizar el sorteo, wishlist por participante, sistema de exclusiones y soporte multi-moneda (CLP, USD, EUR, MXN, ARS, COP, PEN, BRL, GBP). Desplegado en Cloudflare Workers con OpenNext y CI/CD vía GitHub Actions.

Por qué existe

Las apps de amigo secreto que existen están llenas de anuncios, se ven antiguas, te obligan a crearte una cuenta en sitios de dudosa reputación y la mayoría no soporta múltiples grupos, exclusiones ni monedas distintas. Quise una herramienta que simplemente funcionara bien. Entras con un link, te unes con Google, armas tu wishlist y listo.

Cómo lo construí

El algoritmo central es un derangement con sistema de exclusiones. Garantiza que nadie se regale a sí mismo y además respeta restricciones arbitrarias, como parejas que no se pueden tocar o jerarquías de oficina. Usa Fisher-Yates con fallback a backtracking cuando las restricciones son complejas, y detecta configuraciones imposibles antes de intentar el sorteo. Lo probé contra escenarios reales, familias con parejas, oficinas con jerarquías, grupos grandes con exclusiones cruzadas. La privacidad está en la base de datos. Row Level Security en Supabase hace que ni el admin pueda ver las asignaciones. Magic link y Google OAuth para entrar sin fricción, wishlist editable, soporte para 9 monedas de LATAM, notificaciones por email.

Stack y decisiones técnicas

Next.js 16 con App Router y React 19. Backend con Supabase (PostgreSQL + Auth + RLS) y Server Actions. Validación con Zod y React Hook Form. Email transaccional con Brevo SMTP y Nodemailer. Deploy en edge con Cloudflare Workers vía OpenNext. CI/CD con GitHub Actions, Husky y lint-staged.

Reflexión

Me di cuenta de que la mayoría de las apps de amigo secreto tienen un problema de confianza que nadie nombra. Si el organizador puede ver todo, la privacidad es solo una promesa. Quería que fuera una garantía técnica. Eso cambió bastante el diseño de la arquitectura.