Honest-arithmetic solar sizing · modelled in your browser · only a coordinate ever leaves, never your address

Type your address. See the real number.

Enter an address (or drag the pin). The tool geocodes it, pulls your building's footprint from OpenStreetMap, fits two roof planes to its true orientation, sizes them from the footprint area, and runs a genuine 8760-hour yield model for your point on real hourly satellite data (anchored to the NASA POWER 20-year norm), with a P50 / P90 band — all modelled in the browser. The only thing sent anywhere is a coordinate, never your address; block the network and an embedded offline grid takes over. It seeds with a Long Island example until you enter an address. Drag any panel to nudge it, drag a corner to resize, set tilt and azimuth (real roofs are rarely square to the compass; the tool handles any angle). Not a quote — the arithmetic you run before trusting one. The exact proforma.py command for your layout is at the bottom.

This calculator accompanies the write-up First-principles residential solar sizing → — why honest arithmetic beats the configurators, and the full method behind these numbers.

The satellite map could not load (offline, or the tile host is blocked). The panels and every number still work; the map is just the backdrop. The provenance panel lists what it would have loaded.

Esri World Imagery, ~0.1 m/px here. Type an address or drag the pin to relocate; the planes auto-fit your building's footprint and orientation. Drag a panel to move it, drag a corner to resize. Tilt and azimuth are sliders (you cannot read tilt from above). Auto-placement is a starting point, not a site survey.

Economic knobs — yours to set, exactly as in proforma.py
Battery + EV mirror proforma.py: battery shifts up to kWh×365×0.9 of export to import value; EV adds load with 60% met by daytime solar, raising self-consumption.
System size
Specific yield
kWh/kWp/yr, after derate
Year-1 generation (P50)
kWh/yr
Year-1 savings
Net cost (2026: no federal ITC)
Simple payback
net cost / yr-1 savings
25-yr NPV @ 5% (0.5%/yr degradation)
Provenance — every call, source, and assumption

This page sends only a coordinate to any service, never your address or a roof detail. The yield is computed in your browser by a built-in physical model (HDKR anisotropic transposition → ASHRAE incidence-angle loss → PVWatts DC→AC at 14% loss, plus a cell-temperature derate). When the network allows, the top tier is a genuine 8760-hour simulation on one year of real hourly satellite data (Open-Meteo / ERA5), anchored to the NASA POWER 20-year monthly norm, with a P50 / P90 resource band, for . Geocoding, the irradiance fetches, the building footprint, and map tiles are optional public-data calls on that coordinate; if the hourly fetch is blocked it falls back to live NASA POWER 0.5° monthly point data, and if that too is blocked, to an embedded coarse grid — the calculation always runs in-browser from the pin alone.

WhatSource (clickable)How it's used
Irradiance + temperature (yield) NASA POWER climatology — monthly GHI + 2m temp, 0.5° point; the validated P50 energy anchor (active tier: embedded grid) 3 tiers: 8760 hourly → monthly point → embedded grid
Hourly shape (8760 model) Open-Meteo Archive (ERA5) — one full year of hourly GHI/DHI/DNI + 2m temp, each month rescaled to the NASA POWER 20yr norm (not loaded) one fetch/location, re-transposed per plane in-browser
P50 / P90 resource band NASA POWER monthly record 2001–latest (interannual CV) + ~4% satellite-model σ (pending) σtotal=√(CV²+σmeas²); P90=P50·(1−1.28σ)
Yield validation PVGIS v5.2 PVcalc (EU JRC) · NREL PVWatts v8 model checked vs PVGIS
Address → coordinates OpenStreetMap Nominatim (CORS-enabled) on submit; degrades to pin
Building footprint OSM Overpassway(around:30)[building] fits planes; optional
Tariff (LIPA / PSEG-LI) OpenEI URDB — "Long Island Power Authority" default $0.194/kWh; editable
Satellite imagery Esri World Imagery map tiles, on load

Assumptions (all editable above or by dragging):

  • Specific yield is modelled in-browser (HDKR anisotropic transposition → ASHRAE incidence-angle loss → 14% PVWatts loss) and runs in three accuracy tiers, auto-upgrading as data arrives, each leaving the prior intact: (1) an embedded ~5° grid offline; (2) live NASA POWER 0.5° monthly point with a production-weighted cell-temperature derate; (3) a genuine 8760-hour simulation — one full year of real hourly satellite data (Open-Meteo / ERA5: measured GHI, diffuse, DNI, 2 m temp), with a per-hour cell-temperature derate. To stop a single year's weather (which drifts ±8–10% from the long-term norm) from biasing the answer, each month's hourly irradiance is rescaled to the NASA POWER 20-year monthly climatology — preserving the validated P50 energy while gaining the hourly shape. The anchored 8760 benchmarks against live PVGIS PVcalc across 16 continental-US sites (every climate zone, south/30°): mean absolute error ~2.5% vs open-rack PVGIS (~4.5% vs the harsher building-integrated reference), and symmetric across orientations — east, south, and west each within ~5%, so an east/west roof is sized as honestly as a south-facing one. The monthly tier lands similarly. Then × your roof-walk derate (which keeps the delivered figure conservative). Spatial resolution is still ~25–55 km reanalysis, not 250 m satellite — a site-specific proforma.py --source pvgis run is the bankable check.
  • The P50 / P90 band reflects resource + model uncertainty only: interannual variability (CV of the NASA POWER annual-GHI record, 2001–latest — ~1% desert, ~3–6% maritime) combined with a ~4% satellite-derived annual-GHI uncertainty (NSRDB / SARAH validation literature), as σtotal=√(CV²+σmeas²), then P90=P50×(1−1.28σtotal). This is NOT a full bankable P90: it carries no soiling, snow, availability/downtime, or degradation-uncertainty terms. A P90-positive payback is a genuine plus, not a lender-grade guarantee.
  • kWp = panel area × density (default 200 W/m², ~20% modules). Area is auto-sized from the footprint (~80% usable); drag a corner to change it.
  • Two roof planes are auto-placed by fitting a minimum-area rectangle to the OSM footprint: the ridge runs along the long axis, the two faces split off-cardinal to match the building's true orientation.
  • Import rate defaults to the LIPA tariff-weighted rate from a real proforma.py run; set yours for your utility.
  • Export credit defaults to ~$0.19, the PSEG-LI Rate 194 off-peak rate where most solar generation banks under NY time-of-day net metering. (This is NOT California NEM-3.0's ~$0.05 — the export rule is jurisdiction-specific; set yours.)
  • Battery (default 0): shifts up to kWh×365×0.9 of yearly export from the export credit to the higher import-offset value; costs $1,000/kWh with no ITC. EV (default 0): adds the annual load, 60% met from daytime solar, raising self-consumption. Both mirror proforma.py.
  • Time-of-use (optional, 8760 tier only): toggle it on and savings switch to real hourly netting — generation vs a typical residential load shape, valued at each hour's TOU rate (default PSEG-LI Rate 194: on-peak $0.36 weekday 3–7pm, overnight $0.13, off-peak otherwise), with a daily battery peak-shave that only discharges where the rate beats the export credit. It reports your real self-consumption (often ~45–50%, below the flat 55% guess) and the honest battery value (small under NY's high export credit, large under California's ~$0.05). The load shape is a typical-home proxy; your true numbers need your interval data, which only your meter has. proforma.py --tou runs the identical model on the CLI.
  • Federal ITC defaults to 0 — Section 25D expired 12/31/2025 for owned 2026 installs (third-party leases keep 48E). NY's 25%/$5k state credit is pre-filled. Self-consumption, $/Wp, 5% discount, 25 yr, 0.5%/yr degradation match proforma.py.
How this compares to paid tools

Honest scorecard against commercial solar estimators (Aurora, Helioscope, PVsyst, the configurators). The physics here is now genuinely in their class; the data resolution and the bankable layers are where money still buys more.

Now matched

  • True 8760-hour simulation — a full year of real hourly irradiance transposed to each plane, not a 12-month shortcut.
  • Hourly cell-temperature derate — per-hour Tcell from POA + ambient, the same loss mechanism PVsyst models.
  • HDKR anisotropic sky + IAM — circumsolar + horizon-brightening diffuse and incidence-angle reflection, the standard transposition.
  • A P50 / P90 resource band — interannual variability + satellite-model uncertainty, decomposed and labelled.
  • Real building footprint + true roof orientation — off-cardinal planes fit to the OSM outline, not a cardinal assumption.

Still conceded (what a paid report or a site visit adds)

  • 250 m–1 km satellite resolution + ground-station tuning (Solargis, Solcast, NSRDB). This tool's irradiance is ~25–55 km reanalysis — the single biggest accuracy gap.
  • A full bankable P90 — soiling, snow, availability/downtime, inverter clipping, and degradation-uncertainty terms, none of which are in this band.
  • LIDAR / 3-D auto-shading — per-module horizon and self-shading from trees and dormers (Aurora, Helioscope). Here, shading is one honest manual derate.
  • Financing & degradation depth — module-level mismatch, detailed inverter models, lease/PPA/loan structures, full cash-flow tax treatment.

Bottom line: a credible first-pass P50/P90 from one coordinate, free and in your browser. For a contract, still walk the roof and pull a --source pvgis (or paid high-res) cross-check.

Reproduce this on the command line

Your current layout, as an exact proforma.py run (full pro forma + live tariff):

From github.com/bigbrownjeff/solar-sizing. Keyless by default (PVGIS); add --api-key for the PVWatts cross-check.

Get real quotes (lead-gen — accuracy first)
Better irradiance data — free & paid sources

This tool fetches live NASA POWER 0.5° climatology (the best keyless, CORS-open source) and falls back to an embedded grid offline. For a finer, site-specific, or bankable estimate, these go deeper. Verified reachable 2026-06-25.

Free

  • NASA POWER — ~0.5° (~55 km), global, GHI/DNI/DHI + temp, no key (CORS yes; what this tool uses).
  • Open-Meteo (ERA5) — ~0.25° (~25 km), global, hourly GHI/DNI/DHI/tilted, keyless non-commercial (CORS yes; this tool's 8760-hour top tier, anchored to the NASA POWER monthly norm).
  • Open-Meteo (satellite) — 2.5 to 5 km, Europe/Africa/Asia/Oceania only (no North America yet), hourly (CORS yes).
  • EU PVGIS — ~5 km (SARAH3), Europe/Africa/Asia, hourly + TMY + POA, keyless (no CORS; use its web tool or proforma.py --source pvgis).
  • NREL NSRDB — 4 km, US + Americas, hourly GHI/DNI/DHI + TMY, free key.
  • NREL PVWatts v8 — US production estimator on NSRDB, free key (the proforma.py cross-check).
  • Global Solar Atlas — 250 m, global, GHI/DNI/GTI GeoTIFF download, CC-BY 4.0 (World Bank / Solargis).
  • CAMS / McClear — ~3 to 5 km, Europe/Africa/Mideast, 1 min to hourly, free with registration.
  • ERA5 (Copernicus CDS) — ~31 km, global, hourly since 1940, free account (server-side).
  • Renewables.ninja — MERRA-2 ~50 km / SARAH ~5 km, hourly PV simulation, free non-commercial token.
  • Solcast (free tier) — ~1 to 2 km, global, free for research + home rooftop (10 req/day).
  • Meteonorm (demo) — 8 km satellite / station TMY, free sample files.

Paid / commercial