Skip to content

86larryli/CheapBite

Repository files navigation

CheapBite icon

CheapBite

Find the cheapest place to order pickup — right from a Google Maps listing.

CI License: MIT Manifest V3

Restaurants mark menus up 15–25% on Uber Eats / DoorDash / Grubhub to offset platform commissions, so the same food costs very different amounts depending on where you order — and the cheapest channel (often the restaurant's own "Direct" site) varies by restaurant. CheapBite finds it for you.

How it works

  1. Detect — on a restaurant's Google Maps listing, CheapBite adds a "Compare pickup prices" button.
  2. Discover — it reads Google's "Order online" page to find every ordering channel: the delivery aggregators and the restaurant's own Direct site.
  3. Gather — on your click, the service worker opens each channel's menu in a short-lived background tab, reads the items and prices, and closes it.
  4. Rank — it matches items across channels and shows each one's estimated markup vs. the cheapest (the Direct site is preferred as the baseline), flagging anything it couldn't read and disclosing any service fees.

Everything runs locally in your browser — there's no server. See PRIVACY.md.

Supported channels

Direct (the restaurant's own commission-free ordering — usually cheapest): Clover · Toast · DoorDash Storefront (order.online) · Chowbus POS · MealKeyway / MenuSifu · BeyondMenu · ChowNow (incl. "ChowNow Local") · Grubhub Direct (*.dine.online).

Delivery aggregators: DoorDash (+ Caviar) · Uber Eats (+ Postmates) · Grubhub (+ Seamless) · Fantuan · HungryPanda.

New channels are added as adapters — see Contributing.

Install

From the Chrome Web Store: coming soon.

From source (for development):

git clone https://github.com/86larryli/CheapBite.git
cd CheapBite

Then open chrome://extensions, enable Developer mode, click Load unpacked, and select the extension/ folder. Open a restaurant on Google Maps and click Compare pickup prices.

Development

npm ci
npx playwright install --with-deps chromium

npm run lint        # ESLint
npm run test:ci     # deterministic test suite (the CI gate)
npm test            # everything, incl. live tests
npm run package     # build dist/cheapbite.zip for the store
npm run icons       # regenerate icon PNGs from extension/icons/icon.svg

The deterministic tests run each adapter and the matching logic against captured HTML fixtures with the network blocked. The live: end-to-end tests drive real Google Maps + ordering sites and are excluded from CI (manual smoke tests).

Architecture

CheapBite is plain JavaScript with no build step — a deliberate choice for fast load-unpacked iteration (ADR-0005). The design and its rationale are written down:

  • CONTEXT.md — vocabulary (Channel, Direct, Adapter, Upcharge, …)
  • PLAN.md — flow, scope, and phased build
  • docs/adr/ — architecture decision records

Contributing

Contributions — especially new channel adapters — are welcome. See CONTRIBUTING.md for the dev setup and a step-by-step adapter guide. Releases are documented in docs/RELEASING.md.

Privacy

CheapBite collects nothing and has no backend; it only reads public menu pages locally to build the comparison. Full policy: PRIVACY.md.

License

MIT © Larry Li

About

Chrome extension that finds the cheapest place to order pickup from a Google Maps listing — surfacing the restaurant's own ordering site over delivery aggregators.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors