# 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. --- ## 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 - Forward-only schema migration against Cassandra, and why renames are forbidden - Modeling a multi-step user journey as a state machine rather than flags - Denormalization for a query-first datastore: designing tables per access pattern - Running a Node service under systemd with certificate management