Project name

LeaseLens

Tagline

Snap your lease from any EU country and see which clauses break tenant law, why, and where the law says so. Powered by NVIDIA Nemotron on Nebius Token Factory.

Track

Best Apps and Agents (also submitting for Best Use of Tavily)

Links


Inspiration

Renting a home in Europe usually means signing a contract the landlord or agency wrote. Many of those contracts contain clauses that the law already makes void: deposits above the legal maximum, agency fees the tenant shouldn't pay, bans on leaving early, landlords keeping a key "to inspect whenever they want". Spain's consumer ministry publicly lists these as some of the most common abusive clauses in rental contracts.

Tenants rarely know. A lawyer costs more than the problem seems worth, generic chatbots confidently invent articles of law, and the rules change from one country to the next. We wanted something a tenant could use in the minute before signing: take a photo, get a trustworthy answer with the exact legal basis, and have a letter ready to push back.

What it does

A short landing page explains how LeaseLens works, what keeps its answers trustworthy and which countries it covers. From there, the tenant moves through three steps (upload, findings, letter), and the browser's back button works between them.

  1. Upload a lease from any EU country: PDF, photo, scan or text, in any EU language. Or try one of four sample leases (Spain, France, Germany, Italy).
  2. LeaseLens reads it clause by clause, detects the country, city and language, and extracts the key facts (rent, deposit, guarantees, fees, rent indexation, courts).
  3. Every problematic clause is flagged as Illegal, Likely unfair, Check or Fine, with a plain-English explanation, the verbatim quote from the contract, and the legal basis (for example "§ 551(1) BGB" or "Art. 36.1 LAU").
  4. The contract viewer highlights the exact words that cause each problem.
  5. Live legal research checks what changes over time: whether the city is under rent control, the latest official rent index, and, for countries without curated rules, what national law says about each flagged clause, with sources.
  6. A formal letter to the landlord is drafted in its own step, in the contract's language (or English). The step first lists exactly which problems the letter will raise, and the letter cites only those verified problems.

Coverage is tiered and honest about it:

  • Full coverage (Spain, France, Germany): curated national rules with legal citations, deterministic checks for numeric limits, and EU consumer law.
  • Guided coverage (the other 24 member states): EU consumer law (Unfair Terms Directive 93/13/EEC, which the CJEU applies to tenancies in C-488/11 Asbeek Brusse) plus live research into national law for every flagged clause.

How we built it

NVIDIA Nemotron on Nebius Token Factory is the reasoning core. Every step that needs judgement runs on nvidia/nemotron-3-super-120b-a12b through Token Factory's OpenAI-compatible API, always with JSON-schema structured output:

  • Jurisdiction detection: country, city and contract language.
  • Fact extraction: rent, deposit, guarantees, fees, indexation, court city, and the clause each fact came from.
  • Clause classification: each clause is matched against the rule set for that country, returning the rule, a verbatim quote in the original language and an explanation in English. Clauses are processed in concurrent batches.
  • Research verdicts: for guided-coverage countries, Nemotron reads the live sources and decides whether a clause is likely illegal, allowed or unclear.
  • Claim letter: a formal letter in the contract's language.

Photos and scanned PDFs are transcribed by a vision model that is also served on Token Factory (MiniCPM-V 4.5), because Token Factory doesn't offer a Nemotron vision model yet.

Around the model we built layers that make the output trustworthy:

  • Legal citations never come from the model. Nemotron only says which rule applies and which words prove it; the citation comes from a curated knowledge base (YAML files per country, reviewed against the statutes and case law).
  • Quote verification. Every AI finding must quote text that really exists in the clause, and use a rule that exists for that country. Anything else is discarded.
  • Deterministic checks in code for numeric limits: a deposit above one month in Spain, three months' base rent in Germany, one or two months in France depending on furnishing, Spain's IRAV rent index for contracts since May 2023.
  • Source-backed research. A source is only cited if it contains the figure stated, and a legal reference is only shown if it literally appears in those sources. Index values from a previous year get a staleness warning.
  • Letter verification. If the letter cites an article or law number that isn't in the verified findings, it is redrafted.

Tavily powers all live research, with local-language queries that include the current year so results favour recent sources (for example "Mietpreisbremse Berlin" or "encadrement des loyers Lyon").

Stack: Python 3.11, FastAPI with server-sent events so the analysis streams step by step, Pydantic, pypdf/pypdfium2; Next.js 16 static export, React 19, TypeScript and Tailwind CSS 4. Production is a single container on Google Cloud Run that scales to zero; all inference runs on Nebius Token Factory. 66 offline unit tests and an evaluation script that runs the full pipeline on sample leases.

Challenges we ran into

  • Models invent law. Early on the model cited plausible-sounding articles. Moving all citations into a curated knowledge base and verifying every quote solved it.
  • Prompt changes cause silent regressions. Giving Nemotron each rule's legal position made it stop reporting lawful clauses (14/16 on the Spanish sample, three runs in a row). We only caught it because we score every change against labelled samples.
  • Research that looks right but isn't. Live search returned an outdated rent index and, for Italy, a German court ruling. We added year-aware queries, staleness warnings, same-country source rules and literal checks for legal references.
  • No Nemotron vision model on Token Factory. We benchmarked the vision models that are available and picked the fastest exact transcriber for photos.
  • Twenty-seven legal systems. Curating every country wasn't realistic for one person, so we designed tiered coverage that is transparent about what was curated and what was researched live.

Accomplishments that we're proud of

  • On the four labelled sample leases, LeaseLens detects the correct country and every expected rule: Spain 16/16, France 12/12, Germany 11/11, Italy 8/8, with no false positives, in about 15 to 25 seconds per contract.
  • It works on contracts in Spanish, French, German and Italian while explaining everything in English and keeping quotes verbatim.
  • A full analysis plus letter costs about 1.5 cents in Token Factory inference, and hosting costs nothing when idle.
  • Every legal claim on screen can be traced to either a curated rule or a cited source.

What we learned

  • For high-stakes answers, the model should decide and explain, while facts like citations and numeric limits should live in code and data.
  • Structured output with JSON schema on Nemotron was reliable enough to build a multi-step pipeline on.
  • An evaluation set, even a small one, is what makes prompt iteration safe.

What's next for LeaseLens

  • Full coverage for more countries (Netherlands, Italy, Portugal, Poland) with rule sets reviewed by tenant lawyers.
  • An evaluation set of real, anonymised leases, and more robust photo transcription for crumpled phone pictures.
  • Partnerships with tenant associations and consumer offices, who can point tenants to it and help keep the rules current.
  • Other everyday contracts where the fine print hurts: gyms, telecoms, insurance.

Built with

nvidia-nemotron, nebius-token-factory, tavily, python, fastapi, pydantic, next.js, react, typescript, tailwindcss, google-cloud-run, minicpm-v, pypdf

Prior work

None. LeaseLens was created from scratch during the submission period (development started on 13 September 2026).

Built With

  • docker
  • fastapi
  • ffmpeg
  • google-cloud-build
  • google-cloud-run
  • google-cloud-text-to-speech
  • google-secret-manager
  • minicpm-v
  • nebius-token-factory
  • nextjs
  • nvidia-nemotron
  • pillow
  • playwright
  • pydantic
  • pypdf
  • pypdfium2
  • python
  • react
  • tailwindcss
  • tavily
  • typescript
  • uv
  • uvicorn
Share this project:

Updates

Submission history