Consulting Work About Book Writing Contact
Selected work

Not what was built - what it changed.

A few projects that show how I work: look at what the business actually needs, weigh what is available, and build the right thing for the context, even when the right thing does not exist off the shelf yet.

01
NYC commercial real estate 2025

AI narrative, built into the report

Plain-language insight over live data - for a fraction of the licensed price.

The reports already held everything - sales volumes, pricing trends, deal flow, year-on-year movement. What was missing was the sentence a busy reader actually wants: what does this mean, right now, for this borough and this quarter. Power BI can do that natively, but only through Copilot on costly Fabric capacity, and the output is generic at that.

So I built it directly into the report instead. A layer of logic gathers the KPIs that matter, sends them to an AI model with precise editorial instructions, and renders a polished narrative back into the page. Change a filter and the summary rewrites itself in seconds - for a market analyst, an executive, or a broker, depending on how it is briefed.

It runs inside the existing environment with no extra Microsoft licensing, and because it is driven by ordinary API usage, the running cost is a rounding error next to the licence it replaces - while reading as if written by someone who genuinely knows the market.

  • Running cost Token-based API usage - a fraction of the licensed feature
  • Response Regenerates in seconds on every filter change
  • Control Tone, length, and perspective defined per audience
  • Reach Desktop, Service, Publish to Web, Salesforce
TypeScript Power BI Visuals SDK AI / LLM API DAX Data modelling
02
Data engineering 2024–2025

Cloud database migration, done cleanly

Moving millions of rows between platforms and fixing the bug nobody had noticed.

A reporting database of several million rows needed to move from one managed cloud platform to another. A migration like this is rarely just a copy: the data has to land intact, the model has to keep performing, and every downstream report has to keep telling the truth.

The subtle part was time. Timestamps were being converted differently depending on where the report ran, so the same figure could differ between the desktop and the published service. I pushed a daylight-saving-aware conversion down into the database itself, so every environment returns an identical, unambiguous value - closing a discrepancy that is easy to miss and hard to trust once found.

With the gateway, encryption, and connection details set up properly, the result was a migration that was not just complete but dependable - the same numbers everywhere, every time.

  • Scale Several million rows migrated
  • The fix DST-aware conversion pushed into the database
  • Outcome Identical results across desktop and service
PostgreSQL Cloud / managed DB Power Query / M Data Gateway SQL
03
NYC commercial real estate 2025

A Q&A visual that answers in words

When a question deserves a number, not a chart.

Power BI ships with a natural-language Q&A feature, but it answers with charts and tables, and it guesses at what you meant. For someone who just wants the average cap rate for a neighbourhood, a bar chart is friction, not an answer.

I built a compact custom visual instead. It offers a curated set of the questions people actually ask, computes each answer directly from the filtered data, and returns it as clean, formatted text - a percentage with its sample size, a ranked list with property names and values. Every answer is deterministic: the same data and filters always give the same result.

It computes everything locally, so there is no external service, no latency, and no per-query cost. It reacts to slicers like any native visual, and because it is a proper TypeScript custom visual it runs everywhere Power BI does, including Publish to Web and Salesforce. Under the hood it pages through the full dataset and de-duplicates at the row level, so aggregates are always based on the complete picture.

  • Answers Plain text — numbers and lists, not charts
  • Cost Computed locally - no API, no per-query cost
  • Behaviour Deterministic and filter-reactive
  • Reach Desktop, Service, Publish to Web, Salesforce
TypeScript Power BI Visuals SDK Data windowing Deduplication

Have something that doesn’t fit the off-the-shelf answer?

That is usually where the interesting work is. If you have a data problem worth solving properly, let’s talk.

Start a conversation