§1O problema
Preços de viagem mudam todo dia e pacotes de agência costumam sair mais caros. Faltava um jeito de acompanhar voos e hotéis separadamente e saber o que é de fato uma boa oferta.
§2O que eu construí
- Pesquisa diáriaVoos e hotéis em buscas separadas, com total da família calculado pelo app.
- DestinosCerca de dez “âncoras” fixas com histórico diário e uma “caça livre” por promoções em outros destinos.
- Fontes reais de preçoSearchApi, SerpAPI e Ryanair, mais um avaliador dos achados.
- Regra de promoçãoPela mediana do próprio histórico (90 dias), com o julgamento de um agente de IA enquanto o histórico ainda é curto.
- PWATela “Hoje” que se atualiza sozinha, botão de tentar de novo, push só para achado excepcional e e-mail só com promoção nova ou 2 dias de falha.
- SegurançaProteção contra link sósia (reaproveitada do ticket.me) e links diretos de compra.
§3As partes difíceis
5 itens- 01
Detectar promoção de verdade
Mediana do próprio histórico, com o julgamento de um agente de IA quando há menos de 14 pontos.
- 02
Evitar que agentes de IA inventem
Validação por Zod, lista de países excluídos e proibição explícita de pacotes.
- 03
Dado fraco de hotel
Preço aproximado, avisado na interface e no resumo.
- 04
Reaproveitar a arquitetura do ticket.me
Motor sem interface + app, trocando só o domínio.
- 05
Execuções agendadas e notificação idempotente
Com códigos de saída.
§4Resultado
- de histórico de preço por trás de cada promoção
- 90 dias
- arquivos de teste no motor
- 17
Pesquisa diária e resumos automáticos funcionando em uso pessoal. O motor tem 17 arquivos de teste.
§5Stack
- Next.js 16 (PWA)
- TypeScript
- Drizzle ORM + SQLite
- web-push
- nodemailer
- Zod
- Vitest
- Agentes de IA por linha de comando
- APIs de preço
- systemd (timers)
- Tailscale