Subsystem 02.5 · 2026
Domino
Real-estate platform — listings, CRM and AI search
A real-estate business in one system: a listings site in three languages, the CRM the agents work in — and a search you can simply talk to.
01What it is
Domino runs a real-estate business end to end: a public listings site in Albanian, English and German, and the internal CRM the agents live in — leads, a drag-and-drop deals board, clients, calendar, tasks, team chat, company-car bookings and the site’s own content.
Its signature is the search. Type what you want the way you would say it — in Albanian, in English, or both in one sentence — and the matching listings are there almost instantly.
02The problem
People don’t think in filters. They think “a two-bedroom flat in Dardania, under 90,000, with parking.” Filter panels make them translate, and most attempts at AI search either miss the point or get slower and more expensive as the catalogue grows.
The agents, meanwhile, were working out of spreadsheets and chat threads.
03What I built
- The whole architecture: a NestJS API over PostgreSQL with Prisma, Meilisearch, S3-compatible storage and real-time notifications, and a Next.js front end in three languages.
- The AI search: a model turns a sentence into a strict, typed search query — only known fields, only known cities and neighbourhoods, never a guess — and the regular search engine does the rest.
- Weighted lead-to-property matching with an explainable score for every match.
- Security the business can lean on: rotating refresh tokens that tolerate simultaneous refreshes, encrypted two-factor secrets, and two-factor required for admins.
- Notifications over Socket.IO, browser push and email with retries; tiled watermarks on every photo; listing codes renumbered without breaking a single shared link.
04Architecture
05Technology
- Interface
- Next.js 16next-intlTanStack Query · Tablednd-kitGoogle Maps
- Services
- NestJSPrismaSocket.IOMeilisearchResend
- Data
- PostgreSQL 16S3 / R2
- AI
- LLM → typed query (JSON)Albanian · English
- Delivery
- GitLab CIRailwayDocker Compose
06Engineering notes
- 01
Search that doesn’t care how many listings there are
The model never sees a listing. It receives the sentence and the known cities and neighbourhoods, and returns a small typed query — allowed fields, allowed values, and IDs only for confident matches. The index answers the query, so response time and cost stay flat whether there are fifty listings or fifty thousand.
- 02
Two languages in one sentence
Albanian, English or both at once. Ranges, minimums and maximums — “të paktën”, “deri në”, “at least”, “up to” — map to the right fields; anything that can’t be mapped confidently is left out rather than guessed.
- 03
Matches an agent can trust
Leads are matched to properties by weighted criteria, and every match shows its score breakdown — so agents call from a list they understand.
- 04
Links that survive a rename
When listing codes were renumbered, the old codes kept resolving, so every link already shared on social media and in messages still lands on the right property.
07Results
- ~190
- API endpoints
- 40
- data models
- 3
- languages
- 55
- migrations
- Running the business’s listings and daily work at domino-ks.com.
- A natural-language search that stays instant at any catalogue size.