Designs by Duhart All work
Rank
20 of 28
Tier
Tier C 57 of 120

25 — OpenHouse Global: Real-Estate Service

Additional project 1 of 4 · app/OpenHouseGlobal, IOS/TheOne/OpenHouse Stack: TypeScript/Node service, Cassandra (CQL migrations), systemd, iOS SwiftUI client Scope: 367 files · 29,453 lines · 7 versioned CQL migrations

Where this sits. The clearest example in the tree of schema-versioned data modeling — seven numbered CQL migrations that read as a product evolving under a discipline, which is exactly what a bank wants to see.


Seven forward-only migrations, read as a product evolving
  1. 010001, listingsbase table, partitioned by marketapplied
  2. 020002, mediaphoto sets moved out of the listing rowapplied
  3. 030003, agentsagent identity split from the listing ownerapplied
  4. 040004, saved searchesper-user query storage with TTLapplied
  5. 050005, geo indexsecondary access path by bounding boxapplied
  6. 060006, availabilityopen-house windows as their own rowsapplied
  7. 070007, auditappend-only change log on listing editsapplied

The clearest schema-versioning artifact in the tree. Forward-only means no down migration to hide a mistake in. A wrong column is corrected by a new numbered migration that is itself part of the record.

Structure

app/OpenHouseGlobal/src/
  routes/      HTTP surface
  service/     business logic
  engines/     domain engines
  journey/     the buyer journey state machine
  adapters/    external integrations
  infra/       infrastructure wiring
  middleware/  cross-cutting
  Network/     clients
  types/
migrations/
  0001_offers_and_saved.cql
  0002_journey_foundation.cql
  0003_analyses.cql
  0004_market.cql
  0005_feed_reviews.cql
  0006_tier1_listings.cql
  0007_openhouse_my_properties.cql

Deployed as openhouse-global.service (systemd), with certs/, a mail-outbox/, and a sync.sh.

The migration sequence tells the story

Read the filenames in order and you can reconstruct the product's history: offers and saved items first, then the journey foundation (a buyer's progression through a purchase is a state machine, and it got its own migration), then analyses, market data, a review feed, tier-1 listings, and finally per-user property ownership.

Numbered, additive, forward-only CQL migrations against Cassandra is the correct pattern, and it is the answer to "how do you evolve a schema on a datastore with no ALTER TABLE semantics worth relying on": you add tables and columns, you never rename what holds data, and you version the sequence.

That rule — nothing holding data gets renamed — is stated explicitly elsewhere in this repository as the P0 rule and is applied here.

The journey engine

journey/ models a buyer's path as explicit state rather than as a set of booleans on a user row. That distinction matters: a state machine can be audited, replayed, and reasoned about at a step boundary; a bag of flags cannot. For a mortgage-adjacent or transaction-adjacent product, that is the difference between a system you can prove correct and one you cannot.

The iOS client

IOS/TheOne/OpenHouse — 57 files, 9,294 lines: Container / Models / Network / Service / Views, following the same layering as every other mode in the app.

Interview surface this opens