Back to home

A private-markets agent platform for CRE

Three engines over a DuckDB warehouse — deal sourcing, underwriting, and outreach. Built for a commercial real estate operator who wanted to compress the time from listing to decision.

Python
DuckDB
Claude API
FastAPI
Next.js

The Challenge

Commercial real estate deal flow lives in PDFs, scraped listings, broker emails, and analyst spreadsheets. By the time a deal is fully underwritten, two things are usually true: another buyer is already in the room, and the work the analyst did doesn't compound — the next deal starts from zero.

Atlas wanted to turn that workflow into a software loop — a system that pulls in deals, underwrites them against the firm's thesis, and surfaces the few worth a phone call.

What we built

One DuckDB warehouse on shared storage, three engines on top:

Engine 1

Sourcing

Ingest listings, broker emails, and public records into a single normalized table. Deduplicate across sources. Surface deals that match the firm's active mandate.

Engine 2

Underwriting

Pull comps, run the model, generate a one-page memo per deal. Claude does the synthesis; the numbers come from the warehouse so they're auditable.

Engine 3

Outreach

For deals that clear the underwriting bar, draft a personalized outreach to the broker or seller — grounded in what the underwriting actually showed.

Why DuckDB

CRE data is wide, columnar, and mostly read-heavy — the shape DuckDB is built for. Running the warehouse as a single file on shared storage meant the team could iterate on the schema in days, not weeks, and every engine read from the same source of truth. No service layer, no migrations theater, no Snowflake bill.

Outcome

3
Engines shipped
Source, underwrite, outreach
End-to-end
Agent loop in production
From listing to outreach
Auditable
Memos cite the warehouse
Numbers, not vibes

The platform works as a loop. Sourcing pulls deals into the warehouse and deduplicates against the firm's active mandate. Underwriting produces a one-page memo per deal — Claude does the synthesis, but the numbers come from the warehouse so they're auditable. Outreach drafts personalized notes grounded in what underwriting actually showed.

Running the warehouse as a single DuckDB file on shared storage means every engine reads from the same source of truth. The schema can iterate in days, not weeks — which matters more than it sounds, because CRE thesis shifts quarter to quarter and the warehouse has to keep up without breaking the engines that live on top of it.

Building an agent platform on private data?

We've done sourcing, underwriting, and outreach loops end to end. Tell us what you're trying to build.

Start a conversation