MooFlights is a Chrome and Firefox browser extension for mileage earning estimates, Google Flights country price checks, and ITA Matrix workflows.
It helps with:
- Show estimated mileage earnings in the ITA companion panel and first-page search results.
- Compare Google Flights booking-page offers across selected countries while keeping currency fixed.
- Open prefilled Where to Credit links for fare-class lookup.
- Rank curated booking links by local confidence.
- Filter and insert airport codes on ITA search pages.
The extension is AGPL-3.0-only open-source software owned by Mu Travel LLC. The optional hosted MooTravel backend is separate closed-source infrastructure.
On Google Flights booking pages, the extension can compare booking offers across your selected country markets while keeping the displayed currency fixed. This helps surface cases where the same itinerary is cheaper from another country page, while still showing the direct airline price for comparison.
On ITA Matrix itinerary pages, the extension estimates mileage earning from the captured booking class, fare, and local earning snapshot. Revenue-based programs can use FX estimates when ITA prices the fare in a non-USD currency.
Install MooFlights from the Chrome Web Store.
For manual Chrome installation, check the latest release and download the packaged extension.
bun install --frozen-lockfile
bun run buildLoad dist/ as an unpacked extension from chrome://extensions.
For a local Firefox package:
bun run package:firefoxLoad the generated artifacts/mooflights-firefox-<version>.xpi as a temporary add-on from
about:debugging#/runtime/this-firefox. The XPI is unsigned; user distribution still requires Mozilla Add-ons signing.
For development:
bun run devReload the unpacked extension after rebuilds.
For browser-extension E2E tests:
bunx playwright install chromium
bun run test:e2eThe default Playwright suite builds and loads dist/ into Playwright's bundled Chromium, then uses routed ITA Matrix and Google Flights fixture pages so CI does not hit real travel sites. During local development, prefer these Playwright tests for repeatable extension QA before falling back to manual Chrome checks.
To smoke-test real sites locally, run:
bun run test:e2e:real
MOOFLIGHTS_REAL_GOOGLE_FLIGHTS_BOOKING_URL="https://www.google.com/travel/flights/booking/..." bun run test:e2e:real
MOOFLIGHTS_REAL_COMPARE_E2E=1 bun run test:e2e:realThe Google Flights smoke test defaults to a generated future-dated one-way TPE-NRT booking URL. Set MOOFLIGHTS_REAL_GOOGLE_FLIGHTS_BOOKING_URL to override it with a copied booking URL. The real compare-flow smoke starts from US and opens CA and ZA comparison tabs only when MOOFLIGHTS_REAL_COMPARE_E2E=1 is set. Real-site tests are opt-in because Google/ITA can change markup, rate-limit, or show bot-detection interstitials.
bun run check
bun run typecheck
bun run test
bun run test:e2e
bun run package
bun run package:firefox
bun run release:package:next-patch
bun run release:package:next-minor.github/workflows/chrome-webstore-prototype.yml is a manual workflow for evaluating automated Chrome Web Store submission. It builds, verifies, packages, uploads the generated package artifact, then optionally uploads the zip to an existing Chrome Web Store item and submits it for review.
The workflow defaults to dry_run: true, which packages the extension and prints the intended store request without contacting the Chrome Web Store API. To run a live upload, configure these repository secrets and dispatch the workflow with dry_run: false:
CHROME_WEBSTORE_CLIENT_IDCHROME_WEBSTORE_CLIENT_SECRETCHROME_WEBSTORE_REFRESH_TOKENCHROME_WEBSTORE_PUBLISHER_IDCHROME_WEBSTORE_EXTENSION_ID
The refresh token must be authorized for the https://www.googleapis.com/auth/chromewebstore OAuth scope.
By default, live submissions use STAGED_PUBLISH, so Chrome Web Store approval stages the update for a later manual release instead of immediately publishing it. Use upload_only: true to upload the package without submitting it for review.
GitHub releases attach Chrome zip/CRX packages and the unsigned Firefox XPI for the same source version. Firefox user distribution still requires Mozilla Add-ons signing.

