Case: buydubai.io
Checked 25 Oct 2026, Dubai time (UTC+4). [V] I checked it this run. [R] from a team report. [U] unverified. Project locations are in PROJECTS.md.
Level 1: For someone who does not work with data
What it is. buydubai.io is a website about buying property in Dubai. Its pages are built from Dubai Land Department records: who sold what, where, for how much, and when.
Why that matters. A normal property site writes about Dubai. This one counts. Last week, its own file says, there were 2,413 sales worth AED 6.03 billion; 131,653 sales so far in 2026 (to 22 Oct). [V, llms.txt] Those counts change, so the pages change.
What "data layer" means here. Think of a spreadsheet that every page reads from. A page does not say "JVC is popular". It says how many homes sold there in the last 12 months, at what median price, and gives the date the figures were taken. If the spreadsheet changes, the page changes. Nobody retypes numbers.
How it is kept honest. Before a page goes live, a checker reads every number on it and confirms it matches the spreadsheet. A second checker scores the page out of 100 and refuses anything under 85. [R]
What has happened since launch. Search Console shows 69 clicks and 6,249 impressions from 15 to 24 Oct. ChatGPT sent 78 visits and Google search 77 between 20 Sep and 25 Oct. [V, Supermetrics read-only] These are small numbers. They show the pages can be found and cited within days. They do not show scale.
What is not good enough yet. Most of the site's pages (agents, and about 90,000 unit pages) are not covered by the checker. Some pages are thin. Some say "updated every morning" when the numbers are three days old. We know, and the fixes are ranked in 20-scorecard.md.
Level 2: For a businessman
The asset. A joined-up Dubai property dataset that competitors do not publish in one place: sales, leases, buildings, developers, schools, photos. The pages and the AI assistant (Dalia) both read it. [R]
The bet. Content that changes every day, with facts nobody else has, gets found by Google and quoted by AI assistants. Early signal: first Google organic visit 17 Oct, first ChatGPT visit 19 Oct, 77–78 visits each from the two sources in five weeks. [V]
Scale.
| Measure | Value |
|---|---|
| URLs in main sitemap | 8,156 [V] |
| of which agent pages | 5,931 (72.7%) [V] |
| Unit pages in separate sitemaps | about 90,000 [V] |
| Community pages checked | Business Bay, JVC, Town Square, Motor City, Arjan, Dubai Marina (all carry manifests) [V] |
| Facts in the staged cube | 9,645,491 rows, 1,009,660 suppressed (24 Oct) [R] |
| Towers and buildings | 1,366 tower pages live per llms.txt [V]; 6,166 buildings in the staged registry [R] |
Cost. Photos from Google Places are the only paid input I found. The log shows 178 records with a cumulative maximum of about USD 0.78 against a USD 10 per community cap. [R] Most data is public record.
What gives the moat. The work of joining sources and keeping each number traceable. That is slow to copy. The raw records are not secret.
Risks that could hurt the business.
| Risk | Why it matters |
|---|---|
| Google treats thin pages at scale as spam | 5,931 agent pages and about 90,000 unit pages are template-built with little unique text. Google says such pages can be excluded from Search. [V] A wide exclusion would hurt the good pages too. |
| A wrong number on a public page | No trace for pages outside the checker. |
| Freshness claims that are false | "Updated every morning"; some pages are 3 days old. [V] |
| Rights on listing and photo data | Policy decided 24 Oct, not yet built. [R] |
| One person and one machine | Deploys run from MacPro. [R] |
What to decide. Whether the agent and unit sets stay indexed. The cheap, reversible move is to remove them from search for four weeks, keep the community and tower pages, and measure.
Score today: 5.6 out of 10 (20-scorecard.md). Design 8, delivery 5.
Level 3: For an engineer
Architecture
Locations: PROJECTS.md.
Pieces [R unless marked]
- Cube.
facts.parquet+cube_meta.json, DuckDB,fact_id,cube_hash,sales_as_of. 23 Oct cube: 9,600,087 rows, 192 (metric, slice) pairs, 25 inmetrics.yaml, not reproducible (13,547 rows differ), 972 NULLfact_id. Staged rebuild 24 Oct: 9,645,491 rows, 1,009,660 suppressed,cube_hash 74bc4c52…65b3a6, 0 diff, 0 NULL IDs, 0 duplicate IDs. - Registers. 186 communities, 6,166 buildings, 61 mapped page folders, 3 retired, 0 unresolved;
verify_registry_formulas.py27/27. - Page contract.
<script id="facts-manifest">JSON plusdata-fact-idattributes. Six sampled community pages carry 17 to 61 fact IDs and three ld+json blocks. [V] - Lint
lint_pages.py(21 Oct). At least eight checks. No manifest while printing numbers fails (24 Oct). Mutation-tested. Skips/developer/since 25 Oct. [R] - Eval
community_eval.py. 0–100: Data 35, Content 30, Place 20, Quality 15. Pass 85. Town Square scores rose across 25 Oct runs; see10-gully-audit.md[R]. - Release.
deploy_ts_gated.sh(25 Oct 10:41),deploy_community_gated.sh(11:32),deploy_fulltree_gated.shandrelease_full.sh(12:28). Dailyio_release.sh. [V mtimes] - Deploy. Last production deploy
dpl_HAJpdQ2MRGrvu3Uyq9hcfhCf1z4K, 25 Oct 12:23 Dubai time. [V]
Live state vs the design [V, 25 Oct]
| Check | Result |
|---|---|
| Homepage | 200, last-modified 12:26 Dubai time |
robots.txt |
allows GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended |
sitemap.xml |
8,156 URLs; lastmod 23 Oct 8,040; 24 Oct 35; 25 Oct 81 |
sitemap-index.xml |
names only sitemap.xml |
sitemap-units-1.xml, -2.xml |
200; 45,000 URLs each; not in index or robots |
llms.txt |
4,265 B; "Data from 2026-01-01 to 2026-10-22… rebuilt (2026-10-23)"; says 17 communities |
llms-full.txt |
404 |
| Cube hash on live pages | 661f7039… on Business Bay, JVC, Motor City, Arjan, Dubai Marina; 74bc4c52… on Town Square |
Placeholder "not shown yet" and 0 data-fact-id |
Discovery Gardens, JVT, Dubai Silicon Oasis |
| Agent pages | no manifest, no fact IDs; about 5,000 characters of text |
| Unit page sample | 200, index, follow, canonical, no manifest, 3 ld+json |
Defects, in order of cost to fix
- Orphan unit sitemaps (decide: restore into the index with a gate, or remove).
- Agent pages outside the lint.
- Two cube hashes live.
- Three placeholder community pages.
llms.txtcounters 2–3 days old and "17 communities" while the navigation lists more.- Nightly job fails silently: failed 21 and 24 Oct,
last_goodrestored, no page change. - 25 of 192 (metric, slice) pairs registered (23 Oct) and builders do not yet read the register.
- Link rates: sales to tower 75.5% (did not reproduce; 14.1% in another report), leases to building 30.8%, PF to DLD 84.3% vs 73.4% unexplained.
- Auditor-logged gate holes: eval check by
grep PASS; exclusions enforced at depth 1; 17,193 Traks-only edits in the overlay [U: figure not re-found].
What to copy from this build
Cube with row IDs and hash; manifest in the page; lint that fails closed; independent auditor; spend gate; deployment ids recorded; honest limits written into copy.
What not to copy
Wiring gates after publishing. Two sources of numbers on one page (hand-typed 1,296 vs cube 1,273 on JVC). A named person's quote written by a template.
Traffic [V, Supermetrics read-only]
GSC buydubai.io 15–24 Oct: 69 clicks, 6,249 impressions. GA4 20 Sep–25 Oct: direct 96, chatgpt.com 78, Google organic 77. First Google organic 17 Oct; first ChatGPT 19 Oct. [V] Direct may include our own tests [U].
Against outside cases (../research/cases.md)
- Closest survivors own the data (Zillow, Nomad List, Ramp). buydubai's DLD records are public, so the moat is the join, the lineage and the daily refresh, not the raw rows. The Wise case (about -40% from peak, cause unconfirmed) shows what happens to commodity data.
- The dead-tail study (96.7% of 12.3M pages at 100 visits a month or less) argues for pruning the agent and unit sets before scaling them. Third-party estimates, vendor-run.
- National Today is the loss case. It had no proprietary data. buydubai does, but the agent pages have none of it.
- Competitors expose DLD data to agents already (dxbdata.io via MCP). Source:
../research/cases.mdrow 13. - Official guidance on llms.txt and structured data:
../research/best-practice.mdsection 1. Google says it does not use llms.txt; the data layer should not lean on it.