credential & editorial — each shows place coverage · cities · avg trust. Click a layer for the per-outlet breakdown. Watch these grow as sources improve.
click to open a city in Explore · click a header to sort
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, 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…
Calibration sandbox
How to calibrate: 1 — label reference places you know (open one in Explore, press 1–5). 2 — drag the cut-points to push agreement up and the whole-universe mix toward something sane. 3 — Apply. Cuts set the tier boundaries on cohort-percentile; they fix a global +1/-1 offset, not individual rank errors. Nothing saves until you Apply.
Your calibration labels
verdicts you’ve set · engine-vs-you disagreements float to the top
Confidence model
exactly how the engine decides how sure it is — and how often each leg is the deciding factor. Nothing here is hidden.
loading…
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. Use the Calibrate tab's sandbox if you want to preview cut changes before committing.
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)
The three confidence legs
E (evidence) = min(e_max, Σ trust-weighted merit evidence ÷ E_saturation) A (agreement) = 1 − agreement_k · min(pos,neg) ÷ (pos+neg) // 0 if no merit signal C (coverage) = min(1, cov_w_credential·[has credential] + cov_w_voices·[has gem/nope voices] + cov_w_evidence·[evidence > cov_evidence_min]) confidence = the weakest of E, A, C// LEAST() — a place is only as sure as its flimsiest leg
How the tier is decided (in this order)
1. closed, or min(E,C) < confidence_gate → no tier (not yet rated) 2. ≥ nope_min_voices nope-voices AND net merit < nope_hard_merit_max → Nope (1) 3. ≥ nope_min_voices nope-voices AND merit < nope_merit_max AND attention ≥ nope_attn_min → Worth Trying (2) 4. otherwise by cohort-percentile vs the cuts: ≥ cut_t5 → DAF(5) · ≥ cut_t4 → Delicious(4) · ≥ cut_t3 → Damn Good(3) · ≥ cut_t2 → Worth Trying(2) · else Nope(1)
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.