Track a list of personal flight routes and get a Discord ping when a price hits the historical top three cheapest
Scrape Secret Flying and similar RSS feeds for business class mistake fares under a price threshold
Build a long-running fare history in a Turso libSQL database for later analysis
Run a self-hosted travel deal bot for a small Discord community
You need accounts and keys for Turso, SerpApi, OpenAI, and Discord, plus correct cron and threshold env vars before the first run will be useful.
flight-price-radar is a small background service that watches flight prices and travel deal feeds, then pings a Discord channel when something interesting comes up. It is written in TypeScript and runs on Node.js 20 or newer. There is no user interface: you set it up once with your own API keys, leave it running, and it posts to Discord on its own. It does two separate things. The first is normal fare tracking. You give it a list of flight routes you care about, and it queries SerpApi to read Google Flights prices for those routes on a schedule, by default every six hours. It saves each price in a Turso libSQL database so it can build up a history. When a new price for a route lands in the historical top three cheapest, it sends a Discord alert. A separate table records which alerts have already been fired so you do not get the same message twice. The second job watches travel deal RSS feeds, such as the public Secret Flying and Premium Deals feeds. Every two hours it reads the new items and asks an OpenAI compatible model, by default gpt-4o-mini, to pull out structured details from the description: origin, destination, price, and cabin class. If a deal looks like a business class fare that comes in under a configured price threshold, with the model's confidence above a chosen score, it gets posted to Discord as a formatted webhook embed. Setup is mostly environment variables. You need a Turso database URL and auth token, a SerpApi key, a Discord webhook URL, the RSS feed URLs in a comma separated format, and an OpenAI key for the deal extraction. There are also optional variables for the cron schedules, the price threshold which defaults to 1000 GBP, the minimum model confidence which defaults to 0.8, and a scheduler lease duration. Two SQL migration files set up the tables: tracked_destinations, fare_observations, fare_alerts, business_deals, and job_scheduler_state. The README also lists npm scripts for the common tasks: build, typecheck, test, init the database, seed and sync tracked destinations, backfill old fare data with a bootstrap script, and start the runtime. A troubleshooting section covers a specific Discord 400 error caused by RSS feeds that return dates in RFC 2822 format instead of the ISO 8601 format the Discord embed timestamp field requires.
Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.