§1The problem
Travel prices change every day and agency packages tend to cost more. There was no way to track flights and hotels separately and know what is really a good deal.
§2What I built
- Daily searchFlights and hotels in separate searches, with the family total calculated by the app.
- DestinationsAbout ten fixed “anchors” with daily history, plus a “free hunt” for deals elsewhere.
- Real price sourcesSearchApi, SerpAPI and Ryanair, plus an evaluator for the findings.
- Deal ruleBased on the median of its own history (90 days), with an AI agent's judgement while the history is still short.
- PWAA self-refreshing “Today” screen, a retry button, push only for exceptional finds and email only for a new deal or 2 days of failures.
- SafetyLook-alike link protection (reused from ticket.me) and direct purchase links.
§3The hard parts
5 entries- 01
Detecting a real deal
Median of its own history, falling back to an AI agent's judgement when there are fewer than 14 data points.
- 02
Keeping AI agents from making things up
Zod validation, a list of excluded countries and an explicit ban on packages.
- 03
Weak hotel data
Approximate prices, flagged in the interface and in the summary.
- 04
Reusing ticket.me's architecture
Headless engine + app, changing only the domain.
- 05
Scheduled runs and idempotent notifications
With exit codes.
§4Result
- of price history behind each deal
- 90 days
- test files in the engine
- 17
Daily search and automatic summaries working in personal use. The engine has 17 test files.
§5Stack
- Next.js 16 (PWA)
- TypeScript
- Drizzle ORM + SQLite
- web-push
- nodemailer
- Zod
- Vitest
- AI agents via command line
- Price APIs
- systemd (timers)
- Tailscale