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
momente entrouIntl, 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
-
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 comonSnapshot). O leitor resolve local, a presença é gravada de forma otimista e sincroniza quando a conexão volta. -
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
-
O prefixo não diz se o número já tem DDI. O convite montava o link do WhatsApp com
55fixo. Só que55999998888é um celular de Santa Maria (DDD 55), e353833900174é 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. -
Type-check não é teste. No porte,
File.copy()doexpo-file-systemvirou 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. -
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.
- Site: https://andreoleari.com.br/pt/lista-virtual
- App Store: https://apps.apple.com/br/app/id6738919953
- Google Play: https://play.google.com/store/apps/details?id=com.ROC
Feedback é muito bem-vindo, principalmente de quem organiza eventos ou trabalha com offline-first em React Native.