01Case study — Brief

Drawing set — 5 sheets

PropTracker — real estate investment platform

A private platform built to order for real estate investors in Khujand, Tajikistan. It replaced a shared spreadsheet with one system for properties, expenses, deal evaluations and model estimates.

Client
Real estate investors
Location
Khujand, Tajikistan
Type
Custom platform, built to order
Status
In use by the investors it was built for
Roles
Admin · Viewer

The problem

The investors ran their portfolio in Excel. As properties and deals grew, the workbook became harder to trust and harder to share.

  1. Fragile formulasCalculations depended on fragile formulas that were easy to break or overwrite.
  2. Drifting copiesRecords went missing or fell out of date between copies of the file.
  3. All-or-nothing sharingShowing the numbers to one person meant sending them the entire workbook.

What we built

PropTracker is not a template product. It was designed and built around this group's own process: calculations moved out of spreadsheet formulas into tested code, and access is controlled by role.

  1. Properties and timelineEach property with purchase, sale and a dated timeline of events.
  2. ExpensesCosts recorded per property by category.
  3. Shared calculationsInvested capital, cost per square metre, profit and outstanding balance computed in tested code shared by the server and the forms.
  4. Deal evaluationsCandidate deals assessed before purchase; the decision and its reason are kept.
  5. Model estimatesA separate model service returns price estimates, deal score, saleability, estimated days to sell and projected ROI.
  6. Role-based accessAdmins edit records; viewers read and can request estimates. Shared access reduces the need to circulate workbook copies.
02Architecture

A typed web application on PostgreSQL, with a separate model service in Python.

The browser talks only to the Next.js application. Its server routes check the session, read and write through Prisma, and call the model service from the server. Both branches start at the application, and estimates return through it.

Fig. 1 — Application boundary and data flow

Layers

  1. InterfaceRecords, evaluations and charts in the browser.
  2. AccessBusiness routes check the session; record changes require the Admin role.
  3. DataA relational model of properties, evaluations, predictions, events and expenses.
  4. EstimatesA FastAPI service called from the server. The application records prediction history, with storage failures logged.
Title
PropTracker — system architecture
Application
Next.js 14 · TypeScript · Prisma
Database
PostgreSQL
Model service
FastAPI · scikit-learn
Sheet
02 / 05
03Data model

A simplified subset of the actual data model.

Properties carry purchase and sale facts. Evaluations can exist before a purchase; predictions can belong to a property or an evaluation. Events and expenses are added as dated records. Other tables are omitted.

Fig. 2 — Entities and relations, simplified

Rules the model enforces

  1. Predictions are recordedEach prediction is written with its model version and input snapshot; the design treats it as a record of what the model knew at the time.
  2. Events form a timelineEvents are added to a per-property timeline that is designed to be append-only.
  3. A sale date sets soldWhen a sale date is present the server sets the status to sold; otherwise the supplied status is kept.
  4. One calculation moduleServer routes and form previews use the same tested calculation module.
Title
PropTracker — data model
ORM
Prisma
Store
PostgreSQL
Entities shown
6 of 12
Sheet
03 / 05
04Roles and access

Signed-in access, two roles.

Business routes require a signed-in session; sign-in itself is the exception. Viewers read and can request estimates, which the application records as prediction history. Admins create and change records, save deal decisions and export reports. Shared access reduces the need to circulate workbook copies.

Fig. 3 — Access by role, from the server routes
CapabilityAdminViewer
View properties, evaluations and estimates
Request a model estimate (the application records the request as history)
Add and edit properties, events and expenses
Save a deal decision
Export reports (CSV, XLSX)
Fig. 3 — Access by role, from the server routes

Access

  1. Sign-inNextAuth.js sessions; repeated failed sign-ins lock the account temporarily.
  2. AdminMaintains properties, events, expenses and evaluations; exports reports.
  3. ViewerReads records and can request estimates; cannot edit records.
Title
PropTracker — roles and access
Sign-in
NextAuth.js
Roles
Admin · Viewer
Record edits
Admin only
Sheet
04 / 05
05Status

In use, data kept private.

PropTracker is used by the investors it was built for. Their portfolio data is confidential, so this page shows no figures or screenshots.

Back to reference work

Services behind this project