2

Pitch: Lista Virtual, a lista de convidados que funciona sem internet na portaria

O Lista Virtual nasceu num evento numa fazenda: praticamente sem internet, duas entradas, uma lista em cada uma e ninguém sabendo quem já tinha entrado. A primeira versão saiu em uma semana, feita à mão, para resolver aquele evento. Depois ficou claro que o problema era rotina de muitos cerimonialistas, e o app continuou crescendo.

Em desenvolvimento desde junho de 2024 e nas lojas desde janeiro de 2025: mais de 4 mil eventos, 39 mil convidados e 13 mil check-ins.

O que ele faz

  • Lista de convidados com acompanhantes, grupos (mesas, empresas, setores) e VIP
  • Convite pelo WhatsApp com link pessoal de confirmação
  • QR Code individual e de grupo, com check-in que funciona sem internet
  • Recepcionistas no próprio celular, entrando com código de acesso
  • Relatório pós-evento em PDF e Excel
  • iPhone, iPad e Android, em 11 idiomas

Como o código evoluiu

  • A primeira versão foi escrita à mão, no Expo SDK 51.
  • Em meados de 2025 entraram a IA e a expo-utils, uma lib que desenvolvi com meu chefe na época, na Pixel Logic Apps, e que junta a base comum dos apps: inicialização, anúncios, paywall, Remote Config e atualização OTA. Foi com a IA que o app passou para o Liquid Glass do iOS 26, que chegou ao Expo no SDK 54.
  • O passo maior foi o porte para o SDK 57 com o Claude Code, num repositório novo e em fases (fundação, serviços, hooks, componentes, telas), cada uma validada no TypeScript e aprovada por mim antes da próxima. Levou dois dias, e aproveitei para modernizar: saiu o moment e entrou Intl, e os ícones viraram SF Symbols.
  • O que segura a qualidade: regras escritas que a IA lê antes de tudo (nada de Context API, lib nova só com a minha autorização, estilo só do design system), memória do projeto em arquivos, protótipo aprovado antes do código e teste no aparelho.

Cinco coisas que aprendi

  1. A portaria é onde a internet falha. O QR carrega só LV|c|evento|convidado, e a lista já está no aparelho (cache offline do Firestore, assinada com onSnapshot). O leitor resolve local, a presença é gravada de forma otimista e sincroniza quando a conexão volta.

  2. A câmera lê o mesmo QR várias vezes por segundo. A primeira versão do leitor renovava a janela de deduplicação a cada frame, e um QR que continuava enquadrado nunca mais era lido. O certo é contar a janela a partir do processamento:

if (data === lastScan.current.data && now - lastScan.current.time < 2500) return;
lastScan.current = {data, time: now}; // só chega aqui o que vai ser processado
  1. O prefixo não diz se o número já tem DDI. O convite montava o link do WhatsApp com 55 fixo. Só que 55999998888 é um celular de Santa Maria (DDD 55), e 353833900174 é um número irlandês que já tem DDI. O que separa os dois é o comprimento: número nacional no Brasil tem no máximo 11 dígitos, então 12 ou 13 começando com 55 só pode ser DDI.

  2. Type-check não é teste. No porte, File.copy() do expo-file-system virou assíncrono. O código compilou, passou no TypeScript e quebrou o relatório em silêncio no Android; no simulador, que é rápido, o erro nunca aparecia.

  3. A IA também erra. Ela sugeriu um rate limit de 10 requisições por minuto por IP como "trava de graça". Num evento corporativo, 200 convidados estão no mesmo Wi-Fi: com duas requisições por check-in, a porta travaria na sexta pessoa. Desde então, nenhuma defesa entra sem um problema real na mão.

Onde eu queria opinião: o pedido número um dos clientes é mandar os convites em lote pelo WhatsApp. Sem a API paga, cada envio passa pela mão do organizador, e mensagem automática em massa num número pessoal é um bom jeito de perder o número. Alguém já resolveu isso?

Grátis para começar (1 evento, até 50 convidados), com Premium por evento ou por assinatura.

Feedback é muito bem-vindo, principalmente de quem organiza eventos ou trabalha com offline-first em React Native.

Carregando publicação patrocinada...