Inspiration

The inspiration for this app comes from my personal struggles with finding an apartment with a good landlord. NYC renters are up against landlords with lawyers and property managers, while tenants are left with a 20-page lease, scattered city records, and their own memory of what happened when. My hope is that this app empowers tenants to fight back against slumlords.

What it does

Tenant Advocate is an AI-powered advocate for renters:

  • Explains your lease in plain English, quoting each clause with its page number and flagging terms worth checking, like an outsized security deposit or "entry without notice"
  • Surfaces your building's violation history from NYC public records (HPD violations and complaints), so you can see whether your problem is part of a pattern
  • Tracks every issue with dates and landlord-notification status, so you walk into any dispute with an organized record
  • Answers your questions with a source for every claim, telling you what it couldn't verify and who to confirm with (311, HPD, Housing Court Answers)
  • Drafts letters to your landlord that cite your lease and the city's records, and never sends anything: every draft waits for your approval
  • Remembers context you share, like "management only answers texts", so later advice and letters fit your situation

How we built it

  • Agent: Claude on Amazon Bedrock runs a bounded tool-use loop. Its tools are all read-only: building record, lease terms and lease search, issue log, vetted NYC rules, memory recall, plus a draft-only letter tool.
  • Daytona: uploaded lease PDFs are untrusted input, so they're parsed inside a throwaway Daytona sandbox that's deleted right after. Claude then extracts the key terms, and every quote is checked word-for-word against the lease text. Quotes that don't match are dropped.
  • Arize AX: every run is traced end to end (agent → tools → model calls), and a citation check runs on every answer and is recorded on the trace.
  • SurrealDB Agent Memory: stores what the tenant tells the agent, like landlord responses and preferences, and recalls it by meaning in later conversations. Structured records (issues, lease terms) live in a regular datastore.
  • NYC Open Data: NYC Planning Labs GeoSearch turns an address into a building ID, which we use to pull HPD violations and complaints.
  • App: a TypeScript/Express API and a React/Vite dashboard, with Google sign-in, signed session cookies, CSRF origin checks and per-user data.

Challenges we ran into

  • Not giving legal advice while still being useful. Early outputs called lease clauses "likely unlawful". We changed it so the agent only states law from a short list of rules checked against official sources. Everything else is framed as "worth checking", with who to confirm it with, and a filter backstops the wording.
  • Keeping complaints and violations apart. In HPD data, complaints are reports from the public and violations are findings after an inspection. Mixing them up would mislead tenants, so the app labels them separately everywhere.
  • Trusting model output about a document. Models can invent quotes, so every extracted clause is verified against the actual lease text before it's shown.
  • Deciding what belongs in agent memory versus a database. Exact dates and statuses belong in a database. Context and preferences belong in memory.

Accomplishments that we're proud of

  • Grounded answers: the agent's answers cite real HPD record IDs, lease pages and official sources, and the citation check is visible in Arize.
  • Safe by design: every tool is read-only, untrusted PDFs are isolated in a sandbox, nothing is sent without human approval, and the app never contacts the landlord.

What we learned

  • Learned about the different services and the different parts of the stack they touch including, monitoring with Arize, agent memory with SurrealDB, code execution and sandbox with Daytona, and using agents with Bedrock.
  • Agents get trustworthy through structure: read-only tools, citations, verification and approval gates do more than prompt wording alone.
  • Observability isn't optional for agents. Seeing which tools ran and why made debugging and the safety story far easier.
  • Public data is powerful but subtle. Knowing what a record actually means (a complaint versus a violation) matters as much as fetching it.

What's next for Tenant Advocate

  • Building score and landlord transparency: the registered owner and managing agent, HPD litigation, DOB violations and enforcement-program status, rolled into an explainable building grade
  • Follow-up reminders: "It's been 7 days with no response. Here's your next step: 311 → HPD inspection → Housing Court Answers"
  • Evidence capture: photos, temperature logs and timestamps attached to each issue
  • Guided form filling with Anchor Browser: pre-fill 311 complaints and DHCR rent-history requests in a live browser view, where the tenant signs in and clicks Submit themselves
  • Read it to me: multilingual read-aloud with ElevenLabs, so language and literacy don't decide who knows their rights
  • Landlord portfolio graph: connect LLCs to every building an owner controls, using SurrealDB's graph side

Built With

Share this project:

Updates

Submission history