Asclepieion
Site-selection tools tell a health center where. Asclepieion tells it which vacant suite, proves from that suite's own 3D scan that a clinic fits, and says what it costs and how soon it can open.
Live: https://asclepieion.vercel.app
Inspiration
An asclepieion was a healing temple in ancient Greece: a building set aside so that people could get care. We kept noticing two numbers that belong in the same sentence and almost never are:
- 92 million Americans live where there aren't enough primary-care doctors, up from 76 million a year earlier.
- About a quarter of Houston's offices are empty, and Houston and Los Angeles are the two busiest healthcare leasing markets in the country.
Then we found the person caught between them. On August 13, 2026, HHS awarded \$102 million to 158 community health centers to open 415 new sites, and every one of them has to be open and seeing patients within 120 days of the award. A normal medical fit-out takes six to twelve months. The bottleneck isn't money or demand. It's finding space that is nearly ready.
Brokers do this by hand today: walk the suite, sketch the rooms, guess whether exam rooms fit, guess the cost. We wanted to give the expansion lead at a health center an answer in minutes, with every number traceable to something measured.
What it does
- Where is care missing? Search Houston or Los Angeles. Every census tract is shaded by a need score built from HRSA shortage designations and CDC PLACES health data. On top of the map: every vacant office suite with a Matterport scan of that exact suite that can legally hold a clinic, ranked and sortable by need, size, patients served, rent, cost to open, days to open or distance from you. A "What you need" panel turns must-haves (exam rooms, ground floor, opens within 120 days) into filters. Needs new walls lists the suites that fail today, often open floors exactly where need is highest, with the cost and time of a build-out. Coming vacant reads CoStar lease end dates to show what frees up next and lets you set an alert.
- Reimagined. Open a suite and its real 3D scan appears. Then the old walls sink, straight new walls rise on the same lines, and every room is furnished by rule as a primary-care clinic. Three numbers lead: exam rooms, cost to open, patients served. Under them: days to open against HRSA's 120-day window, cost per square foot against a typical medical fit-out, and each Texas or California code rule checked against the measured rooms. Click any room to change its use: the furniture, cost, capacity and rule checks all update. Switch clinic type (primary care, urgent care, behavioral health) or walk through the clinic in first person.
- The room. Stand where the scanner stood and see the real 360° photo, with Before and After.
- Take it with you. A printable summary, a rooms-and-equipment spreadsheet, a link to your exact plan, the rebuilt clinic as a
.glb(with none of the scan in it), and the floor plan as a.dxfwith new walls and door swings marked. - Ask Asclepieion. An agent in a drawer on every page, and on iMessage. Ask "We were just awarded an HRSA grant. Where should our new clinic open in Houston?" It plans, sends an inspector into each finalist in parallel, pauses for you to approve or edit the shortlist, then writes a report shaped like the grant application's site form, checked figure by figure against the data before it hands it over.
Example, 450 Sam Houston Pkwy, suite 220: a primary-care clinic with five exam rooms, about \$232k to open, about 2,000 patients a year, open in about 115–160 days. That's \$57 per square foot against \$412 for a typical medical fit-out, because the existing walls do most of the work.
How we built it
Three data sources on one address.
- CoStar: buildings, vacancies, tenants, lease end dates and asking rents. We screened all 289 office buildings in the kit and matched 107 vacant suites to a Matterport scan of that exact suite.
- Matterport: rooms, the full 3D mesh, panorama positions and 360° photos for each suite.
- Vexcel: footprints, aerial photos and elevation. We carve each building's per-floor outline from surface-minus-terrain elevation, check it against CoStar's floor areas, and place each scanned suite inside its real floor by matching its outer walls to the facade.
The need score is computed per tract, as a percentile within its own county, with weights that come from a ranking rather than from tuning (rank-sum weights):
$$ \text{need} = \tfrac{5}{15}\,\text{HPSA} + \tfrac{4}{15}\,p(\text{uninsured}) + \tfrac{3}{15}\,p(\text{no checkup}) + \tfrac{2}{15}\,p(\text{diabetes}) + \tfrac{1}{15}\,p(\text{high blood pressure}) $$
Deterministic code for everything measurable.
- Rules: a clinic kit (
clinic_kit.json) holds room minimums, fixtures, unit costs and state rules. A fitter assigns each measured room a use only if it clears the size and clear-width minimums for its state. - Capacity: one provider per two exam rooms, at health-center averages from HRSA's Uniform Data System:
$$ \text{patients/yr} = \frac{\text{exam rooms}}{2} \times 800, \qquad \text{visits/yr} = \frac{\text{exam rooms}}{2} \times 2{,}600 $$
- Time to open: credentialing runs in parallel with the build, and is often the critical path:
$$ \text{days to open} = \max\big(\text{permits} + \text{construction},\ \text{licensing},\ \text{payer credentialing}\big) $$
The rebuild. We treat the scan as a survey, not as the model. Every room outline is straightened onto the suite's own grid, walls that nearly line up across rooms are snapped to one line, doors go where the scan shows real openings, and a constraint-based layout places furniture: nothing overlapping, nothing in a doorway, door swings and walkways clear, exam tables with the feet away from the door. Two tests every change has to pass: hide the scan and the clinic still stands, and lay it over the scan and it lines up. A quality test checks every ready suite room by room.
The front end is a static site: ES modules, an SVG map, and Three.js for the 3D suite, walk-through and 360° rooms. It is hosted on Vercel and runs entirely from data files we built and cached offline.
The agent is built on LangChain deepagents with a FastAPI server that streams every step to the page over server-sent events:
- Planning:
write_todos. - Subagents: a
site-inspectorper finalist, run in parallel, each writing its own notes file. - Skill: an HRSA site-rules skill loaded only when a question is about grants or deadlines.
- Human in the loop: an interrupt for shortlist approval, with tick boxes that send an edited approval.
- Self-check:
check_dossierrejects any dollar figure or day range that doesn't match the tools. - Memory: saved per visitor, so one person's "ground floor only" never leaks to the next.
- Vision: an aerial check of parking, drop-off and the way in, against CoStar's parking count.
The tools read the same files the page shows, so the agent and the page can't disagree. Behaviour evals check that it does the right kind of work for each kind of question (35/35). The same agent answers on iMessage through Photon, where you approve a shortlist by replying YES, NO or "drop 2".
Challenges we ran into
- Matterport rooms are mostly unlabelled. Only 229 of the 700 rooms in our vacant suites carry a real label; the rest say "Other". So we classify rooms by what they measure, not what they're called.
- Doors are mostly invisible in the data. Openings appear as invisible edges in only about 9% of commercial models. We read the doorways from gaps in the mesh's wall triangles between knee and head height instead.
- Broken outlines and missing rooms. Some scans give a 2,800 sq ft waiting room an outline of a few square feet, and some leave small rooms off the room list entirely. We rebuild those rooms from the scanned floor, bounded by floor-to-ceiling walls, and cut the floor at its doorways so walled-off rooms come back as rooms of their own.
- Data that looks consistent but isn't. LA asking rents are quoted per square foot per month and Houston's per year. CoStar's floor field is an enum code, not a floor number. Elevator data is usually missing, which means "unknown", not "no". Matterport's signed URLs expire, so we cache every downloaded file rather than the links.
- A one-character class of bug with a big blast radius. A doorway check built a point door's lane from two separate
[x, y]arrays and then tested them with===, which is never true for two arrays. The lane's direction collapsed to zero and became an endless strip across the suite, silently deleting chairs and tables in line with any door. Fixing it gave one waiting room back thirteen chairs and its TV. - Making a number defensible. Our first visit estimate was about three times the health-center benchmark and our first cost looked too good to be true. We rebuilt both from published benchmarks, put the benchmark beside every estimate, and labelled every assumption on screen.
- Agent honesty. A language model will happily round a figure, or quote one suite's cost under another suite's name. Rather than prompt harder, we made the agent verify its own dossier against the tools and fix what doesn't match before the report is shown.
Accomplishments that we're proud of
- Real rooms, real numbers. Every exam room on screen is a measured room that clears its state's minimums, and every number traces to a measurement or a stated rule.
- All three data sources, combined. CoStar, Matterport and Vexcel used together on the same address: leases and rents, rooms and photos, footprint, height and aerial.
- An honest answer where need is highest. Where need is highest in Los Angeles, nothing is ready today, and the app says so. It shows what a build-out with new walls would cost and how long it would take instead of pretending.
- An agent that does real work. It plans, delegates to parallel inspectors, waits for a person, checks itself, remembers per person, and acts on the page: it narrows the list, rings buildings while inspecting, and edits the plan you're looking at.
- A plan you can hand to someone. The output is a clinic someone can act on: a report shaped like the grant form, a spreadsheet, a 3D file and a CAD floor plan.
What we learned
- Who the user is decided everything. The 120-day clock is why "days to open" sits next to the cost on every suite, and why the report reads like the grant application's site attachment.
- A 3D scan is a survey, not a model. Building the clinic new on the scan's wall lines, instead of painting over the scan, made it both cleaner and more faithful to the real building.
- Let code measure and the model decide. Deterministic tools plus a self-check made the agent trustworthy in a way prompting alone never did.
- Tests change what you see. A room-by-room quality test surfaced problems no one had noticed while clicking around.
What's next for Asclepieion
- More cities: the CoStar kit covers Houston and Los Angeles. The pipeline runs per address, so a new city is a data question, not a code one.
- The 1-mile check against existing health center sites, which HRSA requires and which the agent currently reports as "not done" rather than guessing.
- HRSA's own Unmet Need Score alongside ours, so the map speaks the funder's language.
- Landlord and broker mode, for CoStar's customers: list a vacant suite and see which clinic types it already holds and what the work would be.
- Testing with a real health-center expansion lead on a live New Access Point award.
Built With
- anthropic
- cdc-open-data
- costar
- fastapi
- gemini
- hrsa-data-warehouse
- javascript
- langchain
- matterport
- node.js
- numpy
- pandas
- photon
- playwright
- render
- shapely
- vercel
- vexcel