A fully on-premises, open-weight AI stack for property mapping, regional analysis, and autonomous geospatial reasoning over the Denver metro — no cloud GPUs, no metered APIs, no data leaving the building.
What the stack does
Answers plain-English questions about property, land use, zoning, and infrastructure across the Denver region.
Extracts features from aerial imagery — pools, solar panels, roofs, pavement, vegetation — by prompt.
Joins imagery, parcels, and regional vectors inside a local analytical database for sub-second queries.
Publishes maps, datasets, and reports through the Hermes agent web interface.
Component map
Hermes Agent
Local orchestration layer. Plans tool calls, manages skills and MCP servers, serves chat and web UI, and coordinates Qwen + vision models + DuckDB.
Qwen (local LLM)
Open-weight Alibaba language model running on the DGX Spark. Handles reasoning, SQL/GeoJSON generation, summarization, and agent decision-making.
DRAPP Imagery
Denver Regional Aerial Photography Project public COGs. 2022 flight at ~3-inch resolution, served locally as Cloud-Optimized GeoTIFF tiles.
DuckDB + Spatial
In-process analytics engine with spatial extension. Queries GeoParquet/Shapefile parcels and vectors, performs intersections, buffers, and aggregations without a server.
Assessor Parcel Data
County parcel fabric with owner, valuation, land use, and building attributes. Joins vectors to real-world property records.
DRCOG Vector Data
Regional layers from the Denver Regional Council of Governments: jurisdictions, transit, trails, watersheds, land use, and more.
Data flow
User prompt
↓
Hermes agent (planning / reasoning via Qwen)
↓
Tool selection — DuckDB spatial query | Vision model on DRAPP chip | Web map render
↓
Local data sources:
• DRAPP COG tile server (TiTiler / COG reader)
• DuckDB: parcels, DRCOG vectors, extracted features
• Filesystem: GeoJSON, GeoParquet, TIFF downloads
↓
Answer: map + table + GeoJSON + narrative
Worked example: "Show me all pools in Cherry Hills Village"
Agent reasoning (Qwen): Hermes parses the question, identifies intent (spatial extraction + parcel join), and plans steps.
Imagery chip extraction: Pull DRAPP 2022 COG tiles for the bounding box and run a local SAM-family vision model to segment swimming-pool-like features.
Parcel join: Intersect detected pool footprints with county assessor parcels to attach APN, owner, and zoning.
Output: Web map with highlighted parcels, a CSV download, and a one-paragraph summary.
DuckDB spatial patterns
-- Load parcels and DRCOG municipality boundaries
CREATE OR REPLACE TABLE parcels AS
SELECT * FROM ST_Read('/data/assessor_parcels.shp');
CREATE OR REPLACE TABLE municipalities AS
SELECT * FROM ST_Read('/data/drcog_municipalities.shp');
-- Find parcels inside Cherry Hills Village
SELECT p.apn, p.owner_name, p.land_use, p.valuation,
ST_Area(p.geom) AS parcel_sqft
FROM parcels p, municipalities m
WHERE m.name = 'Cherry Hills Village'
AND ST_Intersects(p.geom, m.geom);
This runs entirely on the DGX Spark's Grace Blackwell GPU. No frames or masks leave the machine.
Sovereignty model
Risk
Cloud approach
Sovereign stack
Data residency
Imagery uploaded to remote GPU host
Imagery stays on local NVMe
Inference cost
$ per image / $ per token
Fixed hardware cost only
Model availability
API rate limits, policy changes
Open weights run offline
Vendor lock-in
Proprietary extraction services
DuckDB + SAM-family + Qwen
Network dependency
Requires internet
Works air-gapped after setup
Data sources and refresh cadence
Source
Type
Update cadence
License
DRAPP 2022
Aerial imagery COG
Next public release (~2–3 years)
Public / regional
DRCOG vectors
Regional GIS layers
Quarterly / annual
Open data
County assessor
Parcel fabric + attributes
Annual valuation roll + ongoing
Public record
Extracted features
GeoJSON / GeoParquet
On-demand via agent
Owned by you
Why this wins: The combination of an open-weight local LLM (Qwen), an open vision stack (SAM-family), and an in-process spatial database (DuckDB) means a single DGX Spark can replace a scattered cloud pipeline while keeping every byte of client and regional data under your control.