RealtorHub Signal

A branded real estate intelligence service for fast-moving markets.

RealtorHub combines tenant-isolated listing pipelines, market-aware region coverage, and map-ready delivery so broker teams can launch a clean client search experience without building MLS infrastructure from scratch.

4Featured markets
4Tenant brands
1Active workstreams
productionEnvironment

Platform

Built for multi-tenant delivery

Schema-isolated listing pipelines, map-ready delivery, and operator health surfaces on a shared host.

Schema-isolated tenant data for safe brand separation
Region-specific pricing behavior tuned for urban, resort, and island markets
Health and ingestion surfaces designed for operator visibility
4Market regions wired
4Active tenant brands
6Phases shipped
38Scoped execution tasks

Canonical Entry Model

Shared-host delivery is the default

Canonical base: https://realtorhub.bjorn-erik.com. Each brand lives at its own slug path.

Market coverage

Featured regions for RealtorHub

Denver Metrodense-mid-market

Profile: urban

BBox: [-105.3, 39.4, -104.4, 40.1]

Summit County, COluxury-resort

Profile: mountain

BBox: [-106.6, 39.3, -105.6, 39.8]

Vail, COluxury-resort

Profile: mountain

BBox: [-106.5, 39.5, -106.1, 39.8]

Oahu & Hawaiiisland-premium

Profile: island

BBox: [-160.5, 18.8, -154.5, 22.3]

Execution

Platform readiness

Current phase: Phase 7Tenant Look and Feel / UX Customization

  • Phase 1: Foundation and Tenancy Bootstrapcompleted

    Foundation work is complete: tenant routing, region configuration, health reporting, and project tracking are in place.

  • Phase 2: PostGIS and Tenant Schema Provisioningcompleted

    The repo now includes the env baseline, trusted schema binding helpers, and repeatable SQL drafts for tenant schema provisioning.

  • Phase 3: Listing Model, Normalization, and Enrichmentcompleted

    Phase 3 is complete: normalized DTO, synthetic IDs, enrichment rules, mock fixtures, listing search/detail APIs, ingestion run tracking, and map cluster contract with viewport summary fields are all in place.

  • Phase 4: Ingestion Pipelines and Run Trackingcompleted

    Phase 4 is complete: provider adapters, orchestration, run tracking, retries, deduplication, and admin visibility are in place.

  • Phase 5: Tenant-Aware Listing APIscompleted

    Phase 5 is complete: tenant-safe pagination/sorting, strict query validation, response metadata shaping, and isolation guardrails are in place.

  • Phase 6: Mapbox Frontend and Admin Consolecompleted

    Phase 6 is complete: Mapbox GL JS cluster rendering, bbox-driven search, detail drawer, region fly-to presets, and map/list/drawer selection flow are all delivered.

  • Phase 7: Tenant Look and Feel / UX Customizationin progress

    Phase 7 is active: tenant-specific color themes, map styles, background images, font families, and admin theme viewer are being wired per the tenant registry.

  • Phase 8: Testing, Hardening, and Seed Simulationnot started

    Playwright-heavy validation, tenant isolation checks, and seeded region behavior testing are planned.

  • Phase 9: Landing Media and Aerial Preview Enhancementsnot started

    Tenant-managed slideshow content and listing-centric aerial preview rendering are roadmap stretch items.

Roadmap

Current focus

  • Provider adapter pattern implemented: Overpass, CountyGIS, and Kaggle scaffolds are ready.completed
  • Ingestion orchestration layer is live: fetch, transform, enrich, deduplicate, and upsert flow.completed
  • Ingestion trigger endpoint (/api/ingestion/trigger) allows operators to start multi-provider runs.completed
  • Duplicate detection by synthetic ID and source ID prevents data collisions across runs.completed
  • Provider-specific error handling with retry logic and timeout management is implemented.completed
  • Admin stats endpoint shows aggregated ingestion metrics and provider run history.completed
  • Phase 4 complete: provider adapters, orchestration, retries, deduplication, and admin dashboard are operational.completed
  • Phase 5 hardening delivered: listing search/detail now include validated filters, stable pagination/sorting, and isolation checks.completed
  • Phase 5 contract docs are now published with request/response examples and error semantics.completed
  • Phase 6 kickoff delivered: tenant map shell is live and connected to listing search metadata.completed
  • Phase 6 map rendering and drawer interactions delivered on tenant-aware /map route.completed
  • Phase 6 viewport presets delivered; region fly-to with profile-aware padding and zoom is live.completed
  • Phase 6 complete: Mapbox rendering, cluster layers, detail drawer, bbox search, and region presets all delivered.completed
  • Phase 7 kickoff: TenantConfig extended with TenantTheme; per-tenant CSS variable injection underway.next

Next up

  1. Wire tenant CSS variable injection into RootLayout so each host gets its own scoped design tokens.
  2. Apply tenant map style to Mapbox initialization instead of hardcoded light-v11.
  3. Support background image, opacity, and color hue overlay via per-tenant CSS variables.
  4. Deliver admin tenant theme viewer at /admin/tenants with live color swatch previews.

Backlog

Execution queue

38 tasks
  • P0-1: Add local env baselinecompleted

    Lane: Data Foundation · M · Document optional DB mode, mock ingestion mode, and local startup defaults.

  • P0-2: Create tenant-safe DB scaffoldcompleted

    Lane: Data Foundation · M · Resolve schemas internally from trusted tenant metadata only.

  • P0-3: Draft bootstrap migrationscompleted

    Lane: Data Foundation · L · Prepare PostGIS, public metadata, tenant schemas, and geometry indexes.

  • P0-4: Define normalized listing DTOcompleted

    Lane: Domain Contracts · M · Freeze validation rules before pipeline work starts.

  • P0-5: Implement enrichment rulescompleted

    Lane: Domain Contracts · M · Encode region-aware defaults for price, beds, and baths without external MLS dependency.

  • P0-6: Add transform boundariescompleted

    Lane: Domain Contracts · M · Provide a validated source-to-normalized listing boundary for upcoming provider adapters.

  • P1-1: Stand up mock provider pathcompleted

    Lane: Pipeline and API · M · Use deterministic fixtures once schema and DTO contracts are in place.

  • P1-2: Start mock ingest runscompleted

    Lane: Pipeline and API · M · Run transform and enrichment pipeline against Denver fixtures and expose API-ready output.

  • P1-3: Add listing search scaffoldcompleted

    Lane: Pipeline and API · M · Expose queryable listing search response shape on top of mock ingestion output.

  • P1-4: Begin ingestion run trackingcompleted

    Lane: Pipeline and API · M · Capture per-run fetch/transform counts and timestamps to seed Phase 4 auditability.

  • P1-5: Add listing detail APIcompleted

    Lane: Pipeline and API · S · Resolve a tenant-scoped listing by synthetic ID from mock-ingested normalized output.

  • P1-6: Add ingestion run history APIcompleted

    Lane: Pipeline and API · S · Expose a tenant-scoped endpoint for recent ingestion runs with region/provider/status filters.

  • P1-7: Start bbox query scaffoldcompleted

    Lane: Pipeline and API · M · Add bbox-first query contract and filtered map-friendly response shape to listing search.

  • P1-8: Add run detail lookup APIcompleted

    Lane: Pipeline and API · S · Allow operators to inspect a single ingestion run by run ID under tenant scope.

  • P1-9: Draft map cluster contractcompleted

    Lane: Pipeline and API · M · Stabilized cluster payload with density classification, zoom suggestions, confidence scores, and price aggregation for frontend integration.

  • P2-1: Implement provider adapters (Overpass, CountyGIS, Kaggle)completed

    Lane: Pipeline and API · M · Created scaffold implementations for three external data providers with placeholder fetchers ready for API integration.

  • P2-2: Build ingestion orchestration layercompleted

    Lane: Pipeline and API · M · Orchestrates fetch, transform, enrich, deduplicate, and upsert steps with audit trail for all provider runs.

  • P2-3: Add ingestion trigger endpointcompleted

    Lane: Pipeline and API · S · POST /api/ingestion/trigger allows operators to start ingestion from any provider with region/tenant scoping.

  • P2-4: Implement duplicate detection and collision handlingcompleted

    Lane: Pipeline and API · M · Registry-based deduplication by synthetic ID within and across runs; configurable collision strategies.

  • P2-5: Add provider-specific error handlingcompleted

    Lane: Pipeline and API · M · Resilient error handling per provider with retry logic, timeout management, and graceful degradation.

  • P2-6: Enhance audit trail with provider metricscompleted

    Lane: Visibility and Docs · S · Record deduplication stats, collision counts, and provider-specific metrics in run records.

  • P2-7: Create multi-provider ingestion admin UIcompleted

    Lane: Visibility and Docs · L · Live admin dashboard at /admin/ingestion with ingestion triggering, run monitoring, provider statistics, and real-time metrics refresh.

  • P2-8: Test multi-provider pipeline behaviorcompleted

    Lane: Pipeline and API · M · Validated trigger/stats/run history contracts across provider types with expected success/failure handling semantics.

  • P3-1: Add tenant-safe search paginationcompleted

    Lane: Pipeline and API · M · Support page/limit (or cursor) with stable tenant-scoped ordering for listing search responses.

  • P3-2: Harden search filtering contractscompleted

    Lane: Domain Contracts · M · Normalize and validate price, beds, baths, status, source, and bbox filters to prevent ambiguous query behavior.

  • P3-3: Shape API responses for map UIcompleted

    Lane: Domain Contracts · S · Standardize map/list payload fields (totals, pagination metadata, cluster summary, attribution block) for frontend consumption.

  • P3-4: Add tenant isolation API checkscompleted

    Lane: Visibility and Docs · M · Add automated checks proving host/header tenant resolution cannot return listings from other tenants.

  • P3-5: Document Phase 5 API contractscompleted

    Lane: Visibility and Docs · S · Publish request/response examples and error semantics for listing search/detail and ingestion admin APIs.

  • P4-1: Create tenant-branded map shellcompleted

    Lane: Visibility and Docs · M · Added /map route with tenant-aware region switcher and map/list panel scaffold wired to listing search API.

  • P4-2: Integrate Mapbox rendering layercompleted

    Lane: Visibility and Docs · L · Replace map placeholder with Mapbox GL JS cluster and viewport interactions tied to search metadata.

  • P4-3: Add listing detail drawercompleted

    Lane: Visibility and Docs · M · Support map/list selection with tenant-themed listing detail drawer and source attribution links.

  • P4-4: Tune map viewport presetscompleted

    Lane: Visibility and Docs · S · Add region-specific fly-to presets and adjust initial zoom/padding behavior for each market profile.

  • P4-5: Add map interaction testscompleted

    Lane: Visibility and Docs · M · Verify map point/list selection sync and drawer detail loading under tenant-scoped routes.

  • P5-1: Extend TenantConfig with theme fieldsin-progress

    Lane: Domain Contracts · M · Add accent, background, text, panel, border, font, map style, and background image fields to the tenant registry.

  • P5-2: Inject tenant CSS variables in layoutqueued

    Lane: Visibility and Docs · M · Server-resolve the tenant on every request and emit a scoped <style> tag with overriding CSS custom properties.

  • P5-3: Apply per-tenant Mapbox stylequeued

    Lane: Visibility and Docs · S · Read tenant.theme.mapStyle at map initialization and fall back to light-v11 for tenants with no style configured.

  • P5-4: Add background image + overlay supportqueued

    Lane: Visibility and Docs · M · Tenants can configure a background image URL, opacity, and color hue overlay injected via scoped CSS variables.

  • P5-5: Add admin tenant theme viewerqueued

    Lane: Visibility and Docs · M · Authenticated admin page at /admin/tenants showing each tenant's full theme configuration with live swatch previews.

Quality gates

Verification

  • Boot safety

    The app and /api/health stay operational when DATABASE_URL is absent.

  • Phase 2 complete

    Trusted schema binding helpers, env baseline, and tenant provisioning SQL all exist in the repo.

  • Isolation guardrail

    No runtime path accepts caller-supplied schema names; tenant slug resolves schema internally.

  • Phase 3 underway

    Normalized listing validation, synthetic IDs, enrichment defaults, and transform boundaries are ready for provider adapters.

  • Mock listings online

    Denver fixture listings can be transformed, enriched, and returned from the mock listings API endpoint.

  • Backlog sync

    Homepage phases and queue are aligned with the latest ROADMAP.md (including Phases 8 and 9).

  • Search scaffold online

    The listing search API scaffold is available and can filter mock-ingested output by text, price, beds, baths, type, and status.

  • Detail API online

    A tenant-aware listing detail endpoint now resolves normalized mock listings by synthetic ID.

  • Run tracking online

    Mock ingestion runs now emit per-run IDs, counts, timestamps, duration, and status metadata.

  • Run history API online

    Operators can query recent ingestion runs at /api/ingestion/runs with tenant-scoped filters.

  • BBox scaffold online

    Search now accepts bbox filtering and returns a preliminary map cluster scaffold payload.

  • Run detail API online

    Operators can inspect an individual run via /api/ingestion/runs/:runId under tenant scope.

  • Phase 5 hardening online

    Listing search/detail now enforce tenant-scope checks, strict filter validation, deterministic sorting, and pagination metadata.

  • Phase 6 shell online

    A tenant-aware /map route now renders a region switcher with map/list shell and live listing search metadata wiring.

  • Phase 6 map interactions online

    Mapbox cluster rendering, bbox-driven search, and map/list/detail-drawer selection flow are now active.

  • Phase 6 viewport presets online

    Region transitions now use profile-aware fly-to presets for urban, mountain, and island market framing.

Delivery

Platform config

  • Tenant

    RealtorHub · tenant_1

  • Canonical entry

    / on https://realtorhub.bjorn-erik.com

  • Host routing

    localhost, 127.0.0.1, realtorhub.bjorn-erik.com

  • Overpass API

    https://overpass-api.de/api/interpreter

  • Database

    configured

  • Mapbox

    token configured