<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Documentation | XEarthLayer</title><link>https://xearthlayer.app/docs/</link><description>Learn how to install, configure, and use XEarthLayer for photoreal scenery in X-Plane 12.</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://xearthlayer.app/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>How It Works</title><link>https://xearthlayer.app/docs/how-it-works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/how-it-works/</guid><description>Understand the technology behind XEarthLayer's on-demand satellite imagery streaming.</description><content:encoded><![CDATA[<p>XEarthLayer uses a combination of technologies to stream satellite imagery directly into X-Plane, downloading only what you need, when you need it.</p>
<h2 id="the-problem">The Problem</h2>
<p>Traditional orthophoto scenery for X-Plane requires downloading entire regions upfront:</p>
<ul>
<li><strong>Hundreds of gigabytes</strong> per continent, even if you only fly a few routes</li>
<li><strong>Hours</strong> of download and installation time before you can fly</li>
<li><strong>Large disk space</strong> requirements for scenery you may never use</li>
</ul>
<h2 id="the-solution">The Solution</h2>
<p>XEarthLayer takes a just-in-time streaming approach:</p>
<ol>
<li><strong>Virtual Filesystem</strong>: Creates a FUSE file system that X-Plane uses to read scenery tiles</li>
<li><strong>Just-In-Time Fetching</strong>: When X-Plane requests tile resources, XEarthLayer fetches it from satellite providers in real-time and then returns the tile dependencies</li>
<li><strong>Two Tier Caching</strong>: Downloaded tiles are cached to memory as X-Plane can request the same tile multiple times in succession. The map image chunks that are used to construct tiles are cached to disk, saving time when revisiting the same location multiple times.</li>
</ol>
<p>You only download the scenery you actually fly over. No wasted bandwidth or disk space on areas you&rsquo;ll never visit.</p>
<h2 id="architecture">Architecture</h2>
<p><img src="/images/docs/architecture-stack.svg" alt="XEarthLayer Architecture"></p>
<h3 id="scenery-request-pipeline-stages">Scenery Request Pipeline Stages</h3>
<ol>
<li><strong>Request</strong>: X-Plane requests a DSF from XEarthLayer</li>
<li><strong>Image Resource</strong>: X-Plane decodes DSF and creates requests for textures</li>
<li><strong>Cache Check</strong>: XEarthLayer first checks memory cache for completed tile DDS image, then disk cache for image chunks required to create DDS image. If either is found they are returned to X-Plane</li>
<li><strong>Download</strong>: If not cached, XEarthLayer downloads requires tile chunks from the provider to prepare for assembly</li>
<li><strong>Assembly</strong>: Combine 256 small image chunks into a 4096×4096 DDS image</li>
<li><strong>Encode</strong>: Compress 4096×4096 image into DDS format (BC1/BC3) using one of three backends — Software (pure Rust), ISPC SIMD (default, 5–10× faster), or GPU compute shaders (fastest, requires a wgpu-compatible GPU)</li>
<li><strong>Cache</strong>: Store completed DDS image in memory and cache image chunks to disk</li>
<li><strong>Serve</strong>: Return the DDS texture to X-Plane</li>
</ol>
<h3 id="prefetching">Prefetching</h3>
<p>XEarthLayer reads your aircraft&rsquo;s position and heading directly from X-Plane&rsquo;s built-in Web API — no configuration required. On X-Plane 12.1.1 and later, the Web API is enabled by default, so prefetching works out of the box.</p>
<p>The prefetch system uses two strategies, selected automatically based on flight phase:</p>
<ul>
<li><strong>Ground</strong> (ground speed &lt; 40 kt): Loads a <strong>ring of tiles</strong> around the perimeter of X-Plane&rsquo;s already-loaded scenery area. Since the aircraft could taxi in any direction, the ring is symmetric — no heading bias.</li>
<li><strong>Cruise</strong> (airborne): Maintains a <strong>sliding prefetch box</strong> biased in the direction of travel. The box covers roughly 9° per axis, overlapping X-Plane&rsquo;s ~6×6 DSF load area so tiles are ready before the simulator crosses into the next region. The forward bias slides proportionally with heading — at cardinal headings the primary axis gets up to 80/20 bias, while at diagonals both axes share equal bias.</li>
</ul>
<p>A brief <strong>transition</strong> phase bridges the two: when a takeoff is detected (ground speed exceeds 40 kt), prefetching is suppressed until the aircraft climbs 1,000 ft above the departure elevation (or a 90-second timeout elapses). This reserves system resources for X-Plane while it loads departure scenery. Once cruise is confirmed, prefetching ramps up gradually from 25% to full rate over 30 seconds to avoid flooding the pipeline.</p>
<h3 id="consolidated-mounting">Consolidated Mounting</h3>
<p>XEarthLayer uses a single FUSE mount point (<code>zzXEL_ortho</code>) for all of your installed scenery packages. Whether you have one region or a dozen, they are all merged into one virtual folder that X-Plane reads from. Custom tile patches (for airport add-ons, for example) are included in the same mount and automatically take priority over regional package tiles. This means your <code>scenery_packs.ini</code> only needs one ortho entry, and resource usage stays low regardless of how many regions you have installed.</p>
<h2 id="performance">Performance</h2>
<ul>
<li><strong>Scene load</strong>: 1-2 minutes with cached data (down from 5+ minutes when downloading chunks)</li>
<li><strong>Cache hits</strong>: &lt;10ms response time</li>
<li><strong>Cold download</strong>: 1-2 seconds per tile with 1 Gig+ internet connection</li>
</ul>
<h2 id="technical-details">Technical Details</h2>
<p>XEarthLayer is written in Rust for performance and memory safety. Key technologies:</p>
<ul>
<li><strong>fuse3</strong>: Async FUSE filesystem implementation</li>
<li><strong>tokio</strong>: Async runtime for concurrent I/O</li>
<li><strong>reqwest</strong>: HTTP client with connection pooling</li>
<li><strong>image</strong>: JPEG decoding and manipulation</li>
</ul>
]]></content:encoded></item><item><title>Getting Started</title><link>https://xearthlayer.app/docs/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/getting-started/</guid><description>Install XEarthLayer and start flying with photoreal scenery in X-Plane 12.</description><content:encoded><![CDATA[<p>This guide will help you install XEarthLayer and get flying with photoreal scenery in minutes.</p>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li><strong>X-Plane 12</strong> installed on your system</li>
<li><strong>Linux</strong> (Debian/Ubuntu, Fedora/RHEL, or Arch Linux) with FUSE support</li>
<li>At least <strong>2GB free RAM</strong> for the memory cache</li>
<li><strong>Internet connection</strong> for streaming imagery</li>
</ul>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    <strong>X-Plane 12.1.1 or later is recommended.</strong> XEarthLayer connects to X-Plane automatically via the Web API (enabled by default since 12.1.1) to read aircraft position, heading, and speed. This powers adaptive prefetching so tiles are ready before you need them. If X-Plane is not running when XEarthLayer starts, it falls back to inferring position from file access patterns.
  </div>
</div>

<h2 id="installation">Installation</h2>
<div class="tabs" data-tabs-id="tabs-1">
  <div class="tabs__nav" role="tablist"><button
        class="tabs__button active"
        role="tab"
        aria-selected="true"
        aria-controls="tabs-1-panel-0"
        data-tab="0"
      >Build from Source</button><button
        class="tabs__button"
        role="tab"
        aria-selected="false"
        aria-controls="tabs-1-panel-1"
        data-tab="1"
      >Fedora/RHEL</button><button
        class="tabs__button"
        role="tab"
        aria-selected="false"
        aria-controls="tabs-1-panel-2"
        data-tab="2"
      >Debian/Ubuntu</button><button
        class="tabs__button"
        role="tab"
        aria-selected="false"
        aria-controls="tabs-1-panel-3"
        data-tab="3"
      >Arch Linux</button></div>
  <div class="tabs__content"><div
          class="tabs__panel active"
          role="tabpanel"
          id="tabs-1-panel-0"
          data-tab="0"
          
        >
          <div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">git clone https://github.com/samsoir/xearthlayer.git &amp;&amp; cd xearthlayer &amp;&amp; make install</code></pre></div>

        </div><div
          class="tabs__panel"
          role="tabpanel"
          id="tabs-1-panel-1"
          data-tab="1"
          hidden
        >
          <div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">wget https://github.com/samsoir/xearthlayer/releases/download/v0.4.6/xearthlayer-0.4.6-1.fc44.x86_64.rpm &amp;&amp; sudo rpm -i xearthlayer-0.4.6-1.fc44.x86_64.rpm</code></pre></div>

        </div><div
          class="tabs__panel"
          role="tabpanel"
          id="tabs-1-panel-2"
          data-tab="2"
          hidden
        >
          <div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">wget https://github.com/samsoir/xearthlayer/releases/download/v0.4.6/xearthlayer_0.4.6-1_amd64.deb &amp;&amp; sudo dpkg -i xearthlayer_0.4.6-1_amd64.deb</code></pre></div>

        </div><div
          class="tabs__panel"
          role="tabpanel"
          id="tabs-1-panel-3"
          data-tab="3"
          hidden
        >
          <div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">curl -sL https://github.com/samsoir/xearthlayer/releases/download/v0.4.6/%!s(&amp;lt;nil&amp;gt;) | bsdtar -xf- -C /tmp &amp;&amp; cd /tmp &amp;&amp; makepkg -si</code></pre></div>

        </div></div>
</div>

<h2 id="initial-setup">Initial Setup</h2>
<ol>
<li>
<p><strong>Run the setup wizard</strong> (recommended for first-time users):</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer setup</code></pre></div>

<p>The wizard will guide you through:</p>
<ul>
<li>Detecting your X-Plane 12 installation</li>
<li>Choosing package and cache locations</li>
<li>Configuring optimal settings for your hardware</li>
</ul>
</li>
<li>
<p><strong>Install a regional scenery package</strong>:</p>
<p>List available regional scenery packages:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages check</code></pre></div>

<p>Install a package (e.g., Europe):</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages install EU</code></pre></div>

<p>Or North America:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages install NA</code></pre></div>

</li>
<li>
<p><strong>Start XEarthLayer</strong>:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer</code></pre></div>

<p>This defaults to the <code>run</code> command. You can also use <code>xearthlayer run</code> explicitly. Leave this terminal running while you fly in X-Plane.</p>
</li>
<li>
<p><strong>Launch X-Plane</strong> and fly! You should see satellite imagery streaming in as you move around.</p>
</li>
</ol>
<h2 id="stopping-the-service">Stopping the Service</h2>
<p>When you are done flying, close X-Plane first. Then stop XEarthLayer cleanly by pressing the <strong><code>q</code></strong> key in the terminal and following the prompt to confirm.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    Always stop XEarthLayer cleanly before shutting down. Terminating the process while X-Plane is still running will cause X-Plane to crash to desktop.
  </div>
</div>

<h2 id="verifying-it-works">Verifying It Works</h2>
<p>When XEarthLayer is running, you&rsquo;ll see a real-time dashboard showing:</p>
<ul>
<li><strong>Cache statistics</strong> (memory and disk usage)</li>
<li><strong>Download activity</strong> (tiles being fetched)</li>
<li><strong>Aircraft position</strong> (when connected to X-Plane via the Web API)</li>
<li><strong>Pipeline health</strong> (download, assembly, encode stages)</li>
</ul>
<p>If you see tiles being downloaded and cache hits increasing, XEarthLayer is working correctly.</p>
<h2 id="next-steps">Next Steps</h2>
<ul>
<li><a href="../x-plane-configuration/">Configure X-Plane 12 for optimal performance</a></li>
<li><a href="../configuration/">Configure providers and caching</a></li>
<li><a href="../packages/">Install more regional packages</a></li>
<li><a href="../how-it-works/">Learn how XEarthLayer works</a></li>
</ul>
]]></content:encoded></item><item><title>Configuration</title><link>https://xearthlayer.app/docs/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/configuration/</guid><description>Configure imagery providers, caching behavior, and performance settings.</description><content:encoded><![CDATA[<p>XEarthLayer is configured through an INI file located at <code>~/.xearthlayer/config.ini</code>. This page covers the essential settings to get flying, followed by advanced tuning sections for users who want more control.</p>
<h2 id="getting-started-with-configuration">Getting Started with Configuration</h2>
<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    The easiest way to configure XEarthLayer is with the <strong>setup wizard</strong>: run <code>xearthlayer setup</code> and it will auto-detect your X-Plane installation, system hardware, and recommend optimal settings. See <a href="../getting-started/">Getting Started</a> for a walkthrough.
  </div>
</div>

<p>If you prefer manual configuration, create the default config file with:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer init</code></pre></div>

<p>The config file lives at:</p>
<table>
  <thead>
      <tr>
          <th>Path</th>
          <th>Purpose</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>~/.xearthlayer/config.ini</code></td>
          <td>Main configuration file</td>
      </tr>
      <tr>
          <td><code>~/.xearthlayer/xearthlayer.log</code></td>
          <td>Log file (default)</td>
      </tr>
      <tr>
          <td><code>~/.cache/xearthlayer/</code></td>
          <td>Tile cache (default)</td>
      </tr>
  </tbody>
</table>
<p>See <a href="/docs/cli-reference/">CLI Reference</a> for commands to view and modify configuration settings from the terminal.</p>
<h2 id="minimum-settings">Minimum Settings</h2>
<p>These four sections are all you need to configure before your first flight.</p>
<h3 id="x-plane-scenery-directory">X-Plane Scenery Directory</h3>
<p>Tell XEarthLayer where your X-Plane Custom Scenery folder is. If left empty, it auto-detects from <code>~/.x-plane/x-plane_install_12.txt</code>.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[xplane]
scenery_dir = /home/user/X-Plane 12/Custom Scenery</code></pre></div>

<h3 id="imagery-provider">Imagery Provider</h3>
<p>Choose which satellite imagery source to use.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[provider]
type = bing</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Provider</th>
          <th>Config Value</th>
          <th>API Key Required</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bing Maps</td>
          <td><code>bing</code></td>
          <td>No</td>
          <td>Recommended, same source as MSFS 2020/2024. Good global coverage</td>
      </tr>
      <tr>
          <td>Google GO2</td>
          <td><code>go2</code></td>
          <td>No</td>
          <td>Free, Google Maps via public tile servers</td>
      </tr>
      <tr>
          <td>Apple Maps</td>
          <td><code>apple</code></td>
          <td>No</td>
          <td>High quality imagery, tokens auto-acquired</td>
      </tr>
      <tr>
          <td>ArcGIS</td>
          <td><code>arcgis</code></td>
          <td>No</td>
          <td>ESRI World Imagery, good global coverage</td>
      </tr>
      <tr>
          <td>MapBox</td>
          <td><code>mapbox</code></td>
          <td>Yes (freemium)</td>
          <td>Requires free account at mapbox.com</td>
      </tr>
      <tr>
          <td>Google Maps</td>
          <td><code>google</code></td>
          <td>Yes (paid)</td>
          <td>Official API, strict rate limits (15,000 requests/day)</td>
      </tr>
      <tr>
          <td>USGS</td>
          <td><code>usgs</code></td>
          <td>No</td>
          <td>US coverage only, excellent quality orthoimagery</td>
      </tr>
  </tbody>
</table>
<p>For providers that need an API key, add the key in the same section:</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[provider]
type = mapbox
mapbox_access_token = pk.eyJ1...your-token-here</code></pre></div>

<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[provider]
type = google
google_api_key = AIzaSy...your-key-here</code></pre></div>

<h3 id="cache">Cache</h3>
<p>Controls how much memory and disk space XEarthLayer uses for caching tiles. Larger caches mean fewer repeat downloads.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[cache]
memory_size = 2 GB
disk_size = 20 GB
directory = ~/.cache/xearthlayer</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>memory_size</code></td>
          <td><code>2 GB</code></td>
          <td>RAM for in-memory tile cache. If you have 32 GB of system memory, 15 GB or more is recommended</td>
      </tr>
      <tr>
          <td><code>disk_size</code></td>
          <td><code>20 GB</code></td>
          <td>Disk space for persistent tile cache. Larger values reduce repeat network requests</td>
      </tr>
      <tr>
          <td><code>directory</code></td>
          <td><code>~/.cache/xearthlayer</code></td>
          <td>Where cached tiles are stored on disk. Use a drive separate from your system drive if possible, as cache writes are high</td>
      </tr>
  </tbody>
</table>
<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    Size values support <code>KB</code>, <code>MB</code>, and <code>GB</code> suffixes (e.g., <code>500 MB</code>, <code>4 GB</code>, <code>100 GB</code>).
  </div>
</div>

<h3 id="texture-format">Texture Format</h3>
<p>Controls the DDS compression format used for scenery tiles.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[texture]
format = bc1</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>format</code></td>
          <td><code>bc1</code></td>
          <td><code>bc1</code> (DXT1) produces smaller tiles at ~11 MB per 4096x4096 tile. <code>bc3</code> (DXT5) includes alpha channel at ~22 MB per tile. Use <code>bc1</code> unless you specifically need transparency</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="advanced-settings">Advanced Settings</h2>
<p>The sections below cover advanced tuning. Each is self-contained with sensible defaults that work for most systems. Only change these if you have a specific reason to.</p>
<h3 id="dds-encoding">DDS Encoding</h3>
<p>Controls the compression backend used to encode satellite imagery into DDS textures.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>compressor</code></td>
          <td><code>ispc</code></td>
          <td>Compression backend: <code>software</code>, <code>ispc</code> (SIMD), or <code>gpu</code> (compute shader)</td>
      </tr>
      <tr>
          <td><code>gpu_device</code></td>
          <td><code>integrated</code></td>
          <td>GPU adapter when using <code>gpu</code> compressor: <code>integrated</code>, <code>discrete</code>, or an adapter name substring (e.g., <code>Radeon</code>, <code>RTX 5090</code>)</td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th>Backend</th>
          <th>Speed</th>
          <th>CPU Usage</th>
          <th>When to Use</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>software</code></td>
          <td>Slowest</td>
          <td>High</td>
          <td>Fallback when ISPC or GPU are unavailable</td>
      </tr>
      <tr>
          <td><code>ispc</code></td>
          <td>Fast (5-10x)</td>
          <td>High</td>
          <td>Default. Best overall performance for most users</td>
      </tr>
      <tr>
          <td><code>gpu</code></td>
          <td>Fast</td>
          <td>Low</td>
          <td>When an idle wgpu-compatible GPU is available for encoding</td>
      </tr>
  </tbody>
</table>
<p>The <code>gpu</code> backend is ideal for systems with both an integrated and discrete GPU. Set <code>gpu_device = integrated</code> to use the iGPU for encoding while the discrete GPU handles X-Plane rendering. This eliminates CPU contention between encoding and the simulator.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    Using <code>gpu_device = discrete</code> sends encoding work to the same GPU running X-Plane, which creates memory pressure and may cause frame drops. Only use <code>discrete</code> if you do not have an integrated GPU.
  </div>
</div>

<p>Run <code>xearthlayer diagnostics</code> to see available GPU adapters on your system.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[texture]
format = bc1
compressor = gpu
gpu_device = integrated</code></pre></div>

<h3 id="prefetch-tuning">Prefetch Tuning</h3>
<p>Controls the Adaptive Prefetch System, which pre-loads tiles ahead of the aircraft to reduce scenery pop-in during flight. The system self-calibrates based on your network and hardware performance.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>enabled</code></td>
          <td><code>true</code></td>
          <td>Enable or disable predictive tile prefetching</td>
      </tr>
      <tr>
          <td><code>mode</code></td>
          <td><code>auto</code></td>
          <td>Mode selection: <code>auto</code> (recommended), <code>aggressive</code>, <code>opportunistic</code>, or <code>disabled</code></td>
      </tr>
      <tr>
          <td><code>web_api_port</code></td>
          <td><code>8086</code></td>
          <td>X-Plane Web API port for telemetry (position, heading, speed, altitude). Change only if X-Plane uses a non-default port</td>
      </tr>
      <tr>
          <td><code>max_tiles_per_cycle</code></td>
          <td><code>200</code></td>
          <td>Maximum tiles to submit per prefetch cycle. Lower values reduce bandwidth competition with on-demand requests</td>
      </tr>
      <tr>
          <td><code>cycle_interval_ms</code></td>
          <td><code>2000</code></td>
          <td>Interval between prefetch cycles in milliseconds</td>
      </tr>
      <tr>
          <td><code>calibration_aggressive_threshold</code></td>
          <td><code>30.0</code></td>
          <td>Tiles/sec throughput threshold for aggressive mode</td>
      </tr>
      <tr>
          <td><code>calibration_opportunistic_threshold</code></td>
          <td><code>10.0</code></td>
          <td>Tiles/sec throughput threshold for opportunistic mode. Below this, prefetch is disabled</td>
      </tr>
      <tr>
          <td><code>calibration_sample_duration</code></td>
          <td><code>60</code></td>
          <td>How long (seconds) to measure throughput during initial calibration</td>
      </tr>
      <tr>
          <td><code>box_extent</code></td>
          <td><code>6.5</code></td>
          <td>Prefetch box extent per axis in degrees (7.0-15.0). X-Plane loads ~6x6 DSF tiles around the aircraft</td>
      </tr>
      <tr>
          <td><code>box_max_bias</code></td>
          <td><code>0.8</code></td>
          <td>Forward bias fraction (0.5-0.9). 0.8 means 80% of the box is ahead of the aircraft</td>
      </tr>
  </tbody>
</table>
<p><strong>Mode selection</strong> is based on calibration throughput:</p>
<table>
  <thead>
      <tr>
          <th>Mode</th>
          <th>Trigger</th>
          <th>When Used</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>auto</code></td>
          <td>Based on calibration (recommended)</td>
          <td>Most users</td>
      </tr>
      <tr>
          <td><code>aggressive</code></td>
          <td>Position-based (&gt;30 tiles/sec throughput)</td>
          <td>Fast connections</td>
      </tr>
      <tr>
          <td><code>opportunistic</code></td>
          <td>Executor backpressure-based (10-30 tiles/sec)</td>
          <td>Moderate connections</td>
      </tr>
      <tr>
          <td><code>disabled</code></td>
          <td>Never prefetches</td>
          <td>Slow connections or debugging</td>
      </tr>
  </tbody>
</table>
<p><strong>Flight phase transitions:</strong></p>
<p>The prefetch system detects three flight phases and adjusts behavior automatically:</p>
<ul>
<li><strong>Ground</strong> (GS &lt; 40 kt): Full-rate prefetch using ring strategy around current position</li>
<li><strong>Transition</strong> (takeoff detected): Prefetch suppressed while X-Plane loads takeoff scenery</li>
<li><strong>Cruise</strong> (climb confirmed): Prefetch ramps up from 25% to full rate over 30 seconds</li>
</ul>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Range</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>takeoff_climb_ft</code></td>
          <td><code>1000</code></td>
          <td>200-5000</td>
          <td>Feet above takeoff altitude to release transition hold</td>
      </tr>
      <tr>
          <td><code>takeoff_timeout_secs</code></td>
          <td><code>90</code></td>
          <td>30-300</td>
          <td>Maximum seconds before timeout release</td>
      </tr>
      <tr>
          <td><code>landing_hysteresis_secs</code></td>
          <td><code>15</code></td>
          <td>5-60</td>
          <td>Sustained seconds at GS &lt; 40 kt before landing detection</td>
      </tr>
      <tr>
          <td><code>ramp_duration_secs</code></td>
          <td><code>30</code></td>
          <td>10-120</td>
          <td>Duration of linear ramp to full prefetch rate</td>
      </tr>
      <tr>
          <td><code>ramp_start_fraction</code></td>
          <td><code>0.25</code></td>
          <td>0.1-0.5</td>
          <td>Starting prefetch fraction when ramp begins</td>
      </tr>
  </tbody>
</table>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    Telemetry is automatic. XEarthLayer connects to X-Plane&rsquo;s built-in Web API (port 8086 by default) for position, heading, speed, and altitude data. No plugin or manual setup is required. If X-Plane uses a non-default port, set <code>web_api_port</code> to match.
  </div>
</div>

<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[prefetch]
enabled = true
mode = auto</code></pre></div>

<h3 id="cache-warming-prewarm">Cache Warming (Prewarm)</h3>
<p>Pre-loads tiles around a departure airport before X-Plane starts, reducing initial scenery load times on a cold cache.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>grid_rows</code></td>
          <td><code>3</code></td>
          <td>Latitude extent in DSF tiles around the airport</td>
      </tr>
      <tr>
          <td><code>grid_cols</code></td>
          <td><code>4</code></td>
          <td>Longitude extent in DSF tiles around the airport</td>
      </tr>
  </tbody>
</table>
<p>The default 3x4 grid (12 tiles) matches X-Plane&rsquo;s typical scenery window of ~3 degrees latitude by ~4 degrees longitude at mid-latitudes.</p>
<table>
  <thead>
      <tr>
          <th>Rows x Cols</th>
          <th>Tiles</th>
          <th>Approximate Coverage</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>3 x 4 (default)</td>
          <td>12</td>
          <td>~180 nm x 240 nm</td>
      </tr>
      <tr>
          <td>4 x 6</td>
          <td>24</td>
          <td>~240 nm x 360 nm</td>
      </tr>
      <tr>
          <td>6 x 8</td>
          <td>48</td>
          <td>~360 nm x 480 nm</td>
      </tr>
  </tbody>
</table>
<p>Use the <code>--airport</code> flag when launching to activate prewarming:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer run --airport KJFK</code></pre></div>

<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[prewarm]
grid_rows = 3
grid_cols = 4</code></pre></div>

<h3 id="download-settings">Download Settings</h3>
<p>Controls the network timeout for downloading imagery tiles.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>timeout</code></td>
          <td><code>30</code></td>
          <td>Download timeout in seconds for a single chunk</td>
      </tr>
  </tbody>
</table>
<p>Each 4096x4096 scenery tile requires downloading 256 chunks (a 16x16 grid of 256x256 source tiles). HTTP concurrency is automatically tuned based on your CPU count. Retry behavior is configured in the <a href="#resource-pools-executor">Resource Pools (Executor)</a> section.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[download]
timeout = 30</code></pre></div>

<h3 id="generation">Generation</h3>
<p>Controls parallel tile generation (assembling and encoding downloaded chunks into DDS textures).</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>threads</code></td>
          <td>(number of CPU cores)</td>
          <td>Number of worker threads for parallel tile generation. Do not set higher than your CPU core count</td>
      </tr>
      <tr>
          <td><code>timeout</code></td>
          <td><code>10</code></td>
          <td>Timeout in seconds for generating a single tile. If exceeded, a magenta placeholder is returned</td>
      </tr>
  </tbody>
</table>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[generation]
threads = 8
timeout = 10</code></pre></div>

<h3 id="control-plane">Control Plane</h3>
<p>Manages concurrent tile processing jobs and provides health monitoring with stall detection.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>max_concurrent_jobs</code></td>
          <td>num_cpus x 2</td>
          <td>Maximum concurrent tile processing jobs</td>
      </tr>
      <tr>
          <td><code>stall_threshold_secs</code></td>
          <td><code>60</code></td>
          <td>Time in seconds before a job is considered stalled and recovered</td>
      </tr>
      <tr>
          <td><code>health_check_interval_secs</code></td>
          <td><code>5</code></td>
          <td>Interval between health monitoring checks (seconds)</td>
      </tr>
      <tr>
          <td><code>semaphore_timeout_secs</code></td>
          <td><code>30</code></td>
          <td>Timeout for on-demand requests waiting for a job slot (seconds)</td>
      </tr>
  </tbody>
</table>
<p>On-demand requests from X-Plane block up to <code>semaphore_timeout_secs</code> waiting for a slot, while prefetch jobs are silently skipped if no slots are available.</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[control_plane]
max_concurrent_jobs = 16
stall_threshold_secs = 60</code></pre></div>

<h3 id="resource-pools-executor">Resource Pools (Executor)</h3>
<p>The executor is the core tile processing engine. These settings control concurrency limits for network, CPU, and disk I/O operations.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>network_concurrent</code></td>
          <td><code>128</code></td>
          <td>Concurrent HTTP connections. Clamped to 64-256 to prevent provider rate limiting</td>
      </tr>
      <tr>
          <td><code>cpu_concurrent</code></td>
          <td>num_cpus x 1.25</td>
          <td>Concurrent CPU-bound operations (assemble + encode). Minimum: num_cpus + 2</td>
      </tr>
      <tr>
          <td><code>disk_io_concurrent</code></td>
          <td><code>64</code></td>
          <td>Concurrent disk I/O operations. Auto-detected from storage type (HDD: 4, SSD: 64, NVMe: 256)</td>
      </tr>
      <tr>
          <td><code>max_concurrent_tasks</code></td>
          <td><code>128</code></td>
          <td>Maximum concurrent tasks the executor can run</td>
      </tr>
      <tr>
          <td><code>job_channel_capacity</code></td>
          <td><code>256</code></td>
          <td>Internal job queue size</td>
      </tr>
      <tr>
          <td><code>request_channel_capacity</code></td>
          <td><code>1000</code></td>
          <td>External request queue from FUSE and prefetch</td>
      </tr>
      <tr>
          <td><code>request_timeout_secs</code></td>
          <td><code>10</code></td>
          <td>HTTP request timeout per chunk in seconds</td>
      </tr>
      <tr>
          <td><code>max_retries</code></td>
          <td><code>3</code></td>
          <td>Maximum retry attempts per failed chunk download</td>
      </tr>
      <tr>
          <td><code>retry_base_delay_ms</code></td>
          <td><code>100</code></td>
          <td>Base delay in milliseconds for exponential backoff (100 ms, 200 ms, 400 ms, &hellip;)</td>
      </tr>
  </tbody>
</table>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[executor]
network_concurrent = 128
cpu_concurrent = 10
disk_io_concurrent = 64</code></pre></div>

<h3 id="disk-io-profile">Disk I/O Profile</h3>
<p>Tunes disk I/O concurrency based on your storage type. This is set in the <code>[cache]</code> section.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>disk_io_profile</code></td>
          <td><code>auto</code></td>
          <td>Storage type profile: <code>auto</code>, <code>hdd</code>, <code>ssd</code>, or <code>nvme</code></td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th>Profile</th>
          <th>Description</th>
          <th>Concurrent Ops</th>
          <th>Best For</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>auto</code></td>
          <td>Auto-detect storage type (recommended)</td>
          <td>Varies</td>
          <td>Most users</td>
      </tr>
      <tr>
          <td><code>hdd</code></td>
          <td>Spinning disk, seek-bound</td>
          <td>1-4</td>
          <td>Traditional hard drives</td>
      </tr>
      <tr>
          <td><code>ssd</code></td>
          <td>SATA/AHCI SSD</td>
          <td>32-64</td>
          <td>Most SSDs</td>
      </tr>
      <tr>
          <td><code>nvme</code></td>
          <td>NVMe SSD, multiple queues</td>
          <td>128-256</td>
          <td>NVMe drives</td>
      </tr>
  </tbody>
</table>
<p>When set to <code>auto</code> on Linux, XEarthLayer detects the storage type by checking <code>/sys/block/&lt;device&gt;/queue/rotational</code>. If detection fails, it defaults to the <code>ssd</code> profile as a safe middle-ground.</p>
<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    For best performance, place your cache directory on a fast NVMe or SSD that is not your primary system volume.
  </div>
</div>

<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[cache]
disk_io_profile = auto</code></pre></div>

<h3 id="fuse-kernel-parameters">FUSE Kernel Parameters</h3>
<p>Controls Linux FUSE kernel limits for concurrent background requests. The Linux kernel&rsquo;s default limits (12 max background / 9 congestion threshold) are far too low for X-Plane&rsquo;s concurrent scenery reads.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>max_background</code></td>
          <td><code>256</code></td>
          <td>Maximum pending background FUSE requests before the kernel queues them</td>
      </tr>
      <tr>
          <td><code>congestion_threshold</code></td>
          <td><code>192</code></td>
          <td>Kernel starts throttling when pending requests exceed this. Convention: 75% of <code>max_background</code></td>
      </tr>
  </tbody>
</table>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    These are advanced kernel-level parameters. The defaults are tuned to prevent sim freezes at DSF tile boundaries. Only increase these if you experience boundary freezes. The <code>congestion_threshold</code> should always be less than <code>max_background</code>.
  </div>
</div>

<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[fuse]
max_background = 256
congestion_threshold = 192</code></pre></div>

<h3 id="logging">Logging</h3>
<p>Controls where XEarthLayer writes its log file.</p>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>file</code></td>
          <td><code>~/.xearthlayer/xearthlayer.log</code></td>
          <td>Log file location. Supports <code>~</code> expansion</td>
      </tr>
  </tbody>
</table>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[logging]
file = ~/.xearthlayer/xearthlayer.log</code></pre></div>

]]></content:encoded></item><item><title>CLI Reference</title><link>https://xearthlayer.app/docs/cli-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/cli-reference/</guid><description>Complete command reference for the XEarthLayer command-line interface.</description><content:encoded><![CDATA[<p>Complete reference for every <code>xearthlayer</code> command, grouped by purpose.</p>
<p>Run <code>xearthlayer --help</code> or <code>xearthlayer &lt;command&gt; --help</code> for built-in usage information.</p>
<h2 id="service-management">Service Management</h2>
<h3 id="xearthlayer--xearthlayer-run"><code>xearthlayer</code> / <code>xearthlayer run</code></h3>
<p>Start XEarthLayer and mount all installed packages. This is the <strong>default command</strong> — running <code>xearthlayer</code> with no arguments is equivalent to <code>xearthlayer run</code>.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer
xearthlayer run --provider bing --parallel 32
xearthlayer run --airport KJFK</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--provider &lt;TYPE&gt;</code></td>
          <td>Imagery provider: <code>apple</code>, <code>arcgis</code>, <code>bing</code>, <code>go2</code>, <code>google</code>, <code>mapbox</code>, <code>usgs</code></td>
      </tr>
      <tr>
          <td><code>--google-api-key &lt;KEY&gt;</code></td>
          <td>Google Maps API key (required when provider is <code>google</code>)</td>
      </tr>
      <tr>
          <td><code>--mapbox-token &lt;TOKEN&gt;</code></td>
          <td>MapBox access token (required when provider is <code>mapbox</code>)</td>
      </tr>
      <tr>
          <td><code>--dds-format &lt;FORMAT&gt;</code></td>
          <td>DDS compression format: <code>bc1</code> or <code>bc3</code></td>
      </tr>
      <tr>
          <td><code>--timeout &lt;SECS&gt;</code></td>
          <td>Download timeout in seconds</td>
      </tr>
      <tr>
          <td><code>--parallel &lt;NUM&gt;</code></td>
          <td>Maximum parallel downloads (default: 32)</td>
      </tr>
      <tr>
          <td><code>--no-cache</code></td>
          <td>Disable the disk and memory cache</td>
      </tr>
      <tr>
          <td><code>--debug</code></td>
          <td>Enable debug logging</td>
      </tr>
      <tr>
          <td><code>--profile</code></td>
          <td>Enable Chrome Trace profiling output</td>
      </tr>
      <tr>
          <td><code>--no-prefetch</code></td>
          <td>Disable adaptive predictive prefetching</td>
      </tr>
      <tr>
          <td><code>--airport &lt;ICAO&gt;</code></td>
          <td>ICAO airport code for cold-start pre-warming (e.g., <code>LFBO</code>, <code>KJFK</code>)</td>
      </tr>
  </tbody>
</table>
<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    CLI flags override values from <code>config.ini</code>. For example, <code>--provider google --google-api-key &lt;KEY&gt;</code> overrides whatever provider is set in the config file.
  </div>
</div>

<p>To stop the service, press <strong><code>q</code></strong> in the terminal for a clean shutdown (unmounts FUSE, flushes cache). <code>Ctrl+C</code> also works.</p>
<h2 id="setup--configuration">Setup &amp; Configuration</h2>
<h3 id="xearthlayer-init"><code>xearthlayer init</code></h3>
<p>Create a default configuration file. Auto-detects your X-Plane installation and writes <code>config.ini</code>.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer init</code></pre></div>

<h3 id="xearthlayer-setup"><code>xearthlayer setup</code></h3>
<p>Interactive setup wizard. Detects your X-Plane installation, checks hardware, and recommends settings. Recommended for first-time users.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer setup</code></pre></div>

<h3 id="xearthlayer-config-get-key"><code>xearthlayer config get &lt;KEY&gt;</code></h3>
<p>Read a single configuration value. Keys use <code>section.key</code> format.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer config get provider.provider_type
xearthlayer config get cache.disk_size</code></pre></div>

<h3 id="xearthlayer-config-set-key-value"><code>xearthlayer config set &lt;KEY&gt; &lt;VALUE&gt;</code></h3>
<p>Write a configuration value.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer config set provider.provider_type bing
xearthlayer config set cache.disk_size 10737418240</code></pre></div>

<h3 id="xearthlayer-config-list"><code>xearthlayer config list</code></h3>
<p>Display all configuration settings grouped by section.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer config list</code></pre></div>

<h3 id="xearthlayer-config-path"><code>xearthlayer config path</code></h3>
<p>Print the full path to the configuration file.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer config path</code></pre></div>

<h3 id="xearthlayer-config-upgrade"><code>xearthlayer config upgrade</code></h3>
<p>Upgrade your configuration file to the current version. Adds missing settings with defaults and removes deprecated entries. A timestamped backup is created automatically.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer config upgrade --dry-run   # Preview changes without modifying
xearthlayer config upgrade             # Apply the upgrade</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--dry-run</code></td>
          <td>Show what would change without modifying the file</td>
      </tr>
  </tbody>
</table>
<h2 id="package-management">Package Management</h2>
<h3 id="xearthlayer-packages-list"><code>xearthlayer packages list</code></h3>
<p>List all installed packages.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages list
xearthlayer packages list --verbose</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--verbose</code>, <code>-v</code></td>
          <td>Show detailed information</td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-packages-check"><code>xearthlayer packages check</code></h3>
<p>Check the package library for available updates.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages check</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--library-url &lt;URL&gt;</code></td>
          <td>Override the package library URL</td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-packages-install-region"><code>xearthlayer packages install &lt;REGION&gt;</code></h3>
<p>Install a regional scenery package. Region codes are short identifiers like <code>eu</code>, <code>na</code>, <code>sa</code>.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages install eu
xearthlayer packages install na --type overlay</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--type &lt;TYPE&gt;</code></td>
          <td>Package type: <code>ortho</code> (default) or <code>overlay</code></td>
      </tr>
      <tr>
          <td><code>--library-url &lt;URL&gt;</code></td>
          <td>Override the package library URL</td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
      <tr>
          <td><code>--temp-dir &lt;PATH&gt;</code></td>
          <td>Override the temporary download directory</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-packages-update-region"><code>xearthlayer packages update [REGION]</code></h3>
<p>Update installed packages. If no region is specified, checks all installed packages for updates.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages update eu
xearthlayer packages update --all</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--all</code></td>
          <td>Update all packages without prompting</td>
      </tr>
      <tr>
          <td><code>--type &lt;TYPE&gt;</code></td>
          <td>Filter by package type: <code>ortho</code> or <code>overlay</code></td>
      </tr>
      <tr>
          <td><code>--library-url &lt;URL&gt;</code></td>
          <td>Override the package library URL</td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
      <tr>
          <td><code>--temp-dir &lt;PATH&gt;</code></td>
          <td>Override the temporary download directory</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-packages-remove-region"><code>xearthlayer packages remove &lt;REGION&gt;</code></h3>
<p>Remove an installed package.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages remove eu
xearthlayer packages remove na --type overlay --force</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--type &lt;TYPE&gt;</code></td>
          <td>Package type: <code>ortho</code> (default) or <code>overlay</code></td>
      </tr>
      <tr>
          <td><code>--force</code>, <code>-f</code></td>
          <td>Remove without confirmation prompt</td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-packages-info-region"><code>xearthlayer packages info &lt;REGION&gt;</code></h3>
<p>Show detailed information about an installed package.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages info eu
xearthlayer packages info na --type overlay</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--type &lt;TYPE&gt;</code></td>
          <td>Package type: <code>ortho</code> (default) or <code>overlay</code></td>
      </tr>
      <tr>
          <td><code>--install-dir &lt;PATH&gt;</code></td>
          <td>Override the installation directory</td>
      </tr>
  </tbody>
</table>
<h2 id="cache-management">Cache Management</h2>
<h3 id="xearthlayer-cache-stats"><code>xearthlayer cache stats</code></h3>
<p>Show disk cache location, file count, and total size.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer cache stats</code></pre></div>

<h3 id="xearthlayer-cache-clear"><code>xearthlayer cache clear</code></h3>
<p>Delete all cached tiles from the disk cache.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer cache clear</code></pre></div>

<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    Clearing the cache means all textures will need to be re-downloaded on the next flight. This is safe but may cause longer initial load times.
  </div>
</div>

<h2 id="scenery-index">Scenery Index</h2>
<p>The scenery index maps installed packages to tile coordinates, enabling adaptive prefetching. It is built automatically on startup, but you can manage it manually.</p>
<h3 id="xearthlayer-scenery-index-status"><code>xearthlayer scenery-index status</code></h3>
<p>Show index cache status including version, package count, and tile counts.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer scenery-index status</code></pre></div>

<h3 id="xearthlayer-scenery-index-update"><code>xearthlayer scenery-index update</code></h3>
<p>Rebuild the scenery index from installed packages. Useful after manually adding or removing package files.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer scenery-index update</code></pre></div>

<h3 id="xearthlayer-scenery-index-clear"><code>xearthlayer scenery-index clear</code></h3>
<p>Delete the scenery index cache file. It will be rebuilt automatically on the next <code>xearthlayer run</code>.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer scenery-index clear</code></pre></div>

<h2 id="patches">Patches</h2>
<p>Patches are pre-built Ortho4XP tiles with custom mesh or elevation data. XEarthLayer overlays them with dynamically generated textures at runtime.</p>
<h3 id="xearthlayer-patches-list"><code>xearthlayer patches list</code></h3>
<p>List installed patches with validation status, priority order, and file counts.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer patches list</code></pre></div>

<h3 id="xearthlayer-patches-validate"><code>xearthlayer patches validate</code></h3>
<p>Validate patch directory structure and required files.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer patches validate
xearthlayer patches validate --name my-patch</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--name &lt;PATCH_NAME&gt;</code></td>
          <td>Validate a specific patch by name</td>
      </tr>
  </tbody>
</table>
<h3 id="xearthlayer-patches-path"><code>xearthlayer patches path</code></h3>
<p>Print the configured patches directory path.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer patches path</code></pre></div>

<h2 id="diagnostics">Diagnostics</h2>
<h3 id="xearthlayer-diagnostics"><code>xearthlayer diagnostics</code></h3>
<p>Output system diagnostics including GPU detection, system information, and configuration details. Useful for bug reports.</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer diagnostics</code></pre></div>

<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    When filing a bug report, include the output of <code>xearthlayer diagnostics</code> to help with troubleshooting.
  </div>
</div>

]]></content:encoded></item><item><title>Package Management</title><link>https://xearthlayer.app/docs/packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/packages/</guid><description>Install, update, and manage regional scenery packages.</description><content:encoded><![CDATA[<p>XEarthLayer uses a package system to manage regional scenery from across the globe. Packages contain tile indices that tell XEarthLayer which areas have satellite imagery and what resources to download.</p>
<h2 id="available-regions">Available Regions</h2>
<p><img src="/images/coverage.png" alt="Coverage Map"></p>
<p><em>AF1 in cyan, AF2 in yellowgreen, AS1 in firebrick, AS2 in crimson, AS3 in red, AS4 in palevioletred, EU in orange, EU2 in tangerine, NA in blue, OC in purple, SA in green.</em></p>
<table>
  <thead>
      <tr>
          <th>Code</th>
          <th>Region</th>
          <th>Version</th>
          <th>Coverage</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>AF1</td>
          <td>Africa - Part 1</td>
          <td>0.1.0</td>
          <td>North Africa including Morocco, Algeria, Tunisia, Libya, Egypt, Sudan, South Sudan, Ethiopia, Somalia, Djibouti, Chad, Niger, Nigeria, Cameroon, Central African Republic, Mali, Senegal, Gambia, Guinea, Sierra Leone, Liberia, Ivory Coast, Ghana, Benin, Mauritania, Western Sahara</td>
      </tr>
      <tr>
          <td>AF2</td>
          <td>Africa - Part 2</td>
          <td>0.1.0</td>
          <td>Southern Africa including South Africa, Namibia, Botswana, Zimbabwe, Zambia, Mozambique, Madagascar, Tanzania, Kenya, DRC</td>
      </tr>
      <tr>
          <td>AS1</td>
          <td>Asia - Part 1</td>
          <td>0.1.0</td>
          <td>China and Mongolia</td>
      </tr>
      <tr>
          <td>AS2</td>
          <td>Asia - Part 2</td>
          <td>0.1.0</td>
          <td>Middle East, South Asia, and Central Asia including Saudi Arabia, UAE, Oman, Yemen, Iran, Iraq, Syria, Jordan, Israel, Lebanon, eastern Turkey, Afghanistan, Pakistan, India, Nepal, Bhutan, Bangladesh, Sri Lanka, Maldives, Kazakhstan, Uzbekistan, Turkmenistan, Kyrgyzstan, Tajikistan, western China, western Mongolia, southern Russia, and Indian Ocean islands</td>
      </tr>
      <tr>
          <td>AS3</td>
          <td>Asia - Part 3</td>
          <td>0.1.0</td>
          <td>Indonesia, Malaysia, Philippines, Vietnam, Thailand, Japan, South Korea, Taiwan, Eastern Russia</td>
      </tr>
      <tr>
          <td>AS4</td>
          <td>Asia - Part 4</td>
          <td>0.1.0</td>
          <td>Russia east of the Ural Mountains extending to the Pacific peninsula</td>
      </tr>
      <tr>
          <td>EU</td>
          <td>Europe</td>
          <td>0.1.1</td>
          <td>Western and Central Europe</td>
      </tr>
      <tr>
          <td>EU2</td>
          <td>Europe - Part 2</td>
          <td>0.1.0</td>
          <td>Eastern Europe, Scandinavia, Caucasus, and European Russia including Greece, Bulgaria, Romania, Moldova, Ukraine, Belarus, Baltic States, Finland, Sweden, Norway, Turkey, Cyprus, Georgia, Armenia, Azerbaijan, and European Russia extending to the Ural Mountains</td>
      </tr>
      <tr>
          <td>NA</td>
          <td>North America</td>
          <td>0.2.3</td>
          <td>United States, Canada, Caribbean</td>
      </tr>
      <tr>
          <td>OC</td>
          <td>Oceania</td>
          <td>0.2.0</td>
          <td>Australia, New Zealand, Fiji, French Polynesia, Papua New Guinea, Vanuatu, Solomon Islands</td>
      </tr>
      <tr>
          <td>SA</td>
          <td>South America</td>
          <td>0.2.0</td>
          <td>Complete continent including Falkland Islands</td>
      </tr>
  </tbody>
</table>
<h2 id="managing-packages">Managing Packages</h2>
<p>Use the <code>xearthlayer packages</code> command to list, install, update, and remove regional packages. For example, to install the Europe region:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash">xearthlayer packages install EU</code></pre></div>

<p>See the <a href="/docs/cli-reference/">CLI Reference</a> for all package commands and options.</p>
]]></content:encoded></item><item><title>X-Plane 12 Configuration</title><link>https://xearthlayer.app/docs/x-plane-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/x-plane-configuration/</guid><description>How to configure X-Plane 12 for the best results</description><content:encoded><![CDATA[<p>Ensure your X-Plane configuration is setup correctly for XEarthLayer to operate optimally. For most users with an existing well tuned X-Plane system, XEarthLayer should not impact framerates significantly.</p>
<h2 id="scenery-ordering">Scenery Ordering</h2>
<p>Setting the scenery pack order in your <code>X-Plane 12/Custom Scenery/scenery-packs.ini</code> file is essential to ensure all of your scenery loads with the correct priority relative all others.</p>
<h3 id="scenery-pack-loading-order">Scenery Pack Loading Order</h3>
<p><img src="/images/docs/scenery-layers.svg" alt="Scenery pack loading order"></p>
<p>XEarthLayer uses a best effort attempt by using a specific naming convention to ensure scenery is ordered correctly in X-Plane&rsquo;s scenery pack file. XEarthLayer scenery files are all prefixed <code>zzXEL_&lt;ortho&gt;</code> or <code>yzXEL_&lt;overlay&gt;</code>.</p>
<p>When X-Plane launches for the first time after any change to the Custom Scenery folder, it rebuilds the scenery-packs.ini file based on the scenery packs available. It is likely that this process will result in incorrect ordering of the scenery packs installed.</p>
<p>Ensure you exit from X-Plane before starting a flight, then use the reference below to order your scenery correctly in the scenery pack file.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#a6e22e">I</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">1000 Version</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/{Airports, landmarks, other object based scenery}</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/{Airport Overlays}</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/{Airport Mesh}</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/{Sim Heaven X-World, other layers (SFP Global etc)}</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/X-Plane Airports</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK *GLOBAL_AIRPORTS*</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/X-Plane Landmarks</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># XEarthLayer Start</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/yzXEL_overlay/</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/zzXEL_ortho/</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># XEarthLayer End</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SCENERY_PACK Custom Scenery/{Libraries}</span>
</span></span></code></pre></div><h2 id="x-plane-graphics-settings">X-Plane Graphics Settings</h2>
<p>X-Plane 12 offers extensive graphics customization, but pushing every slider to maximum will overwhelm even high-end systems. Finding the right balance ensures smooth framerates while still enjoying XEarthLayer&rsquo;s satellite imagery.</p>
<h3 id="settings-that-matter-most">Settings That Matter Most</h3>
<p><strong>Texture Resolution</strong> — This directly correlates with your GPU&rsquo;s VRAM capacity. If you exceed your available VRAM, X-Plane will constantly swap textures in and out of memory, causing stutters. As a general guide:</p>
<ul>
<li>8GB VRAM: Medium to High</li>
<li>12GB+ VRAM: High to Maximum</li>
</ul>
<p><strong>Antialiasing</strong> — X-Plane offers FSAA and MSAA options. MSAA above 2× will noticeably impact performance even on high-end graphics cards. For most systems, 2× MSAA provides a good balance between image quality and framerate.</p>
<p><strong>FSR (FidelityFX Super Resolution)</strong> — AMD&rsquo;s upscaling technology renders at a lower resolution then upscales the image. This can dramatically improve performance with a modest reduction in image sharpness. If you&rsquo;re struggling with framerates, try FSR in Quality or Balanced mode before reducing other settings.</p>
<p><strong>World Objects</strong> — Controls the density of autogen buildings, vegetation, and other scenery objects. This setting primarily affects CPU performance. Reducing it can help if you experience stutters in densely populated areas.</p>
<p><strong>Rendering Distance</strong> — Determines how far X-Plane renders detailed scenery. Higher values increase the visible scenery range but require the system to process more data. XEarthLayer streams tiles based on your position, so moderate draw distances (Medium to High) work well without overwhelming the tile generation pipeline.</p>
<h3 id="general-advice">General Advice</h3>
<p>Start with X-Plane&rsquo;s default settings for your hardware tier, then adjust individual options based on what you observe. Monitor your framerate in different scenarios—cold and dark at a busy airport, cruise over varied terrain, approach into a detailed city—and tune settings accordingly.</p>
<div class="callout callout--info">
  <svg class="callout__icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
    <circle cx="12" cy="12" r="10"></circle>
    <path d="M12 16v-4"></path>
    <path d="M12 8h.01"></path>
  </svg>
  <div class="callout__content">
    <p>When traversing large distances, X-Plane will begin swapping out and in large areas of scenery. This operation will reduce the framerate of the sim while it happens. Using lower texture resolution and fewer world objects reduces the amount of video memory that needs to be managed in and out when these loading events occur, reducing the impact to your flight experience.</p>
  </div>
</div>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    XEarthLayer automatically reads aircraft telemetry from X-Plane 12.1.1+ via the Web API. No configuration is required — prefetching works out of the box.
  </div>
</div>

<h2 id="recommended-add-ons">Recommended Add-ons</h2>
<p>XEarthLayer provides satellite imagery, but pairing it with quality scenery add-ons enhances the overall visual experience. These add-ons complement XEarthLayer well:</p>
<h3 id="simheaven-x-world-recommended">SimHeaven X-World (Recommended)</h3>
<p><a href="https://simheaven.com/x-world-for-xp12/">SimHeaven X-World</a> is a comprehensive free scenery enhancement that uses OpenStreetMap data combined with Microsoft building footprints to place objects realistically across the globe. Unlike automated autogen, objects are positioned based on real-world data, resulting in a more authentic look and feel.</p>
<p><strong>X-World includes:</strong></p>
<ul>
<li>Accurately placed buildings based on real-world footprints</li>
<li>Road networks and infrastructure</li>
<li>Vegetation and forest coverage</li>
<li>Continental packages for Europe, North America, South America, Asia, Africa, Australia, and Antarctica</li>
</ul>
<p>If you&rsquo;re only going to install one scenery add-on alongside XEarthLayer, we recommend X-World for its comprehensive coverage and seamless integration with satellite imagery.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    X-World includes its own road network overlays. To avoid duplicate roads and potential performance issues, disable either XEarthLayer&rsquo;s overlay packages or X-World&rsquo;s road layer—do not use both simultaneously.
  </div>
</div>

<h3 id="georeality-global-forests-v2">GeoReality Global Forests V2</h3>
<p><a href="https://orbxdirect.com/product/georeality-forests-xp12">Global Forests V2</a> from Orbx provides scientifically accurate forest coverage worldwide. Real-world forest data has been analyzed to recreate authentic ecosystems with correct tree types, density, and height variations.</p>
<p><strong>Global Forests includes:</strong></p>
<ul>
<li>Over 400 unique forest files based on real-world analysis</li>
<li>Accurate tree species placement by region</li>
<li>Coverage for Europe, North America, South America, Asia, Oceania, and Africa</li>
<li>Seamless integration with ortho scenery</li>
</ul>
<p>This is a paid add-on available through Orbx Central.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    If using both X-World and Global Forests V2, disable X-World&rsquo;s forest layer to avoid conflicts. Running both forest systems simultaneously may impact performance.
  </div>
</div>

<h3 id="x-codr-airport-enhancement-package-aep">X-Codr Airport Enhancement Package (AEP)</h3>
<p><a href="https://www.x-codrdesigns.com/xp-aepa">Airport Enhancement Package</a> from X-Codr Designs dramatically improves the visual quality of default airports worldwide. Rather than adding new airports, AEP replaces existing textures and objects with high-quality alternatives featuring PBR materials and regional variations.</p>
<p><strong>AEP includes:</strong></p>
<ul>
<li>High-quality replacement models for airport buildings, hangars, and facades</li>
<li>Ultra high-resolution pavement and marking textures</li>
<li>New 3D vegetation matched to X-Plane 12&rsquo;s forest system</li>
<li>Detailed static ground vehicles, runway lights, beacons, and navaids</li>
<li>Weather-reactive ground textures using X-Plane 12&rsquo;s weather effects</li>
<li>Regional variations giving airports a unique local character</li>
</ul>
<p>AEP is compatible with other airport enhancement libraries and works seamlessly with ortho scenery. This is a paid add-on available from <a href="https://store.x-plane.org/Airport-Enhancement-Package_p_1250.html">X-Plane.org</a>.</p>
<h3 id="short-final-design-sfd-global">Short Final Design SFD Global</h3>
<p><a href="https://store.x-plane.org/SFD-Global_p_1060.html">SFD Global</a> from Short Final Design enhances autogen buildings and landmarks across the globe with regionally appropriate variations. The package uses PBR materials and baked ambient occlusion for realistic rendering.</p>
<p><strong>SFD Global includes:</strong></p>
<ul>
<li>Eight distinct regional autogen styles: Africa &amp; Middle East, Australia, East Asia, Mediterranean, New England, Scandinavia, South America, and US West Coast</li>
<li>Unique 3D buildings with PBR materials for each region</li>
<li>Detailed world-famous landmarks</li>
<li>4K photorealistic terrain and forest textures</li>
<li>Seamless compatibility with ortho scenery overlays</li>
</ul>
<p>This is a paid add-on available from <a href="https://store.x-plane.org/SFD-Global_p_1060.html">X-Plane.org</a>.</p>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    When using SFD Global with XEarthLayer, we recommend installing only the Autogen and Landmarks components. The terrain textures and forests are unnecessary when using satellite imagery in combination with X-World or Global Forests.
  </div>
</div>

]]></content:encoded></item><item><title>Custom Ortho Tiles</title><link>https://xearthlayer.app/docs/custom-ortho-tiles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/custom-ortho-tiles/</guid><description>Use your own pre-built ortho tiles alongside XEarthLayer's streamed scenery.</description><content:encoded><![CDATA[<p>If you already have pre-generated Ortho4XP tiles for your favourite airports or regions, you do not have to give them up. XEarthLayer&rsquo;s <strong>patches</strong> system lets you drop those tiles into a directory so they are served directly to X-Plane instead of streaming imagery for those areas.</p>
<p>This is ideal when you want to keep specific zoom levels, custom imagery sources, or hand-tuned scenery for regions you fly most often, while still getting XEarthLayer&rsquo;s streamed coverage everywhere else.</p>
<h2 id="how-patches-work">How Patches Work</h2>
<p>A patch is a folder containing standard Ortho4XP output — DSF meshes, terrain definitions, and DDS textures — placed inside the XEarthLayer patches directory. When XEarthLayer starts, it scans the patches directory for valid tile data and registers which 1 degree by 1 degree regions are covered. Any request from X-Plane that falls within a patched region is served directly from your local files rather than being streamed.</p>
<p>Patched regions completely replace package files for those 1 degree by 1 degree areas. There is no blending or mixing — your custom tiles take full priority.</p>
<h2 id="directory-structure">Directory Structure</h2>
<p>Place your Ortho4XP output folders inside the patches directory:</p>
<div class="highlight" data-lang="text" data-copy="true"><pre><code class="language-text" data-lang="text">~/.xearthlayer/patches/
├── A_MyRegion/
│   ├── Earth nav data/
│   │   └── &#43;40-080/
│   │       └── &#43;41-074.dsf
│   ├── terrain/
│   │   └── *.ter
│   └── textures/
│       └── *.dds
└── B_AnotherRegion/
    └── ...</code></pre></div>

<p>Each subfolder inside <code>patches/</code> is one patch. The required contents are:</p>
<table>
  <thead>
      <tr>
          <th>Directory</th>
          <th>Contents</th>
          <th>Required</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Earth nav data/</code></td>
          <td>At least one <code>.dsf</code> file in the standard <code>+NN-NNN/</code> subfolder layout</td>
          <td>Yes — this is how XEarthLayer detects which regions the patch covers</td>
      </tr>
      <tr>
          <td><code>terrain/</code></td>
          <td><code>.ter</code> terrain definition files</td>
          <td>Yes</td>
      </tr>
      <tr>
          <td><code>textures/</code></td>
          <td><code>.dds</code> texture files</td>
          <td>Yes</td>
      </tr>
  </tbody>
</table>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    Alphabetical naming controls priority when patches overlap. A folder named <code>A_HighRes</code> takes precedence over <code>B_LowRes</code> for the same region. Use letter prefixes to set the order you prefer.
  </div>
</div>

<h2 id="configuration">Configuration</h2>
<p>Patches are enabled by default. The relevant settings live in the <code>[patches]</code> section of <code>~/.xearthlayer/config.ini</code>:</p>
<div class="highlight" data-lang="ini" data-copy="true"><pre><code class="language-ini" data-lang="ini">[patches]
enabled = true
directory = ~/.xearthlayer/patches</code></pre></div>

<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>enabled</code></td>
          <td><code>true</code></td>
          <td>Enable or disable the patches system</td>
      </tr>
      <tr>
          <td><code>directory</code></td>
          <td><code>~/.xearthlayer/patches</code></td>
          <td>Path to the directory containing your patch folders</td>
      </tr>
  </tbody>
</table>
<p>You can also manage patches from the command line. See the <a href="/docs/cli-reference/">CLI Reference</a> for available <code>xearthlayer patches</code> commands.</p>
<h2 id="prefetch-integration">Prefetch Integration</h2>
<p>XEarthLayer automatically detects which 1 degree by 1 degree regions are covered by your patches and excludes them from streaming and prefetching. This means:</p>
<ul>
<li>No bandwidth is spent downloading tiles you already have locally</li>
<li>Prefetch cycles skip patched regions entirely</li>
<li>No configuration is needed — detection is automatic based on the DSF files in your patches</li>
</ul>
<div class="callout callout--tip">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg></div>
  <div class="callout__content">
    If you have ortho tiles for a large area like the US east coast, patching those regions can significantly reduce your network usage since XEarthLayer will not attempt to stream or prefetch any tiles that your patches already cover.
  </div>
</div>

<h2 id="verification">Verification</h2>
<p>Use the CLI to confirm your patches are correctly set up:</p>
<div class="highlight" data-lang="bash" data-copy="true"><pre><code class="language-bash" data-lang="bash"># List all patches and their validation status
xearthlayer patches list

# Validate directory structure and file integrity
xearthlayer patches validate</code></pre></div>

<p>The <code>list</code> command shows each patch folder, the 1 degree by 1 degree regions it covers, and whether the required files are present. The <code>validate</code> command performs a deeper check on directory structure and file integrity.</p>
<p><strong>In flight</strong>, patched areas are easy to spot — your custom tiles appear immediately with no download delay, while streamed areas may take a moment to load on a cold cache.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    If a patch folder is missing its <code>Earth nav data/</code> directory or contains no <code>.dsf</code> files, XEarthLayer will skip it and log a warning. Run <code>xearthlayer patches validate</code> to diagnose any issues.
  </div>
</div>

]]></content:encoded></item><item><title>Frequently Asked Questions</title><link>https://xearthlayer.app/docs/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/faq/</guid><description>Find answers to common questions about XEarthLayer.</description><content:encoded><![CDATA[<h2 id="general">General</h2>
<h3 id="what-is-xearthlayer">What is XEarthLayer?</h3>
<p>XEarthLayer is a just-in-time satellite imagery streaming system for X-Plane 12. Instead of downloading hundreds of gigabytes of ortho scenery upfront, XEarthLayer streams satellite imagery on-demand as you fly.</p>
<h3 id="which-operating-systems-are-supported">Which operating systems are supported?</h3>
<p>Currently, XEarthLayer supports Linux only. macOS support may be added in the future if there is enough community interest.</p>
<p>Please add a feature request/up vote on Github if you would like to see XEarthLayer on macOS.</p>
<p>Windows is well supported by alternative products and likely will never be supported.</p>
<h3 id="is-xearthlayer-free">Is XEarthLayer free?</h3>
<p>Yes, XEarthLayer is free and open source software released under the MIT license.</p>
<h3 id="how-is-xearthlayer-different-from-other-software-like-autoortho-for-example">How is XEarthLayer different from other software, like AutoOrtho for example?</h3>
<p>XEarthLayer, AutoOrtho, X-Plane Map Enhancement and similar tools all achieve the same objective: streaming satellite orthographic photo scenery into the X-Plane simulator. They all work in largely the same way.</p>
<p>XEarthLayer was designed to be as lightweight and fast as possible, using minimal memory and CPU time to deliver scenery to X-Plane efficiently.</p>
<p>For this reason, <a href="https://rust-lang.org/">Rust</a> was chosen as the implementation language, given its core principles of Performance, Reliability and Productivity. AutoOrtho was implemented in Python, which is popular but not ideally suited for high-throughput runtime environments.</p>
<p>The author of XEarthLayer had been using both AutoOrtho and X-Plane Map Enhancement on a Windows setup previously. When the simulator was migrated to Linux in 2025, the original AutoOrtho was unable to maintain a stable simulator session. XEarthLayer was created in response to not being able to use the alternatives.</p>
<p>Ultimately, all of these systems provide the same in-simulator experience, so which one you use is completely up to you.</p>
<table>
  <thead>
      <tr>
          <th>Photo Scenery System</th>
          <th>Open Source</th>
          <th>X-Plane Interface</th>
          <th>Programming Language</th>
          <th>OS</th>
          <th>Maintained</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>XEarthLayer</td>
          <td>Yes</td>
          <td>Fuse / Web API</td>
          <td>Rust</td>
          <td>Linux</td>
          <td>Yes</td>
      </tr>
      <tr>
          <td>AutoOrtho</td>
          <td>Yes</td>
          <td>Fuse</td>
          <td>Python</td>
          <td>Windows, macOS, Linux</td>
          <td>No</td>
      </tr>
      <tr>
          <td>AutoOrtho Continued</td>
          <td>Yes</td>
          <td>Fuse</td>
          <td>Python</td>
          <td>Windows, macOS, Linux</td>
          <td>Yes</td>
      </tr>
      <tr>
          <td>X-Plane Map Enhancement</td>
          <td>No</td>
          <td>Fuse</td>
          <td>Unknown</td>
          <td>Windows, macOS</td>
          <td>Yes</td>
      </tr>
  </tbody>
</table>
<p><em>As of March 2026</em></p>
<h3 id="can-xearthlayer-be-used-with-microsoft-flight-simulator">Can XEarthLayer be used with Microsoft Flight Simulator?</h3>
<p>No.</p>
<hr>
<h2 id="installation">Installation</h2>
<h3 id="why-wont-xearthlayer-run">Why won&rsquo;t XEarthLayer run?</h3>
<p>XEarthLayer should provide messages to the command line if there is an issue executing any part of the program. If you are not seeing any output, check your system journal for issues that would prevent XEarthLayer from starting.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Check kernel log for OOM kills or process terminations</span>
</span></span><span style="display:flex;"><span>journalctl -k --since <span style="color:#e6db74">&#34;1 hour ago&#34;</span> | grep -iE <span style="color:#e6db74">&#34;oom|killed process|out of memory&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Check for xearthlayer specific entries</span>
</span></span><span style="display:flex;"><span>journalctl --since <span style="color:#e6db74">&#34;1 hour ago&#34;</span> | grep -i xearthlayer
</span></span></code></pre></div><p>These are some factors that could prevent XEarthLayer from launching:</p>
<ul>
<li>Incorrect system architecture for the binary</li>
<li>System killing the process due to out of memory (OOM)</li>
<li>Failure to initialize <code>fuse</code> mounts</li>
</ul>
<p>Check XEarthLayer&rsquo;s own logs for messages that may not be printed to <code>stdout</code> or <code>stderr</code>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tail -f ~/.xearthlayer/xearthlayer.log
</span></span></code></pre></div><h3 id="how-do-i-update-to-the-latest-version">How do I update to the latest version?</h3>
<p>Download the latest package for your distribution from the <a href="https://github.com/samsoir/xearthlayer/releases">GitHub releases</a> and install it over your existing installation.</p>
<hr>
<h2 id="usage">Usage</h2>
<h3 id="how-much-bandwidth-does-xearthlayer-use">How much bandwidth does XEarthLayer use?</h3>
<p>Bandwidth usage depends on many factors: the detail level of the scenery you&rsquo;re flying over, how much scenery is already cached locally, and your cache size.</p>
<p>Starting from a cold cache, expect to download about 6-10GB of data to initialize the simulator. During flight, you can expect to use 3-5GB per degree of traversal, depending on scenery type.</p>
<p>If you have an internet connection with data limits or caps, increase your disk cache size as much as possible to minimize repeated downloads. However, for metered connections, XEarthLayer&rsquo;s value diminishes significantly—you may want to consider storing Ortho tiles locally instead.</p>
<h3 id="can-i-use-xearthlayer-offline">Can I use XEarthLayer offline?</h3>
<p>XEarthLayer requires an internet connection to stream imagery. However, previously downloaded tiles are cached locally, so areas you&rsquo;ve flown before will load from cache even without connectivity.</p>
<hr>
<h2 id="troubleshooting">Troubleshooting</h2>
<h3 id="x-plane-does-not-load-xearthlayer-scenery-into-the-simulator">X-Plane does not load XEarthLayer scenery into the simulator</h3>
<p>This is usually because XEarthLayer&rsquo;s FUSE mounts are not listed in X-Plane&rsquo;s <code>Custom Scenery/scenery_packs.ini</code> file.</p>
<p><strong>Checklist:</strong></p>
<ol>
<li>Ensure XEarthLayer is fully started and running <em>before</em> launching X-Plane. X-Plane indexes scenery at startup, so starting XEarthLayer afterward means its scenery won&rsquo;t be detected.</li>
<li>Verify that <code>zz_XEL_*_Ortho</code> and <code>zy_XEL_*_Overlay</code> packs are listed in your <code>scenery_packs.ini</code> file. They typically appear at the bottom but can be anywhere in the file.</li>
</ol>
<p>If the above doesn&rsquo;t resolve the issue, ask for help on <a href="https://discord.gg/RPEWQZdxm2">Discord</a>, the X-Plane.org forums, or <a href="https://github.com/samsoir/xearthlayer/issues">create a GitHub issue</a>.</p>
<h3 id="tiles-are-downloading-but-not-appearing-in-x-plane">Tiles are downloading but not appearing in X-Plane</h3>
<p>This can happen for several valid reasons:</p>
<ol>
<li>You are flying in a region outside of XEarthLayer scenery coverage, but within the X-Plane or XEarthLayer loading range. X-Plane loads a large area around the aircraft to ensure scenery tiles are available before you can see them. XEarthLayer loads an even bigger radius to stay ahead of X-Plane.</li>
<li>You have a scenery package installed that provides its own mesh. Some third-party scenery providers include custom mesh that overrides XEarthLayer scenery for that specific area.</li>
</ol>
<h3 id="help-i-am-seeing-magenta-tiles-on-the-scenery-when-i-fly">Help! I am seeing magenta tiles on the scenery when I fly.</h3>
<p>Magenta tiles are returned when XEarthLayer is unable to construct a tile within the configured timeout period.</p>
<p>This can be caused by several factors:</p>
<ul>
<li>Slow or throttled downloads from the mapping service</li>
<li>Operating system overhead reducing available CPU and memory</li>
<li>Configuration that is too aggressive for your system&rsquo;s capabilities</li>
<li>Network or disk I/O bottlenecks</li>
</ul>
<p>The XEarthLayer log outputs information about failed tile construction jobs and chunk downloads, so review it before posting in community channels.</p>
<p>If the situation persists, it is likely caused by configuration that exceeds your system&rsquo;s capabilities. XEarthLayer deadlocks are rare but can occur if network or disk I/O is exhausted.</p>
<p>Try reducing the following settings by 50% and testing again. If things stabilize, you can slowly increase them one by one:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[cache]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">disk_io_profile</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">auto</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[texture]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">format</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">bc1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[download]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">timeout</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">30</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">retries</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">3</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[executor]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">network_concurrent</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">64       # Default 128, reduce by 50%</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">cpu_concurrent</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">4            # Default is ~num_cpus * 1.25, try half</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">disk_io_concurrent</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">32       # Default 64, reduce by 50%</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">request_timeout_secs</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">10</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">max_retries</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">3</span>
</span></span></code></pre></div><h3 id="help-i-am-seeing-white-tiles-on-the-scenery-when-i-fly">Help! I am seeing white tiles on the scenery when I fly.</h3>
<p><img src="/images/bugs/white-tiles.jpg" alt="White tiles on landscape"></p>
<p>This is usually caused by a FUSE mount issue, most commonly the result of the operating system killing the FUSE process due to out of memory (OOM) conditions.</p>
<p>If the operating system did kill the process, it will have added a journal entry of this event.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Check for OOM killer activity</span>
</span></span><span style="display:flex;"><span>journalctl -k --since <span style="color:#e6db74">&#34;1 hour ago&#34;</span> | grep -iE <span style="color:#e6db74">&#34;oom|killed process|out of memory&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Check for fuse-related errors</span>
</span></span><span style="display:flex;"><span>journalctl --since <span style="color:#e6db74">&#34;1 hour ago&#34;</span> | grep -iE <span style="color:#e6db74">&#34;fuse|xearthlayer&#34;</span>
</span></span></code></pre></div><p>If your system memory is less than 4GB, consider increasing swap space or upgrading RAM. See the <a href="#performance">Performance</a> section for cache tuning recommendations.</p>
<h3 id="gpu-encoding-is-not-working-or-the-wrong-gpu-is-selected">GPU encoding is not working or the wrong GPU is selected</h3>
<p>If you have configured <code>texture.compressor = gpu</code> and are experiencing issues, here are some common causes and solutions.</p>
<p><strong>GPU not detected:</strong> Run <code>xearthlayer diagnostics</code> to list available GPU adapters on your system. If no GPUs are listed, ensure your GPU drivers are installed correctly and that Vulkan support is available. See the <a href="/docs/cli-reference/">CLI Reference</a> for more on the <code>diagnostics</code> command.</p>
<p><strong>Wrong GPU selected (integrated vs discrete):</strong> On systems with both an integrated GPU (iGPU) and a discrete GPU (dGPU), XEarthLayer may select the wrong adapter. Configure the <code>texture.gpu_device</code> setting to target the correct GPU:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[texture]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">compressor</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">gpu</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">gpu_device</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">integrated  ; Use iGPU for encoding while dGPU runs X-Plane</span>
</span></span></code></pre></div><p>Valid values are <code>integrated</code>, <code>discrete</code>, or an adapter name substring (e.g., <code>Radeon</code>, <code>RTX 5090</code>). Run <code>xearthlayer diagnostics</code> to see available adapters.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    When using the same GPU for both X-Plane rendering and XEarthLayer texture encoding, GPU memory pressure can cause instability or performance degradation. For best results, use the integrated GPU for encoding and leave the discrete GPU dedicated to X-Plane.
  </div>
</div>

<p><strong>Fallback options:</strong> If GPU encoding is not available or causes issues, you can always fall back to CPU-based compression. Set <code>texture.compressor = ispc</code> for SIMD-accelerated encoding, or <code>texture.compressor = software</code> for a portable fallback that works on any system.</p>
<h3 id="i-found-a-bug-how-do-i-report-it">I found a bug! How do I report it?</h3>
<p>First, check the <a href="https://github.com/samsoir/xearthlayer/issues">XEarthLayer GitHub issues</a> to see if the bug has already been reported. If so, add your details to the existing issue. If it&rsquo;s a new issue, follow the issue template to create a new report.</p>
<div class="callout callout--info">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></div>
  <div class="callout__content">
    Issues submitted without the required logs and system diagnostics will be closed automatically.
  </div>
</div>

<h3 id="where-can-i-get-help">Where can I get help?</h3>
<p>The XEarthLayer community is active and happy to help with questions, troubleshooting, and general discussion:</p>
<ul>
<li><strong>Discord</strong> — Join the <a href="https://discord.gg/RPEWQZdxm2">XEarthLayer Discord server</a> for real-time chat with other users and the developer</li>
<li><strong>GitHub Discussions</strong> — Post questions and share ideas on <a href="https://github.com/samsoir/xearthlayer/discussions">GitHub Discussions</a></li>
<li><strong>GitHub Issues</strong> — Report bugs or request features via <a href="https://github.com/samsoir/xearthlayer/issues">GitHub Issues</a></li>
</ul>
<hr>
<h2 id="performance">Performance</h2>
<h3 id="how-can-i-improve-performance">How can I improve performance?</h3>
<p>Performance optimization is a broad topic that extends well beyond XEarthLayer itself. If you&rsquo;re experiencing performance issues in X-Plane, they are most likely related to X-Plane&rsquo;s rendering settings rather than XEarthLayer.</p>
<h4 id="x-plane-settings-to-review">X-Plane settings to review</h4>
<ul>
<li><strong>Visual effects</strong> - Reduce reflection and shadow quality</li>
<li><strong>Draw distance</strong> - Lower the number of objects rendered at distance</li>
<li><strong>Anti-aliasing</strong> - Reduce MSAA or switch to FXAA</li>
<li><strong>Texture quality</strong> - Ensure this matches your VRAM capacity</li>
</ul>
<h4 id="xearthlayer-specific-tips">XEarthLayer-specific tips:</h4>
<ul>
<li>Ensure adequate disk cache to minimize network downloads during flight</li>
<li>Use <code>bc1</code> texture format instead of <code>bc3</code> if you don&rsquo;t need alpha transparency (smaller files, faster encoding)</li>
<li>Monitor the XEarthLayer log for timeout warnings that may indicate bottlenecks</li>
<li>If running on limited hardware, reduce <code>executor.network_concurrent</code> and <code>executor.cpu_concurrent</code> settings</li>
</ul>
<p>For detailed configuration guidance, see the <a href="/docs/configuration/">Configuration</a> page.</p>
<h3 id="what-are-the-recommended-cache-settings">What are the recommended cache settings?</h3>
<p><strong>Disk cache:</strong> Use as much space as you can reasonably allocate. Larger disk caches reduce network traffic and improve load times for previously visited areas. The default is 20GB; a minimum of 50GB is recommended, with 100GB+ being ideal for frequent flyers. For best results, place the cache on a fast NVMe or SSD that is not the primary system volume.</p>
<p><strong>Memory cache:</strong> The default is 2GB. A value of 4-8GB works well for most systems. Adjust based on your available system memory, keeping in mind that X-Plane itself requires around 15GB during initial scene loading.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[cache]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">memory_size</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">8GB</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">disk_size</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">50GB</span>
</span></span></code></pre></div><p><strong>Low memory systems:</strong> If system memory is limited (less than 32GB total), consider creating swap space to provide additional virtual memory for both XEarthLayer and X-Plane. This is particularly important if your GPU has less than 8GB of VRAM, as the system may need to accommodate texture overflow.</p>
<div class="callout callout--warning">
  <div class="callout__icon"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg></div>
  <div class="callout__content">
    Heavy swap usage on SSDs or NVMe drives can significantly reduce drive lifespan due to the high volume of write operations. If possible, place swap on a separate, less critical drive or consider upgrading system RAM instead.
  </div>
</div>

]]></content:encoded></item><item><title>About</title><link>https://xearthlayer.app/docs/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xearthlayer.app/docs/about/</guid><description>The story behind XEarthLayer and the people who made it possible.</description><content:encoded><![CDATA[<h2 id="the-project">The Project</h2>
<p>XEarthLayer was created to solve a fundamental problem in flight simulation: the trade-off between visual fidelity and storage requirements. Traditional ortho photo scenery requires downloading terabytes of satellite imagery before you can fly, and you end up storing data for places you may never visit.</p>
<p>XEarthLayer takes a different approach—streaming satellite imagery on-demand, exactly when and where you need it.</p>
<h2 id="the-author">The Author</h2>
<p>XEarthLayer was created by Sam de Freyssinet in 2025. Sam has been a flight simulator enthusiast for much of his life, ever since his first encounter with Microsoft Flight Simulator 2.0.</p>
<p>After an extended hiatus from flight simulation between 2000 and 2013, Sam returned to his passion. After a couple of years in the Prepar3D ecosystem, he migrated to X-Plane at the tail end of version 10.</p>
<p>Since rediscovering his passion for flying virtually, Sam started flight training for his real private pilot&rsquo;s license in 2016.</p>
<p>When not piloting virtual or real aircraft, Sam works as a Software Engineering Director at a well-known tech company in the San Francisco Bay Area. He likes to snowboard with his children, cycle, and travel.</p>
<h2 id="motivation">Motivation</h2>
<p>In the summer of 2025, after many years of running his flight simulator on Microsoft Windows, Sam decided to migrate to Linux. Many factors drove this decision, but the catalyst was Windows 11 corrupting his main system NVMe drive after a routine update.</p>
<p>After successfully rebuilding his flight simulator on Linux and installing X-Plane 12, Sam was disappointed to find that the tools he had previously used for streaming orthophoto scenery into X-Plane were not available on the platform. One only supported Windows, while the other, AutoOrtho, was no longer maintained.</p>
<p>Given the situation, Sam decided to try and fix <a href="https://kubilus1.github.io/autoortho/latest/">AutoOrtho</a> on his own system but did not make much progress. Taking a step back, he asked the fateful question: <em>how hard would it be to port AutoOrtho to Rust?</em> As it turns out, quite hard—but not impossible.</p>
<p>XEarthLayer shares no code with AutoOrtho, and there have been many <a href="https://github.com/samsoir/xearthlayer/tree/main/docs/dev">design decisions</a> that resulted in significant changes to how scenery tiles are managed internally. With that said, it would be a disservice not to credit AutoOrtho as the inspiration for this project.</p>
<p>After starting work on XEarthLayer, Sam discovered that AutoOrtho had been forked by the community into <a href="https://programmingdinosaur.github.io/autoortho4xplane/">AutoOrtho Continued</a>. Definitely check that out if XEarthLayer is not for you.</p>
<p>Five months later, XEarthLayer was ready for its first public release.</p>
<h2 id="acknowledgments">Acknowledgments</h2>
<p>XEarthLayer wouldn&rsquo;t be possible without the contributions and support of many people.</p>
<h3 id="special-thanks">Special Thanks</h3>
<ul>
<li><a href="https://github.com/kubilus1/autoortho">kubilus1</a> for creating AutoOrtho, the original inspiration for this project</li>
<li><a href="https://forums.x-plane.org/profile/1171657-xjs36uk/">xjs36uk</a> for their testing and feedback on low specification systems that significantly improved the performance of XEarthLayer on memory constrained systems</li>
</ul>
<h3 id="technologies">Technologies</h3>
<p>XEarthLayer is built with:</p>
<ul>
<li><a href="https://www.rust-lang.org/">Rust</a> — Systems programming language</li>
<li><a href="https://claude.com/product/claude-code">Claude Code</a> — AI assisted pair programming and documentation</li>
<li><a href="https://github.com">GitHub</a> — Source code repository, CI/CD and hosting services</li>
<li><a href="https://github.com/shred86/Ortho4XP">Ortho4XP, Shred86</a> fork used to create regional scenery packages</li>
</ul>
<h3 id="imagery-providers">Imagery Providers</h3>
<p>Satellite imagery is sourced from various providers including:</p>
<ul>
<li>Apple Maps</li>
<li>ArcGIS</li>
<li>Bing Maps</li>
<li>Google Maps</li>
<li>MapBox</li>
<li>USGS</li>
</ul>
<h2 id="contact">Contact</h2>
<ul>
<li><strong>GitHub</strong>: <a href="https://github.com/samsoir/xearthlayer">samsoir/xearthlayer</a></li>
<li><strong>Discord</strong>: <a href="https://discord.gg/RPEWQZdxm2">Join the community</a></li>
</ul>
<h2 id="license">License</h2>
<p>XEarthLayer is released under the <a href="https://opensource.org/licenses/MIT">MIT License</a>.</p>
]]></content:encoded></item></channel></rss>