Sorteio de Amigo Oculto sem servidor, com um prompt
Existe um exército de sites de "sorteio de amigo oculto" por aí, a maioria pedindo cadastro, email de todo mundo, ou mostrando anúncio antes de gerar o link. Nenhum desses passos é necessário: o sorteio inteiro cabe dentro do próprio link.
A parte que resolve isso é onde os dados moram. Em vez de salvar "quem tirou quem" num banco em algum servidor, cada resultado do sorteio é codificado (JSON → base64) e vai direto no hash da URL — a parte depois do #. Hash de URL nunca é enviado pra nenhum servidor; o navegador só usa isso localmente. Então não existe backend: o "banco de dados" é o próprio link que cada pessoa recebe. Quem abre o link decodifica o hash na hora e descobre quem tirou — sem consulta, sem espera, sem o site saber de nada.
O sorteio em si usa Fisher-Yates (embaralhamento comprovadamente justo) montado como um ciclo único: embaralha a lista uma vez, cada pessoa tira a próxima da fila, e a última tira a primeira. Isso garante, sem precisar rejeitar e tentar de novo, que ninguém tira a si mesmo e que todo mundo é sorteado exatamente uma vez — testei rodando 2000 simulações e 10 sorteios reais com a mesma lista pra confirmar isso na prática (nenhuma repetição de auto-sorteio, resultado muda a cada rodada).
Dá pra restringir quem não pode tirar quem — útil pro clássico caso de filho(a) não poder tirar os pais que compram o presente dela por ela. É uma segunda caixa opcional, assimétrica de propósito ("Filha: Rafael, Esposa" barra só a Filha, os pais continuam podendo tirar ela ou um ao outro). Se as restrições tornarem o sorteio impossível (ex.: alguém fica sem ninguém pra tirar), a página avisa exatamente quem, em vez de travar ou dar resultado errado.
Pra distribuir, cada link tem um botão que abre o WhatsApp direto (wa.me) com o link já preenchido — o organizador só escolhe o contato, sem copiar/colar.
Publicar de verdade: sendo puro HTML/JS sem servidor, o resultado só vira um link de verdade quando está hospedado em algum lugar acessível — rodar só no seu computador não gera um link pra mandar pra ninguém. Caminho mais simples pra quem for reaproveitar esse prompt num site próprio: GitHub Pages (grátis — sobe o arquivo num repositório, ativa o Pages nas configurações, sai uma URL pública sem precisar configurar servidor nenhum) ou Netlify Drop/Cloudflare Pages (também grátis, geralmente é arrastar o arquivo numa página de deploy). Aqui no pixe.studio o resultado final ficou embutido direto nesta mesma página da Biblioteca que você está vendo agora — não como um arquivo solto: é a seção "Sorteie seu Amigo Oculto" logo acima.
Bônus: abaixo você pode copiar o prompt exato que usei pra gerar essa funcionalidade com o Claude Code.
Sorteie seu Amigo Oculto
Digite um nome por linha. A gente sorteia e gera um link secreto pra cada pessoa — sem cadastro, sem servidor.
Tudo roda no seu navegador, sem servidor — por isso é simples e gratuito, mas não é criptografia de verdade: quem organiza o sorteio poderia, tecnicamente, inspecionar os pares se quisesse. Para um amigo oculto de confiança, tá perfeito.
O prompt
Crie uma página HTML única, standalone (sem build, sem framework, sem backend), pra sortear Amigo Oculto entre amigos e compartilhar o resultado pelo WhatsApp.
Requisitos funcionais:
- Tela 1 (organizador): textarea onde ele cola um nome por linha. Botão "Gerar sorteio" valida: mínimo de 3 participantes, e nenhum nome duplicado (case-insensitive) — mostra erro claro sem travar a tela.
- Sorteio: embaralhe a lista com Fisher-Yates de verdade (Math.random, sem seed) e monte um ciclo único — cada pessoa tira a próxima da lista embaralhada, e a última tira a primeira. Isso garante que ninguém tira a si mesmo e que é uma bijeção (todo mundo é sorteado exatamente uma vez), sem precisar rejeitar e re-sortear.
- Restrições opcionais: adicione uma segunda caixa de texto opcional, abaixo da lista de participantes, no formato "Pessoa: fulano, ciclano" (uma restrição por linha) — indica que essa pessoa não pode tirar os nomes listados. É assimétrico de propósito (restringir A não impede o inverso: B ainda pode tirar A) — cobre o caso comum de uma criança não poder tirar os pais que compram o presente dela por ela, sem exigir blocos de família simétricos. Valide que todo nome citado existe na lista de participantes, com erro claro se não existir. Antes de sortear, detecte se as restrições de alguém cobrem literalmente todo mundo (sorteio matematicamente impossível) e mostre um erro específico dizendo quem ficou sem ninguém pra tirar. No sorteio (ciclo único), se o resultado violar alguma restrição, embaralhe de novo — repita até achar um ciclo válido ou esgotar um número alto de tentativas (ex.: 5000), só então mostre um erro genérico sugerindo reduzir as restrições ou aumentar a lista.
- Cada participante recebe um link próprio: codifique {pessoa, sorteado} em JSON, depois em base64 (usando TextEncoder/TextDecoder pra suportar acento e emoji corretamente), e coloque no hash da URL (depois do #) — nunca em querystring, porque o hash nunca é enviado a nenhum servidor. Isso elimina qualquer backend: o "banco de dados" é o próprio link.
- Tela 2 (lista de links): mostra os participantes em ordem alfabética (só a exibição — não revela quem tirou quem) com um botão "Compartilhar" por pessoa. Ao clicar, abra `https://wa.me/?text=` com uma mensagem personalizada (nome da pessoa + o link dela) via `window.open` — isso abre o WhatsApp direto pra escolher o contato, sem precisar copiar/colar nada.
- Tela 3 (quem abriu o link): ao carregar a página, leia `location.hash`; se tiver dado válido, mostra direto "Olá, {nome}" com um botão "Revelar meu amigo oculto" que, ao clicar, anima a entrada do nome sorteado. Sem hash válido, cai na tela 1 (formulário).
- Rodapé avisando honestamente que não é criptografia de verdade — quem organiza poderia, tecnicamente, inspecionar os links se quisesse — só que roda inteiramente no navegador, sem servidor nenhum.
Visual: fundo claro neutro, texto quase-preto, um único acento de cor usado com moderação, cantos suaves (8-14px), tipografia legível. Cabeçalho simples com identidade de marca linkando pra home.
Entregue tudo num arquivo .html único (CSS e JS inline), sem nenhuma dependência externa. Depois de pronto, publique em algo como GitHub Pages, Netlify ou Cloudflare Pages pra virar um link de verdade — HTML sem servidor só funciona quando está hospedado em algum lugar acessível.
Resultado
Página única (amigo-oculto.html), testada ponta a ponta: gerei o sorteio pra 5 nomes (com acento e emoji), abri cada um dos 5 links simulando 5 navegadores diferentes — todos caíram na revelação certa, ninguém tirou a si mesmo, ninguém repetido. Rodei o sorteio 10x com a mesma lista pra confirmar que o resultado muda a cada vez (9 de 10 combinações distintas na prática).