Boostt · Architecture · Ecosystem View

City Ecosystem
Dashboard.

The globe is the overview screen. Each city is at a different stage of development. The dashboard shows what exists — founders, permits, properties, services, stays, creators, businesses, opportunities — and what's missing. The gap is the opportunity.

A player zooms into any city and immediately comprehends its economy: what assets are there, what state they're in, and where the underserved markets are.

Globe view + 8 asset types + 4 city stages + 12 frames Architecture 2026-05-08
01
The globe. Every city is a pulse.
The flat map of Earth. Cities with ecosystem activity glow. Brighter = more assets. Dimmer = earlier stage. A city with no assets has no dot. Click any city to open its ecosystem dashboard.
NYC
Athens
London
Lisbon
LA
Austin
Chicago
Dubai
Singapore
Tokyo
Bali
São Paulo
Liquid
Active
Growing
Genesis
02
New York City — liquid economy.
The most developed city. All asset types populated. Every layer active. Transactions flowing. Click the city dot on the globe — this dashboard opens.
New York City
Liquid
Properties
870,241
Businesses
186,402
Permits
24,531
Creators
2,847
Services
312
Stays
89
Founders
47
Opportunities
48
Genesis Growing Active Liquid
03
Athens — growing. Gaps visible.
Creators and stays exist. No permits data, no property intelligence. The gaps tell you where the opportunity is — bring the missing layers to this city.
Athens
Growing
Properties
Businesses
12,840
Permits
Creators
287
Services
34
Stays
23
Founders
8
Opportunities
Opportunity gaps
Properties — no property intelligence layer. First to bring permit/zoning data wins the city.
Opportunities — 8 founders, zero posted opportunities. Founders need clients.
04
Lisbon — genesis. Almost empty.
Only creators from TikTok scraping and a few businesses from OSM. Everything else is a gap. The first founder to register owns the city.
Lisbon
Genesis
Properties
Businesses
4,210
Permits
Creators
52
Services
Stays
Founders
Opportunities
Wide open
52 creators scraped. No founders, no services, no stays, no property data. First founder to register owns this city.
Genesis Growing Active Liquid
05
LA — active. Permits flowing.
Permit data from LA's Socrata portal populates the contractor layer. Creators are present. Property intelligence is the next unlock.
Los Angeles
Active
Properties
Businesses
94,120
Permits
8,341
Creators
1,204
Services
45
Stays
31
Founders
Opportunities
12
Opportunity gaps
Founders — permits + creators exist but no founders. 0% fee = free entry.
Properties — no property intelligence yet. Whoever brings it captures the real estate layer.
06
The eight asset types.
Every city's economy is measured by the same eight asset types. Each has a state. Each can be present or absent. The combination defines the city's stage.
Properties
Lots with zoning, FAR, transactions, permits. States: idle → claimed → for rent → for sale
Businesses
From GMAPS + OSM. Real businesses at real addresses. Pre-loaded demand signals.
Permits
Building permits from Socrata. Contractor work history. Replenishes daily.
Creators
Scraped from TikTok. Exist before claiming. States: scraped → claimed → verified → seller
Services
Active listings from professionals. States: draft → active → booked → completed
Stays
Bookable rentals. Workspaces. Housing. States: available → booked → occupied (recurring)
Founders
Amber pins on /founders. 0% fee on services + housing. Bring their own demand.
Opportunities
Buy orders. Client needs posted on the map. States: open → proposals → assigned → completed
Part II City Stages Classification
07
Four stages. Computed from asset counts.
No manual classification. The stage is derived from the data. Count the asset types present, count the transactions — the stage follows. Each stage tells a different story about what the city needs next.
Genesis
Only pre-loaded data — scraped creators and/or businesses from OSM. No active participants. No transactions. The city exists on the map but nobody is working it.
Asset types present: 1–2
Transactions: 0
Signal: wide open
Growing
Active participants have arrived. Some services or stays listed. First cross-role connections forming. Gaps are visible and specific — the dashboard names them.
Asset types present: 3–5
Transactions: 1–50
Signal: gaps named
Active
Multiple asset types populated. Regular transactions. Cross-role cooperation happening — owners working with influencers, founders hiring founders. Competition between providers.
Asset types present: 5–7
Transactions: 50–500
Signal: economy running
Liquid
All asset types present. High transaction volume. Money circulating between roles. Price discovery functioning. New entrants face competition but also abundant demand.
Asset types present: 8/8
Transactions: 500+
Signal: full economy
Part III Implementation Frontend + Data
08
Data. One API call per city.
getMapCountryStats(cc) already returns counts per category per country. Extend to city-level granularity. The dashboard renders from a single JSON response.
// Existing — extend to city level
GET /api/v1/ecosystem/:city_slug
// Response shape
{
  "city": "new-york",
  "country": "US",
  "stage": "liquid",
  "assets": {
    "properties":    { "count": 870241, "states": { "idle": 812000, "claimed": 41200, "for_rent": 12800, "for_sale": 4241 } },
    "businesses":    { "count": 186402 },
    "permits":       { "count": 24531,  "last_24h": 47 },
    "creators":      { "count": 2847,   "states": { "scraped": 2102, "claimed": 580, "verified": 165 } },
    "services":      { "count": 312,    "states": { "active": 248, "booked": 64 } },
    "stays":         { "count": 89,     "states": { "available": 61, "booked": 28 } },
    "founders":      { "count": 47 },
    "opportunities": { "count": 48,     "states": { "open": 31, "assigned": 17 } }
  },
  "transactions_30d": 284,
  "gaps": ["none"]
}
09
Component. EcosystemDashboard.tsx
A floating card on the map. Opens when clicking a city dot on the globe view. Same glass-morphism pattern as existing floating cards. Positioned right side, full height.
// New component
src/components/maps/
  EcosystemDashboard.tsx
// Props
{
  citySlug: string
  isOpen: boolean
  onClose: () => void
}

// Pattern: same as StaysFloatingCard
// Position: absolute right-2 top-2 bottom-2
// Width: 360px
// Background: bg-white/70 backdrop-blur-xl
// Triggered by: clicking city cluster on globe
// Data: single fetch to /api/v1/ecosystem/:slug
// Stage computed from asset counts + txn volume
// Globe integration
// Route: /ecosystem (new route in MapShell)
// Theme: dark basemap, zoom 2 (world view)
// Layer: city-ecosystem-clusters
// Source: /api/v1/ecosystem/clusters
// Click handler: fly to city → open dashboard
10
Stage computation. Not manual.
The stage is computed from the data. Count asset types with count > 0 and total transactions in 30 days. No human classification needed.
// Stage derivation — no config, no manual labels
function deriveStage(assets, txn30d) {
  const typesPresent = Object.values(assets)
    .filter(a => a.count > 0).length

  if (typesPresent >= 8 && txn30d >= 500)
    return 'liquid'
  if (typesPresent >= 5 && txn30d >= 50)
    return 'active'
  if (typesPresent >= 3 && txn30d >= 1)
    return 'growing'
  return 'genesis'
}

// Gap detection
function detectGaps(assets) {
  const ALL = ['properties','businesses','permits',
    'creators','services','stays','founders',
    'opportunities']
  return ALL.filter(k => assets[k].count === 0)
}
11
Globe layer. City dots sized by activity.
Same pattern as src/map-layers/creators.ts dual-mode rendering. Zoom < 5: city ecosystem dots with glow. Zoom >= 5: transition to regular category layers.
// New map layer
src/map-layers/ecosystem-clusters.ts
// Source: GeoJSON from /api/v1/ecosystem/clusters
// Each feature:
{
  type: "Feature",
  geometry: { type: "Point", coordinates: [lng, lat] },
  properties: {
    city: "new-york",
    label: "NYC",
    stage: "liquid",          // → color
    total_assets: 1084380,    // → dot size
    types_present: 8,         // → glow intensity
    txn_30d: 284              // → pulse speed
  }
}

// Dot color by stage
genesis:  #6b7280  (gray-500, dim)
growing:  #14b8a6  (teal-500)
active:   #f59e0b  (amber-500)
liquid:   #f59e0b  (amber-500, bright glow)

// Dot size by total_assets
circle-radius: interpolate(total_assets)
  0      → 4px
  1000   → 6px
  10000  → 8px
  100000 → 12px
  500000+→ 16px
12
Route. /ecosystem
New route in MapShell. Dark basemap. Zoom 2 (world). The entry point for every player who wants to see the full digital city across all geographies.
// route-themes.ts — add ecosystem
ecosystem: {
  name: 'ecosystem',
  applyBasemap: applyDarkTheme,
  initialCamera: {
    center: [20, 25],   // centered on Atlantic
    zoom: 2,            // world view
    pitch: 0,
    bearing: 0
  }
}

// Router — new route under MapShell
<Route path="ecosystem" element={<Ecosystem />} />

// Navigation — add to top nav bar
// Position: between "Digital City" and "Marketplace"
// Label: "Ecosystem"

// Interaction flow:
// 1. Land on /ecosystem → dark globe, city dots
// 2. Click city dot → flyTo city, open dashboard
// 3. Click asset row in dashboard → navigate to
//    that category's existing route (/stays, etc.)
// 4. Click gap → shows CTA for that missing layer

Core thesis

The digital city spans every geography. Each city is at a different stage of development. The ecosystem dashboard makes the stage and the gaps legible at a glance. The gap is the opportunity — a city with properties but no founders, a city with creators but no services. Players see where the economy needs them and enter accordingly.

What connects to what

  • /ecosystem → new route under MapShell
  • ecosystem-clusters.ts → new map layer
  • EcosystemDashboard.tsx → new floating card
  • getMapCountryStats() → extend to city-level
  • Route theme → dark basemap, zoom 2
  • Asset rows → deep link to existing category routes

New infrastructure

  • /api/v1/ecosystem/clusters — all cities with counts
  • /api/v1/ecosystem/:city_slug — single city detail
  • deriveStage() — computed, not configured
  • detectGaps() — names missing asset types
  • City-level aggregation of existing category counts