credential & editorial — each shows place coverage · cities · avg trust. Click a layer for the per-outlet breakdown. Watch these grow as sources improve.
how many places are rated, how many carry each credential, and how much content we hold (about text · reviews · cuisine · price). Click a header to sort · click a city to open it in Explore.
Explore restaurants
search all cities, or pick one below · click any header to sort · click a restaurant to inspect & label it
min conf 0
choose a city…
Rankings — every standard, side by side
How each place ranks by our computed merit and by each external authority — Infatuation, Michelin, James Beard, North America's 50 Best, Eater 38, Google, Yelp, TripAdvisor. Click any column to sort (e.g. sort by Infatuation to see their top picks). Click a name to open it.
pick a city…
loading…
Tier requirements & calibration
Each tier needs both a score (merit ≥) and a minimum number of independent sources — so a top tier can't rest on a single source. Set values, watch agreement with your labels and the whole-universe mix, then Apply. Min-sources and the Not Sure Yet floor save live; scores apply on the button. Label places you know first (Explore → press 1–5).
Nope — overrated flag its own formula · never changes the tier, only what the user sees
Flags reputable / in-demand places carrying real dissatisfaction signals (overrated mentions, hype complaints, polarized TripAdvisor, sub-7 Infatuation). Tune so it lands on genuinely overrated spots.
Your calibration labels
verdicts you’ve set · engine-vs-you disagreements float to the top
Value book — the single source of truth
Every award, rating level and signal the engine can score, in one place. Value = what a level is worth (you set it; blank = unset, scores nothing). Weight (sources, below) = how much we trust a source; 0 = excluded. Edit a cell, then press Recompute to re-rate.
loading…
Source weight (confidence) — one weight per source · 0 excludes
A 0–1 multiplier on everything a source contributes. This is the single home for source confidence — the crowd platforms sit here at 0 (off).
loading…
Rating scale & publish rules — the public ladder, as data
Each rung's merit cutoff, dots, public copy, and whether it shows on the site. Plus the publish cutoff (how much signal earns a Not Sure Yet vs staying in the hidden backlog) and the Nope override level. Recompute after changes.
How the engine rates
the whole pipeline in plain terms — merit from credentials, absolute cutoffs, the data-gap rule, the family-count confidence, and Nope as a side flag. Nothing hidden.
loading…
The scorecard — what actually drives the rating
the points behind every rating, in plain terms. This is the part you tune. Set values in the Value book tab; tune the tier lines with a live preview in the Calibrate tab.
loading…
— point changes apply after a recompute (auto on edit, or within 10 min). Tier-line changes are instant.
⚙ Advanced — every underlying knob (you rarely need these)
Metrics, formulas & settings — live & editable
grouped by the metric each drives: the formula first, then the settings that feed it (the ones named in the formula are bold/up top, supporting ones below). Edit any value and press Enter (or click away) — the whole universe re-rates instantly. Nothing hidden.
⚠ These are live. A change here re-tiers every restaurant immediately. To tune the tier cutoffs with a preview first, use the Calibrate tab.
loading…
Engine logic — editable config
the mappings & word-lists that turn raw signal into a score: the award classifier, the gem/nope/complaint vocabularies, which categories count as credentials, and how each category routes to a weight. Every row has a plain-English description. Edits are live — the engine reads these directly.
loading…
Engine structure — the fixed shape (read-only)
these are the formulas and decision rules the engine runs. They reference the editable params above by name. They're shown here so nothing that influences a rating is hidden in code — but they're the engine's shape, not numbers to tune (changing them is a redesign, done via migration).
How a fact is weighted
fact_weight = trust × recency_decay recency_decay = min(decay_max_weight, 0.5 ^ (age_in_days / half_life)) // half_life = decay_half_life_days, or decay_half_life_credential_days for credential categories; the clamp stops future-dated facts being amplified above 1.0 trust = the outlet's trust weight from the Source-trust table above (or trust_default if the outlet isn't registered)
Confidence (how sure)
confidence = how many independent credible families back the place // awards · national critic · local editorial · chef 3+ families → 1.0 · 2 → 0.7 · 1 → 0.4 · 0 → needs facts
How the tier is decided
1. closed, or cred_families < min_families_1 → no tier (needs facts / backlog — a data gap to fill) 2. otherwise by absolute merit AND min independent sources: ≥ merit_cut_5 & ≥ min_families_5 → DAF(5) · ≥ merit_cut_4 & min_families_4 → Delicious(4) · ≥ merit_cut_3 & min_families_3 → Damn Good(3) · ≥ merit_cut_2 & min_families_2 → Worth Trying(2) · else (credentialed, under the bar) → Not Sure Yet // cuisine, price & city are filters in Explore, never part of the math. Nope is a separate diagnostic (its own formula) — it never changes the tier.
Ranking basis (eff_pct)
eff_pct = a place's percentile of net merit within its cuisine cohort. For cohorts smaller than cohort_smooth_min_n it blends pct_cohort_blend·(cuisine percentile) + (1−blend)·(global percentile). Cohort = the restaurant's Google primary type (mapped to a cuisine); falls back to 'general' when Google has none.
Category special-cases (which signal does what)
cat 1 = Awards → the Award-classifier config · cat 5 = Local voice → the gem/nope vocabulary · cat 7 review_themes → the complaint vocabulary · cat 11 = Operational status → "closed" when business_status ≠ OPERATIONAL · all other category→weight routing is in the config tables above.
How the universe is built (which restaurants get in)
A discovered candidate is promoted into the universe only if it: resolves on Google Places · is a food/drink place · is open (not CLOSED_PERMANENTLY) · its Google match is within universe_radius_km of the city centre · and it is credentialed (an Award or Critic source) OR has ≥ universe_min_reviews Google reviews. // credentialed places skip the review floor — both gates are editable params above; the rest is identity/dedup, not tuning
Only genuine math is fixed in code: the 0.5 half-life base, the 1.0 ceilings/anchors, and the weakest-link (LEAST) combination. Everything else above is a param or a config row you can edit.
Jobs & schedule — every automated pipe, what it does, when it runs
all — scheduled jobs that feed or maintain the engine, read live from the scheduler. On = enabled · schedule = when it fires · last run = most recent result. Jobs marked paid spend money (Apify / Google API) when they run. Click ON/OFF to enable/disable a job, edit the schedule (5 cron fields) and press set, or open details ▾ to see the exact command each job runs (nothing hidden) and tune any editable settings. Changes are live. The Apify scheduler stays dry-run (plans, spends nothing) until you set its mode to tick.
Each source pulls only our restaurants (by saved URL or name), never whole cities. active on/off · mode: seed = discover by city · url_refresh = by saved URL (exact, ~0 waste) · targeted_name = by name (OpenTable, rated-only) · off · cap = seed depth · batch = restaurants per run · schedule = cron. Plus live coverage & estimated $/mo. The orchestrator reads exactly this table — no hidden behavior.