The Doozer Brainlive from the knowledge bundle · v2.2.697 · 2026-10-29 10:59 ETall pages · one page

The Menu Finder

systems/menu-finder.md · System · menus, enrichment, review, business-site, acquisition, security

status: draft · written by claude-opus-5-5 on 2026-09-25 · stale after 2027-01-01

When a real person visits a restaurant page with no menu, Doozer reads the restaurant's own website for it, for free, and stages what it finds for review. Nothing goes live until approved.

The Menu Finder

"If they're looking for a menu, show it to them. If we don't have the menu, get it." In September 2026, 1,224 live food and drink sites had a website we could read and only three showed a menu. The Menu Finder closes that gap without spending money and without publishing anything nobody checked.

How it works

includes/menu-acquire.php.

  1. Earned by a visit. When a person (not a crawler) opens the page of a food or drink
  2. business that has its own website and no approved menu, the page queues one job. The page itself does only in-memory checks; the crawler check, a once-a-day marker and the caps (60 a day, 12 an hour) run after the response is sent. Each business is tried at most once every 30 days.

  3. Read the business's own site. Raw HTTP only, no paid API. At most four pages in
  4. twenty seconds: the homepage, then the page its "Menu" link points to. It trusts, in order: schema.org Menu data, known site-builder markup (Wix Restaurants, BentoBox), then "name ... price" lines on the menu page. A page of text becomes a menu only with at least five priced items that pass a strict junk filter. PDF menus and ordering links (Toast, ChowNow, DoorDash storefronts and so on) are kept as links, never parsed.

  5. Stage, never publish. Items land in enrichment.scraped_menu, and the business
  6. appears in the Enrichment Review queue under "Found on their website".

The approval gate

includes/enrichment-trust.php. A menu or product list reaches a page, its structured data or its price range only while it matches the stamp written when the operator approved it on the review page. Before this existed, the scraper wrote straight onto live pages: 34 sections were unreviewed, and most were junk (a deli's gift card as its "menu", a law firm's sentence about nursing-home costs, a hijacked domain's gambling spam). Those came off the pages the day the gate shipped and wait in the queue.

Notes for the reviewer

Each staged menu also carries notes the live page never reads, and the review page shows them:

Before staging, four rules measured on those 3,816 lines drop add-on sections, cut-off fragments and descriptions in the name slot, and turn bare sizes ("Half Loaf") into "Garlic Cheese Bread (Half Loaf)". They removed 70 lines, all junk.

What to expect

A survey of 40 live restaurant websites (September 2026):

Safety

A business's website is third-party data, and so is every redirect and link it offers. includes/net-guard.php resolves each host before connecting and refuses private, loopback, link-local (cloud metadata) and carrier-NAT addresses and odd numeric forms. It allows ports 80 and 443 only, and pins the connection to the vetted address so DNS cannot change its answer between the check and the connect. The older site scraper and the structured-data fetcher go through the same guard. Parsing is bounded by the page's shape, not only its size.

Operating it

Other reads a visit earns

includes/visit-reads.php applies the same gate to two older reads that had no trigger at all:

dz visitreads shows what visits have earned; on=0 stops it.

Related: Live Composition, which may lead a page with the menu only once it is approved.

← The Growth Engine — observe → serve → convert → learnThe Muse System →