LLM-Council-Homehunter

April 23, 2026 · View on GitHub

A council-pattern LLM app for house and apartment hunting.

You hand the council a messy, human description of what you're looking for — budget, location, life-stage, non-negotiables, aspirations, anxieties — and it returns a search spec you can actually use: must-haves, nice-to-haves, dealbreakers, and (the important bit) a written section on where to compromise and why.

Part of the LLM-Council-Projects index. Inspired by karpathy/llm-council.

Why

Every real house search is a compromise. Buyers and renters rarely articulate this to themselves up front — they fixate on the ideal, bid/apply on things that don't really fit, and then negotiate with themselves in a panic at 11pm.

This tool forces the tradeoff conversation to happen before the Rightmove / Zillow / Yad2 tab opens. The council's job is not to find you listings. It is to tell you what to actually search for given your real constraints, and what you will have to give up to stay inside them.

The council

Five personas debate your brief. Each is deliberately one-sided — the value comes from their disagreement.

PersonaRepresents
The Mortgage ExpertFinanceable price ceiling, rate sensitivity, true monthly carrying cost
The Home-Ownership Project ExpertEnd-to-end buying process, timeline, stakeholders, transaction costs
The Renovation SpecialistBuy-and-improve economics, expandable vs fixed features, retrofit cost reality
The Lifestyle AdvocateCommute, neighbourhood, daylight, walkability, schools
The Risk AuditorStructural, legal, HOA/committee, environmental, resale risk

A Chairman model synthesises their inputs into a single search spec.

Pipeline

User brief (free-text or voice transcript)


Context parser ─ extracts budget, location(s), timeline, household, hard constraints


Council (fan-out) ─ each persona produces: priorities, red flags, compromise positions


Cross-review ─ each persona reviews the others (identities anonymised)


Chairman ─ synthesises a SEARCH SPEC


Typst ─ polished PDF report

Output: the search spec

The Chairman always produces four sections:

  1. Must-haves — violating these makes the home wrong for you.
  2. Nice-to-haves — ranked, with effective weights.
  3. Dealbreakers — instant-reject criteria (not the inverse of must-haves).
  4. Acceptable compromises — the most important section. For each axis where your stated wants exceed your stated budget or realistic supply, the Chairman names the specific compromise and explains which persona argued for it and why the others agreed.

Stack

  • API: OpenRouter (one key, many models).
  • Council models: configurable in backend/config.py.
  • Chairman: configurable; defaults to a strong reasoning model.
  • Report: Typst → PDF.

Setup

uv sync
cp .env.example .env   # then edit: OPENROUTER_API_KEY=sk-or-v1-...

Running

uv run python -m backend.main --brief examples/brief-jerusalem-family.md

Or pipe stdin:

cat my-brief.md | uv run python -m backend.main

The PDF report lands in out/.

Status

Template / scaffold — pipeline wiring, Typst template, and example briefs included. Drop in your OPENROUTER_API_KEY and it runs.

Relationship to other council variants

See LLM-Council-Projects § My Own Variations for the full set. This one is the most domain-specific — the personas, the parser, and the output schema are all shaped around the house-search problem rather than being general-purpose.


Daniel Rosehill (not a bot) · github.com/danielrosehill