Skip to content
Selected work
Private projectJune 2026 — present

CORA

Cost estimation for services and proposals, built on historical data.

Software and data engineering in one project: extract and transform historical service and proposal records, model them relationally, and use that history to estimate the cost of new work — instead of starting each estimate from a blank sheet.

Proprietary system — no source code is shared.

Status
In development
Period
June 2026 — present
Context
Private project
Domains
Estimation · Data engineering · ETL
CORA — historical cost estimation tool

The problem

Cost estimates were built from scratch each time, leaning on the experience of whoever prepared them. The historical record that should inform them existed, but it was scattered across exports and unusable in that shape.

Approach

  1. 01Built the extraction and transformation of historical records into a consistent dataset.
  2. 02Designed a relational model that makes past work comparable across services and proposals.
  3. 03Used that history as the basis for estimation, so a new estimate starts from evidence.
  4. 04Shipped it as a web application, keeping the interface thin and server-rendered.

Architecture

How it is put together.

ETL over historical records

Extraction, cleaning and transformation of heterogeneous historical exports into a coherent schema — the part of the project that took the most care.

Relational modelling in PostgreSQL

A normalised model of services, proposals and costs, designed so estimation queries stay simple.

Django + HTMX

Server-rendered pages with HTMX for partial updates: interactive where it matters, without shipping a front-end framework for a form-heavy tool.

Stack

Backend
  • Python
  • Django
Front end
  • HTMX
  • Server-rendered templates
Data
  • PostgreSQL
  • pandas
  • ETL

Outcome

  • Turned a scattered historical record into a queryable basis for estimation.
  • The extraction and cleaning layer is the bulk of the work: heterogeneous exports, inconsistent formats, and no shared identifiers to join on.
  • In development since June 2026 — outcomes will be added once it is in use.