Analyze NYC lot zoning, FAR, height, setbacks, uses, and buildable envelope from PLUTO and the Zoning Resolution. Use for "what can I build"; use nyc-bsa for relief and zoning-envelope for 3D visualization.
npx skills add https://github.com/AlpacaLabsLLC/skills-for-architects --skill zoning-analysis-nyc
Analyze building envelope rules for any lot in New York City using the PLUTO database (NYC Open Data) and the NYC Zoning Resolution.
If PROJECT.md exists in the working directory, read it before fetching — the BBL, district, and prior envelope results may already be on file. After completing, offer the zoning district, FAR set, envelope results, overlays/special districts, and landmark status to /as:project update for its Zoning section, each with a source and date. If the analysis surfaces a choice between development paths, propose /as:project record-decision. No PROJECT.md? Skip silently — or mention /as:project init if the user is clearly starting a project.
Accept one of the following identifiers:
Normalize to BBL format: [borough 1 digit][block 5 digits][lot 4 digits]
Borough codes:
| Code | Borough |
|------|---------|
| 1 | Manhattan |
| 2 | Bronx |
| 3 | Brooklyn |
| 4 | Queens |
| 5 | Staten Island |
Fetch lot data from two NYC APIs in parallel:
Endpoint: https://data.cityofnewyork.us/resource/64uk-42ks.json
Query by BBL:
https://data.cityofnewyork.us/resource/64uk-42ks.json?bbl=XXXXXXXXXX
Query by address (fallback):
https://data.cityofnewyork.us/resource/64uk-42ks.json?$where=address='123 MAIN STREET' AND zipcode='10001'
No authentication required for basic queries.
Read zoning-rules/pluto-fields.md for the full field reference.
Extract these key fields:
bbl — Borough-Block-Lotaddress, zipcode — street addresszonedist1 through zonedist4 — zoning district(s)overlay1, overlay2 — commercial overlay districtsspdist1, spdist2, spdist3 — special purpose districtsltdheight — limited height districtsplitzone — Y if lot is split across zoneslotarea — lot area in SFbldgarea — total building area in SFbuiltfar — as-built FARresidfar — maximum residential FARcommfar — maximum commercial FARfacilfar — maximum community facility FARnumfloors — existing number of floorslanduse — current land use categoryzonemap — zoning map numberlandmark — landmark designationhistdist — historic district nameborocode, block, lot — parsed BBL componentsEndpoint: https://a841-dotweb01.nyc.gov/arcgis/rest/services/GAZETTEER/MapPLUTO/MapServer/0/query
Query by BBL:
https://a841-dotweb01.nyc.gov/arcgis/rest/services/GAZETTEER/MapPLUTO/MapServer/0/query?where=BBL='XXXXXXXXXX'&outFields=BBL&f=json&outSR=4326
This returns the exact tax lot polygon in WGS84 (lat/lon). No authentication required.
Convert to local feet:
features[0].geometry.rings[0] coordinate array (pairs of [lon, lat])cos(lat)x_ft = (lon - lon_min) × 111320 × cos(lat) × 3.28084y_ft = (lat - lat_min) × 111320 × 3.28084LOT_POLY array of [x, y] pairs in feetlotarea (expect ±5% due to projection)Always use the real polygon for the 3D envelope viewer. Never fall back to a lotfront × lotdepth rectangle when polygon data is available.
If either query returns no results, inform the user and ask them to verify the address or BBL.
Map the zonedist1 value to its district type:
| Prefix | Type | Rules File |
|--------|------|----------------|
| R | Residential | zoning-rules/residential.md |
| C | Commercial | zoning-rules/commercial.md |
| M | Manufacturing | zoning-rules/manufacturing.md |
Check for:
splitzone = Y): Analyze each zonedist1–zonedist4 separately. Pro-rate FAR by estimated area in each zone if lot dimensions are available, otherwise present both sets of controls.zoning-rules/contextual-districts.md.overlay1/overlay2): If present (e.g., C1-4, C2-5), load zoning-rules/commercial.md for overlay rules.spdist1–spdist3): If present, load zoning-rules/special-districts.md.ltdheight): Note the height cap.State your district identification and reasoning clearly.
Read the relevant regulation files from the skill's zoning-rules/ directory:
zoning-rules/overview.md — system primerresidential.md, commercial.md, or manufacturing.mdzoning-rules/contextual-districts.md — if district has A/B/D/X suffixzoning-rules/special-districts.md — if spdist1–spdist3 are populatedzoning-rules/use-groups.md — for permitted use analysiszoning-rules/parking.md — for parking requirementszoning-rules/city-of-yes.md — for recent reform impactsCalculate the building envelope for the lot:
residfar or district table)commfar or district table)facilfar or district table)Apply contextual district rules when suffix is present — these override standard height/setback rules with mandatory streetwall, base height, and setback requirements.
Layer additional regulations on top of base district controls:
zoning-rules/special-districts.md for the specific districtlandmark or histdist is populated, note that Landmarks Preservation Commission (LPC) review is requiredzoning-rules/city-of-yes.md for applicable changesUse the output format below to present a structured, comprehensive analysis.
Write the analysis to a markdown file in the current working directory:
zoning-analysis-[address-slug].mdzoning-analysis-123-main-st-brooklyn.md# Zoning Analysis — [Address], [Borough]
## Lot Summary
| Parameter | Value |
|-----------|-------|
| BBL | X-XXXXX-XXXX |
| Address | ... |
| Borough | ... |
| Lot Area | ... SF |
| Current Building Area | ... SF |
| Current FAR (built) | ... |
| Current Use | ... |
| Zoning Map | ... |
## Zoning Classification
| Parameter | Value |
|-----------|-------|
| Primary District | ... |
| Secondary District(s) | ... (or None) |
| Commercial Overlay | ... (or None) |
| Special District | ... (or None) |
| Limited Height | ... (or None) |
| Contextual | Yes/No |
| Split Zone | Yes/No |
| Landmark | ... (or None) |
| Historic District | ... (or None) |
## Bulk Parameters
### Floor Area
| Use | Max FAR | Max Floor Area (SF) |
|-----|---------|---------------------|
| Residential | ... | ... |
| Commercial | ... | ... |
| Community Facility | ... | ... |
### Height & Setback
| Parameter | Value |
|-----------|-------|
| Max Building Height | ... ft |
| Base Height (min–max) | ... ft (contextual only) |
| Sky Exposure Plane | starts at ... ft, ratio .../1 |
| Street Wall | required/not required |
### Yards & Coverage
| Parameter | Value |
|-----------|-------|
| Front Yard | ... ft |
| Rear Yard | ... ft |
| Side Yards | ... |
| Max Lot Coverage | ...% |
| Open Space Ratio | ... (if applicable) |
## Permitted Uses
Key permitted uses by Use Group for this district. Highlight the most relevant:
- Residential: ...
- Commercial: ...
- Community Facility: ...
- Manufacturing: ... (if applicable)
## Parking Requirements
Based on current rules (post-City of Yes where applicable):
| Use | Requirement |
|-----|-------------|
| Residential | ... |
| Commercial | ... |
| Other | ... |
## Bonuses & Incentives
- Inclusionary Housing bonus: ...
- UAP (City of Yes): ...
- Other applicable bonuses: ...
## Restrictions & Special Conditions
- Landmark/LPC review: ...
- Special district requirements: ...
- Environmental: ...
- Other: ...
## Development Potential
| Scenario | FAR | Floor Area (SF) | Est. Floors |
|----------|-----|------------------|-------------|
| As-of-right residential | ... | ... | ... |
| As-of-right commercial | ... | ... | ... |
| With IH bonus | ... | ... | ... |
| With UAP bonus | ... | ... | ... |
## Buildable Envelope
### Plan View
ASCII diagram showing the lot boundary with setbacks and buildable zone. Orient with the primary street frontage at the bottom. Label dimensions, setback distances, and buildable area. Use PLUTO lot dimensions (lotfront, lotdepth) where available.
Example:
← 170 ft →
┌────────────────────────────┐
│ 20 ft rear yard │ ↑
│ ┌──────────────────────┐ │ |
│ │ │ │ |
│ │ BUILDABLE ZONE │ │ 130 ft
│ │ ~150 ft × 170 ft │ │ |
│ │ │ │ |
│ │ │ │ |
│ └──────────────────────┘ │ ↓
└────────────────────────────┘
HUDSON ST (wide street)
← no front setback →
### Section View
ASCII cross-section showing the height and setback envelope from street level. Include base height, setback, sky exposure plane, and maximum height. For contextual districts, show the mandatory streetwall height range.
Example:
290 ft ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ max height
│ ╱
│ ╱ sky exposure
│ ╱ plane (5.6:1)
│ ╱
85 ft ├──────┤ ← setback line
│ │
│ │ base / streetwall
│ │ (60–85 ft)
│ │
───────┴──────┴──────────────── street
HUDSON ST (wide)
Adapt both diagrams to the specific lot. Use actual dimensions and controls from the analysis. If the lot is irregular or split-zone, note the complexity and simplify where needed.
## Envelope Data
Machine-readable data for `/as:zoning-envelope`. Include the exact lot polygon from Step 2b (MapPLUTO ArcGIS) converted to local feet, plus all computed envelope parameters.
{
"lot_poly": [[x, y], ...],
"unit": "ft",
"setbacks": { "front": 0, "rear": 20, "lateral1": 0, "lateral2": 0 },
"volumes": [
{ "type": "base", "inset": 20, "h_bottom": 0, "h_top": 85, "label": "base (streetwall)" },
{ "type": "tower", "inset": 10, "h_bottom": 85, "h_top": 290, "label": "tower" }
],
"height_cap": 290,
"info": { "title": "...", "zone": "...", "id": "BBL ...", "area": "... SF" },
"stats": { "Commercial FAR": "10.0", "Max Floor Area": "218,620 SF", ... }
}
Adapt the `volumes` array to the district type:
- **Height-factor:** One base volume (0 to sky start) + one tapered volume or approximation
- **Contextual:** Base/streetwall volume + tower volume with deeper inset
- **With front yard:** Add front setback to `setbacks`
To generate an interactive 3D viewer from this data, run: `/as:zoning-envelope path/to/this-report.md`
## Caveats
- This analysis is based on publicly available zoning data (PLUTO) and general Zoning Resolution rules
- Always verify with NYC Department of City Planning and ZoLa (zola.planning.nyc.gov)
- Special permits, variances, and BSA actions are not reflected in PLUTO data
- City of Yes provisions are being phased in — confirm effective dates for specific provisions
- Site-specific conditions (flood zones, coastal erosion, environmental restrictions) require additional review
- This is not a substitute for professional zoning analysis or legal advice
This skill produces regulatory output. End every report this skill produces — printed in chat or saved to a file — with the canonical disclaimer block from rules/professional-disclaimer.md, followed by one blank line and the machine-readable marker, exactly as shown:
> **Disclaimer:** This is an AI-generated analysis for preliminary planning purposes. All findings must be verified by a licensed professional before use in design, permitting, or regulatory submissions.
<!-- architecture-studio:requires-disclaimer -->
The marker is a single end-of-file sentinel — it appears exactly once, as the last line of the report. The post-write-disclaimer-check hook parses saved .md reports for the marker and blocks the write if the canonical disclaimer block is missing.
Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.
Query openFDA API for drugs, devices, adverse events, recalls, regulatory submissions (510k, PMA), substance identification (UNII), for FDA regulatory data analysis and safety research.
MATLAB and GNU Octave numerical computing for matrix operations, data analysis, visualization, and scientific computing. Use when writing MATLAB/Octave scripts for linear algebra, signal processing, image processing, differential equations, optimization, statistics, or creating scientific visualizations. Also use when the user needs help with MATLAB syntax, functions, or wants to convert between MATLAB and Python code. Scripts can be executed with MATLAB or the open-source GNU Octave interpreter.
UMAP dimensionality reduction. Fast nonlinear manifold learning for 2D/3D visualization, clustering preprocessing (HDBSCAN), supervised/parametric UMAP, for high-dimensional data.
Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisations, or any complex SVG-based data visualisation that requires fine-grained control over visual elements, transitions, or interactions. Use this for bespoke visualisations beyond standard charting libraries, whether in React, Vue, Svelte, vanilla JavaScript, or any other environment.
Access AlphaFold 200M+ AI-predicted protein structures. Retrieve structures by UniProt ID, download PDB/mmCIF files, analyze confidence metrics (pLDDT, PAE), for drug discovery and structural biology.
Take alpacalabsllc/zoning-analysis-nyc from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.