Inspiration

Finding an apartment in New York City is stressful, and the information renters need is often scattered across multiple public databases. A building might have recurring 311 complaints, open housing violations, or Department of Buildings complaints, but understanding those records usually requires navigating unfamiliar government websites and interpreting technical language.

We created NYC Building X-Ray to make that information easier to explore. Instead of producing an oversimplified “good” or “bad” rating, the project brings the underlying evidence together and helps renters understand what questions they may want to ask before signing a lease.

What it does

Users can search for an NYC address and confirm the intended building. NYC Building X-Ray then creates a unified report using:

  • NYC 311 service requests
  • HPD housing violations
  • Department of Buildings complaints
  • Building identity and location information
  • Official NYC 3D building geometry

The report highlights recurring patterns, open violations, complaint categories, monthly activity, and source coverage. Every finding links back to its supporting public record so users can inspect the evidence themselves.

The 3D building viewer adds a spatial layer to the report. Records with documented floor numbers are displayed as heat bands directly on the corresponding sections of the building. The heat scale is universal: every building uses the same fixed scale from 0 to 10+ records per floor, making comparisons consistent. Users can rotate the model, select a floor, and open an associated record.

A separate real-world view uses Google Photorealistic 3D Tiles to provide geographic context around the selected address.

How we built it

The frontend is built with Next.js, React, and TypeScript. We used React Three Fiber, Three.js, and Drei to render isolated NYC building geometry and create the interactive floor heat map. The heat visualization uses custom shaders that clip each color band to the building’s actual surface, allowing it to wrap around every façade without extending beyond the model.

The real-world geographic view uses CesiumJS and the Google Map Tiles API.

The backend is built with Python and FastAPI. It retrieves and normalizes records from NYC Open Data, including 311, HPD, and DOB datasets. The backend handles address matching, reporting periods, source availability, evidence normalization, recurring-pattern detection, and building-model extraction.

Original NYC .3dm district models are processed to identify the footprint containing the selected address. The matching building is extracted into a lightweight GLB model for the browser while preserving downloadable Rhino geometry.

We also built the application to degrade gracefully. If a public dataset is unavailable, the interface identifies that source as unavailable instead of displaying a misleading zero. The report can generate a plain-language explanation with AI when configured, while retaining a deterministic fallback so the core product still works without an AI key.

Challenges we faced

One major challenge was matching an address to the correct building. Street addresses can be ambiguous, multiple boroughs may contain similar addresses, and public datasets do not always identify buildings consistently. We addressed this by requiring users to confirm search candidates and by preserving the matching method, confidence, and ambiguity information.

Working with NYC’s original 3D geometry was another challenge. The source models are extremely large and contain many neighboring buildings. We created a preprocessing and extraction pipeline that indexes building footprints, selects the geometry containing the address coordinates, converts source units correctly, and generates a browser-friendly model without simplifying the original outline.

Floor-level visualization required additional care. Most public records do not include a reliable floor number, so we only place records when a positive numeric floor is explicitly documented. We also had to make the heat overlay follow irregular building geometry, remain visible from every viewing angle, and avoid suggesting apartment-level precision that the source data does not provide.

Finally, we wanted the interface to be useful without presenting complaints as proven conditions. Throughout the product, we distinguish complaints from violations, show source status and limitations, and link important claims to their supporting evidence.

What we learned

We learned that building a trustworthy civic-data product requires more than combining APIs. The difficult work is preserving context: knowing when data is incomplete, distinguishing different types of records, explaining how an address was matched, and avoiding conclusions that the evidence cannot support.

We also learned how to process large-scale 3D municipal datasets, connect geographic coordinates to individual building footprints, write custom Three.js shaders, and combine multiple visualization systems in one application.

Most importantly, we learned that transparency can be more valuable than a single score. NYC Building X-Ray does not tell users whether they should rent an apartment. It gives them clearer evidence, visible patterns, and better questions to ask.

Built With

Share this project:

Updates

Submission history