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.
| Persona | Represents |
|---|---|
| The Mortgage Expert | Financeable price ceiling, rate sensitivity, true monthly carrying cost |
| The Home-Ownership Project Expert | End-to-end buying process, timeline, stakeholders, transaction costs |
| The Renovation Specialist | Buy-and-improve economics, expandable vs fixed features, retrofit cost reality |
| The Lifestyle Advocate | Commute, neighbourhood, daylight, walkability, schools |
| The Risk Auditor | Structural, 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:
- Must-haves — violating these makes the home wrong for you.
- Nice-to-haves — ranked, with effective weights.
- Dealbreakers — instant-reject criteria (not the inverse of must-haves).
- 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