> ## Documentation Index
> Fetch the complete documentation index at: https://docs.canadava.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Pilot One-pager

> Review essential vACA pilot rules, flight procedures, time acceleration policies, and prohibited actions before your next flight.

export const Aircraft = ({aircraft = [], title = "Air Canada Fleet", labels = {}}) => {
  const DEFAULT_LABELS = {
    mainline: "Mainline",
    express: "Express",
    cargo: "Cargo",
    fictional: "Fictional"
  };
  const mergedLabels = {
    ...DEFAULT_LABELS,
    ...labels
  };
  const typeKey = type => {
    const t = (type || "").toLowerCase();
    if (t.includes("mainline") || t.includes("principal")) return "mainline";
    if (t.includes("express") || t.includes("jazz") || t.includes("regional") || t.includes("régional")) return "express";
    if (t.includes("cargo") || t.includes("freight") || t.includes("fret")) return "cargo";
    if (t.includes("fictional") || t.includes("fictif")) return "fictional";
    return "default";
  };
  const typeLabel = k => {
    if (k === "mainline") return mergedLabels.mainline;
    if (k === "express") return mergedLabels.express;
    if (k === "cargo") return mergedLabels.cargo;
    if (k === "fictional") return mergedLabels.fictional;
    return "";
  };
  const TypeIcon = ({k}) => {
    const svgProps = {
      width: 14,
      height: 14,
      viewBox: "0 0 24 24",
      fill: "none",
      stroke: "currentColor",
      strokeWidth: 2,
      strokeLinecap: "round",
      strokeLinejoin: "round",
      "aria-hidden": true
    };
    switch (k) {
      case "mainline":
        return <svg {...svgProps}>
            <path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z" />
          </svg>;
      case "express":
        return <svg {...svgProps}>
            <path d="M2 22h20" />
            <path d="M6.36 17.4 4 17l-2-4 1.1-.55a2 2 0 0 1 1.8 0l.17.1a2 2 0 0 0 1.8 0L8 12 5 6l.9-.45a2 2 0 0 1 2.09.2l4.02 3a2 2 0 0 0 2.1.2l4.19-2.06a2.41 2.41 0 0 1 1.73-.17L21 7a1.4 1.4 0 0 1 .87 1.99l-.38.76c-.23.46-.6.84-1.07 1.08L7.58 17.2a2 2 0 0 1-1.22.18Z" />
          </svg>;
      case "cargo":
        return <svg {...svgProps}>
            <path d="M16.5 9.4 7.55 4.24" />
            <path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" />
            <path d="M3.27 6.96 12 12.01l8.73-5.05" />
            <path d="M12 22.08V12" />
          </svg>;
      case "fictional":
        return <svg {...svgProps}>
            <path d="m12 3-1.9 5.8a2 2 0 0 1-1.287 1.288L3 12l5.8 1.9a2 2 0 0 1 1.288 1.287L12 21l1.9-5.8a2 2 0 0 1 1.287-1.288L21 12l-5.8-1.9a2 2 0 0 1-1.288-1.287Z" />
            <path d="M5 3v4" />
            <path d="M19 17v4" />
            <path d="M3 5h4" />
            <path d="M17 19h4" />
          </svg>;
      default:
        return <svg {...svgProps}>
            <rect x="3" y="3" width="18" height="18" rx="2" />
          </svg>;
    }
  };
  const ChevronIcon = () => <svg width={16} height={16} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
      <polyline points="9 18 15 12 9 6" />
    </svg>;
  return <div className="kb-aircraft">
      <div className="kb-aircraft-header">
        <span className="kb-aircraft-eyebrow">{title}</span>
      </div>
      <div className="kb-aircraft-list">
        {aircraft.map((plane, i) => {
    const k = typeKey(plane.type);
    const sublabel = typeLabel(k);
    return <a key={`a-${i}`} href={plane.href} className="kb-aircraft-row" data-type={k}>
              <span className="kb-aircraft-icon" aria-hidden="true">
                <TypeIcon k={k} />
              </span>
              <div className="kb-aircraft-text">
                <div className="kb-aircraft-name">
                  <span className="kb-aircraft-name-label">{plane.name}</span>
                  {plane.code && <span className="kb-aircraft-code">{plane.code}</span>}
                </div>
                {plane.description && <div className="kb-aircraft-description">
                    {plane.description}
                  </div>}
              </div>
              <div className="kb-aircraft-type-col">
                {sublabel && <span className="kb-aircraft-sublabel">{sublabel}</span>}
              </div>
              <span className="kb-aircraft-chevron" aria-hidden="true">
                <ChevronIcon />
              </span>
            </a>;
  })}
      </div>
    </div>;
};

export const Airports = ({airports = [], title = "Canadian Airport Briefings", labels = {}}) => {
  const DEFAULT_LABELS = {
    hub: "Hub",
    regional: "Regional",
    liveLabel: "VATSIM",
    liveTitle: "VATSIM ATIS broadcasting now"
  };
  const mergedLabels = {
    ...DEFAULT_LABELS,
    ...labels
  };
  const [liveIcaos, setLiveIcaos] = useState(() => new Set());
  useEffect(() => {
    let cancelled = false;
    const fetchAtisFeed = async () => {
      try {
        const res = await fetch("https://data.vatsim.net/v3/vatsim-data.json", {
          cache: "no-store"
        });
        if (!res.ok) return;
        const json = await res.json();
        const all = Array.isArray(json.atis) ? json.atis : [];
        const live = new Set();
        for (const a of all) {
          const cs = (a.callsign || "").toUpperCase();
          const m = cs.match(/^([A-Z]{4})(?:_[AD])?_ATIS$/);
          if (m) live.add(m[1]);
        }
        if (!cancelled) setLiveIcaos(live);
      } catch (_) {}
    };
    fetchAtisFeed();
    const interval = setInterval(fetchAtisFeed, 60 * 1000);
    return () => {
      cancelled = true;
      clearInterval(interval);
    };
  }, []);
  const typeKey = type => {
    const t = (type || "").toLowerCase();
    if (t.includes("hub") || t.includes("plaque") || t.includes("focus")) return "hub";
    if (t.includes("regional") || t.includes("régional") || t.includes("capital")) return "regional";
    return "default";
  };
  const typeLabel = k => {
    if (k === "hub") return mergedLabels.hub;
    if (k === "regional") return mergedLabels.regional;
    return "";
  };
  const TypeIcon = ({k}) => {
    const svgProps = {
      width: 14,
      height: 14,
      viewBox: "0 0 24 24",
      fill: "none",
      stroke: "currentColor",
      strokeWidth: 2,
      strokeLinecap: "round",
      strokeLinejoin: "round",
      "aria-hidden": true
    };
    switch (k) {
      case "hub":
        return <svg {...svgProps}>
            <path d="M16 10h4a2 2 0 0 1 0 4h-4l-4 7h-3l2-7H6l-2 2H1l2-4-2-4h3l2 2h5l-2-7h3z" />
          </svg>;
      case "regional":
        return <svg {...svgProps}>
            <path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z" />
          </svg>;
      default:
        return <svg {...svgProps}>
            <rect x="3" y="3" width="18" height="18" rx="2" />
          </svg>;
    }
  };
  const ChevronIcon = () => <svg width={16} height={16} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
      <polyline points="9 18 15 12 9 6" />
    </svg>;
  return <div className="kb-airports">
      <div className="kb-airports-header">
        <span className="kb-airports-eyebrow">{title}</span>
      </div>
      <div className="kb-airports-list">
        {airports.map((airport, i) => {
    const k = typeKey(airport.type);
    const sublabel = typeLabel(k);
    const isLive = airport.icao && liveIcaos.has(airport.icao.toUpperCase());
    return <a key={`a-${i}`} href={airport.href} className="kb-airports-row" data-type={k}>
              <span className="kb-airports-icon" aria-hidden="true">
                <TypeIcon k={k} />
              </span>
              <div className="kb-airports-text">
                <div className="kb-airports-name">
                  <span className="kb-airports-name-label">{airport.name}</span>
                  {airport.icao && <span className="kb-airports-icao">{airport.icao}</span>}
                  {isLive && <span className="kb-airports-live" title={mergedLabels.liveTitle}>
                      <span className="kb-airports-live-dot" aria-hidden="true" />
                      <span className="kb-airports-live-label">
                        {mergedLabels.liveLabel}
                      </span>
                    </span>}
                </div>
                {airport.description && <div className="kb-airports-description">
                    {airport.description}
                  </div>}
              </div>
              <div className="kb-airports-type-col">
                {sublabel && <span className="kb-airports-sublabel">{sublabel}</span>}
              </div>
              <span className="kb-airports-chevron" aria-hidden="true">
                <ChevronIcon />
              </span>
            </a>;
  })}
      </div>
    </div>;
};

export const Checklist = ({title, items, icon}) => {
  const [checked, setChecked] = useState(Object.fromEntries(items.map((_, i) => [i, false])));
  const toggle = i => setChecked(prev => ({
    ...prev,
    [i]: !prev[i]
  }));
  const done = Object.values(checked).filter(Boolean).length;
  return <div className="kb-checklist">
      <div className="kb-checklist-header">
        <div className="kb-checklist-title">
          {icon && <span className="kb-checklist-icon">{icon}</span>}
          <span>{title}</span>
        </div>
        <span className="kb-checklist-count">{done}/{items.length}</span>
      </div>
      <div className="kb-checklist-items">
        {items.map((item, i) => <button key={i} className={`kb-checklist-item ${checked[i] ? 'checked' : ''}`} onClick={() => toggle(i)}>
            <span className="kb-check-box">
              {checked[i] && <span className="kb-check-mark">✓</span>}
            </span>
            <span className="kb-check-label">{item}</span>
          </button>)}
      </div>
    </div>;
};

This page consolidates the most important information for Virtual Air Canada Airline pilots. Use it as a quick reference before and during your flights, with links to detailed guides for more information.

<img className="block dark:hidden" src="https://mintcdn.com/virtualaircanada/viMOiMp_6YXc-VCM/images/operations/pilot-onepager.png?fit=max&auto=format&n=viMOiMp_6YXc-VCM&q=85&s=9320114b872a81f2fb83c13eab1677c2" alt="Pilot One-pager" width="2064" height="1104" data-path="images/operations/pilot-onepager.png" />

<img className="hidden dark:block" src="https://mintcdn.com/virtualaircanada/viMOiMp_6YXc-VCM/images/operations/pilot-onepager-dark.png?fit=max&auto=format&n=viMOiMp_6YXc-VCM&q=85&s=0490dfc2ac63e48ad7ebebef23d8a07c" alt="Pilot One-pager" width="2064" height="1104" data-path="images/operations/pilot-onepager-dark.png" />

<Checklist
  title="Pre-Flight Readiness"
  items={[
"Flight booked in Pilot Hub",
"Correct aircraft type selected",
"Approved Air Canada livery installed",
"Flight plan loaded in Pegasus ACARS",
"Weather checked at departure and arrival",
"ACARS tracking started"
]}
/>

## Booking your flight

Before flying, you need to book a flight through the Pilot Hub:

1. Navigate to Flight Booking in the Pilot Hub
2. Select your departure airport (vACA hubs offer more route options)
3. Choose your destination and route
4. Select an appropriate aircraft for the route
5. Schedule your departure time and confirm

<Tip>
  Use the Jumpseat feature to reposition to any airport in the network without flying there first.
</Tip>

For the complete booking process and departure time management, see the [Booking Flights Guide](/essentials/booking-flights).

## Aircraft

You must fly the aircraft type that matches your booked flight. Using incorrect aircraft types may result in your flight being rejected.

<Aircraft
  title="Aircraft Checklists"
  aircraft={[
{ type: "mainline", code: "A220-300", name: "Airbus A220-300", href: "/aops/checklists/a220", description: "Short to medium-haul workhorse for regional jet routes" },
{ type: "mainline", code: "A320 family", name: "Airbus A319 / A320 / A321", href: "/aops/checklists/a320", description: "Backbone of short and medium-haul mainline operations" },
{ type: "mainline", code: "A321-XLR", name: "Airbus A321-XLR", href: "/aops/checklists/a320", description: "Long-range single-aisle for thin transatlantic routes" },
{ type: "mainline", code: "A330-300", name: "Airbus A330-300", href: "/aops/checklists/a330", description: "Widebody for medium and long-haul international routes" },
{ type: "mainline", code: "B737 MAX 8", name: "Boeing 737 MAX 8", href: "/aops/checklists/b737max", description: "Short to medium-haul narrowbody" },
{ type: "mainline", code: "B777-200LR", name: "Boeing 777-200LR", href: "/aops/checklists/b777-200lr", description: "Ultra long-haul widebody flagship" },
{ type: "mainline", code: "B777-300ER", name: "Boeing 777-300ER", href: "/aops/checklists/b777-300er", description: "Long-haul widebody flagship" },
{ type: "mainline", code: "B787-8", name: "Boeing 787-8 Dreamliner", href: "/aops/checklists/b787-8", description: "Modern long-haul Dreamliner widebody" },
{ type: "mainline", code: "B787-9", name: "Boeing 787-9 Dreamliner", href: "/aops/checklists/b787-9", description: "Stretched Dreamliner for long-haul routes" },
{ type: "express", code: "DH8D", name: "De Havilland Dash 8-400", href: "/aops/checklists/q400", description: "Regional turboprop for short hops" },
{ type: "express", code: "CRJ900", name: "Mitsubishi CRJ-900", href: "/aops/checklists/crj900", description: "Regional jet for short and medium routes" },
{ type: "express", code: "E175", name: "Embraer E175", href: "/aops/checklists/e175", description: "Regional jet for short and medium routes" },
{ type: "fictional", code: "A340-300", name: "Airbus A340-300", href: "/aops/checklists/a340", description: "Four-engine quadjet for ultra long-haul, fictional fleet" },
{ type: "fictional", code: "A350-900", name: "Airbus A350-900", href: "/aops/checklists/a350", description: "Modern long-haul widebody, fictional fleet" }
]}
/>

<Info>
  Always verify your booked aircraft before starting your simulator.
</Info>

For the complete list of accepted aircraft and approved substitutes, see [Accepted Aircraft](/aircraft/accepted-aircraft).

## Accepted liveries

All aircraft must display a correct Air Canada livery. Default simulator liveries or incorrect airline liveries are not acceptable.

For the complete list of accepted liveries, see [Accepted Liveries](/aircraft/accepted-liveries).

## Airports

The eight Canadian airports flown most often at Virtual Air Canada. Each briefing covers runways, ATC frequencies, hot spots, and live METAR.

<Airports
  title="Canadian Airport Briefings"
  airports={[
{ type: "hub", icao: "CYYZ", name: "Toronto Pearson", href: "/aops/airports/toronto-pearson", description: "Primary global hub. Five runways, parallel ops, complex taxi network, CAT III capability" },
{ type: "hub", icao: "CYUL", name: "Montréal-Trudeau", href: "/aops/airports/montreal-trudeau", description: "Eastern Canada hub. Two close parallel runways since 10/28 was decommissioned in 2023" },
{ type: "hub", icao: "CYVR", name: "Vancouver", href: "/aops/airports/vancouver-international", description: "Western Canada hub. Three runways on Sea Island. Coastal fog and North Shore terrain" },
{ type: "hub", icao: "CYYC", name: "Calgary", href: "/aops/airports/calgary-international", description: "Hot-and-high field. Canada's longest runway (17L/35R). Chinook winds frequently swing operations" },
{ type: "regional", icao: "CYOW", name: "Ottawa", href: "/aops/airports/ottawa", description: "National capital region. Bilingual ATC. Two main jet runways with no parallel operations" },
{ type: "regional", icao: "CYQB", name: "Québec City", href: "/aops/airports/quebec-city", description: "Eastern Quebec. Bilingual ATC. Single CAT I ILS on runway 06; heavy winter operations" },
{ type: "regional", icao: "CYEG", name: "Edmonton", href: "/aops/airports/edmonton", description: "Two intersecting runways. Cold-weather operations and significant cargo activity overnight" },
{ type: "regional", icao: "CYHZ", name: "Halifax", href: "/aops/airports/halifax", description: "Atlantic gateway. Coastal fog. Extended Runway 05/23 supports wide-body operations to Europe" }
]}
/>

For full briefings on each field, see [Canadian Airport Briefings](/aops/airports/index).

## Flight procedures (gate to gate)

Follow these procedures for a safe and valid flight:

<Steps>
  <Step title="Pre-flight preparation">
    * Load your flight in <Tooltip tip="Aircraft Communications Addressing and Reporting System" cta="See glossary" href="/aops/additional-resources/glossary/acars">Pegasus ACARS</Tooltip> from "My Flights"
    * Download and review your flight plan (route, <Tooltip tip="Standard Instrument Departure" cta="See glossary" href="/aops/additional-resources/glossary/sid">SIDs</Tooltip>, <Tooltip tip="Standard Terminal Arrival Route" cta="See glossary" href="/aops/additional-resources/glossary/star">STARs</Tooltip>, approaches)
    * Check weather at departure and arrival airports
    * Calculate fuel requirements
    * Set up your aircraft in the simulator at the departure gate
  </Step>

  <Step title="Pushback and taxi">
    * Request pushback and start engines according to procedures
    * Taxi to the assigned runway using designated taxiways only
    * Follow all ground markings and hold short instructions
  </Step>

  <Step title="Takeoff and climb">
    * Ensure aircraft is configured properly for takeoff based on your aircraft's operating manual
    * Perform takeoff from the runway threshold
    * Follow your assigned SID
    * Climb to your cruise altitude as per your flight plan
  </Step>

  <Step title="Cruise">
    * Maintain your cruise altitude and speed
    * Monitor fuel consumption and systems
    * Time acceleration is permitted during this phase only (long-haul flights 3+ hours, above 20,000 feet)
  </Step>

  <Step title="Descent and approach">
    * Begin descent as per your flight plan
    * Follow your assigned STAR
    * Configure aircraft for approach
    * Ensure time acceleration is disabled (return to 1x speed)
  </Step>

  <Step title="Landing and taxi-in">
    * Land on the assigned runway
    * Exit the runway and taxi to your assigned gate using designated taxiways
    * Follow all ground markings
  </Step>

  <Step title="Shutdown at gate">
    * Park at the gate and shut down engines
    * Complete the flight in Pegasus ACARS by clicking "End Flight"
    * Submit your flight report
  </Step>
</Steps>

## Time acceleration and simulator pausing

<AccordionGroup>
  <Accordion icon="clock" title="Time acceleration rules">
    * **Allowed**: During cruise phase only (at least 20,000 feet), on flights 3 hours or longer
    * **Not allowed**: Short-haul flights under 3 hours
    * **Not allowed**: During takeoff, climb, descent, approach, or landing
    * Must return to 1x speed before beginning descent
    * ACARS tracks usage and may deduct points/hours
  </Accordion>

  <Accordion icon="pause" title="Simulator pausing">
    * Pausing is allowed at any time during your flight
    * No penalty for pausing during any flight phase
    * ACARS will continue tracking correctly when you resume
  </Accordion>
</AccordionGroup>

For complete details, see the [Flight Simulator Guide](/operations/flight-sim).

## Prohibited actions

<Warning>
  The following actions are **prohibited** and will result in your flight being **invalidated** (0 hours, 0 points awarded). Multiple rule violations may result in a permanent ban from the airline. ACARS automatically tracks your aircraft position and flight parameters at all times.
</Warning>

**Ground operations:**

* **Taxiing on grass** - You must remain on paved surfaces at all times
* **Taxiing outside designated taxiways** - Follow proper taxiway routes only
* **Taking off from gates** - You must taxi to and depart from a runway
* **Overspeeding during taxi** - Maintain safe taxi speeds appropriate for the taxiway

**Unsafe flight operations:**

* **Exceeding aircraft limitations** - Do not exceed maximum operating speeds (VMO/MMO), G-limits, or structural limits
* **Overstressing the aircraft** - Hard landings exceeding manufacturer specifications will be flagged
* **Landing gear violations** - Extending gear above maximum speed or landing with gear retracted
* **Stalling or spinning** - Loss of control situations indicate unsafe flying
* **Crashing or ditching** - Aircraft must arrive safely at the destination

**Procedure violations:**

* **Using incorrect aircraft** - You must fly the aircraft type matching your booking
* **Invalid liveries** - Aircraft must display an approved Air Canada livery
* **Time acceleration during critical phases** - No time acceleration during takeoff, climb, descent, approach, or landing

For a complete list of <Tooltip tip="Pilot Report" cta="See glossary" href="/aops/additional-resources/glossary/pirep">PIREP</Tooltip> statuses and what they mean, see [PIREP Statuses](/operations/pirep-statuses).

## Essential resources

<CardGroup cols={2}>
  <Card title="Booking flights" icon="calendar" href="/essentials/booking-flights">
    Complete guide to finding routes, selecting aircraft, and booking your flights.
  </Card>

  <Card title="Flight simulator guide" icon="gauge-high" href="/operations/flight-sim">
    Time acceleration policies, aircraft requirements, and ACARS tracking details.
  </Card>

  <Card title="ACARS guide" icon="satellite-dish" href="/essentials/acars-guide">
    How to use Pegasus ACARS to track and submit your flights.
  </Card>

  <Card title="PIREP statuses" icon="clipboard-check" href="/operations/pirep-statuses">
    Understanding flight report statuses and the review process.
  </Card>
</CardGroup>

## Need help?

<CardGroup cols={2}>
  <Card title="Discord Community" icon="discord" href="https://links.canadava.com/kgNgqfb" cta="Join Discord" arrow={true}>
    Get answers to your questions in our active Discord community
  </Card>

  <Card title="Email Support" icon="envelope" href="mailto:support@canadava.com" cta="Contact Us" arrow={true}>
    Contact our support team for personalized assistance
  </Card>
</CardGroup>
