尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Before you sign the lease or take the shift, see who failed here before you, and why.
Every business that closed at an address, checked twice, with the reasons as evidence-backed hypotheses. Every company behind a venue, and whether it is still alive. Code finds every fact, Gemini explains them, and a second check makes sure a "closure" isn't just a new company behind the same restaurant.
· Built for Encode London Hackathon 2026 — track: The Real World
· MongoDB Atlas + Google Gemini (gemini-4-argon)
🎬 Demo video (3 min): https://www.youtube.com/watch?v=xyGk52dv0rI 📊 Pitch deck: Google Slides 🌐 Live app: https://tell-me-why-henna.vercel.app
| Try it live | What you'll see |
|---|---|
| Open a venue: a coffee shop on Pitfield Street | direct competitors, what they charge, the rating bar to beat, closures nearby ($geoNear, $median) |
| Case file: 14 Rivington St | two restaurants in a row, each closure checked against Google; Gemini's hypotheses with evidence and a counter-argument |
| Ask the analyst: "fried chicken closed fast near Old Street" | Gemini picks MongoDB tools itself and lists every query it ran: Hybrid Search ($rankFusion), $geoNear. Takes ~15 s |
| Take a job: Schnitzel Heaven | the company behind it was dissolved while the venue still trades: amber, not red |
We signed for a unit. It looked right: good street, fair rent, a restaurant had been there before. Nobody told us it did not have the permissions our concept needed. We found out after signing — and finding out cost us a lot of money.
That is how small business owners learn this: the hard way, one lease at a time. Chains pay consultants and location-intelligence platforms ("price on request") to see this. A first-time owner has the landlord's agent — the side that wants the deal signed.
Tell Me WHY helps you choose the right place: who was here before you, what went wrong for them, and what to check about the space before you sign.
I wasn't paid for my work. The company that employed me had been dissolved — and I didn't know. The restaurant kept trading. The owners simply moved it to a new company and carried on. Other people kept coming in for extra shifts, not knowing they would never be paid either: their employer, on paper, no longer existed. The only trace is in Companies House — if you know to look, and know what you're looking at.
Tell Me WHY lets anyone check a venue before the first shift: has the company behind it changed, did the old one disappear while the venue kept trading, and what to ask before you start.
Why me: 15+ years in hospitality, 7 venues opened in several countries — and both of these happened to me.
| 🏪 "I'm opening a venue" | 🧑🍳 "I'm taking a job" | |
|---|---|---|
| Asks | Who failed at this address before me, and why? | Is the company behind this venue still alive? |
| Enters | a street, address or venue name | a venue name |
| Gets | a map of closures + a case file per address: the chain of companies, how long each lasted, whether the closure is confirmed, 2–3 hypotheses for why with evidence, confidence and a counter-argument | a traffic light with signals from public records, questions to ask before the first shift, and where to get help (Acas, HMRC, Redundancy Payments Service, Citizens Advice) |
Traffic-light rule (worker mode): 🟡 needs verification for anything inferred from company changes — it is a signal, not a fact. 🔴 only when Companies House confirms an insolvency procedure (liquidation, administration, receivership). 🟢 when our data shows no signals, which is not a guarantee.
A real case file — 14 Rivington St, Shoreditch (210 m from Encode Hub). Dates are the companies' registration and dissolution, not the venues' trading life — we never present one as the other:
A real employer check — Schnitzel Heaven, 57 Pitfield St: 🟡 needs verification — three food companies registered at the address since 2019 (two of them look like venues); the latest one was dissolved in Sept 2026 while the venue still trades (FSA + Google). For staff: ask who your employer is on paper.
Eight screens, light and calm, built mobile-first (people open it from a QR code in the room):
venue.html) — one page per café, restaurant or bar (1,102): Google rating and reviews, FSA hygiene, price, who runs it (every food company at the address or under its trading name, active and dissolved, with dates — found for 400 venues — and the likely operator where the match is strong, 98 so far), what guests praise and criticise (Gemini, every quote checked), who comes, opening hours and what it offers, its direct competitors within 300 m on a map and in a table, the neighbourhood mix, the street by the hour and over the years, and what closed nearby.here.html, the QR code in the room) — no typing: the case files within a short walk of Encode Hub."Will the space work for your concept?" A previous restaurant is not proof that yours is allowed. The case file separates three checks — lawful use class (old A-classes vs. today's Class E), installed extraction, and suitability for your equipment — and changes the questions for a coffee shop, a bakery with on-site baking or a hot kitchen. Each stays Not verified / Assessment needed until documents exist; official guidance (GOV.UK, Planning Portal, HSE, Hackney) is linked.
scripts/verify_closures.py) — see below.app/data/), so pages open without waiting on the database. Live questions go to Atlas through Vercel functions: competitors and venue reports (/api/venue), Ask the analyst (/api/ask) and the live closure (/api/demo-closure, /api/live).Restaurants change the company behind them all the time: new partners, tax, restructuring. If we called every dissolved company a closure, the board would be full of "failures" that are still serving dinner. So every company in every chain is checked against the real world before it counts:
CLOSED_PERMANENTLY, CLOSED_TEMPORARILY or OPERATIONAL? (results cached, so re-running costs nothing; --refresh re-checks)We check the 146 companies registered at the 112 case-file addresses. Most of the 6,544 dissolved food & drink companies we loaded sit elsewhere, often at accountants' and registered-office addresses.
| Verdict | Meaning | Shoreditch | Richmond | Total |
|---|---|---|---|---|
closed_google | closure confirmed by Google | 4 | 0 | 4 |
operating_now | same venue still trading — company changed, not a closure | 9 | 10 | 19 |
no_trace | name looks like a venue, no trace anywhere — probably closed | 19 | 14 | 33 |
unclear | no trace and the name doesn't say what it was — not counted as a closure | 51 | 39 | 90 |
| 83 | 63 | 146 |
Each address then gets a label that describes its history, not the venue today: Closure confirmed (3) · Likely closure (31) · Unverified (67) · New company, same venue (11). The venue's status today is shown separately.
The same verdict means different things to different people: for a tenant, operating_now is good news (the place survives); for a worker, it is a red flag (the employer company is gone while the venue trades on).
| Model | gemini-4-argon via the Gemini API |
| 1 · Case files | turns a fact sheet about one address into a case file: headline, hypotheses with evidence / confidence / counter-argument, chain pattern, caveat. Structured output (responseMimeType: application/json + responseSchema), temperature 0.3 — scripts/gen_reasons.py |
| 2 · Guests' own words | reads reviews and returns quotes for each customer segment and what guests praise or criticise; every quote is checked word for word by code. Structured output, temperature 0.1 — scripts/gen_audience.py, scripts/gen_review_themes.py |
| 3 · Ask the analyst | a live agent: function calling over three MongoDB tools, it decides what to look up and cites case files. Temperature 0.2 — api/ask.js |
The hygiene register and Google Places describe the same places under different names (YAYACAS vs YAYACAS Authentic Greek Restaurant). In Shoreditch & Hoxton, scripts/build_venues.py merges them by similar name within 60 m (274 venues), searches Google by name for FSA venues without a match (47 found) and asks the free FSA API about Google-only venues (116 found). Result: 851 food & drink venues around Encode Hub, 409 with both a Google rating and an FSA hygiene score; the rest say honestly what is missing. With Richmond & St Margarets, 1,102 venues. Each venue gets a concept from its primary Google category, FSA type and name — a cinema with a café counter is not a coffee shop.
Many first-time owners learn too late that the street empties after 18:00 — and that daytime trade alone won't pay the rent. Real footfall counters (Huq, MyTraffic, Placer.ai) are paid, so we use open proxies and say so:
scripts/gen_hours.py): opening hours of every trading venue within 150 m, counted hour by hour for weekdays and weekends. At 57 Pitfield St, 9 of 10 neighbours are open at 13:00 and 6 at 21:00.scripts/gen_footfall.py): TfL Annual Station Counts 2025 — Old Street, 430 m away, has 57,204 entries and exits on a typical weekday and 41,011 on a Saturday — plus the station's typical busyness by hour from the TfL Crowding API.Each of the 1,107 Google venues in Shoreditch & Hoxton gets up to three customer segments (office workers, evening crowd, families, regulars, visitors, remote workers, students) as a hypothesis with confidence:
scripts/gen_audience.py.operating_now is never called a closure; unclear is never called a closure; confidence can't be high unless a closure is confirmed by Google.⏳ Not yet: automatic post-checks of every number in the output and a blind evaluation against a code-only template (the approach that worked in my previous hackathon project). Planned next.
Database deadspot on Atlas, two areas: Shoreditch & Hoxton (around Encode Hub) and Richmond & St Margarets.
| Collection | What | Shoreditch | Richmond | Total |
|---|---|---|---|---|
places | FSA food hygiene register (E1, E2, E8, N1, EC2 · TW1, TW9, TW10) | 3,937 | 509 | 4,446 |
google | Google Places venues: hours, price range, rating, reviews, customer segments (audience, Shoreditch) | 1,107 | 249 | 1,356 |
companies | dissolved food & drink companies, Companies House | 6,302 | 242 | 6,544 |
stations | TfL tube and rail stations | 54 | 9 | 63 |
areas | ONS Census 2021 by LSOA: age, employment, tenure | 174 | 42 | 216 |
cases | case files: chain, verification, context, Gemini analysis | 61 | 51 | 112 |
venues | merged FSA + Google venues with concept, ratings, price, hygiene, and the companies behind each (companies: 4,472 active and the dissolved ones, matched by address and trading name) | 851 | 251 | 1,102 |
occupancy_events | time series: companies opening and closing, per street | 710 | 164 | 874 |
closure_events, alerts | live closure events and the alerts they raise | empty until a closure |
| Atlas feature | Role in the product | Status |
|---|---|---|
| 2dsphere geo indexes | competitors within 200–500 m, neighbours of a case file, nearest stations ($geoNear, $geoWithin) | ✅ live |
Vector Search + Automated Embedding (cases_autoembed, Voyage) | find case files by meaning; embeddings recompute whenever an analysis is rewritten | ✅ live |
Atlas Search (cases_text, google_text) | keywords over case files, company names, venue names and review text | ✅ live |
Hybrid Search ($rankFusion) | Ask the analyst: keywords and meaning fused into one ranking, then a geo filter. "fried chicken shop closed fast" → 29 Pitfield St (Taste of Tennessee → Hot Fried Chicken), ranked 1st by both | ✅ live |
| Change Streams | /api/live long-polls alerts; a new closure turns the nearby pin red on screen | ✅ live |
Time Series + window functions (occupancy_events, $setWindowFields) | the street over the years: openings, closings and 3-year churn per street | ✅ live |
Aggregation ($median, $group) | competition level, typical price, rating bar for Open a venue and the analyst | ✅ live |
Stream Processing (scripts/stream_processor.json, workspace tellmewhy, SP2) | closure event → $lookup over case files with the distance computed inside the processor (≤ 150 m) → $merge into alerts, inside Atlas. A test event on Pitfield Street produced 7 alerts in under 2 seconds | ✅ live (the API keeps an api-fallback path if the processor is stopped) |
/api/ask gives Gemini (gemini-4-argon) three tools — find_place, search_cases (Hybrid Search + geo) and area_stats ($geoNear + $group) — and lets it decide which to call. The answer cites case files, and the screen lists every MongoDB query the analyst ran with its timing, so a judge can see that the numbers come from the database, not from the model.
A protected button (only on the stage screen, ?demo=<key>) inserts a simulated closure event into closure_events. Alerts for case files within 150 m land in alerts; the app is subscribed through a Change Stream, so the pin turns red and a notification appears within a second or two. The alerts are computed by Atlas Stream Processing (closures_to_alerts), and the notification says so.
npm run dev
Opens on http://localhost:3000: the screens come from design/, the data and shared logic from app/ (site.config.js). npm run build assembles the same site into public/ for Vercel. The API needs npm install (MongoDB driver) and the variables in .env.example.
API (Vercel functions in api/):
on Atlas — /api/venue?id=fsa-1794844 · /api/ask?q=… · /api/live; on the snapshot — /api/cases · /api/cases?level=confirmed · /api/case?id=14-rivington-st-EC2A3DU · /api/employer-check?q=Schnitzel%20Heaven · /api/employer-check?id=57-pitfield-st-N16BU — contract in docs/API.md
Data pipeline (Python 3, pip install pymongo):
scripts/collect_*.py → data/ (FSA, TfL, Google Places, Companies House, ONS)
scripts/load_atlas.py → MongoDB Atlas (database deadspot) + geo indexes
scripts/build_cases.py → chains of companies per address
scripts/verify_closures.py → verdict for every company (Google Places + FSA)
scripts/gen_reasons.py → context + Gemini hypotheses, exports app/data/cases.json
scripts/create_search_indexes.py → Atlas Search + Vector Search indexes
scripts/street_history.py → time-series events + window functions
scripts/build_venues.py, gen_audience.py, gen_hours.py, gen_footfall.py → venues, customers, hours, TfL
Secrets live in local git-ignored files (*_key.txt, atlas_user.txt, atlas_password.txt) — never in the repository.
unclear and are not shown as closures.scripts/areas.py plus the same pipeline. The sources are national, so the method scales; the dataset doesn't yet.✅ Done:
design/ the site: pages, styles, plan.js (Open a venue, Ask the analyst, venue report, live alerts), assets
app/ data snapshot (data/) and shared logic (lib/employer.js, also used by the API)
api/ Vercel functions: on Atlas — venue, ask, demo-closure, live; on the snapshot — case, cases, employer-check
docs/ API contract, front-end components, diagrams
scripts/ data pipeline, one script per step (see scripts/README.md)
Solo build. Product, data decisions and hospitality know-how: Julia. Code and data pipeline written with Claude Code; design prototype made with ChatGPT. Every number in this README was checked against the data.
MIT © 2026 Julia Zabrodska