Inspiration

Sai has a big, big, big problem. During a dispute with his landlord, he had no idea what rights and protections he had as a tenant. Drafting a single reply took about 30 back-and-forth ChatGPT prompts, hours of legal research rabbit holes, and a 3-hour call with the LA Housing Department (LAHD). Every landlord message started that cycle again, and the back-and-forth stretched into a month. Even at the end, Sai still didn't know if his response was correct.

That's a bigger problem than one person: tenants have rights, but understanding and exercising them shouldn't require legal expertise. Housing resources in LA are spread across city, county, state and nonprofit websites, are hard to find, and are written in language that's hard to understand. Students, low-income renters and first-time tenants are hit hardest.

What it does

Feliz is a tenant-rights assistant you text, through iMessage via Photon, with no app to download and no legal website to navigate. A renter describes their problem in plain words, such as "my landlord kept $800 of my deposit and won't explain why," and Feliz:

  • Works out the issue (security deposit, eviction or rent increase) and asks only for the facts it needs: which city, the move-out date, whether they got an itemized list.
  • Applies the right jurisdiction. City of Los Angeles rules, LA County rules and statewide California law differ, so a Santa Monica renter never gets City of LA rules.
  • Answers only from trusted sources: the California Courts Self-Help Center, LAHD, LA County's Department of Consumer and Business Affairs (DCBA), the Legal Aid Foundation of LA (LAFLA), Stay Housed LA and LawHelpCA. Every legal statement comes with a source line naming the publisher, page and section, and it never makes up deadlines or dollar amounts.
  • Flags urgent situations like lockouts, utility shutoffs and eviction notices, and points to real help with referrals to legal aid and county services.

Example: after learning the renter moved out of a Los Angeles apartment and never got an itemized list, Feliz quotes the 21-day deposit-return rule straight from the California Courts guide, with its citation, and lists where to get help.

How we built it

  • Messaging: Photon Spectrum connects the agent to iMessage. Each text is one conversation turn.
  • Data pipeline: a Python scraper crawled the official and legal-aid sites into 52 pages. A TypeScript loader cleans them (strips site navigation, repairs garbled characters, fixes publisher names), splits them into 514 short, quotable passages with headings, and tags each one with its city, county, state and topic.
  • Search (RAG): passages are embedded with Google's gemini-embedding-001 (768 dimensions, through Vertex AI) and stored in Supabase Postgres with pgvector. Search combines keyword and meaning-based matching, then filters by the renter's exact location and issue. It works for both English and Spanish questions.
  • Agent: a TypeScript agent asks for missing facts, calls search with the confirmed location, and checks every citation and every number in its draft against the passages it retrieved that turn. If anything can't be verified, it quotes the sources directly instead of guessing.
  • Process: four of us worked in a TypeScript monorepo on parallel branches (scraping, RAG, agent, messaging), with automated tests at each stage. We spent a lot of time planning the UX and how messages are written, then scoped down hard to three issue types done well.

Challenges we ran into

  • Outdated legal information on trusted sites. One legal-aid page still says tenants have 5 days to answer an eviction lawsuit, but California's AB 2347 made it 10 court days in 2025. Answering from the corpus as-is would have given renters dangerously wrong advice, so we built checks to find and remove outdated rules.
  • Jurisdiction is genuinely hard. "Los Angeles" can mean the city, the county, or one of dozens of other cities with their own rules. Some county ordinances only apply in unincorporated areas, so we had to tag every page with where it applies.
  • Getting the data. Some official sites block automated scraping, many pages were flat text with no structure, and our scraper credited one county page to the wrong organization. Since every citation has to be exact, each of these needed fixing.
  • Embedding access. We spent a surprising amount of time getting embeddings running: API keys with no credit and cloud projects without billing. At one point we ran a free open-source model locally, then moved to Gemini through a Google Cloud service account.
  • Subtle search bugs. Long messages were silently cut off so the newest message was ignored, city names were case-sensitive, and Spanish words were matching fragments of English words ("para" inside "paragraph"), which pushed the right answer from #2 to #10. Tests and real-world checks caught each one.

Accomplishments that we're proud of

  • Answers you can check. Every legal claim cites its exact source, and the agent refuses to state numbers that aren't in the sources.
  • The same scenario that took Sai a month of back-and-forth takes Feliz [X] minutes.
  • Correct by location: city, county and state rules are kept apart, so renters only see rules that apply to them.
  • Spanish questions find the right legal sources: the deposit and eviction-deadline rules come back at #1‚Äì#2.
  • We measured accuracy instead of assuming it: on test questions we hadn't tuned on, Feliz told housing questions apart from off-topic ones 27 out of 27 times.
  • A full pipeline built and connected in a weekend: scraping ‚Üí cleaning ‚Üí embeddings ‚Üí database ‚Üí search ‚Üí agent ‚Üí iMessage.

What we learned

  • Accuracy matters more than answering. For legal information, "I don't have a source for that, here's who can help" beats a confident wrong answer. That shaped the whole design, from citation checks to refusing unsourced numbers.
  • Official information goes stale. Even trusted sites contradict current law, so a legal assistant needs a way to catch outdated rules, not just scrape them.
  • Measure, don't guess. Several "obvious" settings turned out wrong when tested on real questions, especially for Spanish.
  • Plan the UX early. How a reply reads in a text message (short, sourced, with clear next steps) mattered as much as the search behind it.
  • Coordinate across a team: agreeing on data formats between scraping, search and the agent early saved us from painful merges later.

What's next for Feliz

  • Full Spanish conversations: understand and reply in Spanish (and more languages), not just search in it.
  • More issues and places: repairs and habitability, harassment and lease questions, plus the other LA County cities with their own rent and eviction rules.
  • Fresher law: automatic re-scraping with alerts when a source changes, plus the California Civil Code as a primary source.
  • More channels: SMS and RCS so anyone can text Feliz, not just iPhone users.
  • Document understanding: let renters send photos of notices and leases, so Feliz can pull out dates and amounts and ask them to confirm.
  • A warm handoff to humans: connect urgent cases directly to legal aid and tenant organizations like Stay Housed LA and LAFLA.

Built With

Share this project:

Updates

Submission history