Checklist Creation Guide
SimEFB loads aircraft checklists from JSON files on your server. This guide explains the exact format, every field, and how to create and host your own checklists for any aircraft.
How It Works
When the app starts, it fetches index.json from your server's /data/
directory. This file lists all available aircraft. When a user selects an aircraft, the app
fetches that aircraft's individual JSON file containing all checklists.
- App fetches
/data/index.json→ gets list of aircraft - User picks an aircraft (e.g. "Airbus A320 Family")
- App fetches
/data/a320.json→ gets all checklists for that aircraft - Checklists are displayed grouped by flight phase
File Structure
Each aircraft has two files: the .json data file and a .json.php
wrapper that adds CORS headers so the app can fetch it.
index.json — Aircraft Catalogue
This is the main entry point. It lists every aircraft available on your server.
index.json Field Reference
| Field | Type | Description |
|---|---|---|
server_name |
string REQ | Display name of your checklist server. Shown in the app. |
version |
string REQ | Version of your checklist catalogue (e.g. "1.0"). |
last_updated |
string REQ | Date of last update in YYYY-MM-DD format. |
checklists |
array REQ | Array of aircraft entries (see below). |
Aircraft Entry Fields
| Field | Type | Description |
|---|---|---|
id |
string REQ | Unique identifier. Use lowercase, no spaces (e.g. "a320", "crj700"). |
aircraft |
string REQ | Full display name (e.g. "Airbus A320 Family"). |
aircraft_code |
string REQ | ICAO type code or short label (e.g. "A320 Family", "B738"). |
description |
string REQ | Short description shown below the aircraft name. |
url |
string REQ | Filename of the checklist JSON (e.g. "a320.json.php"). Relative to /data/. |
version |
string REQ | Version of this specific checklist file. |
premium |
boolean OPT | true = requires Pro access. Default: false. |
Aircraft Checklist JSON
Each aircraft has its own JSON file containing all checklists organized by flight phase.
Top-Level Fields
| Field | Type | Description |
|---|---|---|
version |
string REQ | Version of this checklist file. Should match the version in index.json. |
aircraft |
string REQ | Full aircraft name. |
aircraft_code |
string REQ | ICAO type designator or short code. |
source |
string OPT | Source of the procedures (e.g. "FCOM", "QRH", "SimEFB"). |
last_updated |
string REQ | Date in YYYY-MM-DD format. |
checklists |
array REQ | Array of checklist objects (one per flight phase). |
Flight Phases
Each checklist belongs to a flight phase. The app groups and orders checklists
by phase. Use these exact values for the phase field:
| Phase Value | Display Name | Description |
|---|---|---|
cockpit_preparation | COCKPIT PREPARATION | Initial cockpit setup, before anything else |
before_start | BEFORE START | Pre-engine start checks |
after_start | AFTER START | Post-engine start checks |
taxi | TAXI | Before/during taxi to runway |
line_up | LINE UP | On the runway, before takeoff |
approach | APPROACH | Approach preparation |
landing | LANDING | Final landing checks |
after_landing | AFTER LANDING | Post-touchdown procedures |
parking | PARKING | At the gate/stand |
securing_the_aircraft | SECURING THE AIRCRAFT | Final shutdown |
Checklist Object Fields
| Field | Type | Description |
|---|---|---|
id |
string REQ | Unique ID within this file (e.g. "cockpit_prep"). |
name |
string REQ | Display name, uppercase (e.g. "BEFORE START"). |
phase |
string REQ | One of the phase values from the table above. |
category |
string REQ | Always "normal" for standard procedures. |
items |
array REQ | Array of checklist item objects. |
Checklist Items
Each item in a checklist represents one challenge/response pair. This is what the user sees and checks off.
| Field | Type | Description |
|---|---|---|
challenge |
string REQ | The item label / challenge text. Uppercase recommended. |
response |
string REQ | Expected response. Use "______" for fill-in values. Empty string for notes. |
is_note |
boolean OPT | If true, displayed as an informational note instead of a checkable item. Default: false. |
Notes (is_note)
Notes are items that appear in the checklist but are not checkable. They're displayed differently — usually as dimmer text without a checkbox. Use them for:
- ECAM memo items (things the pilot verifies visually, not calls out)
- Reminders ("AUTO BRK MAX", "CABIN READY")
- Conditional notes ("IF ICE: ENGINE ANTI-ICE ON")
"- SPLRS ARM") to match the Airbus ECAM memo style.
This is purely cosmetic but looks more authentic.
Full Example — CRJ-700
Here's a complete example for a fictional CRJ-700 checklist with 3 phases:
And the matching entry in index.json:
Adding a Custom Aircraft
Step by step:
- Create your checklist JSON file (e.g.
crj700.json) in the/data/directory - Create the PHP wrapper (e.g.
crj700.json.php) — see below - Add an entry to the
checklistsarray inindex.json - Update
index.json'slast_updateddate - Done — the app will show the new aircraft on next refresh
Serving Checklist Files
The app fetches checklists via HTTP. Files live in your web server's /data/ directory.
The .json.php wrappers exist to add CORS headers so the app can fetch them from
a different domain.
PHP Wrapper File
Every .json file needs a matching .json.php wrapper. They all look the same:
Access-Control-Allow-Origin: *
to every response. The url field in index.json points to the
.json.php file, not the raw .json.
Alternative: Nginx CORS
If your Nginx config already adds CORS headers for the /data/ directory,
you can skip the PHP wrappers and point url directly to the .json files.
Example Nginx config:
With this, you can set "url": "a320.json" directly in index.json.
Testing Your Checklists
Before using in the app, verify your JSON is valid:
- Validate JSON syntax — paste your file into jsonlint.com to catch missing commas, brackets, etc.
-
Test the URL — open
https://yourdomain.com/data/crj700.json.phpin a browser. You should see the raw JSON. -
Check CORS — in the browser dev tools (F12 → Network tab),
verify the response has
Access-Control-Allow-Origin: *. - Test in app — restart SimEFB or pull-to-refresh the aircraft list. Your new aircraft should appear.
Premium Flag
Set "premium": true in the aircraft entry in index.json to restrict
access to Pro users. Non-Pro users will see the aircraft but get a "Pro Required" message
when trying to open it.
Versioning
The app uses version numbers to detect updates:
- index.json
version— bump this when you add/remove aircraft - Aircraft entry
version— bump when you update a specific aircraft's checklists - Checklist file
version— should match the entry in index.json
index.json. If they
don't match, the app may serve a cached version.
Best Practices
- Uppercase text — all challenge and response text should be UPPERCASE to match real aviation style
- Use underscores for fill-ins —
"______"tells the pilot they need to fill in a value - (BOTH) — add this when both pilots must verify/set the item
- Keep phases ordered — put checklists in the order they're used during a real flight
- One file per aircraft — don't combine multiple aircraft in one JSON file
- Validate before deploying — a single missing comma breaks the entire file
- Use descriptive IDs —
"before_start"not"bs1" - Source your procedures — use the
sourcefield to credit FCOM, QRH, or community contributions