Roamstead

A collaborative agent that helps people and families find an affordable home to retire abroad, verify property claims, and make decisions they can trust.

Roamstead project cover

Inspiration

I started Roamstead with a question I could not ignore: where will I be able to afford to live when I retire? Rising home prices and the everyday cost of living have made it impossible for me to afford a home where I currently live. That experience made this project personal, but it is not only about me. I am building Roamstead with my family's future in mind because I want us to understand what a stable and affordable retirement could realistically look like.

I also believe many other Americans are asking versions of the same question as housing, healthcare, and everyday expenses continue to rise. Retiring abroad will not be right for everyone, but people who are considering it deserve better than a pile of listings and optimistic assumptions. I wanted to build something my family could genuinely use and something that could help other families investigate their options with clearer evidence and more control.

Looking abroad creates a different problem. A lower listing price does not automatically make a home affordable or suitable. Healthcare access, food and daily needs, space, neighborhood conditions, remote-work reliability, ownership or rental restrictions, currency differences, and facts missing from the listing can completely change the decision. Property sites are good at showing options, but this evidence is scattered across pages, photographs, maps, and local context. I could collect dozens of tabs and still not know which option I could responsibly trust.

I also wanted to explore a more useful relationship between a person and an agent. I did not want another chat window that produced a confident recommendation after one prompt. For a decision as personal and consequential as housing, the agent should ask a useful question, explain the tradeoff it found, wait for approval before changing anything, remember feedback over time, and show the evidence behind every conclusion.

That became the core idea behind Roamstead: a collaborative decision partner for people looking for an affordable place to retire across Southeast Asia. The current experience covers Ho Chi Minh City, Bangkok, and Kuala Lumpur. The agent leads the investigation, but the person remains in control of the decision. My goal is not to promise that a home is affordable or safe; it is to help someone compare the real evidence, see the unknowns, and make a more grounded choice.

Roamstead live landing page

How the user and agent collaborate

What it does

Roamstead turns an affordable-retirement or relocation goal into a persistent decision process. A user chooses a city and whether they want to buy or rent, then creates an editable decision profile containing hard constraints and weighted lifestyle priorities. Budget is a hard gate rather than a suggestion, alongside property type, bedrooms, and bathrooms. The agent cannot silently loosen any of them to make a recommendation look better.

Instead of asking generic follow-up questions, Roamstead runs a counterfactual ranking test over the qualified results. It measures which preference change would most affect the top ten and asks one high-information clarification. The answer becomes a typed proposal that shows the predicted ranking impact. The user can Accept, Soften, or Reject it; the profile and rankings change only after approval.

Decision profile and adaptive clarification

The browsing experience uses a persisted catalog of real property records. It currently contains 240 publishable listings across the three supported markets. Each listing retains its source, observation time, numeric price, locally served photograph, and evidence state. Visitors browse the saved catalog rather than triggering a new model search every time.

Results combine deterministic hard filtering with an inspectable Fit Score. The interface explains why each property fits, which facts are confirmed, what is inferred, and what remains unknown. It also keeps the decision profile, adaptive question, listing results, and real map visible together.

Ranked listings, decision memory, and map

Property-level evidence and Fit Score

Feedback becomes durable memory, but never an invisible scoring rule. When a user rejects properties for the same underlying reason—even with different wording—Roamstead can recognize the pattern and propose a profile revision. Again, the user must approve it before the profile changes.

After selecting exactly three qualified properties, the user can build a Decision Brief. Roamstead locks the profile version and evidence packet, retrieves relevant decision memory, compares the listings, runs two specialist critics in parallel, verifies the claims, and produces a brief organized around confirmed facts, inferences, unknowns, and next actions. The full run is persisted before its events are streamed, so refreshing or reconnecting restores the same run instead of starting it again.

Live multi-agent Decision Brief

Persisted model execution trace

Roamstead also includes Decision Watch. The agent proposes the smallest useful due-diligence plan and pauses. Only after the user approves can it run bounded checks and append an immutable evidence revision. It never silently changes the user's profile, Fit Scores, or source facts.

How we built it

I designed Roamstead as a production-minded system with deterministic control around model reasoning. The frontend is a Next.js application running on Cloud Run. A FastAPI service exposes the domain API and resumable server-sent events. Google ADK defines the durable PartnerCoordinator workflow and its parallel specialist branches.

Gemini 3.5 Flash handles bounded listing analysis, evidence verification, brief composition, and preference phrasing. Gemini Embedding 001 powers profile-isolated semantic memory. A Gemma 4 26B multimodal critic audits the exact listing photos, while a separate Gemma 4 31B critic checks the comparison against the approved profile and retrieved memory. Both Gemma branches start before the join, and the workflow cannot advance to verification until both have completed or explicitly degraded.

PartnerCoordinator workflow

The models never own the hard filters, Fit Score calculation, profile mutation, approval logic, or persistence. Function nodes lock the profile version and selected listing IDs before model execution. Evidence packets are bounded, retries are limited, provider failures are recorded, and unsupported claims remain UNKNOWN instead of being replaced with plausible text.

Firestore is the primary database for profiles, listings, revisions, feedback, semantic memories, proposals, agent runs, events, briefs, watches, and evidence revisions. Cloud Storage holds validated listing photographs and generate-once city orientation media. BigQuery receives redacted operational metadata, while Cloud Trace connects a public run to phase timing without storing prompts, profiles, vectors, or private reasoning.

Deployed Google Cloud architecture

The deployed stack also uses Artifact Registry, Pub/Sub, Secret Manager, Cloud Run jobs, and a deliberately paused Cloud Scheduler trigger. City orientations are generated once with Veo 3.1 Lite and narrated with Gemini 3.1 Flash TTS, then hashed, stored, labeled as generated orientation, and kept completely separate from property evidence.

GitHub pushes to main trigger Cloud Build. API and web checks run in parallel; successful builds create commit-tagged containers, push them to Artifact Registry, deploy both Cloud Run services, and verify the public endpoints. This gives every deployed release a source commit, build record, container image, health check, and observable runtime.

GitHub-to-Cloud Run CI/CD flow

Successful Cloud Build

Cloud Run production observability

Firestore persistence

Persisted model event proof

For data, I normalized source records from Batdongsan for Ho Chi Minh City, PropertyHub for Bangkok, and PropertyGenie for Kuala Lumpur. A listing is publishable only when it has a numeric source price, a valid source page, retrievable image bytes, and a non-duplicate photograph hash. Prices are retained in their reported local currency and normalized into USD server-side for comparison. Source attribution and observation timestamps stay attached to the evidence.

The result is not a demo that only labels model names. The public event stream and persisted Firestore records expose which tool or model ran, its status, timing, bounded output, and failure state. The demo video also shows the Cloud Build release, Cloud Run services, Firestore state, and real model-event sequence.

Challenges we ran into

The hardest part was keeping model assistance useful without letting it become the source of truth. I had to separate deterministic constraints and scores from advisory memory, make parallel failures explicit, persist events before streaming them, and keep real-estate unknowns visible instead of smoothing them over with fluent text.

Accomplishments that we're proud of

I am proud that I turned a problem affecting my own future into a working collaborative partner. Roamstead measures what to ask, explains proposed changes, waits for approval, remembers feedback, and produces a reloadable evidence trail. The live deployment also proves real Gemini and Gemma execution rather than displaying model-name labels.

What we learned

I learned that trust comes from boundaries more than personality. Typed proposals, immutable revisions, deterministic gates, durable events, explicit degradation, and visible CONFIRMED, INFERRED, and UNKNOWN states made the agent more useful and easier to evaluate.

What's next for RoamStead

Next I want to cover more realistic retirement markets and compare total living costs alongside housing. I also want multilingual evidence review and sourced checks for healthcare, visas, ownership rules, and recurring costs—while preserving approval gates and clearly separating decision support from professional legal or financial advice.

Built With

Share this project:

Updates

Submission history