- PHP 75.1%
- CSS 24.7%
- JavaScript 0.2%
APCHECK
Aviation photography checklist — a simple web application designed specifically for aviation photographers that can be used for planning photo sessions at airports.
Features
- Weather data — live METAR & TAF from aviationweather.gov
- METAR/TAF reference — comprehensive code lookup table with filter
- ATC frequencies — displays tower, ground, approach, ATIS, and other frequencies for the selected airport, sorted by relevance
- Runway advisor — wind-optimised runway selection using OurAirports data; shows headwind/crosswind components, surface, lighting, and dimensions for every runway end
- Photo suitability score — 0–10 rating based on visibility, wind, clouds, and precipitation
- Sun position — solar elevation diagram, azimuth, golden hour, blue hour, and day progress timeline
- Checklist — editable equipment & planning checklist with groups, items, and a print button for printable templates
- Distance tool — click-to-measure map using OpenStreetMap, showing segment and total distance in meters/feet/kilometers/miles
- Frame Fill Calculator — calculate how much of the frame an aircraft fills based on its size, focal length, distance, and sensor orientation
- Session notes — auto-saving plain-text notepad
- Optional password protection — bcrypt-based login via
auth.json - Installable as a PWA — add to your device's home screen or taskbar from any modern browser
Requirements
- PHP 7.4+ with
allow_url_fopenenabled - No database, no Composer, no npm
Setup
- Place the files in a directory served by PHP (e.g.
php -S localhost:8000or any web server). - Open
index.phpin a browser. - Enter an ICAO airport code (e.g.
EKCH,KJFK,EDDF).
Photo suitability score
The score starts at 10 (ideal conditions) and penalties are subtracted based on the current METAR:
| Penalty | Condition |
|---|---|
| –4 | Visibility below 3 statute miles |
| –2 | Visibility below 6 statute miles |
| –2 | Wind speed above 30 knots |
| –1 | Wind speed above 20 knots |
| –3 | Overcast or broken ceiling below 1,500 ft |
| –1 | Overcast or broken ceiling below 3,000 ft |
| –3 | Thunderstorms, fog, heavy rain, snow, or drizzle |
The final value is clamped to 0–10 and color-coded:
| Score | Label | Color |
|---|---|---|
| 8–10 | Good conditions | Green |
| 5–7 | Marginal | Amber |
| 0–4 | Poor conditions | Red |
Password protection (optional)
To restrict access, create an auth.json file with a bcrypt hash:
{"hash": "2ドルy10ドル$..."}
Generate the hash with PHP on the command line:
php -r "echo password_hash('your-password', PASSWORD_BCRYPT), PHP_EOL;"
Then paste the output into auth.json as the hash value. Alternatively use a tool like htpasswd -nB. When auth.json exists, visitors are redirected to login.php.
Adding missing airports and runways
APCHECK looks up airport name and coordinates from airports.csv and runway data from runways.csv. If an airport or its runways are missing, you can add them manually.
airports.csv
| Column | Description |
|---|---|
icao_code |
ICAO code (e.g. EGLL) |
name |
Airport name |
iso_country |
ISO 3166-1 alpha-2 country code |
latitude_deg |
Latitude in decimal degrees (e.g. 51.470748) |
longitude_deg |
Longitude in decimal degrees (e.g. -0.459909) |
Append a new line at the end of airports.csv in the same format:
EGLL,London Heathrow Airport,GB,51.470748,-0.459909
Coordinates can be obtained from OurAirports, Wikipedia, or any aeronautical database.
runways.csv
Runways are matched by the airport_ident column — this must match the ICAO code used in airports.csv exactly.
| Column | Description |
|---|---|
id |
Unique numeric ID (auto-increment from last existing) |
airport_ref |
Reference ID (can be the same as id) |
airport_ident |
ICAO code must match the code in airports.csv |
length_ft |
Runway length in feet |
width_ft |
Runway width in feet |
surface |
Surface type (e.g. ASP, ASP-G, CON, GRVL, TURF) |
lighted |
1 = lighted, 0 = not lighted |
closed |
1 = closed (ignored by APCHECK), 0 = open |
le_ident |
Low-end identifier (e.g. 09L) |
le_heading_degT |
Low-end true heading in degrees |
he_ident |
High-end identifier (e.g. 27R) |
he_heading_degT |
High-end true heading in degrees |
le_displaced_threshold_ft / he_displaced_threshold_ft |
Optional displaced threshold in feet |
le_latitude_deg / he_latitude_deg |
Optional end coordinates (can be empty) |
le_longitude_deg / he_longitude_deg |
Optional end coordinates (can be empty) |
le_elevation_ft / he_elevation_ft |
Optional elevation (can be empty) |
Only airport_ident, length_ft, width_ft, surface, lighted, closed, le_ident, le_heading_degT, he_ident, and he_heading_degT are used by APCHECK. Other columns can be left empty.
Example new runway entry for CYVR:
,,"CYVR",10600,200,"ASP",1,0,"08L",80,"26R",260,,,,,
Runway data can be obtained from OurAirports. Download the file, search for the airport_ident, and copy the matching rows into the local runways.csv.
frequencies.csv
Frequencies are matched by the airport_ident column — this must match the ICAO code used in airports.csv exactly. Frequencies are displayed in the sidebar sorted by type priority: TWR > GND > APP/DEP/ARR/A/D > ATIS > CLD > RMP > AFIS > INFO > FSS > RDO > UNIC > CTAF, then by frequency within each type.
| Column | Description |
|---|---|
id |
Unique numeric ID (can be auto-incremented) |
airport_ref |
Reference ID (can be the same as id) |
airport_ident |
ICAO code must match the code in airports.csv |
type |
Frequency type (TWR, GND, APP, ATIS, CTAF, etc.) |
description |
Human-readable label (e.g. PALM BEACH APP) |
frequency_mhz |
Frequency in MHz (e.g. 124.6) |
Example new frequency entry for KJFK:
,,"KJFK","ATIS","ATIS",115.1
Frequency data can be obtained from OurAirports. Download the file, search for the airport_ident, and copy the matching rows into the local frequencies.csv.
Files
| File | Purpose |
|---|---|
index.php |
Main application |
login.php |
Password authentication page |
style.css |
Stylesheet |
manifest.php |
PWA manifest (name, icons, colors) |
sw.js |
Service worker (install trigger) |
favicons/ |
App icons for PWA & bookmarks |
checklist.json |
Checklist data (auto-managed) |
notes.txt |
Session notes (auto-managed) |
airports.csv |
Airport database (name, coords) |
runways.csv |
Runway database |
frequencies.csv |
Radio frequency database |
auth.json |
Optional password hash |