Inspiration

Rental sites help you find listings. City open-data portals technically expose everything else — permits, code violations, complaints, inspections, evictions, seismic risk — but scattered across dozens of datasets with different identifiers, geographic scopes, and update cadences. A housing professional can reconcile them; a renter deciding between tours this weekend cannot. That information asymmetry costs people thousands of dollars and years in a bad building. We wanted to make the investigation, not just the search, accessible.

What it does

You describe what you want out loud — neighborhood, budget, bedrooms, "quiet," "no construction headaches." DueDwelligence:

  1. Searches live RentCast inventory (real current listings, not a canned demo property).
  2. Resolves candidate addresses against SF's official Enterprise Addressing System and parcel (APN) records.
  3. Joins each candidate to SF Open Data: building permits, DBI complaints, notices of violation, inspections, soft-story status, 311 cases, police incident trends, SFMTA transit, neighborhood boundaries, and more.
  4. Selects one defensible listing and narrates why it survived — on a live evidence canvas with maps, timelines, and source cards, not a chat transcript.
  5. Lets you interrupt mid-walkthrough; it renders a contextual deep-dive visual, answers, and resumes exactly where it left off.
  6. Ends by naming the questions public records can't answer, so you know exactly what to ask before you commit.

Every claim is labeled by source, geographic scope (unit vs. parcel vs. block vs. neighborhood), freshness, and epistemic status. Complaints are never presented as violations. Missing data is never presented as a clean record. When a required stage fails, it fails loudly with a diagnostic instead of faking a result.

How we built it

  • DigitalOcean Gradient is the investigation engine: the Gradient ADK orchestrates the stateful research graph; function routing invokes RentCast search, address resolution, evidence retrieval, and scoring; a Gradient Knowledge Base explains SF dataset semantics and caveats; Gradient inference synthesizes structured evidence into source-grounded conclusions; tracing and evaluations verify grounding and attribution.
  • DigitalOcean PostgreSQL + PostGIS holds the SF Open Data warehouse: 12 source assets across 11 SF dataset families, with database-enforced ingestion accounting, immutable source records, sealed one-way releases, and freshness gates before any dataset is used as evidence.
  • FastAPI streams typed research events over resumable SSE.
  • Next.js/React renders the landing page and live evidence canvas; a deterministic OpenAPI export with generated TypeScript and strict Zod schemas keeps the contract drift-checked on both sides.
  • ElevenLabs powers the browser voice experience.

Challenges we ran into

  • Joining SF datasets is genuinely hard: listings use street addresses, city records use EAS IDs and APNs, incidents use points, evictions use blocks. Getting deterministic address resolution instead of fuzzy matching took real work.
  • Keeping evidence honest: modeling the difference between a complaint, a verified violation, and an unknown — and making the UI preserve those distinctions instead of flattening them into a score.
  • Voice interruption: checkpointing narrative state so barge-in stops playback, answers in context, and resumes the walkthrough correctly.
  • Refusing silent fallbacks: building specific hard-failure diagnostics for every external provider instead of degrading quietly.

Accomplishments that we're proud of

  • The winner is selected from real, live inventory — a judge can pick any neighborhood and budget, and the agent investigates whatever comes back.
  • A provenance-first data spine: immutable, sealed warehouse releases with freshness gates, so the agent can never cite stale or half-ingested data.
  • An agent UI that isn't a chatbot: a research ledger and live evidence canvas that make the investigation legible without exposing chain-of-thought.

What we learned

  • How Gradient ADK's stateful workflows and function routing change agent design compared to a single prompted loop.
  • The hardest part of "use open data" is identifier reconciliation and evidentiary semantics, not API access.
  • How much engineering "unknown is a valid answer" actually requires — evaluation kept catching places where the agent turned missing records into positive claims.

What's next for DueDwelligence

  • An authorized outbound action: with the user's explicit approval, the agent phones the listing contact about the unanswered questions, discloses it's an AI, extracts the answers as attributed claims, and emails a complete report with element-level contextual voice Q&A.
  • More cities beyond San Francisco.
  • Side-by-side finalist comparison and saved searches with re-investigation alerts. x

Built With

Share this project:

Updates