PERTI (Plan, Execute, Review, Train, and Improve) is a comprehensive web-based traffic flow management platform for VATSIM (Virtual Air Traffic Control Simulation). It provides professional-grade tools for virtual air traffic controllers to manage traffic flow, monitor incidents, and coordinate operations.
Production URL: https://perti.vatcscc.org
| Page | URL | Description |
|---|---|---|
| Home | / |
Landing page and dashboard |
| JATOC | /jatoc.php |
AWO Incident Monitor (no login required) |
| NOD | /nod.php |
NAS Operations Dashboard (no login required) |
| Privacy Policy | /privacy.php |
Privacy policy |
| Page | URL | Description |
|---|---|---|
| GDT | /gdt.php |
Ground Delay Tool - FSM-style GDP interface |
| Route Plotter | /route.php |
TSD-style live flight map with route plotting & weather radar |
| Demand | /demand.php |
Airport demand analysis with rate suggestions |
| Reroutes | /reroutes.php |
Reroute authoring and monitoring |
| Splits | /splits.php |
Sector/position split configuration with strata filtering |
| Playbook | /playbook.php |
Pre-coordinated route play catalog (FAA/DCC/ECFMP/CANOC) |
| TMI Publish | /tmi-publish.php |
NTML & advisory publishing to Discord |
| Advisory Builder | /advisory-builder.php |
TFMS-style advisory creation |
| ATFM Simulator | /simulator.php |
TMU training simulator |
| Page | URL | Description |
|---|---|---|
| Airport Configs | /airport_config.php |
Runway configurations and rate management |
| System Status | /status.php |
System health dashboard and diagnostics |
| Page | URL | Description |
|---|---|---|
| Plan | /plan.php |
Traffic management planning worksheets with initiative timeline |
| Schedule | /schedule.php |
Staff scheduling |
| Data Sheet | /data.php or /sheet.php |
Operational data sheets |
| Review | /review.php |
Plan review and comments with StatSim integration |
AWO Incident Monitor - Publicly accessible at /jatoc.php
- Incident Tracking: Monitor ATC Zero, ATC Alert, ATC Limited, and Non-Responsive incidents
- Operations Level: Real-time 1/2/3 status with color-coded display
- Map Visualization: Interactive MapLibre map with ARTCC/TRACON boundaries
- POTUS/Space Calendar: Track special operations activities
- Personnel Roster: JATOC position assignments
- Incident Search: Multi-criteria historical search
- VATUSA Events: Integrated event display
Consolidated Monitoring - Publicly accessible at /nod.php
- Active TMIs: Real-time ground stops, GDPs, reroutes with rich data cards
- Facility Flows: Per-facility flow configurations with FEA demand integration
- Advisory Management: DCC advisory creation and tracking
- Map TMI Layer: Airport rings by severity, delay glow circles, MIT fix markers
- Weather Integration: Radar overlay support
- Discord Sync: TMI synchronization with Discord channels
FSM-Style GDP Interface - at /gdt.php
- Rate Visualization: FSM-style demand/capacity bar graphs
- EDCT/CTA Allocation: Controlled arrival time slot management
- Program Parameters: Scope, rate, duration configuration
- Flight List: Real-time compliance status
- Preview/Simulate: Impact analysis before application
Live Flight Visualization - at /route.php
- Live Flights: Real-time VATSIM flight display with TSD symbology
- Weather Radar: IEM NEXRAD/MRMS overlay with multiple color tables
- Route Plotting: Multi-route plotting with DP/STAR resolution
- Public Routes: Globally shared route advisories
- Advisory Builder: Generate TFMS-style route advisories
- Export: GeoJSON, KML, GeoPackage export formats
- Playbook/CDR Search: FAA playbook and CDR route lookup
- SUA/TFR Display: Special Use Airspace and TFR boundaries
Reroute Management - at /reroutes.php
- Reroute Authoring: Create reroute definitions with constraints
- Flight Matching: Preview and assign affected flights
- Compliance Tracking: Monitor route compliance status
- Export: CSV/JSON export of assignments
Sector Configuration - at /splits.php
- Area Management: Define and save sector groupings
- Configuration Presets: Reusable split configurations
- Active Splits: Real-time position assignments
- Scheduled Splits: Auto-activate/deactivate at specified UTC times
- Map Visualization: MapLibre-based sector display with color coding
- Strata Filtering: Low/High/Superhigh sector layers
- International Coverage: 23 US ARTCCs and 7 Canadian FIRs (CZYZ, CZWG, CZEG, CZUL, CZVR, CZQM, CZQX)
Route Play Catalog - at /playbook.php
- Play Management: Pre-coordinated route plays organized by scenario
- Multi-Source: FAA national playbook, DCC custom plays, ECFMP, CANOC
- Bulk Paste: Auto-structured import from ECFMP/CANOC format
- Shareable Links:
?play=PLAY_NAMEURL parameter for direct access - Route Visualization: Integrated map display of play routes
Planning Worksheets - at /plan.php
- Initiative Timeline: Interactive Gantt-style TMI visualization
- Terminal/Enroute Planning: Separate worksheets for different airspace
- Constraints Management: Track operational constraints
- Group Flights: Coordinate large traffic events
- StatSim Integration: Historical rate comparison
PERTI/
├── api/ # API endpoints
│ ├── adl/ # ADL flight data APIs (current, demand, waypoints)
│ ├── data/ # Reference data APIs (weather, SUA, TFR, playbook)
│ ├── jatoc/ # JATOC incident APIs
│ ├── mgt/ # Management CRUD APIs (plans, TMI, playbook)
│ ├── nod/ # NOD dashboard APIs (TMIs, flows, FEA)
│ ├── splits/ # Splits APIs (configs, scheduler, maps)
│ ├── swim/ # SWIM public API (FIXM-aligned, v1)
│ ├── stats/ # Statistics APIs (realtime, hourly, daily)
│ ├── tmi/ # TMI workflow APIs (GS/GDP lifecycle)
│ └── simulator/ # ATFM simulator APIs
│
├── assets/
│ ├── css/ # Stylesheets
│ ├── data/ # Navigation data (CSV: fixes, airways, playbook)
│ ├── geojson/ # Map boundary files (SUA, sectors)
│ ├── img/ # Images and icons
│ ├── js/ # JavaScript modules
│ ├── locales/ # i18n translation files (en-US, fr-CA, en-CA, en-EU)
│ └── vendor/ # Third-party libraries
│
├── adl/ # ADL subsystem (daemons, migrations, analysis)
├── database/
│ └── migrations/ # SQL migration scripts
│
├── discord-bot/ # Node.js Discord Gateway bot
├── docs/ # Documentation (swim/, stats/, tmi/)
├── lib/ # Core PHP utility classes
├── load/ # Shared PHP includes & configuration
├── login/ # VATSIM OAuth login
├── scripts/ # Background daemons & utilities
├── sdk/ # Multi-language client SDKs
├── services/ # Wind data services (NOAA GFS)
├── sessions/ # Session handling
└── wiki/ # GitHub wiki source (46 pages)
7 databases across 3 engines:
- Plans, schedules, configs, comments
- Initiative timelines, playbook plays
- User sessions and role assignments
- VATSIM_ADL — Normalized 8-table flight architecture (
adl_flight_core,adl_flight_plan,adl_flight_position,adl_flight_times,adl_flight_tmi,adl_flight_aircraft,adl_flight_trajectory,adl_flight_waypoints), airport configs, splits, JATOC, statistics - VATSIM_TMI — TMI programs (GS/GDP/AFP/reroute lifecycle), slots, advisories, coordination
- VATSIM_REF — Reference data (navigation fixes, airways, procedures, playbook routes)
- SWIM_API — Public FIXM-aligned API (
swim_flights, API keys, audit log) - VATSIM_STATS — Statistics & analytics (may be paused on free tier)
- ARTCC/TRACON/sector boundary polygons with spatial geometry
- Airport points, navigation fixes, airway segments with PostGIS support
- Boundary adjacency and spatial utility tables
GET /api/adl/current.php- Current flights snapshotGET /api/adl/flight.php?id=xxx- Single flight lookupGET /api/adl/stats.php- Flight statisticsGET /api/adl/snapshot_history.php- Historical snapshots
GET /api/adl/demand/fix.php- Flights at a navigation fixGET /api/adl/demand/airway.php- Flights on an airway segmentGET /api/adl/demand/segment.php- Flights between two fixes (airway or DCT)GET /api/adl/demand/batch.php- Multi-monitor time-bucketed demandGET/POST/DELETE /api/adl/demand/monitors.php- Demand monitor CRUDGET /api/adl/demand/details.php- Individual flights for a monitor
Ground Stop API:
POST /api/tmi/gs/create.php- Create new GSPOST /api/tmi/gs/model.php- Model GS scopePOST /api/tmi/gs/activate.php- Activate GSPOST /api/tmi/gs/extend.php- Extend GSPOST /api/tmi/gs/purge.php- Purge GSGET /api/tmi/gs/flights.php- Get affected flightsGET /api/tmi/gs/demand.php- Get demand dataGET /api/tmi/gs/list.php- List programsGET /api/tmi/gs/get.php- Get single program
GDP/Reroute/Advisory APIs:
POST /api/tmi/gdp_*.php- GDP operationsGET/POST /api/tmi/reroutes.php- Reroute managementGET/POST /api/tmi/advisories.php- Advisory managementGET/POST /api/tmi/entries.php- TMI log entries (MIT, AFP, restrictions)GET/POST /api/tmi/public-routes.php- Public route management
GET /api/data/playbook/list.php- List plays (with category/source filters)GET /api/data/playbook/get.php- Get single play with routesGET /api/data/playbook/categories.php- Play categoriesGET /api/data/playbook/changelog.php- Play change historyPOST /api/mgt/playbook/save.php- Create/update playPOST /api/mgt/playbook/route.php- Add/update play routesDELETE /api/mgt/playbook/delete.php- Delete play
GET /api/jatoc/incidents.php- List incidentsGET /api/jatoc/incident.php?id=xxx- Get incidentPOST /api/jatoc/incident.php- Create incidentPUT /api/jatoc/incident.php?id=xxx- Update incident
GET /api/nod/tmi_active.php- Active TMIsGET /api/nod/advisories.php- AdvisoriesGET /api/nod/tracks.php- Flight tracksGET /api/nod/fea.php- Flow Evaluation Area demandGET /api/nod/flows/elements.php- Facility flow elements
GET /api/splits/areas.php- Area definitionsGET /api/splits/configs.php- ConfigurationsGET /api/splits/active.php- Active splitsGET /api/splits/presets.php- Split presetsGET /api/splits/maps.php- Sector map dataGET /api/splits/scheduled.php- Scheduled splitsPOST /api/splits/scheduler.php- Schedule management
GET /api/routes/public.php- List public routesPOST /api/routes/public_post.php- Create route
GET /api/data/weather.php- Weather dataGET /api/data/sua.php- Special Use AirspaceGET /api/data/tfr.php- Temporary Flight Restrictions
PERTI uses VATSIM Connect (OAuth) for authentication. Users log in via /login/ which redirects to VATSIM's OAuth server and returns to /login/callback.php.
Session data is stored in PHP sessions and includes:
VATSIM_CID- VATSIM CIDVATSIM_FIRST_NAME/VATSIM_LAST_NAME- User name
Note: JATOC and NOD viewing is public; editing requires DCC role assignment.
All 15 background daemons run inside the Azure App Service container, started at boot via scripts/startup.sh.
Core Daemons:
| Daemon | Script | Interval |
|---|---|---|
| ADL Ingest | scripts/vatsim_adl_daemon.php |
15s |
| Parse Queue (GIS) | adl/php/parse_queue_gis_daemon.php |
10s batch |
| Boundary Detection | adl/php/boundary_gis_daemon.php |
15s |
| Crossing Calculation | adl/php/crossing_gis_daemon.php |
Tiered |
| Waypoint ETA | adl/php/waypoint_eta_daemon.php |
Tiered |
| SWIM WebSocket | scripts/swim_ws_server.php |
Persistent |
| SWIM Sync | scripts/swim_sync_daemon.php |
2min |
| Scheduler | scripts/scheduler_daemon.php |
60s |
| Archival | scripts/archival_daemon.php |
1-4h |
| Discord Queue | scripts/tmi/process_discord_queue.php |
Continuous |
| Monitoring | scripts/monitoring_daemon.php |
60s |
| Event Sync | scripts/event_sync_daemon.php |
6h |
Maintenance Scripts:
| Script | Purpose |
|---|---|
airac_full_update.py |
Full AIRAC cycle data update (28-day cycle) |
scripts/refresh_vatsim_boundaries.php |
Updates ARTCC/TRACON boundary GeoJSON |
nasr_navdata_updater.py |
Updates navigation data from FAA NASR |
Main configuration in load/config.php:
- Database credentials
- VATSIM OAuth settings
- ADL SQL connection settings
- Site configuration
Example config template: load/config.example.php
- VATSIM API - Live flight data (positions, flight plans, prefiles)
- FAA NFDC - NASR navigation data (fixes, airways, airports, procedures)
- Iowa Environmental Mesonet - Weather radar (NEXRAD/MRMS)
- VATSpy/SimAware - ARTCC/TRACON boundary data
- FAA Playbook - Route playbooks and CDRs
- VATUSA - Events integration (US division)
- VATCAN - Events integration (Canadian division)
- ECFMP - European flow measures (EUROCONTROL-style)
- FAA SUA - Special Use Airspace data
- NOAA GFS - Wind data for ETA calculations
For detailed technical documentation, see:
wiki/- GitHub wiki (46 pages: architecture, algorithms, APIs, troubleshooting)docs/operations/STATUS.md- System status and feature trackingdocs/reference/QUICK_REFERENCE.md- Quick reference cardadl/ADL_REFRESH_MIGRATION_GUIDE.md- ADL refresh patternsdocs/swim/- SWIM API documentationscripts/README.md- Script documentation- Database migrations in
database/migrations/
- Backend: PHP 8.2+, Python 3.x (utilities), Node.js (Discord bot, simulator engine)
- Frontend: JavaScript (ES6+), jQuery 2.2.4, Bootstrap 4.5
- Mapping: MapLibre GL JS
- Charts: Chart.js
- Databases: MySQL 8, Azure SQL (Hyperscale Serverless), PostgreSQL/PostGIS
- Hosting: Azure App Service (Linux, P1v2)
- Auth: VATSIM Connect (OAuth 2.0)
- Weather: IEM NEXRAD/MRMS tiles
- i18n: 4 locales (en-US, fr-CA, en-CA, en-EU) with 450+ translation keys
-
Playbook Route Catalog (NEW):
playbook.php— Pre-coordinated route play managementapi/data/playbook/*.php— Play listing, categories, changelogapi/mgt/playbook/*.php— Play CRUD (save, route, delete)- Multi-source: FAA national, DCC custom, ECFMP, CANOC plays
- Bulk paste parser for ECFMP/CANOC format routes
- Shareable links:
?play=PLAY_NAMEURL parameter - Duplicate play with
_MODIFIEDsuffix
-
Canadian FIR Sectors & International Expansion:
- 7 Canadian FIRs: CZYZ, CZWG, CZEG, CZUL, CZVR, CZQM, CZQX
- 1,379 total sector boundaries (23 US ARTCCs + Canadian FIRs)
- Splits map visualization with per-FIR sector data
-
Scheduled Splits & Strata Filtering:
- Scheduled splits with auto-activate/deactivate at UTC times
api/splits/scheduled.php/scheduler.php— Schedule management- Strata filtering: low (SFC-FL230), high (FL230-FL370), superhigh (FL370+)
-
NOD Facility Flows:
- Facility Flow Configurations with FEA demand integration
api/nod/flows/elements.php— Flow element dataapi/nod/fea.php— Flow Evaluation Area demand- 8 map layer types with visual controls per element
-
TMI Publish & Discord Integration:
tmi-publish.php— NTML & advisory publishing to Discord- Multi-organization Discord posting (multi-server)
- TMR (Traffic Management Review) reports with demand charts
-
Internationalization (i18n):
- 450+ translation keys across 4 locales (en-US, fr-CA, en-CA, en-EU)
- Locale auto-detection (URL > localStorage > browser > en-US fallback)
PERTIDialogwrapper with automatic i18n key resolution
-
Previous v17 Updates:
- Airport demand analysis (
demand.php) with weather-aware rate suggestions - Airport configuration & ATIS system (runway detection, rate audit trail)
- ATFM Training Simulator (
simulator.php) with Node.js flight engine - Airspace element demand (fix, airway, segment queries)
- Config modifiers & ATIS priority
- Airport demand analysis (
-
Previous v15/v16 Updates:
- GDT Ground Stop NTML Architecture with complete program lifecycle
- ADL Schema Cleanup (unified
phasecolumn) - Weather Radar (IEM NEXRAD/MRMS integration)
- SUA/TFR Display
- Initiative Timeline (Gantt-style visualization)
For issues or questions about PERTI, contact the vATCSCC development team.
Last updated: 2026-02-25