A portal, not a brochure site. About 1,000 public SSR pages carry the full numbers. Each page has hooks into signed-in tools (map, DLD browser, saved comps, alerts, deal tracker) for buyers, investors and agents. Every value has a source tag. The plan runs as 3 weeks of shippable tickets.
Updated Mon 5 Oct 2026, 12:55 GSTSprint window 5–25 Oct 2026Data SoT DLD + PF matches (ours)Plan host dubai-co-uk-plan.articulate-ai.work (cwdeploy · never here.now)
§0Rules (non-negotiable)
R1 Sales
Every public page has ≥1 portal hook (save, alert, compare, book viewing).
Every hook writes an events row with entity_type and entity_id, and opens a lead path.
R2 Never hide numbers
All KPIs are in SSR HTML tables.
Charts are a layer on top of a table, never the only copy.
No bot/human cloaking.
Every table has a CSV twin under /data/.
R3 Data provenance
DLD wins for price and date. PF wins for unit and floor.
Never average across sources. Area medians are DLD-only.
Every value carries a source tag: ourspubliclicensed, plus [D]/[B]/[A] (DLD data / benchmark / assumed).
DXBinteract = UX inspiration only. We borrow the area×category toggles, scorecard tiles, handover and supply charts. We never scrape, mirror or quote their figures. The DXBinteract MCP may be used internally as a QA cross-check. Its output must never be written into any public table.
§1Portal map: public SEO layer → portal tools → signed-in areas
PUBLIC (SSR, indexable, ~1,000 URLs) HOOKS on every page PORTAL TOOLS (public read, save = sign-in) SIGNED-IN AREAS (RLS)
dubai.co.uk/developers/{slug} ─┐ [Save project] [Alert me] ──► /map?area=&type=&beds= price-change map /app buyer/investor home
dubai.co.uk/master-projects/{slug} │ [Save comps] [Compare] /dld?project=2621 DLD browser 1.66M tx /app/saved comps · projects · searches
dubai.co.uk/areas/{slug} ├─► [Open in map / DLD] ──► /compare?p=2621,3637 side by side /app/alerts DLD-delta alerts
dubai.co.uk/projects/{dld-no}-{slug} │ [Book viewing] [WhatsApp] /calc/cost|mortgage|yield|golden-visa /app/deals my deal tracker + docs
dubai.co.uk/buildings/{slug} │ [Brochure] /investor portfolio + valuations
dubai.co.uk/reports/{yyyy}/{area} ─┘ /agent pipeline · leads · viewings
dubai.co.uk/guides/* · /data/* · /method /ops SLA · attribution · ingest
Role
Gets
Signup trigger
Sales job
anon
All public pages, read-only map and DLD browser, CSV downloads
none
SEO/AIO traffic → hook click
buyer
Saved projects and comps, alerts, calculators with saved scenarios, deal tracker, document vault
Save, alert, book viewing, brochure download
Lead → viewing → offer
investor
Everything a buyer gets, plus a portfolio of owned units: comps-based value, yield and handover tracker
Value plus year. “Not yet published” for off-plan.
Golden Visa eligible share
Derived
mv_project_kpis.gv_share
M-GV badge
Market ours
Sales n (segment), first/last sale
DLD tx (lease-to-own and outliers excluded)
mv_project_kpis
Tiles
Median AED/sqft (all · by beds · off-plan vs ready)
DLD
mv_project_kpis
Table with n per cell. Cells with n<3 show “n=1: 4,915”, not a median.
Median price AED, median size sqft
DLD
same
Tiles
Quarterly median psf + n
DLD
mv_project_quarterly
Table plus chart
All transactions
DLD + PF match (unit/floor)
dld_transactions ⋈ pf_matches
Columns: date · procedure · beds · sqft · AED · AED/sqft · unit · floor · match conf. Excluded/flagged rows go in a collapsed “Excluded (n)” table with the reason.
Comps: 500 m radius, same segment, L24M
DLD
mv_comps
Table of top 10 projects by sales. “Save these comps” hook.
Rent + yield
Ejari + [B] benchmark
dld_rents
M-YLD with label
Conflicts
Unit counts / storeys by source
ours
source_conflicts
M-CONF box: every source with its value. Never silently resolved.
Save project · Alert on new sale · Save comps · Open /dld?project={no} · Open /map?project={no} · Book viewing · WhatsApp · Brochure (sign-in if licence-gated)
§6T-BLD building /buildings/{slug} and the unit view (portal)
Field (T-BLD, public)
Source → table
Name, project link, DLD building name, PF building URL
buildings
Floors, units, completion year, height m (OSM)
buildings, osm_buildings
Floor-band median psf (L1–5, 6–15, 16–30, 31+) with n
mv_building_floorband (PF floor × DLD price)
Unit table: unit · floor · beds · sqft · last AED · last date · n sales
pf_matches ⋈ dld_transactions. Only matched pairs.
Repeat-sale pairs (buy → sell, CAGR)
mv_unit_history (history_n ≥ 2)
Rent by beds; yield; service charge
M-YLD, service_charges
Overlays as T-PRJ (inherits the project lat/lon)
§7
Unit view /app/units/{unit_key} (signed-in, noindex)
Why gated
Full matched history for one unit, plus a comps-based value band (P25–P75 psf × size)
Unit-level focus is a lead signal (owner or buyer). Saving requires an account.
“I own this”: adds the unit to the investor portfolio, with valuation alerts
Investor acquisition (resale and rental mandates)
“Ask agent about this unit”: lead with unit_key
Highest-intent lead
Public pages still show each unit's sale numbers in the building table (R2). The gate covers only tools and saving, never the data.
A module is a server component <Overlay id="M-XXX" entity={…}/>. It reads (entity_type, entity_id, lat, lon) and renders an SSR table and a source line (“Source: KHDA 2025-26 · checked 2026-10-05”). If it has no data, it prints “No data: {reason}”. It never disappears silently.
ID
Module
Data source (type)
Ingest / API → table
Render rule (SSR)
Attaches to
Schema
Wk
M-LOC
Location
public OSM (Geofabrik GCC extract), DLD nearest_metro / nearest_mall / nearest_landmark, our geocode
osm2pgsql → pois, osm_buildings. PostGIS ST_Distance → entity_distances
Lat/lon, nearest metro (m, walk min at 80 m/min), straight-line distance to Burj Khalifa, DIFC, DXB, Dubai Marina. Static SVG map (Protomaps PMTiles, self-hosted). No Google tiles.
MP, AREA, PRJ, BLD
Place + GeoCoordinates
2
M-TRF
Traffic / commute
public OSRM on OSM (free-flow); RTA Salik gate list. licensed TomTom Matrix or Google Routes for live peak times (signed-in only, not cached)
OSRM container → drive_times(entity, anchor, mode, min_freeflow, km, salik_gates) for 8 anchors: DIFC, Downtown, DXB, DWC, Marina, Internet City, Dubai Hills, the entity's top-rated school
Public table: anchor · km · free-flow min · Salik gates · Salik AED per trip, labelled “free-flow (OSRM)”. A “Peak now” column loads live for signed-in users only, since licence terms forbid publishing or caching it.
AREA, PRJ, BLD
table
2
M-SCH
Schools
public KHDA school directory, inspection ratings, fee ranges
Ingest → schools(khda_id, name, curriculum, rating, rating_year, fee_min_aed, fee_max_aed, lat, lon); geocode → entity_schools (≤5 km, rank)
Top 8 within 5 km: name · curriculum · KHDA rating (year) · fees AED · km · drive min (M-TRF). Count of Outstanding/Very good schools within 3 km as a tile.
AREA, PRJ, BLD, /guides/schools
ItemList of School
2
M-SHP
Shopping / daily life
public OSM POIs, DHA facility list (hospitals/clinics)
pois where category in (mall, supermarket, pharmacy, hospital, clinic, gym, park, beach) → entity_poi_counts(1 km, 3 km)
Counts table (1 km / 3 km) plus nearest named mall, supermarket and hospital with km. No ratings, since review data is licensed.
AREA, PRJ, BLD
table
2
M-FIN
Finance
public CBUAE LTV caps, EIBOR; DLD fee table. [A] bank margin until a broker rate feed (licensed) is signed
Worked example at the page's median price, in HTML: deposit, loan, monthly payment (25y), cash-to-close. The interactive /calc/mortgage?price= enhances it. Assumptions are labelled [A].
PRJ, BLD, AREA, /guides/mortgages
FAQPage (guide)
2
M-GV
Golden Visa
public ICP / DLD property-investor visa rules (AED 2M threshold; re-verify at build)
ref_golden_visa_rules(rule, value, source_url, checked_at); derived gv_share = share of DLD unit sales ≥ AED 2M
Badge: “15 of 15 recorded unit sales here ≥ AED 2M.” 4-line eligibility checklist (value, title deed / Oqood, mortgage conditions, joint ownership) with a link to /guides/golden-visa-property.
PRJ, BLD, AREA
HowTo + FAQPage on guide
2
M-TXN
Transaction process
public DLD procedures and fees (Forms A/B/F/I, NOC, trustee centre, Oqood)
Path auto-selected from project status (EYWA = off-plan resale). Step table with AED fees computed at the median price. These steps are the deal stages in §10, so the CTA is “Start this process with an agent”.
PRJ, BLD, /guides/buying-process
HowTo
2
M-YLD
Rent & yield
public DLD open-data rents (Ejari) export; [B] nearby comps when the building has none
Yellow box listing each source's value. The value used in KPIs is marked.
PRJ, BLD
—
1
M-UK
UK buyer
public CBUAE / ECB daily FX; HMRC links
ref_fx(date, aed_gbp)
GBP next to every AED headline figure, with the FX date. UK-time video-viewing slots. “UK tax on overseas rental income may apply: HMRC link. Not advice.”
All public
—
2
M-TRUST
Compliance
public DLD broker register (BRN/ORN), Trakheesi ad permits
Table assets:asset_id, entity_type, entity_id, type, title, r2_key, cdn_url, mime, bytes, sha256, pages, duration_s, width, height, source(developer_portal|own_shoot|agent|youtube), licence_ref, rights_expiry, gated, published, extracted_json, created_at. A nightly job unpublishes any asset past rights_expiry. Ingest: assets-ingest {entity} {file} uploads to R2, hashes the file, runs pdftotext, an LLM extracts fields into extracted_json, and a human signs off before publish.
§9Portal tools and signed-in areas (routes)
Route
Who
What it does
Reads
Writes
Built from
/map
anon read · user save
Area × type × beds price-change map: median psf, volume, top buildings, monthly change
System of record is the Postgres deals table. Outbound webhooks (crm_webhooks) on stage change mirror to Airtable now, and HubSpot later if needed.
WhatsApp Business API: an inbound message creates lead_created, with the entity parsed from the prefilled text (“Re: /projects/2621-eywa-dubai”).
Attribution: touches(lead_id, ts, page_path, entity, utm, kind). Reports first touch, last touch and assisted touches, plus the page template that sourced the lead.
Agent assignment: round robin within the area specialism. A lead is reassigned if the L0 SLA is breached twice. Split rules (Form A/B/I) live in commissions.
SLA engine: sla_timers(deal_id, stage, due_at, breached_at). A cron runs every 5 min. On breach it pushes to the agent, then escalates to ops at 2× the SLA.
PII never appears in public HTML, CSVs or llms.txt. DLD rows carry no owner names. UK GDPR and UAE PDPL apply: consent is captured at sign-up, and export/delete lives at /app/account.
§13AIO / schema / open data (per template)
Template
JSON-LD
Raw HTML must contain
Open data twin
T-DEV
Organization (identifier = DLD dev no.) + ItemList of projects + BreadcrumbList
Projects table with % complete and median psf
/data/developers/{slug}.csv
T-MP / T-AREA
Place + GeoShape + Dataset (monthly series) + BreadcrumbList
36-month median psf and volume table
/data/areas/{slug}-monthly.csv
T-PRJ
ApartmentComplex (geo, numberOfAccommodationUnits) + Dataset (transactions) + DigitalDocument/VideoObject/ImageObject + BreadcrumbList. RealEstateListing only when a live permitted offer exists.
KPI tiles as text, quarterly table, full transaction table
/data/projects/{no}.csv
T-BLD
ApartmentComplex + Dataset
Unit table, floor-band table
/data/buildings/{slug}.csv
Guides
HowTo / FAQPage / GovernmentService ref
Fee and rule tables with source and checked_at
/data/ref/{table}.csv
Site
sitemap.xml index → sitemap-{template}.xml (lastmod = data refresh). llms.txt + llms-full.txt (template list, dataset links, method). robots.txt allows all public routes and /data/, and disallows /app /agent /ops /investor. Bulk Parquet: /data/dld-transactions.parquet (DLD open data, attribution kept).
§14Sprint backlog: shippable tickets
Build preview host: dubai-co-uk.articulate-ai.work (cwdeploy). Moves to the dubai.co.uk apex only after the ownership check in §17.
Week 1 (Mon 5 – Sun 11 Oct): data spine + EYWA vertical slice
All figures below are real values from our current extract: DLD sales, the PF batch-1 matches (14 of 15 sales matched to a unit) and the EYWA spec (context_kpis.json, generated 2026-10-05 08:09 GST). Finance rows apply the M-FIN rules with a [A] rate.
┌─ dubai.co.uk ─ Developers · Areas · Projects · Map · DLD · Guides ─────────────────── [Sign in] [WhatsApp] ┐
│ Home › Business Bay (master) › Business Bay (area) › EYWA Dubai │
│ EYWA Dubai (Tree of Life) DLD #2621 "EYWA DUBAI" · R.Evolution (RVL Real Estate LLC) │
│ Marasi Drive, Business Bay · on the Dubai Water Canal · 25.183098, 55.273213 [★ Save] [🔔 Alert] │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ STATUS Off-plan · 64.2% complete (DLD inspection 17 Sep 2026) · Planned handover 1 Apr 2026 ⚠ OVERDUE │
│ Escrow 200974659 · Plot 3,463.67 m² · 25 floors · 53 units (19×2BR · 22×3BR · 6×4BR · 6×5BR) │
├─ KPI TILES segment Residential · DLD unit sales 2020 → 3 Oct 2026 · lease-to-own + outliers excluded [D] ─┤
│ Sales 15 │ Median 3,906 AED/sqft │ Median price AED 17,096,094 (+GBP, ref_fx date) │ Median size 3,693 sqft │
│ First sale 16 Feb 2024 │ Last sale 1 Apr 2026: AED 17,403,846 @ 4,915/sqft │ Sales L12M 1 (1.9% of units) │
│ By beds: 2BR 3,860 (n=10) · 3BR 4,143 (n=5) │ YoY: not shown (n<5 in a window) │ Sales/yr 2024 10 · 2025 4 · 2026 1│
├─ QUARTERLY median AED/sqft (table + chart) ──────────────────────────────────────────────────────────────────┤
│ 2024Q1 3,792 (n3) · 2024Q2 3,854 (n4) · 2024Q3 n=1: 3,828 · 2024Q4 4,466 (n2) │
│ 2025Q2 4,686 (n2) · 2025Q3 3,854 (n2) · 2026Q2 n=1: 4,915 [Open /dld?project=2621] │
├─ ALL TRANSACTIONS SSR table · 15 rows + "Excluded (6)" ─────────────────────────────────────────────────────┤
│ Date Procedure Beds Sqft AED AED/sqft Unit Floor Match conf │
│ 2026-04-01 Sell - Pre registration 2BR 3,541 17,403,846 4,915 402 4 PF 1.00 │
│ 2025-08-13 Sell - Pre registration 3BR 5,223 19,150,000 3,667 501 5 PF 0.93 │
│ 2025-07-15 Sell - Pre registration 2BR 2,945 11,900,000 4,040 803 8 PF 0.93 │
│ 2025-06-19 Sell - Pre registration 2BR 3,756 14,325,300 3,813 203 2 PF 0.93 │
│ 2025-06-03 Sell - Pre registration 2BR 3,674 20,429,550 5,560 — — unmatched │
│ 2024-12-18 Sell - Pre registration 3BR 6,466 26,788,960 4,143 802 8 PF 1.00 │
│ … 9 more (2024) [Save these comps] │
│ Excluded: land plot sales 2013/2016/2021/2022 (e.g. 2022 AED 74,285,000) · 2026-08-27 AED 12M + 2026-09-02 │
│ AED 8M filed under DLD #3890 "Eywa The Way Of Water" (sizes don't match units 503/604) · reason shown │
├─ ⚠ SOURCE CONFLICTS (M-CONF) ────────────────────────────────────────────────────────────────────────────────┤
│ Units/storeys: DLD 53 / 25 floors (USED) · Brochure "48 exclusive residences" · Christie's 48 / 20 storeys │
│ · datahabibi 58 / 23 storeys · Shababeek G+3P+19 │
├─ RENT & YIELD (M-YLD) ──────────────────────────────────────────────────────────────────────────────────────┤
│ No Ejari contracts (off-plan). Benchmark [B]: 237 AED/sqft/yr median of 44 PF-published rents ≥2,000 sqft │
│ (Volante · Dorchester Collection · Jumeirah Living BB) → indicative gross yield 6.1% at 3,906/sqft │
├─ GOLDEN VISA (M-GV) ─────────────────────────────────────────────────────────────────────────────────────────┤
│ 15 of 15 recorded unit sales ≥ AED 2M → every unit sold here clears the property-value threshold. │
│ Checklist ▸ value · Oqood/title deed · mortgage conditions · joint owners [/guides/golden-visa-property]│
├─ FINANCE at median price AED 17,096,094 (M-FIN) ─────────────────────────────────────────────────────────────┤
│ Off-plan, 50% LTV cap → loan 8,548,047 · equity 8,548,047 · 25y @ 4.49% [A] → AED 47,464 / month │
│ At handover, expat >AED 5M, 70% LTV → loan 11,967,266 · deposit 5,128,828 → AED 66,450 / month │
│ Cash-to-close (70% case): deposit 5,128,828 + DLD 4% 683,844 + trustee 4,200 + agent 2%+VAT 359,018 │
│ + mortgage reg 0.25%+AED 290 = 30,208 → AED 6,206,098 (excl. bank arrangement/valuation) [/calc/cost] │
├─ PROCESS (M-TXN, path = offplan_resale) ─────────────────────────────────────────────────────────────────────┤
│ 1 Offer → 2 MOU (Form F) + deposit → 3 Developer NOC (min % paid check) → 4 Oqood transfer at trustee │
│ → 5 Handover + snagging · fees computed above [Start this with an agent] │
├─ LOCATION · COMMUTE · SCHOOLS · SHOPPING (M-LOC / M-TRF / M-SCH / M-SHP) ───────────────────────────────────┤
│ Burj Khalifa 1,560 m (bearing 3°) · canal frontage north · nearest metro (DLD field) · │
│ DIFC / Downtown / DXB / DWC / Marina / Internet City / Dubai Hills: km · free-flow min · Salik gates │
│ 8 KHDA schools ≤5 km (rating · year · fees AED) · POI counts 1 km / 3 km (mall, supermarket, clinic …) │
├─ MEDIA (§8) ── Brochure PDF "Eywa Offer 203" · Floorplans (2BR Type B …) · Payment plan · Developer video ──┤
│ · Gallery · 3D tower viewer (eywa.articulate-ai.work) "Brochure says" table next to the DLD values │
├─ COMPS 500 m ── Volante · Volante 2 · Dorchester Collection · Jumeirah Living BB … [Compare] [Save comps] ┤
├─ CTA ── [Book viewing (UK-time video slots)] [WhatsApp "Re: /projects/2621-eywa-dubai"] │
│ Agent BRN · ORN · Trakheesi no. (M-TRUST) · signed-in with open deal → "O1 Offer made · 2 d · next: MOU" │
├─ Open data: /data/projects/2621.csv · Method: /method · source tag on every figure ─────────────────────────┤
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
§17Domain + deploy status (checked 5 Oct 2026, GST)
Item
State
Action
dubai.co.uk apex
A → 216.150.1.1 (Vercel edge). HTTPS returns 403 x-vercel-mitigated: deny. Not in the Articulate-AI Vercel team domains. The Hostinger portfolio check timed out. www does not resolve.
Confirm ownership (Hostinger / registrar) before promotion in DCU-308
Plan (this page)
dubai-co-uk-plan.articulate-ai.work, deployed with cwdeploy from MacPro
Vault: Articulate/Dubai-co-uk/plan/
Build preview
dubai-co-uk.articulate-ai.work (created in DCU-101)