All projects
Skrapan

Every value links back to its source document

Skrapan turns Swedish property companies’ scanned leases and inspection reports into a rent roll they can verify. I was the founding and only engineer, and I designed and built it.

6 months
from idea to MVP
Fully European
and GDPR-native
An excerpt of a scanned lease with lines tracing four of its rows to the values Skrapan extracted from them - the parties, the property, the notice date and the annual rent

The challenge

Property companies track rents, notice dates and termination status by hand, straight from scanned PDFs. It is slow, and one missed notice date can renew a lease on the old terms. The co-founders knew the domain but had no engineer. They needed one person to build the whole product: an AI pipeline that reads scanned contracts, an interface where every value can be checked, and a European stack for customers increasingly wary of sending sensitive data abroad.

What I did

  • Scoping the MVP with the co-founders

    I scoped the MVP with the two co-founders and decided what to build first. Rent rolls and notice deadlines are always rebuilt from the contracts, so they can’t drift. The stack is European and small, and one PostgreSQL database handles background jobs, vector search and real-time updates.

  • Click a value, see the words in the PDF

    Every extracted value shows its source quote, page and confidence. Click it and the exact words light up in the PDF, even on scanned pages, through word-level text matching I built myself.

  • Grounding the assistant in the documents

    The assistant answers questions across the whole portfolio and cites its source every time. Evals showed that what stops it giving plausible but wrong figures is answering from the extracted data, not tuning the model. Each customer’s data is kept separate, and every model output is validated.

  • Testing prompt changes against a benchmark

    Claude Code was my main tool. I wrote the conventions it works to, with custom skills for verifying, committing and reviewing changes, and architecture docs that fail the build when they drift from the code. A prompt change stays only if it scores better on a benchmark of hand-verified leases, and about 3,600 tests cover the rest.

The outcome

Every extracted value in the rent roll traces back to the line in the document it came from.

A row in the rent roll opening a breakdown of how its indexed rent was calculated, with labels: the base rent as written in the lease, the index change since October 2021 from Statistics Sweden, and the lease’s floor clause that keeps the rent from falling below the base rent