What was delivered
- Scans from Kuala Lumpur, Singapore and Johor Bahru to Harbin: every departure date from 11 to 15 January 2027, trips of 6 to 9 days, at most one stop each way and layovers of 8 hours or less.
- Trip.com is checked on every run at 07:00, 13:00 and 19:00 and Google Flights once a day, and the real return flights are confirmed before a price counts.
- Coupons: it reads a few Facebook deal pages for promotions and puts the best usable discount into the maths, so every fare also shows an after-coupon price.
- Koala on Telegram: an alert when a fare beats the lowest seen, a summary after each scan, and answers to “price” or “scan” at any time. Koala runs as a Hermes agent on the Mac's UTM VM.
- Flexible: origins, destination, dates, trip length, stops, layovers, budget and baggage rules are a few lines of settings, so the same monitor can watch any other route.
Why a real browser
Trip.com, Skyscanner and Google Flights offer no open API or MCP for this. An Android emulator on the Mac mini still gets flagged as a robot, so the most reliable helper is Playwright: it opens the real web pages in a browser and reads them, slowly and only a few times a day. When a site asks for a human check, Koala stops and leaves it to a person.
What went wrong, and the fix
- Google Flights stopped returning results; it looked like a block but Google had changed its API. Fix: an updated search library.
- Scanning every two hours made Trip.com show a slider puzzle. Fix: three scans a day, slower requests, and the scan stops for a person to solve the puzzle. It never tries to get round it.
- Outbound prices alone were misleading: one cheap fare flew home from a different Shanghai airport. Fix: the real return legs are checked.
- The Mac's scheduled jobs fired in US Pacific time. Fix: a watchdog that checks every 10 minutes and starts scans in the right slots.
- A power cut left the VM switched off. Fix: the watchdog starts it again.
- Skyscanner blocks automation, so it is not used.
Why it matters
Fare hunting is tedious and easy to get wrong. A small agent that checks every combination, explains its picks and only pings when something is genuinely cheaper takes the chore away, and it keeps a person in the loop for the parts a person should do.