The one commitment: no LLM ever decides compliance
Ask a general-purpose AI whether a floor plan complies with the building code and it will give you a confident answer it has no way to check. In architecture, engineering and construction (AEC), a made-up pass is the worst possible failure, because people trust it.
PlanLint gives language models exactly one job: extracting structure. The vision model classifies entities and reads printed tags, never a measurement. Every number that reaches a verdict is grounded in snapped vector geometry, a validated dimension line or a schedule table. A plain Python checker is the only place a verdict is decided.
Every verdict is a graph edge
PlanLint writes each verdict into a Neo4j graph database as an edge that carries the measured value, the required value, the clause and the run that produced it:
So every result is queryable with Cypher, diffable across drawing revisions, and traceable back to a pixel on the sheet. Extracted constraints are cached as graph nodes too, so re-checking an unchanged codebook re-runs zero extractions.
How it works
- Spatial ingestion. PyMuPDF vector geometry and OpenCV raster masks turn a multi-sheet drawing set into grounded
PhysicalAssetnodes, plus a link graph over every line of printed text: tags, notes, dimensions, callouts and code citations. - Semantic ingestion. The codebook PDF becomes a
Regulationclause tree with its hierarchy preserved and embeddings stored in Neo4j. - Verification. A code hunter finds the relevant clauses, a rule extractor turns each into a typed, validated constraint, the pure-Python checker decides, and a compiler writes the result with idempotent Cypher
MERGEs.
Cross-sheet links follow the drawing set the way a reviewer would: a callout such as SEE 3/A1.7 lands on that exact view, and sections, elevations and details apply to the elements they show.
Unsure means review
When the drawing doesn’t hold enough evidence, PlanLint returns NEEDS_REVIEW instead of a pass. That covers drawings with no detected scale, qualitative clauses such as “adequate” or “as required by the AHJ”, and sources that disagree, like a schedule that says 3′-0″ on a door the plan dimensions at 2′-6″. A missed check a human can catch is better than a fabricated pass a human trusts.
PlanLint is a linter, not a substitute for a licensed professional or an authority’s approval. A COMPLIES_WITH edge means one measurable clause checked out for one measured asset, nothing more.
Built with
Python, FastAPI, Next.js, Neo4j and Cypher, PyMuPDF, OpenCV, vision-language models and retrieval-augmented generation. Released under the Apache 2.0 license.