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

# Canadian Airport Briefings

> vACA briefings for the main Canadian airports flown by Air Canada: runway layout, ATC frequencies, common procedures, hot spots, live METAR, and online ATC network coverage

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 ChartsLinks = ({icao, title = "Charts", freeLabel = "Free"}) => {
  const code = (icao || "").toUpperCase().trim();
  const providers = [{
    name: "ChartFox",
    href: code ? `https://chartfox.org/${code}` : "https://chartfox.org",
    logoSrc: "https://chartfox.org/images/icons/180x180.png",
    badge: freeLabel
  }, {
    name: "Navigraph",
    href: code ? `https://charts.navigraph.com/airport/${code}` : "https://charts.navigraph.com",
    logoSrc: "https://charts.navigraph.com/favicon.ico"
  }];
  return <div className="kb-charts-links">
      <div className="kb-charts-links-header">
        <span className="kb-charts-links-eyebrow">{title}</span>
      </div>
      <div className="kb-charts-links-grid">
        {providers.map(({name, href, logoSrc, badge}) => <a key={name} className="kb-charts-link" href={href} target="_blank" rel="noopener noreferrer">
            <span className="kb-charts-link-logo" aria-hidden="true">
              <img src={logoSrc} alt="" width="20" height="20" loading="lazy" />
            </span>
            <span className="kb-charts-link-name">{name}</span>
            {badge && <span className="kb-charts-link-badge">{badge}</span>}
            <span className="kb-charts-link-chevron" aria-hidden="true">
              <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
                <path d="M5 3L9 7L5 11" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
            </span>
          </a>)}
      </div>
    </div>;
};

<img className="block dark:hidden" src="https://mintcdn.com/virtualaircanada/XtVYTuxmXrU2YyU6/images/aops/airports/airports-light.png?fit=max&auto=format&n=XtVYTuxmXrU2YyU6&q=85&s=115d00e62d40e9781d6f8386dc5cdb6d" alt="Canadian Airport Briefings" width="2064" height="1104" data-path="images/aops/airports/airports-light.png" />

<img className="hidden dark:block" src="https://mintcdn.com/virtualaircanada/XtVYTuxmXrU2YyU6/images/aops/airports/airports-dark.png?fit=max&auto=format&n=XtVYTuxmXrU2YyU6&q=85&s=1f770e38bd6ad415b5a8d5bc4e9bbd9f" alt="Canadian Airport Briefings" width="2064" height="1104" data-path="images/aops/airports/airports-dark.png" />

<Info>For flight-simulation use only - Do **NOT** use for real-world flight</Info>

This section gives you a quick reference for the Canadian airports you will fly most often at Virtual Air Canada. Each page covers the field layout (runways, lengths, ILS categories), the published ATC frequencies, the typical operational rhythm, common hot spots and hazards, and a live METAR pulled from the FAA Aviation Weather Center API so you can check current conditions without leaving the page.

The eight airports here are Air Canada's three primary hubs (Toronto, Montréal, Vancouver), Calgary as the fourth major Western Canadian gateway, and four regional cities where Air Canada operates daily mainline or Express service (Ottawa, Québec City, Edmonton, Halifax). Use these briefings during pre-flight planning, alongside your SimBrief release, charts, and the latest METAR / TAF.

## Airports

<Airports
  title="Canadian Airport Briefings"
  airports={[
{ type: "hub", icao: "CYYZ", name: "Toronto Pearson", href: "/aops/airports/toronto-pearson", description: "Canada's busiest field, parallel ops on five runways" },
{ type: "hub", icao: "CYUL", name: "Montréal-Trudeau", href: "/aops/airports/montreal-trudeau", description: "Bilingual ATC, twin parallel runways" },
{ type: "hub", icao: "CYVR", name: "Vancouver", href: "/aops/airports/vancouver-international", description: "Sea Island location, terrain and coastal fog" },
{ type: "hub", icao: "CYYC", name: "Calgary", href: "/aops/airports/calgary-international", description: "Hot-and-high prairie, chinook crosswinds" },
{ type: "regional", icao: "CYOW", name: "Ottawa", href: "/aops/airports/ottawa", description: "National capital, bilingual ATC" },
{ type: "regional", icao: "CYQB", name: "Québec City", href: "/aops/airports/quebec-city", description: "Bilingual ATC, single ILS, heavy winter ops" },
{ type: "regional", icao: "CYEG", name: "Edmonton", href: "/aops/airports/edmonton", description: "Cold-weather ops, intersecting runways" },
{ type: "regional", icao: "CYHZ", name: "Halifax", href: "/aops/airports/halifax", description: "Transatlantic widebody gateway, coastal fog" }
]}
/>

## Charts

<ChartsLinks />

## How to Use These Briefings

The runway schematic on each page is a stylized diagram, not a navigation chart. Use it to recognize the field layout at a glance. For real procedures, taxi clearances, and approach plates, always cross-reference the current Canada Air Pilot (CAP) and the active <Tooltip tip="Notice to Airmen / Notice to Air Missions" cta="See glossary" href="/aops/additional-resources/glossary/notam">NOTAM</Tooltip> package.

The Live Weather block fetches the most recent <Tooltip tip="Meteorological Aerodrome Report" cta="See glossary" href="/aops/additional-resources/glossary/metar">METAR</Tooltip> from the Aviation Weather Center and refreshes every five minutes. Tap **Metar & Taf Visual decoder** for a graphical breakdown including TAF, ceiling, wind components, and predicted conditions.

The Online ATC Network Maps block links to the live coverage maps for the major virtual ATC networks. Always check who is online before pushing back, particularly on VATSIM where coverage of major Canadian fields fluctuates throughout the day.

<Card title="Back to ASOPs" icon="arrow-left" href="/aops/overview/index">
  Return to the ASOPs index
</Card>
