Engineering owned the server-rendered scaffold and data layer; I built the renter surface on top of it — and never claim it.
UnitPulse · 2026 · Product Design Lead
Built to Be Found — by Humans and AI
Rebuilding UnitPulse's renter site around conversational search on real inventory — with content built to be cited by AI answer engines, not just Google. Shipped in ~6 weeks.
What we shipped
-
Conversational home search
An integrated LLM assistant that turns a vague need — "walkable to USC, dog-friendly, under $2,500" — into real listings on the map. Grounded on live inventory, so it never invents a home.
-
Guided intake
Inline stepped cards capture must-haves.
-
Map split-view
A live map with price pins beside the result grid.
-
Tour shortlist
Shortlist homes and plan several tours in one pass.
-
Personalized search
Adapts to past searches and stated context.
What I owned
- Renter front-end & UX
- Conversational-search UX + tuning
- SEO / GEO architecture
- Lead capture + Twilio compliance
- Refreshed visual system
- AI test suite + evaluation
- Gemini → Dify chat-backend migration
- SSR scaffolding
- Astra / Dify data layer
The problem
A renter’s search no longer starts in Google — it starts in a chat, often answered before anyone clicks. The old site couldn’t be found in either place: a client-only SPA, invisible to search engines and answer engines alike. The fix was a harder design problem than a redesign.
The problem in three
-
Invisible to search & AI
A client-only SPA — nothing server-rendered for Google or an answer engine to read.
-
Renters start in a chat
Search now begins in answer engines, not only Google — and a site that can't be cited there is invisible to a growing slice of demand.
-
The tension to design around
Keep the experience rich and app-like, yet fully indexable and citable — without the ephemeral chat polluting the index.
Talking to renters
Before designing the search, I talked to renters about how they actually look for a home. Three profiles surfaced — and they want different things.
Three kinds of renters
-
The decisive renter
Relocating on a timeline; knows the essentials.
- Set budget
- Target neighborhood
- Move-in date
NeedsFilters and a map — fast, precise, no conversation.
-
The open explorer
First place in a new city; knows the vibe, not the specifics.
- Fuzzy criteria
- Lifestyle-led
- Open on area
NeedsConversation that turns "walkable and lively" into real listings.
-
The shortlister
Down to a few homes, comparing the details.
- Specific questions
- Comparing
- Close to deciding
NeedsAnswers about one place — commute, schools, walkability.
How rental search works today
By the time I shipped, conversational search had become table stakes — Zillow, Apartments.com, and Redfin all launched it in 2025–26. So I evaluated each on the three axes this rebuild competes on.
-
- AI chat
- Unified control
- AI-citable
Natural-language search, an "AI mode" beta, and a ChatGPT integration — the deepest AI stack. But filters and chat stay separate modes, and pages aren't built for organic citation.
-
- AI chat
- Unified control
- AI-citable
Voice + chat "Smart Search" (sitewide Jan 2026) drives big engagement lifts — but it's a guided refine layered on the portal, not unified with the filters.
-
- AI chat
- Unified control
- AI-citable
Sierra-built AI Search replaces filters with pure chat — a linear Q&A. Fluid, but you lose the at-a-glance control precise renters rely on.
The key finding: AI chat is everywhere now, but it’s mostly bolted on as a chat-only Q&A — renters lose the fast, structured control they rely on. No one fuses conversation and filters on one shared state, and no one structures their pages to be cited by answer engines. That’s the opening this rebuild is built for.
Two kinds of renters, one missing interface: nobody lets you start vague, get precise, and keep asking — all on the same canvas.
One search, two modes
So I designed the two models as one. Conversational handles intent; faceted handles precision; both write to a single shared state, so they can never drift apart or contradict each other.
The renter journey I designed for
- 01 Search A place or a need — typed or spoken
- 02 Browse Map split-view + a live listing grid
- 03 Detail Floor plans, amenities, neighborhood Q&A
- 04 Act Inquire or schedule a tour
The principles I designed the conversation against
-
Keep the user in control
Every AI guess is visible and editable, and intake steps skip. The assistant proposes; the renter disposes.
-
Set honest expectations
It says what it found, and what it can do next.
-
Make latency feel handled
An instant echo of intent — never a dead UI.
-
Ground every answer in real data
Real inventory only. No match? It says so — it never invents one.
-
Reduce the blank-page burden
Guided intake and suggested follow-ups.
-
Bridge to action
Every result links to inquire and tour — not a walled garden.
-
Refuse gracefully
Out-of-scope or non-compliant asks get a polite decline and a compliant next step — designed and tested.
Five decisions, one interface
Designed to be found
Designing for the answer engine — not just the search engine — is a bet most rental sites haven’t made.
The GEO architecture
-
Canonical, server-rendered
A `/state/city/slug` hierarchy with FAQPage + BreadcrumbList JSON-LD — Google-indexable and structured for an LLM to quote.
-
Citable neighborhood Q&A
Each property page carries real questions — “Is it walkable to USC?” — exactly what a renter asks an engine, structured so it can lift them.
-
The chat stays out of the index
Ephemeral chat lives in a noindex /search space; legacy /property/[id] URLs 301-redirect to their canonical homes.
- unitpulse.ai/
- /{state} hub
- /{state}/{city} hub
- /{state}/{city}/{slug} PDP
- /search · noindex (ephemeral chat)
- /property/[id] → 301 → canonical
"Is it walkable to USC?"
Yes — the building is a 12-minute walk to campus, with two bus lines at the corner.
Apartments near USC — walkable studios
unitpulse.ai › ca › los-angeles › …
12-minute walk to campus, two bus lines…
"…a 12-minute walk to USC, with two bus lines nearby."
unitpulse.aiTo be precise: this is architecture and intent designed for citation, not a measured count of AI citations. Classic indexing is the part I can measure today.
Built & tested
Shipped in ~6 weeks
-
Scoped to the minimum
The redesign was a prioritization decision, not a coat of paint — knowing what to leave out so the AI bet could ship.
-
A refreshed visual system
A named brand-token palette, a serif display + grotesque body, a bento home — so the AI features read as premium, not experimental.
-
Accessibility, baked in
44pt touch targets on mobile, 36–40px on desktop, aria-labels on icon buttons — defaults, not retrofits.
The lean journey still has to convert
-
Send a message
An inquire modal — name plus email-or-phone, either is fine.
-
Schedule a tour
A date and time-slot grid, with SMS consent.
-
Compliant, and honest
Twilio A2P 10DLC consent + disclosure; GA4 fires only after a real 2xx — so the count tracks real leads, not optimistic clicks.


Tested like a system — quality and Fair Housing
-
47 cases · 9 families · EN + ZH
Each runs in a fresh session, in both languages, judged on the routed `route_code` and node logs — not just the visible reply.
-
34 Pass / 9 Fail / 4 Blocked
A real signal, not a green-washed “all passed.” Mapped back to 7 known prior bugs as a regression guard.
-
Fair Housing, tested
Adversarial cases proved the router must refuse protected-class filters, never extract them, and redirect to a lawful search.
47 cases · 9 intent families · English + Chinese · each run
in a fresh session and judged on the routed route_code and
node-level logs, not just the visible reply.
- 34 Pass
- 9 Fail
- 4 Blocked
- Direct search
- Location-only
- Need-location
- Non-search
- With-context
- Compare
- Relocate
- Fallback
- Compliance
- Protected-class filter request
- Refuse — never extract it
- Cite fair-housing law
- Redirect to a lawful search
The suite caught a real Blocker: one path extracted a protected-class attribute as a filter and affirmed it; another path handled it as the gold standard. Compliance must be tested, not assumed.
Early traction — honest, not inflated
A ~6-week-old production rebuild, live and ramping. All figures measured in GSC / GA4 over the window 2026-05-05 → 06-23.
The honest framing: these are early numbers for a six-week rebuild. The point isn’t the magnitudes — it’s that the architecture is live, indexing is climbing from zero, the funnel is converting real leads, and the GEO bet is designed to compound. Applications aren’t flowing yet (0 in the window), and I’d rather say that than dress it up.
Design for the answer engine, not just the search engine
The forward move was to build content an AI can cite, and to prove an AI-native rebuild can ship in weeks, in production, without sacrificing craft, an honest index, or compliance.
Make safety a tested requirement
The testing is the part I’d carry anywhere: define the intent space, automate the evaluation, read the logs, and treat Fair-Housing compliance as a first-class thing you verify — not assume.
This renter site is the acquisition surface of the broader UnitPulse platform
above. (Separately, the earlier tripalink.com growth story is a different,
legacy marketing site — not this rebuild.)