Skip to content
proyecto propio · full-stack

Fantomio

Un amigo secreto con sorteo a ciegas. Te toca una lista de deseos y no un nombre, así que regalas sin saber a quién hasta la revelación. Se puede apostar quién es, y el chat tapa los nombres para que nadie se delate sin querer.

Captura de Fantomio
fantomio.com, 27-oct-2026 · 1440 px
Captura de Fantomio en el teléfono
fantomio.com, 27-oct-2026 · 390 px

Fantomio, antes GhostSwap, organiza el amigo secreto de una familia, una oficina o un grupo de amigos. Se arma el grupo con un link, cada persona anota su lista de deseos y el sorteo se hace en la base de datos. Lo que lo distingue de otras apps del rubro es el sorteo a ciegas, con apuestas y un chat que tapa los nombres hasta la revelación; la revelación voluntaria de quién te regaló, después del intercambio; y que tu lista de deseos la ve solo quien tiene que regalarte, no el grupo entero. Además permite repetir el grupo al año siguiente sin repetir parejas, y tiene una cuenta completa con foto, cambio de correo, Google, unión de cuentas, descarga de datos y borrado. Es gratis y no rastrea a nadie.

Por qué existe

Que quien organiza no vea las asignaciones ya es lo normal en las apps de amigo secreto. Lo que no encontré en ninguna fue el juego de adivinar. En un amigo secreto de verdad, la mitad de la gracia es sospechar quién te regala, y las apps resolvían el sorteo y se olvidaban de eso.

Cómo lo construí

El modo a ciegas obligó a pensar qué delata a alguien. No bastaba con ocultar la asignación, porque el chat, los avisos, el historial y hasta la lista de deseos podían confirmar una sospecha. La base tapa los nombres de todos los miembros en cada mensaje antes de guardarlo, distinguiendo a una Rosa del color rosa,, y no deja sortear a ciegas mientras falte la lista de alguien. El sorteo es una función de Postgres que respeta exclusiones, evita repetir las parejas del año anterior y avisa cuando no hay sorteo posible. Después le sumé pruebas automáticas contra un Supabase desechable, registro de migraciones y alertas, para dejar de probar en producción.

Stack y decisiones técnicas

Next.js 16 exportado como sitio estático en Cloudflare Workers, sin servidor propio. Supabase con Postgres, Auth y RLS en todas las tablas. El sorteo, los archivos, las revelaciones programadas y los correos corren en la base con funciones, pg_cron y pg_net hacia Brevo. Cada deploy espera a que GitHub Actions levante un Supabase desechable, aplique las migraciones y pase las pruebas de privacidad. Errores reportados a Sentry sin datos personales.

sorteo a ciegas, postgres, supabase, row level security, cloudflare workers, pruebas en ci

Reflexión

Lo difícil no fue esconder datos sino decidir qué cuenta como pista. Tapar solo los nombres de los dos involucrados habría confirmado la apuesta de cualquiera, así que se tapan todos. Esa clase de detalle es la que separa un sorteo que funciona de un juego que se puede jugar.

Otros proyectos

  • Centro de Estudios Migratorios - USACH

    El Centro de Estudios Migratorios de la USACH necesitaba reconstruir su presencia digital y crear DataCEM, una plataforma de visualización de datos migratorios.

  • Flets

    Flets dejó de ser solo un cotizador de fletes y empezó a venderle operación logística a empresas. Rehice el sitio que yo misma había diseñado en 2024 para que dijera eso, y el cotizador ahora suma paradas y peoneta y cobra todo con Webpay.

  • Casalmar Pupuya

    Cabañas y apartamentos frente al mar en Pupuya. El sitio recibía reservas directas sobre un tema comercial con 26 plugins. Lo rehice con un tema propio, 8 plugins y una reserva que pasó de siete clics a tres.