Skip to content
PROJECT 03 / 11

Spotscore

Norwegian property search with a transparent 0–10 score, public registry data and a local-LLM assistant.

→ Every listing scored 0–10 on seven published factors.

  • Search
  • Public data
  • Local LLM
  • Public product

Visit live site


Spotscore is a search and scoring site for Norwegian homes, live at spotscore.ai, for first-time buyers and property investors. A listing shows what the seller wants to show. Spotscore adds what a buyer otherwise has to dig out alone: what the property registers say, what hazards the ground carries, how far it is to public transport, and how the asking price compares with the market.

The score

Every listing gets a score from 0 to 10, a weighted average of seven factors: rental economics, market value, price, location, condition, time on the market and listing quality. The weights follow the buyer’s strategy. A rental investor’s score leans on rental economics and location; a renovation project leans on market value and condition. There is no machine learning in the score and no price forecast, so every number traces back to an input.

The methodology page publishes the weights the scorer actually uses. It did not always. An earlier version described a market-trend factor that the code never had, and in July 2026 it was replaced with the real seven factors and their weights.

┌─[ 00 LISTINGS ]──────────────────────────────────────┐
│ > public listing portals, every 20 minutes           │
└─────────────────────────┬────────────────────────────┘
                          ▼
┌─[ 01 ENRICH ]────────────────────────────────────────┐
│                                                      │
│   Kartverket · SSB · NVE · NGU · Entur · OSM         │
│                                                      │
└─────────────────────────┬────────────────────────────┘
                          ▼
┌─[ 02 SCORE ]─────────────────────────────────────────┐
│                                                      │
│   7 factors × strategy weights ──> 0–10              │
│                                                      │
└─────────────────────────┬────────────────────────────┘
                          ▼
┌─[ 03 USE ]───────────────────────────────────────────┐
│                                                      │
│   search · map · city pages · calculators · chat     │
│                                                      │
└──────────────────────────────────────────────────────┘
Listings in, public data added, one explainable score out.

Public data, handled with care

A scraper collects new listings from the public listing portals every 20 minutes. Scheduled jobs then enrich them: property and title data from Kartverket’s registers, flood and quick-clay zones from NVE, radon from NGU, noise from Miljødirektoratet, walking time to public transport from Entur, schools from OpenStreetMap, and population and employment figures from SSB.

Two rules came out of running this in production. First, an unknown answer is not a fact. A field stays empty until a source has actually answered, because recording a failed lookup as “none” had published wrong verdicts. Second, the land registers return personal data, and a nightly job clears it once its retention period ends.

More than a score

The site also carries the tools people need around a purchase: a home-buying calculator, a stamp-duty calculator, a total-cost guide, and guides on energy labels, tax deductions, cohabitation agreements and buying a first home. There are city pages, a map, saved searches, alerts and listing comparison.

A Norwegian chat assistant answers questions about listings and areas. It runs on a local LLM through Ollama on Spotscore’s own server, not on a hosted API, with a 15-second timeout so a slow answer never hangs the page. Anonymous visitors can use it up to a limit and are then invited to create a free account. The search box parses free text with rules rather than a model, which keeps search fast and predictable.

The bug that looked like an SEO problem

Spotscore has 348 city pages, and for two months they had dropped out of search. The first diagnosis was low domain authority. The real cause was a bug: a city page that failed to load redirected to the city index, so search engines folded all 348 pages into one. The fix in July 2026 made a failing page return an honest error instead. The rule since: a public page that fails must never send a search engine a permanent signal.

Stack

  • Flask API, MySQL and Redis; scheduled jobs instead of a job queue
  • React frontend with Leaflet maps
  • Ollama for local LLM inference
  • Kartverket, SSB, NVE, NGU, Entur, Miljødirektoratet and OpenStreetMap
  • Self-hosted on Linux, deployed on push

Status: public product, built since December 2025. It started from the same architecture as Turboscore.

← back to work

esc
↑↓ nav ↵ open esc close