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.

  1. App fetches /data/index.json → gets list of aircraft
  2. User picks an aircraft (e.g. "Airbus A320 Family")
  3. App fetches /data/a320.json → gets all checklists for that aircraft
  4. Checklists are displayed grouped by flight phase

File Structure

/data/ ├── index.json # Aircraft catalogue (required) ├── index.json.php # PHP wrapper for CORS ├── a320.json # A320 checklists ├── a320.json.php # PHP wrapper for CORS ├── a330.json # A330 checklists ├── a330.json.php ├── b737.json # B737 checklists ├── b737.json.php ├── b777.json # B777 checklists ├── b777.json.php └── version.json # App version info

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.

json — index.json
{ "server_name": "My Custom Checklists", "version": "1.0", "last_updated": "2026-02-11", "checklists": [ { "id": "a320", "aircraft": "Airbus A320 Family", "aircraft_code": "A320 Family", "description": "A320 Family Normal Procedures", "url": "a320.json.php", "version": "1.4", "premium": false }, { "id": "b737", "aircraft": "Boeing 737-800", "aircraft_code": "B738", "description": "737-800 Normal Procedures", "url": "b737.json.php", "version": "1.0", "premium": true } ] }

index.json Field Reference

FieldTypeDescription
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

FieldTypeDescription
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.

json — a320.json (structure)
{ "version": "1.4", "aircraft": "Airbus A320 Family", "aircraft_code": "A320 Family", "source": "SimEFB", "last_updated": "2026-02-06", "checklists": [ { "id": "cockpit_prep", "name": "COCKPIT PREPARATION", "phase": "cockpit_preparation", "category": "normal", "items": [ { "challenge": "GEAR PINS & COVERS", "response": "REMOVED" }, { "challenge": "FUEL QUANTITY", "response": "______" }, { "challenge": "SEAT BELTS", "response": "ON" } ] }, { "id": "before_start", "name": "BEFORE START", "phase": "before_start", "category": "normal", "items": [ ... ] } ] }

Top-Level Fields

FieldTypeDescription
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 ValueDisplay NameDescription
cockpit_preparationCOCKPIT PREPARATIONInitial cockpit setup, before anything else
before_startBEFORE STARTPre-engine start checks
after_startAFTER STARTPost-engine start checks
taxiTAXIBefore/during taxi to runway
line_upLINE UPOn the runway, before takeoff
approachAPPROACHApproach preparation
landingLANDINGFinal landing checks
after_landingAFTER LANDINGPost-touchdown procedures
parkingPARKINGAt the gate/stand
securing_the_aircraftSECURING THE AIRCRAFTFinal shutdown

Checklist Object Fields

FieldTypeDescription
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.

json — item examples
// Standard item (challenge + response) { "challenge": "PARKING BRAKE", "response": "SET" } // Item with a fill-in value (underscore = pilot fills in) { "challenge": "FUEL QUANTITY", "response": "______ KG" } // Item with both-pilots confirmation { "challenge": "BARO REF", "response": "_____ (BOTH)" } // Note item (informational, no response expected) { "challenge": "AUTO BRK MAX", "response": "", "is_note": true } // Note with dash prefix (common Airbus style) { "challenge": "- SPLRS ARM", "response": "", "is_note": true }
FieldTypeDescription
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:

TIP
Prefix notes with a dash ("- 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:

json — crj700.json
{ "version": "1.0", "aircraft": "Bombardier CRJ-700", "aircraft_code": "CRJ7", "source": "Community", "last_updated": "2026-02-11", "checklists": [ { "id": "cockpit_prep", "name": "COCKPIT PREPARATION", "phase": "cockpit_preparation", "category": "normal", "items": [ { "challenge": "BATTERY", "response": "ON" }, { "challenge": "EMERGENCY LIGHTS", "response": "ARMED" }, { "challenge": "FUEL QUANTITY", "response": "______ LBS" }, { "challenge": "PARKING BRAKE", "response": "SET" }, { "challenge": "EXT POWER", "response": "AS RQRD" } ] }, { "id": "before_start", "name": "BEFORE START", "phase": "before_start", "category": "normal", "items": [ { "challenge": "DOORS", "response": "CLOSED" }, { "challenge": "BEACON", "response": "ON" }, { "challenge": "THRUST LEVERS", "response": "IDLE" }, { "challenge": "ANTI-ICE", "response": "AS RQRD" }, { "challenge": "DEPARTURE BRIEFING", "response": "COMPLETED" } ] }, { "id": "taxi", "name": "TAXI", "phase": "taxi", "category": "normal", "items": [ { "challenge": "FLIGHT CONTROLS", "response": "FREE & CORRECT" }, { "challenge": "FLAPS", "response": "______ SET" }, { "challenge": "TRIM", "response": "______ SET" }, { "challenge": "TRANSPONDER", "response": "TA/RA" }, { "challenge": "- TAKEOFF BRIEFING", "response": "", "is_note": true }, { "challenge": "- CABIN SECURE", "response": "", "is_note": true } ] } ] }

And the matching entry in index.json:

json — add to index.json checklists array
{ "id": "crj700", "aircraft": "Bombardier CRJ-700", "aircraft_code": "CRJ7", "description": "CRJ-700 Normal Procedures", "url": "crj700.json.php", "version": "1.0", "premium": false }

Adding a Custom Aircraft

Step by step:

  1. Create your checklist JSON file (e.g. crj700.json) in the /data/ directory
  2. Create the PHP wrapper (e.g. crj700.json.php) — see below
  3. Add an entry to the checklists array in index.json
  4. Update index.json's last_updated date
  5. 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:

php — crj700.json.php
<?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Content-Type: application/json"); if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); } readfile(__DIR__ . "/crj700.json");
WHY PHP WRAPPERS?
The Flutter app runs on a different origin than your server. Without CORS headers, the browser blocks the request. The PHP wrapper adds 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:

nginx
location /data/ { add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods "GET, OPTIONS" always; try_files $uri =404; }

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:

  1. Validate JSON syntax — paste your file into jsonlint.com to catch missing commas, brackets, etc.
  2. Test the URL — open https://yourdomain.com/data/crj700.json.php in a browser. You should see the raw JSON.
  3. Check CORS — in the browser dev tools (F12 → Network tab), verify the response has Access-Control-Allow-Origin: *.
  4. 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.

json
{ "id": "b777", "aircraft": "Boeing 777-300ER", "aircraft_code": "B77W", "description": "PMDG 777-300ER Normal Procedures", "url": "b777.json.php", "version": "1.0", "premium": true }

Versioning

The app uses version numbers to detect updates:

IMPORTANT
When you update a checklist, make sure to bump the version in both the aircraft's JSON file and the matching entry in index.json. If they don't match, the app may serve a cached version.

Best Practices

NEED HELP?
Have questions about creating checklists? Contact us at simefb.com/contact