<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Wawona</title>
    <subtitle>A high-performance native Wayland compositor for macOS, iOS, and Android</subtitle>
    <icon>/images/logo/Wawona-iOS-Default-1024x1024@1x.png</icon>
    <logo>/images/logo/Wawona-iOS-Default-1024x1024@1x.png</logo>
    <link rel="self" type="application/atom+xml" href="/atom.xml"/>
    <link rel="alternate" type="text/html" href="/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-25T00:00:00+00:00</updated>
    <id>/atom.xml</id>
    <entry xml:lang="en">
        <title>Native Compositing</title>
        <published>2026-02-25T00:00:00+00:00</published>
        <updated>2026-02-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/gallery/native-compositing/"/>
        <id>/gallery/native-compositing/</id>
        
        <content type="html" xml:base="/gallery/native-compositing/">&lt;p&gt;This screenshot demonstrates Wawona&#x27;s ability to render Wayland clients directly into the macOS windowing system with full transparency and hardware acceleration.&lt;&#x2F;p&gt;
&lt;div class=&quot;screenshot-wrapper&quot; style=&quot;margin-top: 2rem;&quot;&gt;
    &lt;figure style=&quot;margin: 0; animation: fadeIn 1s ease-out;&quot;&gt;
        &lt;div class=&quot;screenshot-container&quot; onmouseover=&quot;this.style.transform=&#x27;scale(1.02)&#x27;&quot;
            onmouseout=&quot;this.style.transform=&#x27;scale(1)&#x27;&quot;&gt;
            &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;wawona-screenshots&amp;#x2F;wawona-screenshot-1.png&quot; alt=&quot;Wawona Screenshot&quot;
                style=&quot;width: 100%; height: auto; display: block;&quot;&gt;
        &lt;&#x2F;div&gt;
        
        &lt;figcaption
            style=&quot;margin-top: 1.5rem; text-align: center; color: var(--text-2); font-family: var(--header-font); font-size: 1rem; letter-spacing: 0.02em;&quot;&gt;
            Wawona rendering Wayland clients directly into the macOS windowing system.
        &lt;&#x2F;figcaption&gt;
        
    &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;

&lt;style&gt;
    .screenshot-container {
        border-radius: 12px;
        overflow: hidden;
        position: relative;
        transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        box-shadow: var(--premium-shadow);
        border: 1px solid var(--border-color);
        background-color: var(--bg-1);
    }

    :root.dark {
        --premium-shadow: 0 30px 60px rgba(0, 0, 0, 0.6);
    }

    :root.light {
        --premium-shadow: 0 20px 40px rgba(0, 0, 0, 0.12);
    }

    @keyframes fadeIn {
        from {
            opacity: 0;
            transform: translateY(20px);
        }

        to {
            opacity: 1;
            transform: translateY(0);
        }
    }
&lt;&#x2F;style&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Seamless Integration</title>
        <published>2026-02-24T00:00:00+00:00</published>
        <updated>2026-02-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/gallery/wayland-seamless/"/>
        <id>/gallery/wayland-seamless/</id>
        
        <content type="html" xml:base="/gallery/wayland-seamless/">&lt;p&gt;Wawona manages each Wayland window as a first-class macOS window, including title bar management and native resize behavior.&lt;&#x2F;p&gt;
&lt;div class=&quot;screenshot-wrapper&quot; style=&quot;margin-top: 2rem;&quot;&gt;
    &lt;figure style=&quot;margin: 0; animation: fadeIn 1s ease-out;&quot;&gt;
        &lt;div class=&quot;screenshot-container&quot; onmouseover=&quot;this.style.transform=&#x27;scale(1.02)&#x27;&quot;
            onmouseout=&quot;this.style.transform=&#x27;scale(1)&#x27;&quot;&gt;
            &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;wawona-screenshots&amp;#x2F;wawona-screenshot-1.png&quot; alt=&quot;Wawona Screenshot&quot;
                style=&quot;width: 100%; height: auto; display: block;&quot;&gt;
        &lt;&#x2F;div&gt;
        
        &lt;figcaption
            style=&quot;margin-top: 1.5rem; text-align: center; color: var(--text-2); font-family: var(--header-font); font-size: 1rem; letter-spacing: 0.02em;&quot;&gt;
            Wayland windows integrated with the macOS desktop.
        &lt;&#x2F;figcaption&gt;
        
    &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;

&lt;style&gt;
    .screenshot-container {
        border-radius: 12px;
        overflow: hidden;
        position: relative;
        transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        box-shadow: var(--premium-shadow);
        border: 1px solid var(--border-color);
        background-color: var(--bg-1);
    }

    :root.dark {
        --premium-shadow: 0 30px 60px rgba(0, 0, 0, 0.6);
    }

    :root.light {
        --premium-shadow: 0 20px 40px rgba(0, 0, 0, 0.12);
    }

    @keyframes fadeIn {
        from {
            opacity: 0;
            transform: translateY(20px);
        }

        to {
            opacity: 1;
            transform: translateY(0);
        }
    }
&lt;&#x2F;style&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>High Resolution Rendering</title>
        <published>2026-02-23T00:00:00+00:00</published>
        <updated>2026-02-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/gallery/high-res-rendering/"/>
        <id>/gallery/high-res-rendering/</id>
        
        <content type="html" xml:base="/gallery/high-res-rendering/">&lt;p&gt;Wawona supports native scaling for high-density displays, ensuring your Wayland apps look as sharp as native macOS applications.&lt;&#x2F;p&gt;
&lt;div class=&quot;screenshot-wrapper&quot; style=&quot;margin-top: 2rem;&quot;&gt;
    &lt;figure style=&quot;margin: 0; animation: fadeIn 1s ease-out;&quot;&gt;
        &lt;div class=&quot;screenshot-container&quot; onmouseover=&quot;this.style.transform=&#x27;scale(1.02)&#x27;&quot;
            onmouseout=&quot;this.style.transform=&#x27;scale(1)&#x27;&quot;&gt;
            &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;wawona-screenshots&amp;#x2F;wawona-screenshot-1.png&quot; alt=&quot;Wawona Screenshot&quot;
                style=&quot;width: 100%; height: auto; display: block;&quot;&gt;
        &lt;&#x2F;div&gt;
        
        &lt;figcaption
            style=&quot;margin-top: 1.5rem; text-align: center; color: var(--text-2); font-family: var(--header-font); font-size: 1rem; letter-spacing: 0.02em;&quot;&gt;
            High-resolution rendering on a Retina display.
        &lt;&#x2F;figcaption&gt;
        
    &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;

&lt;style&gt;
    .screenshot-container {
        border-radius: 12px;
        overflow: hidden;
        position: relative;
        transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        box-shadow: var(--premium-shadow);
        border: 1px solid var(--border-color);
        background-color: var(--bg-1);
    }

    :root.dark {
        --premium-shadow: 0 30px 60px rgba(0, 0, 0, 0.6);
    }

    :root.light {
        --premium-shadow: 0 20px 40px rgba(0, 0, 0, 0.12);
    }

    @keyframes fadeIn {
        from {
            opacity: 0;
            transform: translateY(20px);
        }

        to {
            opacity: 1;
            transform: translateY(0);
        }
    }
&lt;&#x2F;style&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Android Architecture</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/android/"/>
        <id>/docs/android/</id>
        
        <content type="html" xml:base="/docs/android/">&lt;h1 id=&quot;android-architecture&quot;&gt;Android Architecture&lt;&#x2F;h1&gt;
&lt;p&gt;How Wawona runs on Android — Kotlin frontend, JNI bridge, Vulkan rendering, and SSH binary bundling.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;platform-frontend&quot;&gt;Platform Frontend&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;java&amp;#x2F;com&amp;#x2F;aspauldingcode&amp;#x2F;wawona&amp;#x2F;
├── MainActivity.kt         # Jetpack Compose host, EdgeToEdge, safe area
├── WawonaSurfaceView.kt    # Touch&amp;#x2F;key capture, IME InputConnection
├── WawonaNative.kt         # JNI external declarations
├── FabMenu.kt              # Material 3 FAB — Settings, Waypipe actions
├── SettingsScreen.kt       # SSH host&amp;#x2F;user&amp;#x2F;command config
└── Theme.kt                # Material 3 Expressive theming
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The native side (&lt;code&gt;android_jni.c&lt;&#x2F;code&gt;) handles Vulkan init, render threading, input dispatch, waypipe threads, and SSH binary resolution.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;data-flow&quot;&gt;Data Flow&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;input&quot;&gt;Input&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;MotionEvent &amp;#x2F; KeyEvent
  → WawonaSurfaceView (Kotlin)
    → JNI (nativeTouchDown &amp;#x2F; nativeKeyEvent)
      → WWNCoreInjectTouch* &amp;#x2F; WWNCoreInjectKey (Rust FFI)
        → Wayland protocol handlers → surface commits
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;rendering&quot;&gt;Rendering&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;Render loop (C pthread in android_jni.c):
  WWNCoreProcessEvents
    → WWNCoreGetRenderScene
      → iterate CRenderNode[]
        → Vulkan textured quad draw (SHM → VkImage upload)
          → WWNCoreNotifyFramePresented per node
            → WWNRenderSceneFree
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;waypipe-ssh&quot;&gt;Waypipe + SSH&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;SharedPreferences → nativeRunWaypipe
  → resolve_ssh_binary_paths()
    → dladdr() finds native lib dir
      → waypipe_main(argc, argv) [Rust entry point]
        → SSH bridge thread: fork() → exec(ssh_bin_path) [Dropbear]
          → SSHPASS env var → remote waypipe server
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;ssh-binary-bundling&quot;&gt;SSH Binary Bundling&lt;&#x2F;h2&gt;
&lt;p&gt;Android doesn&#x27;t ship with SSH tools. Wawona bundles &lt;strong&gt;Dropbear SSH&lt;&#x2F;strong&gt; and &lt;strong&gt;sshpass&lt;&#x2F;strong&gt; as static ARM64 executables:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Step&lt;&#x2F;th&gt;&lt;th&gt;What Happens&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Build-time&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Nix cross-compiles Dropbear and sshpass for &lt;code&gt;aarch64-linux-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;APK bundling&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Binaries packaged as &lt;code&gt;libssh_bin.so&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;libsshpass_bin.so&lt;&#x2F;code&gt; in &lt;code&gt;jniLibs&#x2F;arm64-v8a&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Runtime&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;AndroidManifest.xml&lt;&#x2F;code&gt; sets &lt;code&gt;extractNativeLibs=&quot;true&quot;&lt;&#x2F;code&gt; so Android extracts to &lt;code&gt;&#x2F;data&#x2F;app&#x2F;...&#x2F;lib&#x2F;arm64&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Path resolution&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;resolve_ssh_binary_paths()&lt;&#x2F;code&gt; uses &lt;code&gt;dladdr()&lt;&#x2F;code&gt; to find the native lib directory&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Execution&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;SSH bridge thread uses &lt;code&gt;exec()&lt;&#x2F;code&gt; with absolute paths to the extracted binaries&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;android-specific-dependencies&quot;&gt;Android-Specific Dependencies&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Library&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;xkbcommon&lt;&#x2F;td&gt;&lt;td&gt;Keyboard keymaps (XKB)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;openssl&lt;&#x2F;td&gt;&lt;td&gt;TLS&#x2F;crypto (Dropbear, waypipe)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Dropbear SSH&lt;&#x2F;td&gt;&lt;td&gt;Lightweight SSH client (fork&#x2F;exec)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;sshpass&lt;&#x2F;td&gt;&lt;td&gt;Password automation (optional)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;libwayland&lt;&#x2F;td&gt;&lt;td&gt;Wayland protocol library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;pixman&lt;&#x2F;td&gt;&lt;td&gt;Pixel manipulation&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;zstd &#x2F; lz4&lt;&#x2F;td&gt;&lt;td&gt;Waypipe compression&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;modifier-accessory-bar&quot;&gt;Modifier Accessory Bar&lt;&#x2F;h2&gt;
&lt;p&gt;Android includes a &lt;strong&gt;Modifier Accessory Bar&lt;&#x2F;strong&gt; (&lt;code&gt;ModifierAccessoryBar.kt&lt;&#x2F;code&gt;) with 1:1 parity to iOS:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Row 1:&lt;&#x2F;strong&gt; ESC, &lt;code&gt;`&lt;&#x2F;code&gt;, TAB, &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;, &lt;code&gt;—&lt;&#x2F;code&gt;, HOME, ↑, END, PGUP&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Row 2:&lt;&#x2F;strong&gt; ⇧, CTRL, ALT, ⌘, ←, ↓, →, PGDN, ⌨↓&lt;&#x2F;p&gt;
&lt;p&gt;All modifier keys are sticky (tap to toggle).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;nix-build-pipeline&quot;&gt;Nix Build Pipeline&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cross-compile C deps&lt;&#x2F;strong&gt; — xkbcommon, openssl, libwayland, pixman, etc. for &lt;code&gt;aarch64-linux-android&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cross-compile SSH tools&lt;&#x2F;strong&gt; — Dropbear, sshpass as static ARM64 executables&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rust backend&lt;&#x2F;strong&gt; — &lt;code&gt;libwawona.a&lt;&#x2F;code&gt; for &lt;code&gt;aarch64-linux-android&lt;&#x2F;code&gt; with waypipe&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JNI C compilation&lt;&#x2F;strong&gt; — &lt;code&gt;android_jni.c&lt;&#x2F;code&gt; compiled and linked with all static deps into &lt;code&gt;libwawona.so&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;APK assembly&lt;&#x2F;strong&gt; — Gradle builds the final APK with Kotlin sources + native libraries&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deploy&lt;&#x2F;strong&gt; — &lt;code&gt;nix run .#wawona-android&lt;&#x2F;code&gt; installs via &lt;code&gt;adb install -r&lt;&#x2F;code&gt; and launches&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Architecture</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/architecture/"/>
        <id>/docs/architecture/</id>
        
        <content type="html" xml:base="/docs/architecture/">&lt;h1 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h1&gt;
&lt;p&gt;Wawona is a &lt;strong&gt;Rust-first, cross-platform Wayland compositor&lt;&#x2F;strong&gt;. All compositor logic lives in Rust. Platform frontends are thin native adapters written in Objective-C&#x2F;Swift (macOS&#x2F;iOS) and Kotlin&#x2F;JNI (Android).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;design-philosophy&quot;&gt;Design Philosophy&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core&lt;&#x2F;strong&gt;: All shared logic is OS-agnostic and fully testable in isolation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Platform&lt;&#x2F;strong&gt;: Thin adapters translate native events and render buffers via Metal&#x2F;Vulkan&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;FFI&lt;&#x2F;strong&gt;: UniFFI boundary ensures safe memory and threading — no Wayland types leak across&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Protocol modules&lt;&#x2F;strong&gt;: Each protocol owns its state and handler logic&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rendering&lt;&#x2F;strong&gt;: Native GPU APIs consume a &lt;code&gt;RenderScene&lt;&#x2F;code&gt; produced by the Rust core&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;high-level-flow&quot;&gt;High-Level Flow&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;mermaid&quot; class=&quot;language-mermaid &quot;&gt;&lt;code class=&quot;language-mermaid&quot; data-lang=&quot;mermaid&quot;&gt;flowchart TD
    A[&amp;quot;Native OS Events\n(NSEvent &amp;#x2F; UIEvent &amp;#x2F; MotionEvent)&amp;quot;]
    B[&amp;quot;Native Frontend\n(Obj-C &amp;#x2F; Swift &amp;#x2F; Kotlin)&amp;quot;]
    C[&amp;quot;FFI Layer — src&amp;#x2F;ffi&amp;#x2F;* (UniFFI)\ninject_key · inject_pointer · process_events&amp;quot;]
    D[&amp;quot;Rust Core — src&amp;#x2F;core&amp;#x2F;*\nWayland protocols, surfaces, windows\ninput, frame timing&amp;quot;]
    E[&amp;quot;RenderScene\nget_render_scene()&amp;quot;]
    F[&amp;quot;Native Renderer\n(Metal &amp;#x2F; Vulkan)&amp;quot;]
    G[&amp;quot;Display Output&amp;quot;]

    A --&amp;gt; B --&amp;gt; C --&amp;gt; D --&amp;gt; E --&amp;gt; F --&amp;gt; G
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;source-layout&quot;&gt;Source Layout&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;src&amp;#x2F;
├── lib.rs                  # Crate root, UniFFI scaffolding
├── main.rs                 # CLI entry point
│
├── core&amp;#x2F;                   # Platform-agnostic compositor logic
│   ├── compositor.rs       # Lifecycle, Wayland display, client connections
│   ├── runtime.rs          # Event loop, frame timing, task scheduling
│   ├── socket_manager.rs   # Wayland socket management
│   ├── ipc.rs              # Inter-process communication
│   ├── surface&amp;#x2F;            # Surface &amp;amp; buffer lifecycle
│   ├── window&amp;#x2F;             # Window management, z-order, focus
│   ├── wayland&amp;#x2F;            # All protocol implementations
│   ├── input&amp;#x2F;              # Input event types
│   ├── render&amp;#x2F;             # Render scene generation
│   └── time&amp;#x2F;               # Frame timing
│
├── ffi&amp;#x2F;                    # FFI boundary (UniFFI + C API)
│   ├── api.rs              # WawonaCore — main FFI object
│   ├── types.rs            # FFI-safe structs and enums
│   ├── c_api.rs            # C-compatible API wrappers
│   ├── callbacks.rs        # Platform callback traits
│   └── errors.rs           # FFI error mapping
│
├── platform&amp;#x2F;               # Platform trait definitions
│   └── api.rs              # Platform trait + StubPlatform
│
├── rendering&amp;#x2F;              # Native rendering code
│   ├── metal_shaders.metal # Metal shaders (Apple)
│   ├── renderer_apple.m    # Metal renderer (macOS&amp;#x2F;iOS)
│   └── renderer_android.c  # Vulkan renderer (Android)
│
└── input&amp;#x2F;                  # Native input handling
    ├── input_handler.m     # macOS&amp;#x2F;iOS input (NSEvent → Wayland)
    └── wayland_seat.c      # Seat implementation
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;platform-frontends&quot;&gt;Platform Frontends&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Language&lt;&#x2F;th&gt;&lt;th&gt;Rendering&lt;&#x2F;th&gt;&lt;th&gt;Window System&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objective-C + Swift&lt;&#x2F;td&gt;&lt;td&gt;Metal (CAMetalLayer)&lt;&#x2F;td&gt;&lt;td&gt;AppKit (NSWindow)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objective-C + Swift&lt;&#x2F;td&gt;&lt;td&gt;Metal (CAMetalLayer)&lt;&#x2F;td&gt;&lt;td&gt;UIKit (UIWindow)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Kotlin + JNI + C&lt;&#x2F;td&gt;&lt;td&gt;Vulkan&lt;&#x2F;td&gt;&lt;td&gt;SurfaceView&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Each frontend:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Captures&lt;&#x2F;strong&gt; native OS events (touch, keyboard, mouse)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Translates&lt;&#x2F;strong&gt; them to Wayland-compatible input via FFI (&lt;code&gt;inject_key&lt;&#x2F;code&gt;, &lt;code&gt;inject_pointer_motion&lt;&#x2F;code&gt;, etc.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Calls&lt;&#x2F;strong&gt; &lt;code&gt;process_events()&lt;&#x2F;code&gt; to advance the compositor state&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Retrieves&lt;&#x2F;strong&gt; a &lt;code&gt;RenderScene&lt;&#x2F;code&gt; via &lt;code&gt;get_render_scene()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Renders&lt;&#x2F;strong&gt; each scene node using the native GPU API&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;wayland-protocol-support&quot;&gt;Wayland Protocol Support&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona registers &lt;strong&gt;68 protocol globals&lt;&#x2F;strong&gt; at startup, organized by category:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Category&lt;&#x2F;th&gt;&lt;th&gt;Protocols&lt;&#x2F;th&gt;&lt;th&gt;Examples&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Core&lt;&#x2F;strong&gt; (6)&lt;&#x2F;td&gt;&lt;td&gt;Fundamental Wayland&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;wl_compositor&lt;&#x2F;code&gt;, &lt;code&gt;wl_shm&lt;&#x2F;code&gt;, &lt;code&gt;wl_seat&lt;&#x2F;code&gt;, &lt;code&gt;wl_output&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;XDG&lt;&#x2F;strong&gt; (9)&lt;&#x2F;td&gt;&lt;td&gt;Desktop shell&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;xdg_wm_base&lt;&#x2F;code&gt;, &lt;code&gt;xdg_decoration&lt;&#x2F;code&gt;, &lt;code&gt;xdg_output&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;wlroots&lt;&#x2F;strong&gt; (10)&lt;&#x2F;td&gt;&lt;td&gt;Compositor extensions&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;layer_shell&lt;&#x2F;code&gt;, &lt;code&gt;screencopy&lt;&#x2F;code&gt;, &lt;code&gt;foreign_toplevel&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Buffer &amp;amp; Sync&lt;&#x2F;strong&gt; (5)&lt;&#x2F;td&gt;&lt;td&gt;GPU sharing&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;linux_dmabuf&lt;&#x2F;code&gt;, &lt;code&gt;explicit_sync&lt;&#x2F;code&gt;, &lt;code&gt;drm_syncobj&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Input&lt;&#x2F;strong&gt; (10)&lt;&#x2F;td&gt;&lt;td&gt;Advanced input&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;pointer_constraints&lt;&#x2F;code&gt;, &lt;code&gt;text_input&lt;&#x2F;code&gt;, &lt;code&gt;tablet&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Timing&lt;&#x2F;strong&gt; (8)&lt;&#x2F;td&gt;&lt;td&gt;Frame control&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;presentation_time&lt;&#x2F;code&gt;, &lt;code&gt;fractional_scale&lt;&#x2F;code&gt;, &lt;code&gt;fifo&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Session&lt;&#x2F;strong&gt; (5)&lt;&#x2F;td&gt;&lt;td&gt;Security&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;session_lock&lt;&#x2F;code&gt;, &lt;code&gt;idle_inhibit&lt;&#x2F;code&gt;, &lt;code&gt;security_context&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Desktop&lt;&#x2F;strong&gt; (4)&lt;&#x2F;td&gt;&lt;td&gt;Integration&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;foreign_toplevel_list&lt;&#x2F;code&gt;, &lt;code&gt;workspace&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Capture&lt;&#x2F;strong&gt; (4)&lt;&#x2F;td&gt;&lt;td&gt;Screen capture&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;image_copy_capture&lt;&#x2F;code&gt;, &lt;code&gt;xwayland_shell&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plasma&lt;&#x2F;strong&gt; (7)&lt;&#x2F;td&gt;&lt;td&gt;KDE protocols&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;kde_decoration&lt;&#x2F;code&gt;, &lt;code&gt;blur&lt;&#x2F;code&gt;, &lt;code&gt;contrast&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;For detailed implementation status per protocol, see &lt;a href=&quot;&#x2F;docs&#x2F;protocols&#x2F;&quot;&gt;Protocols&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;rendering-pipeline&quot;&gt;Rendering Pipeline&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;apple-macos-ios-metal&quot;&gt;Apple (macOS &#x2F; iOS) — Metal&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Client writes pixel data to a shared buffer&lt;&#x2F;li&gt;
&lt;li&gt;Wawona wraps it in an &lt;code&gt;IOSurface&lt;&#x2F;code&gt; (zero-copy GPU access)&lt;&#x2F;li&gt;
&lt;li&gt;Metal renderer reads directly from the &lt;code&gt;IOSurface&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Composited via custom Metal shaders (MSL)&lt;&#x2F;li&gt;
&lt;li&gt;Synchronized with display via &lt;code&gt;CVDisplayLink&lt;&#x2F;code&gt; (macOS) &#x2F; &lt;code&gt;CADisplayLink&lt;&#x2F;code&gt; (iOS)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;android-vulkan&quot;&gt;Android — Vulkan&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Client submits SHM buffers over the Wayland protocol&lt;&#x2F;li&gt;
&lt;li&gt;Buffer data uploaded to &lt;code&gt;VkImage&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Rendered as textured quads via SPIR-V shaders&lt;&#x2F;li&gt;
&lt;li&gt;Presented through Android&#x27;s &lt;code&gt;SurfaceView&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Synchronized with &lt;code&gt;Choreographer&lt;&#x2F;code&gt; frame callbacks&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;threading-model&quot;&gt;Threading Model&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;mermaid&quot; class=&quot;language-mermaid &quot;&gt;&lt;code class=&quot;language-mermaid&quot; data-lang=&quot;mermaid&quot;&gt;flowchart TD
    T1[&amp;quot;Input Thread\nReceive OS events · Translate via FFI&amp;quot;]
    T2[&amp;quot;Core Thread\nRust state update · Scene graph build · Damage tracking&amp;quot;]
    T3[&amp;quot;Render Thread\nMetal &amp;#x2F; Vulkan draw · Present to display&amp;quot;]

    T1 --&amp;gt; T2 --&amp;gt; T3
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;build-system&quot;&gt;Build System&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona uses &lt;strong&gt;Nix&lt;&#x2F;strong&gt; as the single build system for all platforms:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Strategy&lt;&#x2F;th&gt;&lt;th&gt;Command&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Pure Nix build&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;nix run&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iOS&lt;&#x2F;td&gt;&lt;td&gt;Nix + XcodeGen&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Android&lt;&#x2F;td&gt;&lt;td&gt;Nix + GradleGen&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The Rust backend is compiled via &lt;strong&gt;crate2nix&lt;&#x2F;strong&gt;, which generates per-crate Nix derivations for incremental caching. See &lt;a href=&quot;&#x2F;docs&#x2F;compilation&#x2F;&quot;&gt;Compilation Reference&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;getting-started&#x2F;&quot;&gt;Getting Started&lt;&#x2F;a&gt; — build and run Wawona&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;macos&#x2F;&quot;&gt;macOS Implementation&lt;&#x2F;a&gt; — deep dive into the Metal rendering pipeline&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;protocols&#x2F;&quot;&gt;Protocols&lt;&#x2F;a&gt; — detailed protocol implementation status&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;nix-build-system&#x2F;&quot;&gt;Nix Build System&lt;&#x2F;a&gt; — how the build pipeline works&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Compilation Reference</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/compilation/"/>
        <id>/docs/compilation/</id>
        
        <content type="html" xml:base="/docs/compilation/">&lt;h1 id=&quot;compilation-reference&quot;&gt;Compilation Reference&lt;&#x2F;h1&gt;
&lt;p&gt;Wawona uses &lt;strong&gt;Nix Flakes&lt;&#x2F;strong&gt; for all builds across macOS, iOS, and Android. Nix is the only build dependency — it manages the Rust toolchain, native C&#x2F;C++ libraries, and app packaging.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;quick-build&quot;&gt;Quick Build&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# macOS app — build and launch
nix run

# iOS Simulator — build, install, and launch
nix run .#wawona-ios

# Android — build APK, install, and launch
nix run .#wawona-android
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;build-only-no-launch&quot;&gt;Build Only (No Launch)&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix build .#wawona-macos            # macOS .app bundle
nix build .#wawona-macos-backend    # macOS Rust static library only
nix build .#wawona-ios-backend      # iOS device Rust static library
nix build .#wawona-ios-sim-backend  # iOS simulator Rust static library
nix build .#wawona-android-backend  # Android Rust shared library
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;project-generators&quot;&gt;Project Generators&lt;&#x2F;h2&gt;
&lt;p&gt;Generate IDE projects that reference the Nix-built libraries:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#xcodegen       # Generate Wawona.xcodeproj (iOS + macOS)
nix run .#xcodegen-ios   # iOS target only
nix run .#gradlegen      # Generate Gradle project for Android
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After generating, open the project in your IDE:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;open Wawona.xcodeproj    # Xcode
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See &lt;a href=&quot;&#x2F;docs&#x2F;getting-started&#x2F;&quot;&gt;Getting Started — Team ID&lt;&#x2F;a&gt; for automatic code signing setup.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;common-nix-flags&quot;&gt;Common Nix Flags&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Flag&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-L&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Show full build logs&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--show-trace&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stack trace on Nix evaluation errors&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--rebuild&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Force rebuild (ignore cache)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-ios -L --show-trace
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;debug-builds&quot;&gt;Debug Builds&lt;&#x2F;h2&gt;
&lt;p&gt;Add &lt;code&gt;--debug&lt;&#x2F;code&gt; to launch under LLDB:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-macos -- --debug     # macOS — LLDB from start
nix run .#wawona-ios -- --debug       # iOS — pause at spawn, LLDB attaches
nix run .#wawona-android -- --debug   # Android — lldb-server, remote attach
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See &lt;a href=&quot;&#x2F;docs&#x2F;debugging&#x2F;&quot;&gt;Debugging Guide&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;dev-shell&quot;&gt;Dev Shell&lt;&#x2F;h2&gt;
&lt;p&gt;Enter a full development environment with all tools pre-configured:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix develop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The dev shell provides:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Rust toolchain with cross-compilation targets (iOS, Android)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;XDG_RUNTIME_DIR&lt;&#x2F;code&gt; and &lt;code&gt;WAYLAND_DISPLAY&lt;&#x2F;code&gt; pre-set&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;TEAM_ID&lt;&#x2F;code&gt; loaded from &lt;code&gt;.envrc&lt;&#x2F;code&gt; for code signing&lt;&#x2F;li&gt;
&lt;li&gt;All native libraries and build tools&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;how-the-build-works&quot;&gt;How the Build Works&lt;&#x2F;h2&gt;
&lt;p&gt;The Nix build pipeline has three layers:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│  Layer 3: App Packaging                     │
│  .app bundles, .xcodeproj, Gradle project   │
├─────────────────────────────────────────────┤
│  Layer 2: Rust Backend (crate2nix)          │
│  Per-crate Nix derivations for incremental  │
│  builds — only changed crates rebuild       │
├─────────────────────────────────────────────┤
│  Layer 1: Native C&amp;#x2F;C++ Libraries            │
│  libwayland, xkbcommon, ffmpeg, zstd, lz4,  │
│  openssl, libssh2, etc.                     │
└─────────────────────────────────────────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each crate and library is its own Nix derivation, cached independently. Changing a Rust source file only rebuilds the root &lt;code&gt;wawona&lt;&#x2F;code&gt; crate — all ~120 dependency crates are served from cache.&lt;&#x2F;p&gt;
&lt;p&gt;For the full Nix pipeline deep dive, see &lt;a href=&quot;&#x2F;docs&#x2F;nix-build-system&#x2F;&quot;&gt;Nix Build System&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;requirements-summary&quot;&gt;Requirements Summary&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Requirement&lt;&#x2F;th&gt;&lt;th&gt;When Needed&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Apple Silicon Mac&lt;&#x2F;td&gt;&lt;td&gt;Always&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Nix with flakes&lt;&#x2F;td&gt;&lt;td&gt;Always (&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;determinate.systems&#x2F;nix-installer&#x2F;&quot;&gt;Determinate Nix&lt;&#x2F;a&gt; recommended)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Xcode&lt;&#x2F;td&gt;&lt;td&gt;iOS builds&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.envrc&lt;&#x2F;code&gt; with &lt;code&gt;TEAM_ID&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;iOS device deployment&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;adb&lt;&#x2F;code&gt; + Android emulator&lt;&#x2F;td&gt;&lt;td&gt;Android builds&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Debugging</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/debugging/"/>
        <id>/docs/debugging/</id>
        
        <content type="html" xml:base="/docs/debugging/">&lt;h1 id=&quot;debugging&quot;&gt;Debugging&lt;&#x2F;h1&gt;
&lt;p&gt;Launch Wawona under LLDB on macOS, iOS, or Android using the &lt;code&gt;--debug&lt;&#x2F;code&gt; flag.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;quick-reference&quot;&gt;Quick Reference&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-macos -- --debug     # macOS
nix run .#wawona-ios -- --debug       # iOS Simulator
nix run .#wawona-android -- --debug   # Android
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;macos&quot;&gt;macOS&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-macos -- --debug
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Wawona starts &lt;strong&gt;under LLDB&lt;&#x2F;strong&gt; from the beginning&lt;&#x2F;li&gt;
&lt;li&gt;You can set breakpoints before typing &lt;code&gt;run&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;On exit, LLDB prints a full backtrace (&lt;code&gt;bt all&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Alternative:&lt;&#x2F;strong&gt; &lt;code&gt;WAWONA_LLDB=1 nix run .#wawona-macos&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;ios-simulator&quot;&gt;iOS Simulator&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-ios -- --debug
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;Simulator boots and Wawona.app is installed&lt;&#x2F;li&gt;
&lt;li&gt;App launches with &lt;code&gt;--wait-for-debugger&lt;&#x2F;code&gt; (paused at spawn)&lt;&#x2F;li&gt;
&lt;li&gt;LLDB attaches to the app PID&lt;&#x2F;li&gt;
&lt;li&gt;dSYM is loaded for symbols (if present)&lt;&#x2F;li&gt;
&lt;li&gt;Simulator logs stream in the background&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Type &lt;code&gt;continue&lt;&#x2F;code&gt; in LLDB to resume execution.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;android&quot;&gt;Android&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#wawona-android -- --debug
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;Emulator starts (or uses existing device)&lt;&#x2F;li&gt;
&lt;li&gt;App launches with &lt;code&gt;am start -D&lt;&#x2F;code&gt; (waits for debugger)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;lldb-server&lt;&#x2F;code&gt; is pushed to the device and started&lt;&#x2F;li&gt;
&lt;li&gt;LLDB connects via &lt;code&gt;gdb-remote&lt;&#x2F;code&gt; on port 5039&lt;&#x2F;li&gt;
&lt;li&gt;Java VM resumes after ~4 seconds; native code runs under LLDB&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Requirements:&lt;&#x2F;strong&gt; &lt;code&gt;adb&lt;&#x2F;code&gt; and &lt;code&gt;emulator&lt;&#x2F;code&gt; in PATH; device&#x2F;emulator with USB debugging enabled.&lt;&#x2F;p&gt;
&lt;p&gt;On crash, LLDB stops and gives an interactive prompt. Use &lt;code&gt;bt&lt;&#x2F;code&gt; for backtrace.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Getting Started</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/getting-started/"/>
        <id>/docs/getting-started/</id>
        
        <content type="html" xml:base="/docs/getting-started/">&lt;h1 id=&quot;getting-started-with-wawona&quot;&gt;Getting Started with Wawona&lt;&#x2F;h1&gt;
&lt;p&gt;Wawona is a native Wayland compositor for &lt;strong&gt;macOS&lt;&#x2F;strong&gt;, &lt;strong&gt;iOS&lt;&#x2F;strong&gt;, and &lt;strong&gt;Android&lt;&#x2F;strong&gt;. Whether you want to run Wayland apps on your Mac or contribute to the project, this guide will get you up and running.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;for-users&quot;&gt;For Users&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You do NOT need to install Nix.&lt;&#x2F;strong&gt; Nix is a developer tool for building Wawona from source. If you just want to &lt;em&gt;use&lt;&#x2F;em&gt; Wawona, read this section instead.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;the-easy-way-app-store-play-store&quot;&gt;The Easy Way: App Store &amp;amp; Play Store&lt;&#x2F;h3&gt;
&lt;p&gt;Wawona will be distributed as a native app on each platform:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Where to Get It&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mac App Store&lt;&#x2F;td&gt;&lt;td&gt;Coming Soon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS &#x2F; iPadOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;App Store&lt;&#x2F;td&gt;&lt;td&gt;Coming Soon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Google Play Store&lt;&#x2F;td&gt;&lt;td&gt;Coming Soon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Once available, simply download and install — no terminal, no build tools, no Nix. Just a regular app.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Visit the &lt;a href=&quot;&#x2F;download&#x2F;&quot;&gt;Downloads&lt;&#x2F;a&gt; page&lt;&#x2F;strong&gt; for the latest availability info.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;while-we-re-still-in-development&quot;&gt;While We&#x27;re Still in Development…&lt;&#x2F;h3&gt;
&lt;p&gt;Wawona is in active development (v0.2.x) and &lt;strong&gt;not yet available on public app stores&lt;&#x2F;strong&gt;. Here&#x27;s how you can get involved right now:&lt;&#x2F;p&gt;
&lt;h4 id=&quot;join-the-ios-testflight-beta&quot;&gt;Join the iOS TestFlight Beta&lt;&#x2F;h4&gt;
&lt;p&gt;We have an active &lt;strong&gt;TestFlight&lt;&#x2F;strong&gt; for iOS beta testing. Join to get early access and help shape Wawona before launch:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Join our &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.gg&#x2F;wHVSV52uw5&quot;&gt;Discord server&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Request access to the TestFlight beta in the &lt;code&gt;#beta-testing&lt;&#x2F;code&gt; channel&lt;&#x2F;li&gt;
&lt;li&gt;You&#x27;ll receive a TestFlight invite link directly to your device&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;join-the-discord-community&quot;&gt;Join the Discord Community&lt;&#x2F;h4&gt;
&lt;p&gt;Stay up to date with development progress, ask questions, and share feedback:&lt;&#x2F;p&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.gg&#x2F;wHVSV52uw5&quot;&gt;discord.gg&#x2F;wHVSV52uw5&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h4 id=&quot;star-the-repository&quot;&gt;Star the Repository&lt;&#x2F;h4&gt;
&lt;p&gt;Follow development on GitHub to get notified of new releases:&lt;&#x2F;p&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Wawona&#x2F;Wawona&quot;&gt;github.com&#x2F;Wawona&#x2F;Wawona&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;&#x2F;strong&gt; You do &lt;strong&gt;not&lt;&#x2F;strong&gt; need Nix, Rust, Xcode, or any developer tools. When Wawona ships, it will be a one-click install from the App Store or Play Store. Until then, join the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.gg&#x2F;wHVSV52uw5&quot;&gt;Discord&lt;&#x2F;a&gt; and the iOS &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.gg&#x2F;wHVSV52uw5&quot;&gt;TestFlight&lt;&#x2F;a&gt; beta.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;for-developers&quot;&gt;For Developers&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Everything below this line is for people who want to &lt;strong&gt;build Wawona from source&lt;&#x2F;strong&gt; or contribute to the project. This requires Nix.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Requirement&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Apple Silicon Mac&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;M1, M2, M3, or M4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Nix&lt;&#x2F;strong&gt; (with flakes)&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;determinate.systems&#x2F;nix-installer&#x2F;&quot;&gt;Determinate Nix&lt;&#x2F;a&gt; recommended&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Xcode&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Required for iOS builds and code signing&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;build-run&quot;&gt;Build &amp;amp; Run&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Command&lt;&#x2F;th&gt;&lt;th&gt;What it does&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Build + launch macOS app&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Build + launch on iOS Simulator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Build + install on Android device&#x2F;emulator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;build-only-no-launch&quot;&gt;Build Only (No Launch)&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix build .#wawona-macos          # macOS .app bundle
nix build .#wawona-ios-backend    # iOS Rust static library
nix build .#wawona-android-backend # Android Rust shared library
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;generate-xcode-project&quot;&gt;Generate Xcode Project&lt;&#x2F;h3&gt;
&lt;p&gt;To open the project in Xcode (for debugging, profiling, or deploying to a physical device):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#xcodegen       # Generate Wawona.xcodeproj (iOS + macOS targets)
nix run .#xcodegen-ios   # iOS target only
open Wawona.xcodeproj
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;generate-gradle-project-android&quot;&gt;Generate Gradle Project (Android)&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#gradlegen
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;setting-up-your-team-id-ios-device-deployment&quot;&gt;Setting Up Your Team ID (iOS Device Deployment)&lt;&#x2F;h2&gt;
&lt;p&gt;To deploy Wawona to a physical iOS device, you need an Apple Development Team ID for code signing. Here&#x27;s the workflow:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-find-your-team-id&quot;&gt;1. Find Your Team ID&lt;&#x2F;h3&gt;
&lt;p&gt;If you don&#x27;t know your Team ID, the easiest way to find it:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;nix run .#xcodegen&lt;&#x2F;code&gt; to generate the Xcode project&lt;&#x2F;li&gt;
&lt;li&gt;Open &lt;code&gt;Wawona.xcodeproj&lt;&#x2F;code&gt; in Xcode&lt;&#x2F;li&gt;
&lt;li&gt;Go to &lt;strong&gt;Signing &amp;amp; Capabilities&lt;&#x2F;strong&gt; for the Wawona-iOS target&lt;&#x2F;li&gt;
&lt;li&gt;Sign in with your Apple ID and select your development team&lt;&#x2F;li&gt;
&lt;li&gt;Xcode writes your Team ID into the &lt;code&gt;.xcodeproj&lt;&#x2F;code&gt; — you can find it there (look for &lt;code&gt;DEVELOPMENT_TEAM&lt;&#x2F;code&gt; in the &lt;code&gt;.pbxproj&lt;&#x2F;code&gt; file)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;2-save-your-team-id&quot;&gt;2. Save Your Team ID&lt;&#x2F;h3&gt;
&lt;p&gt;Create a &lt;code&gt;.envrc&lt;&#x2F;code&gt; file in the project root (this file is gitignored):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;echo &amp;#x27;export TEAM_ID=&amp;quot;YOUR_TEAM_ID_HERE&amp;quot;&amp;#x27; &amp;gt; .envrc
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Replace &lt;code&gt;YOUR_TEAM_ID_HERE&lt;&#x2F;code&gt; with the Team ID you found (e.g., &lt;code&gt;G6EJA4DJKW&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-use-the-dev-shell&quot;&gt;3. Use the Dev Shell&lt;&#x2F;h3&gt;
&lt;p&gt;Enter the Nix development shell, which automatically reads your Team ID from &lt;code&gt;.envrc&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix develop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You&#x27;ll see &lt;code&gt;Loaded TEAM_ID from .envrc.&lt;&#x2F;code&gt; confirming it worked.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-generate-with-signing&quot;&gt;4. Generate With Signing&lt;&#x2F;h3&gt;
&lt;p&gt;Now, from inside the dev shell, run xcodegen:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#xcodegen
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Your Team ID is automatically injected into the generated &lt;code&gt;.xcodeproj&lt;&#x2F;code&gt; — no need to manually navigate to Signing &amp;amp; Capabilities in Xcode every time. Just open the project and build to your device.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;&#x2F;strong&gt; Once your &lt;code&gt;.envrc&lt;&#x2F;code&gt; is set up, the workflow is just &lt;code&gt;nix develop&lt;&#x2F;code&gt; → &lt;code&gt;nix run .#xcodegen&lt;&#x2F;code&gt; → open in Xcode → build to device. Your signing identity is preserved across project regenerations.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;dev-shell&quot;&gt;Dev Shell&lt;&#x2F;h2&gt;
&lt;p&gt;The Nix dev shell provides a complete development environment with all tools and environment variables pre-configured:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix develop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This gives you:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Rust toolchain with iOS, macOS, and Android cross-compilation targets&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;XDG_RUNTIME_DIR&lt;&#x2F;code&gt; and &lt;code&gt;WAYLAND_DISPLAY&lt;&#x2F;code&gt; set for local testing&lt;&#x2F;li&gt;
&lt;li&gt;Your &lt;code&gt;TEAM_ID&lt;&#x2F;code&gt; loaded from &lt;code&gt;.envrc&lt;&#x2F;code&gt; for code signing&lt;&#x2F;li&gt;
&lt;li&gt;All native dependencies available&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;useful-nix-flags&quot;&gt;Useful Nix Flags&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Flag&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-L&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Show full build logs&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--show-trace&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stack trace on Nix evaluation errors&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--rebuild&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Force rebuild (ignore cache)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;usage&#x2F;&quot;&gt;Usage Guide&lt;&#x2F;a&gt; — run Weston, waypipe, connect clients&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;architecture&#x2F;&quot;&gt;Architecture&lt;&#x2F;a&gt; — understand the Rust core + native frontend design&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;compilation&#x2F;&quot;&gt;Compilation Reference&lt;&#x2F;a&gt; — deep dive into the Nix build system&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;docs&#x2F;settings&#x2F;&quot;&gt;Settings Reference&lt;&#x2F;a&gt; — all configurable options&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Graphics Drivers</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/graphics/"/>
        <id>/docs/graphics/</id>
        
        <content type="html" xml:base="/docs/graphics/">&lt;h1 id=&quot;graphics-drivers-validation&quot;&gt;Graphics Drivers &amp;amp; Validation&lt;&#x2F;h1&gt;
&lt;p&gt;Vulkan, OpenGL, and Metal driver configuration for Wawona across macOS, iOS, and Android.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;quick-reference&quot;&gt;Quick Reference&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Native Vulkan?&lt;&#x2F;th&gt;&lt;th&gt;Default Driver&lt;&#x2F;th&gt;&lt;th&gt;Alternatives&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;No (Metal)&lt;&#x2F;td&gt;&lt;td&gt;MoltenVK&lt;&#x2F;td&gt;&lt;td&gt;KosmicKrisp&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;No (Metal)&lt;&#x2F;td&gt;&lt;td&gt;MoltenVK&lt;&#x2F;td&gt;&lt;td&gt;KosmicKrisp&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;System&lt;&#x2F;td&gt;&lt;td&gt;SwiftShader, Turnip&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;driver-settings&quot;&gt;Driver Settings&lt;&#x2F;h2&gt;
&lt;p&gt;Configure graphics drivers in &lt;strong&gt;Settings → Graphics&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vulkan-drivers&quot;&gt;Vulkan Drivers&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Options&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, MoltenVK, KosmicKrisp&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;moltenvk&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, MoltenVK, KosmicKrisp&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;moltenvk&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, SwiftShader, Turnip, System&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;system&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MoltenVK&lt;&#x2F;strong&gt; — Mature Vulkan-over-Metal implementation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;KosmicKrisp&lt;&#x2F;strong&gt; — Mesa-based Vulkan-on-Metal (experimental)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SwiftShader&lt;&#x2F;strong&gt; — Software Vulkan renderer (fallback)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Turnip&lt;&#x2F;strong&gt; — Qualcomm Adreno Vulkan driver&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;opengl-drivers&quot;&gt;OpenGL Drivers&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Options&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, ANGLE, MoltenGL&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;angle&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, ANGLE&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;angle&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;None, ANGLE, System&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;system&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;driver-validation-cts&quot;&gt;Driver Validation (CTS)&lt;&#x2F;h2&gt;
&lt;p&gt;Run Khronos Conformance Test Suites to validate your driver:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# Quick Vulkan probe (JSON output)
nix run .#graphics-smoke

# Full validation (smoke + Vulkan CTS + GL CTS)
nix run .#graphics-validate-macos

# iOS Vulkan CTS (in simulator)
nix run .#vulkan-cts-ios

# Android CTS (requires adb)
nix run .#vulkan-cts-android
nix run .#graphics-validate-android
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;all-cts-outputs&quot;&gt;All CTS Outputs&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Output&lt;&#x2F;th&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphics-smoke&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Vulkan probe, JSON output&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphics-validate-macos&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Full validation suite&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphics-validate-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS host&lt;&#x2F;td&gt;&lt;td&gt;iOS Simulator Vulkan CTS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphics-validate-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Any&lt;&#x2F;td&gt;&lt;td&gt;Android CTS via adb&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;vulkan-cts&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Khronos Vulkan CTS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gl-cts&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Khronos OpenGL&#x2F;GLES CTS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Results are saved in &lt;code&gt;.&#x2F;graphics-validate-results&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;macos-driver-override&quot;&gt;macOS Driver Override&lt;&#x2F;h2&gt;
&lt;p&gt;Override the Vulkan driver via environment variable:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# Use MoltenVK explicitly
VK_DRIVER_FILES=&amp;#x2F;path&amp;#x2F;to&amp;#x2F;MoltenVK_icd.json nix run .#graphics-smoke
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;ios-static-drivers&quot;&gt;iOS Static Drivers&lt;&#x2F;h2&gt;
&lt;p&gt;All iOS graphics drivers must be &lt;strong&gt;static libraries&lt;&#x2F;strong&gt; (&lt;code&gt;.a&lt;&#x2F;code&gt;) — dynamic libraries are not allowed by Apple.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Driver&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;KosmicKrisp&lt;&#x2F;td&gt;&lt;td&gt;Vulkan over Metal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MoltenVK&lt;&#x2F;td&gt;&lt;td&gt;Vulkan over Metal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ANGLE&lt;&#x2F;td&gt;&lt;td&gt;OpenGL ES over Metal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Only one Vulkan implementation can be linked at build time.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Issue&lt;&#x2F;th&gt;&lt;th&gt;Fix&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&quot;No Vulkan loader&quot;&lt;&#x2F;td&gt;&lt;td&gt;Ensure vulkan-loader in closure; use MoltenVK or KosmicKrisp&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&quot;deqp-vk not found&quot;&lt;&#x2F;td&gt;&lt;td&gt;Run &lt;code&gt;nix build .#vulkan-cts&lt;&#x2F;code&gt; first&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iOS simulator not booting&lt;&#x2F;td&gt;&lt;td&gt;Install iOS runtime via Xcode: &lt;code&gt;xcrun simctl list runtimes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Android &quot;device offline&quot;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;adb kill-server &amp;amp;&amp;amp; adb start-server&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GL CTS missing data&lt;&#x2F;td&gt;&lt;td&gt;Ensure &lt;code&gt;--deqp-archive-dir&lt;&#x2F;code&gt; points to built archive&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>macOS Implementation</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/macos/"/>
        <id>/docs/macos/</id>
        
        <content type="html" xml:base="/docs/macos/">&lt;h1 id=&quot;macos-implementation&quot;&gt;macOS Implementation&lt;&#x2F;h1&gt;
&lt;p&gt;A deep dive into how Wawona achieves a native macOS experience while acting as a high-performance Wayland compositor.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;native-first&quot;&gt;Native First&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona is not a port of a Linux compositor — it&#x27;s a &lt;strong&gt;re-imagining of a Wayland compositor as a native Mac application&lt;&#x2F;strong&gt;. Every user-facing layer uses Apple&#x27;s first-party frameworks:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Component&lt;&#x2F;th&gt;&lt;th&gt;Framework&lt;&#x2F;th&gt;&lt;th&gt;What It Means&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Window Host&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;AppKit (&lt;code&gt;NSWindow&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Every Wayland app is a real macOS window&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UI&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;AppKit &#x2F; UIKit&lt;&#x2F;td&gt;&lt;td&gt;Settings, About panel use standard Cocoa controls&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Graphics&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Metal&lt;&#x2F;td&gt;&lt;td&gt;Apple&#x27;s high-performance GPU API&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Input&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;NSEvent&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS events translate directly to Wayland keycodes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Because Wawona uses actual &lt;code&gt;NSWindow&lt;&#x2F;code&gt; objects, Wayland applications get native macOS window management — snapping, resizing, Mission Control, Stage Manager, and full-screen transitions all work out of the box.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-rendering-pipeline&quot;&gt;The Rendering Pipeline&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;surface-management&quot;&gt;Surface Management&lt;&#x2F;h3&gt;
&lt;p&gt;Each Wayland client creates surfaces. In Wawona, these map directly to CoreAnimation layers:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;WawonaSurfaceLayer&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Objective-C wrapper managing the surface lifecycle&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CAMetalLayer&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Hardware-accelerated rendering layer&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;zero-copy-via-iosurface&quot;&gt;Zero-Copy via IOSurface&lt;&#x2F;h3&gt;
&lt;p&gt;Wawona uses &lt;code&gt;IOSurface&lt;&#x2F;code&gt; for high-performance buffer sharing:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Client Submission&lt;&#x2F;strong&gt;: Wayland client writes pixel data to a shared buffer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Surface Wrapping&lt;&#x2F;strong&gt;: Wawona wraps the buffer in an &lt;code&gt;IOSurfaceRef&lt;&#x2F;code&gt;, accessible by the GPU&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero-Copy Rendering&lt;&#x2F;strong&gt;: Metal reads directly from the &lt;code&gt;IOSurface&lt;&#x2F;code&gt; — no CPU copies&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This minimizes latency and battery drain.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;metal-compositing&quot;&gt;Metal Compositing&lt;&#x2F;h3&gt;
&lt;p&gt;The final output is composited using custom Metal shaders:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MSL Shaders&lt;&#x2F;strong&gt;: Handle texture sampling, alpha blending, and scaling&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;V-Sync&lt;&#x2F;strong&gt;: &lt;code&gt;CVDisplayLink&lt;&#x2F;code&gt; synchronizes rendering with the display refresh rate&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-rust-apple-bridge&quot;&gt;The Rust–Apple Bridge&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────┐
│  Apple Frontend (Objective-C)       │
│  NSApplication → WawonaWindow →    │
│  CompositorView → Metal Renderer   │
└──────────────┬──────────────────────┘
               │
┌──────────────▼──────────────────────┐
│  Bridge (UniFFI &amp;#x2F; C FFI)            │
│  WawonaCompositorBridge             │
└──────────────┬──────────────────────┘
               │
┌──────────────▼──────────────────────┐
│  Rust Core (src&amp;#x2F;core&amp;#x2F;*)             │
│  Protocol Handler → Surface State  │
│  → Client Management               │
└─────────────────────────────────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rust Core&lt;&#x2F;strong&gt;: Manages Wayland protocol state and client communication&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Objective-C Frontend&lt;&#x2F;strong&gt;: Manages window server integration, system events, and rendering&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;UniFFI&lt;&#x2F;strong&gt;: High-speed binding between Rust and Objective-C&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;gpu-acceleration-dmabuf-via-iosurface&quot;&gt;GPU Acceleration (DMABUF via IOSurface)&lt;&#x2F;h2&gt;
&lt;p&gt;For hardware-accelerated clients (e.g., Weston with GL), Wawona implements a custom zero-copy path:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Allocation&lt;&#x2F;strong&gt;: Client (via Mesa&#x2F;Waypipe) allocates an &lt;code&gt;IOSurface&lt;&#x2F;code&gt;, sends its global ID in the modifier field of &lt;code&gt;zwp_linux_dmabuf_v1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Intercept&lt;&#x2F;strong&gt;: Rust core detects the custom modifier, extracts the ID, creates &lt;code&gt;BufferType::Native&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Scanout&lt;&#x2F;strong&gt;: ID passed to macOS frontend via FFI&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero-Copy&lt;&#x2F;strong&gt;: Objective-C bridge performs &lt;code&gt;IOSurfaceLookup&lt;&#x2F;code&gt; and assigns directly to &lt;code&gt;CAMetalLayer.contents&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;window-decorations&quot;&gt;Window Decorations&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona implements &lt;code&gt;zxdg_decoration_manager_v1&lt;&#x2F;code&gt; with three policies:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Policy&lt;&#x2F;th&gt;&lt;th&gt;Behavior&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Prefer Client&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Client draws its own titlebar (CSD)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Prefer Server&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Wawona draws macOS-native titlebar (SSD)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Force Server&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Always use macOS titlebar, regardless of client preference&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;When Force SSD is enabled, the compositor sends &lt;code&gt;configure(server_side)&lt;&#x2F;code&gt; and the host draws the only window chrome. Clients must not draw CSD.&lt;&#x2F;p&gt;
&lt;p&gt;Configure in &lt;strong&gt;Settings → Display → Force Server-Side Decorations&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;liquid-glass&quot;&gt;Liquid Glass&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona implements Apple&#x27;s &lt;strong&gt;Liquid Glass&lt;&#x2F;strong&gt; design language using &lt;code&gt;NSVisualEffectView&lt;&#x2F;code&gt;, providing vibrant, translucent, depth-aware window chrome that adapts to content behind it.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;performance-benefits&quot;&gt;Performance Benefits&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Low Latency&lt;&#x2F;strong&gt;: &lt;code&gt;IOSurface&lt;&#x2F;code&gt; + Metal bypass traditional buffer copy bottlenecks&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Battery Efficiency&lt;&#x2F;strong&gt;: Native hardware acceleration reduces CPU overhead&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;System Integration&lt;&#x2F;strong&gt;: Full support for Mission Control, Stage Manager, keyboard shortcuts&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Retina&lt;&#x2F;strong&gt;: Automatic HiDPI scaling via the compositor&#x27;s Auto Scale setting&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Nix Build System</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/nix-build-system/"/>
        <id>/docs/nix-build-system/</id>
        
        <content type="html" xml:base="/docs/nix-build-system/">&lt;h1 id=&quot;nix-build-system&quot;&gt;Nix Build System&lt;&#x2F;h1&gt;
&lt;p&gt;How Nix compiles everything in Wawona — from native C libraries to Rust backends to final app bundles for macOS, iOS, and Android.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;why-nix&quot;&gt;Why Nix?&lt;&#x2F;h2&gt;
&lt;p&gt;Nix provides &lt;strong&gt;hermetic, reproducible builds&lt;&#x2F;strong&gt; with a single dependency. No vendored source code, no global system pollution. Every artifact is content-addressed and cached independently.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;three-layer-architecture&quot;&gt;Three-Layer Architecture&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────────────────────┐
│  Layer 3: App Packaging                          │
│  .app bundles, Xcode projects, Gradle projects   │
├──────────────────────────────────────────────────┤
│  Layer 2: Rust Backend (crate2nix)               │
│  Per-crate Nix derivations for incremental       │
│  builds — only changed crates rebuild            │
├──────────────────────────────────────────────────┤
│  Layer 1: Native C&amp;#x2F;C++ Libraries                 │
│  libwayland, xkbcommon, ffmpeg, zstd, lz4,       │
│  openssl, libssh2, mbedtls, etc.                 │
└──────────────────────────────────────────────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;layer-1-native-libraries&quot;&gt;Layer 1: Native Libraries&lt;&#x2F;h2&gt;
&lt;p&gt;Each library has per-platform &lt;code&gt;.nix&lt;&#x2F;code&gt; files in &lt;code&gt;dependencies&#x2F;libs&#x2F;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;dependencies&amp;#x2F;libs&amp;#x2F;
├── ffmpeg&amp;#x2F;        # android.nix, ios.nix, macos.nix
├── libssh2&amp;#x2F;       # android.nix, ios.nix
├── libwayland&amp;#x2F;    # android.nix, ios.nix, macos.nix
├── lz4&amp;#x2F;           # android.nix, ios.nix, macos.nix
├── openssl&amp;#x2F;       # android.nix, ios.nix
├── waypipe&amp;#x2F;       # ios.nix, macos.nix, android.nix
├── xkbcommon&amp;#x2F;     # android.nix, ios.nix, macos.nix
├── zstd&amp;#x2F;          # android.nix, ios.nix, macos.nix
└── ...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;dependencies&#x2F;toolchains&#x2F;default.nix&lt;&#x2F;code&gt; dispatcher exports:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;buildForIOS name entry&lt;&#x2F;code&gt; — dispatches to &lt;code&gt;libs&#x2F;&amp;lt;name&amp;gt;&#x2F;ios.nix&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;buildForMacOS name entry&lt;&#x2F;code&gt; — dispatches to &lt;code&gt;libs&#x2F;&amp;lt;name&amp;gt;&#x2F;macos.nix&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;buildForAndroid name entry&lt;&#x2F;code&gt; — dispatches to &lt;code&gt;libs&#x2F;&amp;lt;name&amp;gt;&#x2F;android.nix&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each library is a standalone Nix derivation. Changing &lt;code&gt;zstd&lt;&#x2F;code&gt; does not rebuild &lt;code&gt;openssl&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;layer-2-rust-backend-crate2nix&quot;&gt;Layer 2: Rust Backend (crate2nix)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;why-crate2nix&quot;&gt;Why crate2nix?&lt;&#x2F;h3&gt;
&lt;p&gt;The previous &lt;code&gt;buildRustPackage&lt;&#x2F;code&gt; approach treated the entire workspace as a single derivation — any Rust change forced a full rebuild.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;crate2nix&lt;&#x2F;strong&gt; generates a separate Nix derivation for every crate in &lt;code&gt;Cargo.lock&lt;&#x2F;code&gt;. Nix caches each independently. Changing one crate only rebuilds that crate and its reverse dependencies.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-pipeline&quot;&gt;The Pipeline&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;Cargo.toml + Cargo.lock
        │
        ▼
crate2nix generates Cargo.nix
        │
        ▼
Per-crate Nix derivations (~120 crates)
        │
        ▼
Final libwawona.a &amp;#x2F; libwawona.so
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;cross-compilation&quot;&gt;Cross-Compilation&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Cargo Target&lt;&#x2F;th&gt;&lt;th&gt;Strategy&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Native (no &lt;code&gt;--target&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Direct build&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iOS device&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;aarch64-apple-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Override &lt;code&gt;stdenv.hostPlatform&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iOS simulator&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;aarch64-apple-ios-sim&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Override &lt;code&gt;stdenv.hostPlatform&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Android&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;aarch64-linux-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;NDK toolchain via override&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;For iOS&#x2F;Android, Nix overrides &lt;code&gt;stdenv.hostPlatform&lt;&#x2F;code&gt; so that &lt;code&gt;buildRustCrate&lt;&#x2F;code&gt; correctly sets &lt;code&gt;TARGET&lt;&#x2F;code&gt;, &lt;code&gt;CARGO_CFG_TARGET_OS&lt;&#x2F;code&gt;, and the &lt;code&gt;--target&lt;&#x2F;code&gt; flag.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;features-by-platform&quot;&gt;Features by Platform&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Enabled Features&lt;&#x2F;th&gt;&lt;th&gt;Why&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;(none)&lt;&#x2F;td&gt;&lt;td&gt;No waypipe in macOS backend&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iOS&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;waypipe-ssh&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;In-process waypipe with static libssh2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Android&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;waypipe&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;In-process waypipe&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;layer-3-app-packaging&quot;&gt;Layer 3: App Packaging&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;macos&quot;&gt;macOS&lt;&#x2F;h3&gt;
&lt;p&gt;Standard &lt;code&gt;mkDerivation&lt;&#x2F;code&gt; that compiles Obj-C sources and links against the Rust backend. Produces a &lt;code&gt;.app&lt;&#x2F;code&gt; bundle.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ios&quot;&gt;iOS&lt;&#x2F;h3&gt;
&lt;p&gt;Two stages:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nix build&lt;&#x2F;strong&gt;: Compiles Obj-C, links &lt;code&gt;libwawona.a&lt;&#x2F;code&gt; + native C libs into &lt;code&gt;.app&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Simulator automation&lt;&#x2F;strong&gt;: Generates Xcode project via &lt;code&gt;xcodegen.nix&lt;&#x2F;code&gt;, builds with &lt;code&gt;xcodebuild&lt;&#x2F;code&gt;, installs, launches, attaches LLDB&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;android&quot;&gt;Android&lt;&#x2F;h3&gt;
&lt;p&gt;Compiles JNI C code, links native libraries, bundles SSH binaries, and uses Gradle for final APK assembly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;project-generators&quot;&gt;Project Generators&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Generator&lt;&#x2F;th&gt;&lt;th&gt;Nix Module&lt;&#x2F;th&gt;&lt;th&gt;Output&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;XcodeGen&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;generators&#x2F;xcodegen.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Wawona.xcodeproj&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GradleGen&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;generators&#x2F;gradlegen.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Gradle project files&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;caching-behavior&quot;&gt;Caching Behavior&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Change&lt;&#x2F;th&gt;&lt;th&gt;Rebuild Scope&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Rust source in &lt;code&gt;src&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Only &lt;code&gt;wawona&lt;&#x2F;code&gt; crate + final assembly&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Waypipe source&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;waypipe&lt;&#x2F;code&gt; crate + &lt;code&gt;wawona&lt;&#x2F;code&gt; crate&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Native C library (e.g. zstd)&lt;&#x2F;td&gt;&lt;td&gt;That library + crates linking it&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;flake.nix&lt;&#x2F;code&gt; or &lt;code&gt;rust-backend-c2n.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;May invalidate crate2nix generation (full rebuild)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Switch platform (e.g. iOS sim → device)&lt;&#x2F;td&gt;&lt;td&gt;Full rebuild (target triple change)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;build-commands&quot;&gt;Build Commands&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Command&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS app (build + launch)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;iOS Simulator (xcodegen + build + run)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#wawona-android&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Android app&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix build .#wawona-macos-backend&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS Rust static library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix build .#wawona-ios-backend&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;iOS device Rust static library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix build .#wawona-ios-sim-backend&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;iOS sim Rust static library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix build .#wawona-android-backend&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Android Rust shared library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#xcodegen&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Generate Xcode project (iOS + macOS)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#xcodegen-ios&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Generate Xcode project (iOS only)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run .#gradlegen&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Generate Gradle project&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;flake-inputs&quot;&gt;Flake Inputs&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Input&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nixpkgs&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Base package set (unstable)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rust-overlay&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Rust toolchain with iOS&#x2F;Android targets&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;crate2nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Per-crate Nix derivation generator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;key-files&quot;&gt;Key Files&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;File&lt;&#x2F;th&gt;&lt;th&gt;Role&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;flake.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Top-level: inputs, overlays, all packages&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;wawona&#x2F;rust-backend-c2n.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;crate2nix Rust backend&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;wawona&#x2F;workspace-src.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cargo workspace assembly&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;wawona&#x2F;ios.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;iOS app bundle + simulator automation&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;wawona&#x2F;macos.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS app bundle&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;wawona&#x2F;android.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Android project&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;toolchains&#x2F;default.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Platform dispatcher&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;generators&#x2F;xcodegen.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Xcode project generator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependencies&#x2F;generators&#x2F;gradlegen.nix&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Gradle project generator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Protocol Support</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/protocols/"/>
        <id>/docs/protocols/</id>
        
        <content type="html" xml:base="/docs/protocols/">&lt;h1 id=&quot;wayland-protocol-support&quot;&gt;Wayland Protocol Support&lt;&#x2F;h1&gt;
&lt;p&gt;Wawona registers &lt;strong&gt;68 protocol globals&lt;&#x2F;strong&gt; at compositor startup. This page documents the implementation status of each protocol.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;status-legend&quot;&gt;Status Legend&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Meaning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;✓ &lt;strong&gt;Functional&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Handles requests, mutates state, sends proper events&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;~ &lt;strong&gt;Partial&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Global registered, some requests handled, incomplete semantics&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;– &lt;strong&gt;Stub&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Global registered, request handlers log only (no state changes)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;Summary:&lt;&#x2F;strong&gt; ~10 Functional, ~8 Partial, ~49 Stub&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;core-protocols-6&quot;&gt;Core Protocols (6)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_compositor&lt;&#x2F;code&gt; v6&lt;&#x2F;td&gt;&lt;td&gt;✓ Functional&lt;&#x2F;td&gt;&lt;td&gt;Surface creation, commit, frame callbacks&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_shm&lt;&#x2F;code&gt; v1&lt;&#x2F;td&gt;&lt;td&gt;✓ Functional&lt;&#x2F;td&gt;&lt;td&gt;Pool creation, buffer creation, mmap&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_seat&lt;&#x2F;code&gt; v8&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Keyboard&#x2F;pointer&#x2F;touch binding works; XKB uses hardcoded minimal keymap fallback&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_output&lt;&#x2F;code&gt; v3&lt;&#x2F;td&gt;&lt;td&gt;✓ Functional&lt;&#x2F;td&gt;&lt;td&gt;Mode, geometry, scale, done events&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_subcompositor&lt;&#x2F;code&gt; v1&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Subsurface creation tracked; z-order and sync&#x2F;desync partially implemented&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wl_data_device_manager&lt;&#x2F;code&gt; v3&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Data source&#x2F;device creation; selection and DnD logic incomplete&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;xdg-protocols-9&quot;&gt;XDG Protocols (9)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xdg_wm_base&lt;&#x2F;code&gt; v5&lt;&#x2F;td&gt;&lt;td&gt;✓ Functional&lt;&#x2F;td&gt;&lt;td&gt;Surface&#x2F;toplevel&#x2F;popup lifecycle, configure&#x2F;ack, ping&#x2F;pong&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zxdg_decoration_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;✓ Functional&lt;&#x2F;td&gt;&lt;td&gt;CSD&#x2F;SSD negotiation, mode switching, Force SSD support&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zxdg_output_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Logical position&#x2F;size sent; updates on output change incomplete&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xdg_activation_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xdg_wm_dialog_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xdg_toplevel_drag_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xdg_toplevel_icon_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zxdg_exporter_v2&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zxdg_importer_v2&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;wlroots-protocols-10&quot;&gt;wlroots Protocols (10)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_layer_shell_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Layer surface creation tracked; anchor&#x2F;margin&#x2F;exclusive zone stored&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_output_management_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_output_power_management_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_foreign_toplevel_management_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_screencopy_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_gamma_control_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_data_control_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_export_dmabuf_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwlr_virtual_pointer_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_virtual_keyboard_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;buffer-sync-5&quot;&gt;Buffer &amp;amp; Sync (5)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_linux_dmabuf_v1&lt;&#x2F;code&gt; v4&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Params creation tracked; IOSurface path for macOS exists; feedback stubbed&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_linux_explicit_synchronization_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_single_pixel_buffer_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_linux_drm_syncobj_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_drm_lease_device_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;input-interaction-10&quot;&gt;Input &amp;amp; Interaction (10)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_relative_pointer_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_pointer_constraints_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_pointer_gestures_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_tablet_manager_v2&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_text_input_manager_v3&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_keyboard_shortcuts_inhibit_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_cursor_shape_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_primary_selection_device_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_input_timestamps_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_pointer_warp_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;presentation-timing-8&quot;&gt;Presentation &amp;amp; Timing (8)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_presentation&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;~ Partial&lt;&#x2F;td&gt;&lt;td&gt;Feedback collection exists; presentation events incomplete&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_viewporter&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_fractional_scale_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_fifo_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_tearing_control_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_commit_timing_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_content_type_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_color_representation_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;session-security-5&quot;&gt;Session &amp;amp; Security (5)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_idle_inhibit_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_session_lock_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_idle_notifier_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_security_context_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_transient_seat_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;desktop-integration-4&quot;&gt;Desktop Integration (4)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wp_alpha_modifier_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_foreign_toplevel_list_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_workspace_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_background_effect_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;screen-capture-xwayland-4&quot;&gt;Screen Capture &amp;amp; XWayland (4)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_output_image_capture_source_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext_image_copy_capture_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zwp_xwayland_keyboard_grab_manager_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xwayland_shell_v1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;kde-plasma-protocols-7&quot;&gt;KDE &#x2F; Plasma Protocols (7)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protocol&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;org_kde_kwin_server_decoration_manager&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Blur manager&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Contrast manager&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Shadow manager&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DPMS manager&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Idle timeout&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Slide manager&lt;&#x2F;td&gt;&lt;td&gt;– Stub&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;&#x2F;h2&gt;
&lt;p&gt;All 68 protocol globals are registered correctly at compositor startup. The issue for stub protocols is not registration — it&#x27;s that request handlers need semantic implementation (state mutations, response events, error handling). Currently, stub handlers log incoming requests via &lt;code&gt;tracing::debug!()&lt;&#x2F;code&gt; but do not implement protocol semantics.&lt;&#x2F;p&gt;
&lt;p&gt;Contributing protocol implementations is one of the most impactful ways to help Wawona. See the &lt;a href=&quot;&#x2F;docs&#x2F;architecture&#x2F;&quot;&gt;Architecture&lt;&#x2F;a&gt; page for how protocol modules are structured.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Settings Reference</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/settings/"/>
        <id>/docs/settings/</id>
        
        <content type="html" xml:base="/docs/settings/">&lt;h1 id=&quot;settings-reference&quot;&gt;Settings Reference&lt;&#x2F;h1&gt;
&lt;p&gt;All configurable settings in Wawona, organized by category. Settings are available on macOS, iOS, and Android unless noted otherwise.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;display&quot;&gt;Display&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Platforms&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Force Server-Side Decorations&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off (macOS&#x2F;iOS), On (Android)&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Compositor draws window borders; clients don&#x27;t draw their own titlebar&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Auto Scale&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Match platform UI scaling (Retina, Android density)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Respect Safe Area&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Avoid notches, Dynamic Island, display cutouts&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Show macOS Cursor&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;macOS&lt;&#x2F;td&gt;&lt;td&gt;Toggle visibility of the macOS system cursor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;graphics&quot;&gt;Graphics&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Platforms&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Vulkan Driver&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;moltenvk&lt;&#x2F;code&gt; (macOS&#x2F;iOS), &lt;code&gt;system&lt;&#x2F;code&gt; (Android)&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Vulkan implementation. macOS&#x2F;iOS: None, MoltenVK, KosmicKrisp. Android: None, SwiftShader, Turnip, System&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OpenGL Driver&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;angle&lt;&#x2F;code&gt; (macOS&#x2F;iOS), &lt;code&gt;system&lt;&#x2F;code&gt; (Android)&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;OpenGL&#x2F;GLES implementation. macOS: None, ANGLE, MoltenGL. iOS: None, ANGLE. Android: None, ANGLE, System&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DmaBuf Support&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Zero-copy texture sharing between clients&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;input&quot;&gt;Input&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Platforms&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Touch Input Type&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Multi-Touch&lt;&#x2F;td&gt;&lt;td&gt;iOS&lt;&#x2F;td&gt;&lt;td&gt;Multi-Touch (direct) or Touchpad mode (1-finger = pointer, tap = click, 2-finger = scroll)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Touchpad Mode&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Android&lt;&#x2F;td&gt;&lt;td&gt;Same behavior as Touchpad on iOS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Swap CMD with ALT&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;macOS, iOS&lt;&#x2F;td&gt;&lt;td&gt;Swap Command and Alt keys for Wayland clients&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Universal Clipboard&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Sync clipboard with host platform&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Text Assist&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Autocorrect, suggestions, smart punctuation&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Dictation&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Voice dictation to focused Wayland client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;connection&quot;&gt;Connection&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;macOS and iOS only.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;XDG_RUNTIME_DIR&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Runtime directory for Wayland socket (read-only)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;WAYLAND_DISPLAY&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Socket name, e.g. &lt;code&gt;wayland-0&lt;&#x2F;code&gt; (read-only)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Socket Path&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full path to Wayland socket (read-only)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Shell Setup&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Copy-paste &lt;code&gt;export&lt;&#x2F;code&gt; commands for your terminal (read-only)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;TCP Port&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Port for TCP listener (default: 6000)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;advanced&quot;&gt;Advanced&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Platforms&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Color Operations&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off (macOS&#x2F;iOS), On (Android)&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Color profiles, HDR requests&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Nested Compositors&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Support nested Wayland compositors&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Multiple Clients&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;On (macOS), Off (mobile)&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Allow multiple Wayland clients simultaneously&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Launcher&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Start built-in Wayland shell&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Native Weston&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Start full Weston compositor on launch&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Weston Terminal&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Start weston-terminal on launch&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Enable Weston Simple SHM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;All&lt;&#x2F;td&gt;&lt;td&gt;Start weston-simple-shm on launch&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;waypipe&quot;&gt;Waypipe&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Display Number&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;td&gt;Display number (0 = wayland-0)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Socket Path&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Platform-specific&lt;&#x2F;td&gt;&lt;td&gt;Unix socket path&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Compression&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;lz4&lt;&#x2F;td&gt;&lt;td&gt;none, lz4, zstd&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Compression Level&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;7&lt;&#x2F;td&gt;&lt;td&gt;Zstd level (1–22)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Threads&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0 (auto)&lt;&#x2F;td&gt;&lt;td&gt;Worker thread count&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Video Compression&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;none&lt;&#x2F;td&gt;&lt;td&gt;none, h264, vp9, av1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Remote Command&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Command to run remotely (e.g. &lt;code&gt;weston-terminal&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Debug Mode&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Verbose waypipe logging&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Disable GPU&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Force software rendering&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;One-shot&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Exit when client disconnects&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Login Shell&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Run in login shell on remote&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;ssh&quot;&gt;SSH&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;Default&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SSH Host&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Remote host IP or hostname&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SSH User&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;SSH username&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Auth Method&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Password&lt;&#x2F;td&gt;&lt;td&gt;Password or Public Key&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Password&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;SSH password&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Key Path&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;.ssh&#x2F;id_ed25519&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Path to private key&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Key Passphrase&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Passphrase for encrypted key&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;platform-defaults-summary&quot;&gt;Platform Defaults Summary&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;&#x2F;th&gt;&lt;th&gt;macOS&lt;&#x2F;th&gt;&lt;th&gt;iOS&lt;&#x2F;th&gt;&lt;th&gt;Android&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Force SSD&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Multiple Clients&lt;&#x2F;td&gt;&lt;td&gt;On&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;td&gt;Off&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Vulkan Driver&lt;&#x2F;td&gt;&lt;td&gt;moltenvk&lt;&#x2F;td&gt;&lt;td&gt;moltenvk&lt;&#x2F;td&gt;&lt;td&gt;system&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;OpenGL Driver&lt;&#x2F;td&gt;&lt;td&gt;angle&lt;&#x2F;td&gt;&lt;td&gt;angle&lt;&#x2F;td&gt;&lt;td&gt;system&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;storage&quot;&gt;Storage&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS &#x2F; iOS&lt;&#x2F;strong&gt;: &lt;code&gt;NSUserDefaults&lt;&#x2F;code&gt; (UserDefaults)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;: &lt;code&gt;SharedPreferences&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Usage Guide</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/usage/"/>
        <id>/docs/usage/</id>
        
        <content type="html" xml:base="/docs/usage/">&lt;h1 id=&quot;usage-guide&quot;&gt;Usage Guide&lt;&#x2F;h1&gt;
&lt;p&gt;How to run Wayland apps with Wawona — locally and remotely.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;native-weston-on-macos&quot;&gt;Native Weston on macOS&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona includes a &lt;strong&gt;native port of Weston&lt;&#x2F;strong&gt; for macOS. No Linux, no VM — Weston runs as a nested compositor client inside Wawona.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;weston-full-compositor&quot;&gt;Weston (Full Compositor)&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#weston
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Launches the full Weston compositor as a nested client inside Wawona&#x27;s Wayland session.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;weston-terminal&quot;&gt;Weston Terminal&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#weston-terminal
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Launches Weston Terminal — a native Wayland terminal client connected to Wawona&#x27;s display.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;other-weston-clients&quot;&gt;Other Weston Clients&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#weston-debug         # Weston debug client
nix run .#weston-simple-shm    # Simple SHM test client
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;enable-bundled-clients-from-settings&quot;&gt;Enable Bundled Clients From Settings&lt;&#x2F;h3&gt;
&lt;p&gt;You can also enable Weston and other bundled clients to &lt;strong&gt;auto-launch&lt;&#x2F;strong&gt; when Wawona starts — no terminal needed:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Wawona&lt;&#x2F;strong&gt; → &lt;strong&gt;Settings&lt;&#x2F;strong&gt; → &lt;strong&gt;Advanced&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Toggle on any combination:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable Native Weston&lt;&#x2F;strong&gt; — starts the full Weston nested compositor&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Enable Weston Terminal&lt;&#x2F;strong&gt; — starts a weston-terminal client&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Enable Weston Simple SHM&lt;&#x2F;strong&gt; — starts the simple SHM test client&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This works on &lt;strong&gt;macOS, iOS, and Android&lt;&#x2F;strong&gt; — useful when you don&#x27;t have terminal access (mobile) or want clients to start automatically.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;connecting-wayland-clients-locally&quot;&gt;Connecting Wayland Clients Locally&lt;&#x2F;h2&gt;
&lt;p&gt;When Wawona is running, any Wayland client can connect via the Wayland socket.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;set-up-your-shell&quot;&gt;Set Up Your Shell&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;export XDG_RUNTIME_DIR=&amp;quot;&amp;#x2F;tmp&amp;#x2F;wawona-$(id -u)&amp;quot;
export WAYLAND_DISPLAY=&amp;quot;wayland-0&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can also find these values in &lt;strong&gt;Settings → Connection&lt;&#x2F;strong&gt; inside the Wawona app.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;run-a-client&quot;&gt;Run a Client&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# With the exports above, run any Wayland client:
nix run .#weston-terminal
nix run .#foot
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;waypipe-remote-wayland-apps&quot;&gt;Waypipe: Remote Wayland Apps&lt;&#x2F;h2&gt;
&lt;p&gt;Waypipe forwards Wayland applications over SSH. Run apps on a remote machine and display them on your device.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;quick-start-macos&quot;&gt;Quick Start (macOS)&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure Wawona is running&lt;&#x2F;li&gt;
&lt;li&gt;Set up your shell (see above)&lt;&#x2F;li&gt;
&lt;li&gt;Run waypipe:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;nix run .#waypipe -- ssh user@remote-host weston-terminal
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;quick-start-ios-android&quot;&gt;Quick Start (iOS &#x2F; Android)&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Wawona&lt;&#x2F;strong&gt; → &lt;strong&gt;Settings&lt;&#x2F;strong&gt; → &lt;strong&gt;Waypipe&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set &lt;strong&gt;SSH Host&lt;&#x2F;strong&gt;, &lt;strong&gt;SSH User&lt;&#x2F;strong&gt;, &lt;strong&gt;SSH Password&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set &lt;strong&gt;Remote Command&lt;&#x2F;strong&gt; (e.g., &lt;code&gt;nix run ~&#x2F;Wawona#weston-terminal&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Tap &lt;strong&gt;Start Waypipe&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;remote-command-examples&quot;&gt;Remote Command Examples&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Command&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run ~&#x2F;Wawona#weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Weston Terminal (if Wawona repo on remote)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Weston Terminal (if installed on remote)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;foot&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Foot terminal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run ~&#x2F;Wawona#weston&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full Weston compositor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gnome-calculator&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;GNOME Calculator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;prepare-a-remote-mac&quot;&gt;Prepare a Remote Mac&lt;&#x2F;h3&gt;
&lt;p&gt;If your remote host is a Mac:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;bash scripts&amp;#x2F;prepare_mac_remote.sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This verifies Remote Login (SSH) is enabled, Waypipe is available, and Weston Terminal is buildable.&lt;&#x2F;p&gt;
&lt;p&gt;For detailed waypipe configuration, see &lt;a href=&quot;&#x2F;docs&#x2F;waypipe&#x2F;&quot;&gt;Waypipe Guide&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;platform-notes&quot;&gt;Platform Notes&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;Local Weston&lt;&#x2F;th&gt;&lt;th&gt;Waypipe Transport&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;nix run .#weston&lt;&#x2F;code&gt;, &lt;code&gt;.#weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;OpenSSH (process spawn)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Via Settings → Advanced toggles&lt;&#x2F;td&gt;&lt;td&gt;libssh2 (in-process)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Via Settings → Advanced toggles&lt;&#x2F;td&gt;&lt;td&gt;Dropbear SSH (fork&#x2F;exec)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;On iOS and Android, enable &lt;strong&gt;Native Weston&lt;&#x2F;strong&gt; and &lt;strong&gt;Weston Terminal&lt;&#x2F;strong&gt; in &lt;strong&gt;Settings → Advanced&lt;&#x2F;strong&gt; to auto-launch on app start.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Waypipe Guide</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/docs/waypipe/"/>
        <id>/docs/waypipe/</id>
        
        <content type="html" xml:base="/docs/waypipe/">&lt;h1 id=&quot;waypipe-guide&quot;&gt;Waypipe Guide&lt;&#x2F;h1&gt;
&lt;p&gt;Waypipe forwards Wayland applications over SSH. Run apps on a remote Linux or Mac machine and display them on your device running Wawona.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;platform-overview&quot;&gt;Platform Overview&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;&#x2F;th&gt;&lt;th&gt;SSH Transport&lt;&#x2F;th&gt;&lt;th&gt;Buffer Path&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;OpenSSH (process spawn)&lt;&#x2F;td&gt;&lt;td&gt;IOSurface → Metal&lt;&#x2F;td&gt;&lt;td&gt;Working&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;libssh2 (in-process)&lt;&#x2F;td&gt;&lt;td&gt;IOSurface → Metal&lt;&#x2F;td&gt;&lt;td&gt;Working&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Dropbear SSH (fork&#x2F;exec)&lt;&#x2F;td&gt;&lt;td&gt;SHM → Vulkan&lt;&#x2F;td&gt;&lt;td&gt;Working&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;quick-start&quot;&gt;Quick Start&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;macos-command-line&quot;&gt;macOS (Command Line)&lt;&#x2F;h3&gt;
&lt;p&gt;With Wawona running:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;export XDG_RUNTIME_DIR=&amp;quot;&amp;#x2F;tmp&amp;#x2F;wawona-$(id -u)&amp;quot;
export WAYLAND_DISPLAY=&amp;quot;wayland-0&amp;quot;

nix run .#waypipe -- ssh user@remote-host weston-terminal
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;ios-android-in-app&quot;&gt;iOS &#x2F; Android (In-App)&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Wawona&lt;&#x2F;strong&gt; → &lt;strong&gt;Settings&lt;&#x2F;strong&gt; → &lt;strong&gt;Waypipe&lt;&#x2F;strong&gt; (or &lt;strong&gt;SSH&lt;&#x2F;strong&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSH Host&lt;&#x2F;strong&gt;: IP address or hostname of the remote machine&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSH User&lt;&#x2F;strong&gt;: Your username on the remote&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSH Password&lt;&#x2F;strong&gt;: Your login password (or configure Public Key auth)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Remote Command&lt;&#x2F;strong&gt;: The app to run, e.g., &lt;code&gt;nix run ~&#x2F;Wawona#weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Tap &lt;strong&gt;Start Waypipe&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;prepare-a-remote-mac&quot;&gt;Prepare a Remote Mac&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;bash scripts&amp;#x2F;prepare_mac_remote.sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This checks that Remote Login (SSH) is enabled, Python 3 is installed, and Waypipe is available.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;remote-command-examples&quot;&gt;Remote Command Examples&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Command&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run ~&#x2F;Wawona#weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Weston Terminal (Wawona repo on remote)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Weston Terminal (if installed)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;foot&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Foot terminal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nix run ~&#x2F;Wawona#weston&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full Weston compositor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;geary&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Geary email client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gnome-calculator&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;GNOME Calculator&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;macos&quot;&gt;macOS&lt;&#x2F;h3&gt;
&lt;p&gt;Waypipe runs as a local process that connects to Wawona&#x27;s Wayland socket, then spawns an SSH connection to the remote host. The remote waypipe server captures Wayland protocol data and forwards it through the SSH tunnel.&lt;&#x2F;p&gt;
&lt;p&gt;Buffer sharing uses &lt;strong&gt;IOSurface&lt;&#x2F;strong&gt; for zero-copy Metal rendering.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ios-libssh2-streamlocal&quot;&gt;iOS — libssh2 + Streamlocal&lt;&#x2F;h3&gt;
&lt;p&gt;iOS can&#x27;t spawn processes, so Wawona uses &lt;strong&gt;libssh2&lt;&#x2F;strong&gt; in-process with &lt;code&gt;streamlocal-forward@openssh.com&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;iOS App                        SSH                          Remote
──────────────────────────────────────────────────────────────────
1. connect_ssh2()
   ├── TCP connect + handshake + auth
   ├── streamlocal-forward  ──────►  sshd creates
   │   (path=&amp;#x2F;tmp&amp;#x2F;wp-XXX.sock)       &amp;#x2F;tmp&amp;#x2F;wp-XXX.sock
   │
   ├── exec channel:  ──────────►  waypipe --socket
   │   waypipe server -- &amp;lt;app&amp;gt;       &amp;#x2F;tmp&amp;#x2F;wp-XXX.sock
   │                                 server -- &amp;lt;app&amp;gt;
   │
   └── bridge thread: pumps data
       forwarded channel ↔ local socket
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Remote requirements:&lt;&#x2F;strong&gt; Stock waypipe + OpenSSH ≥ 6.7. No socat, nc, or patched tools needed.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;android-dropbear-ssh&quot;&gt;Android — Dropbear SSH&lt;&#x2F;h3&gt;
&lt;p&gt;Android bundles &lt;strong&gt;Dropbear SSH&lt;&#x2F;strong&gt; (lightweight SSH client) as a static ARM64 executable:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;SSH binaries packaged as &lt;code&gt;libssh_bin.so&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;libsshpass_bin.so&lt;&#x2F;code&gt; in the APK&lt;&#x2F;li&gt;
&lt;li&gt;Android extracts them at install time&lt;&#x2F;li&gt;
&lt;li&gt;Waypipe Rust backend exposes &lt;code&gt;waypipe_main()&lt;&#x2F;code&gt; for JNI&lt;&#x2F;li&gt;
&lt;li&gt;SSH bridge thread: &lt;code&gt;fork()&lt;&#x2F;code&gt; → &lt;code&gt;exec(dbclient)&lt;&#x2F;code&gt; with &lt;code&gt;SSHPASS&lt;&#x2F;code&gt; env&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;compression&quot;&gt;Compression&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Option&lt;&#x2F;th&gt;&lt;th&gt;Speed&lt;&#x2F;th&gt;&lt;th&gt;Ratio&lt;&#x2F;th&gt;&lt;th&gt;Use Case&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;none&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Fastest&lt;&#x2F;td&gt;&lt;td&gt;1:1&lt;&#x2F;td&gt;&lt;td&gt;Local network&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;lz4&lt;&#x2F;strong&gt; (default)&lt;&#x2F;td&gt;&lt;td&gt;Fast&lt;&#x2F;td&gt;&lt;td&gt;Good&lt;&#x2F;td&gt;&lt;td&gt;General use&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;zstd&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Slower&lt;&#x2F;td&gt;&lt;td&gt;Better&lt;&#x2F;td&gt;&lt;td&gt;Slow connections&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Configure in &lt;strong&gt;Settings → Waypipe → Compression&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Issue&lt;&#x2F;th&gt;&lt;th&gt;Fix&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&quot;streamlocal-forward failed&quot;&lt;&#x2F;td&gt;&lt;td&gt;Check &lt;code&gt;AllowStreamLocalForwarding&lt;&#x2F;code&gt; in &lt;code&gt;sshd_config&lt;&#x2F;code&gt; (default: yes)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&quot;Timed out waiting for channel&quot;&lt;&#x2F;td&gt;&lt;td&gt;Verify waypipe is installed and in PATH on remote&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&quot;Missing Wayland socket&quot;&lt;&#x2F;td&gt;&lt;td&gt;Start a Wayland compositor on the remote first&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Remote command not found&lt;&#x2F;td&gt;&lt;td&gt;Use full path: &lt;code&gt;nix run ~&#x2F;Wawona#weston-terminal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Black screen after connect&lt;&#x2F;td&gt;&lt;td&gt;Check that the remote app supports Wayland&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing Wawona: A Nested Wayland Compositor for macOS</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/introducing-wawona/"/>
        <id>/posts/introducing-wawona/</id>
        
        <content type="html" xml:base="/posts/introducing-wawona/">&lt;p&gt;Wawona isn’t just another display server—it is a native Wayland substrate designed from the ground up for the Apple and Android ecosystems. We are bringing high-performance, bare-metal Wayland execution to the hardware where it was previously impossible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-wawona&quot;&gt;Why Wawona?&lt;&#x2F;h2&gt;
&lt;p&gt;For years, running Wayland applications on a Mac meant living in a Virtual Machine or a slow emulation layer. Wawona changes that. By implementing a native Wayland compositor in Rust and targeting platform-native graphics APIs, we provide a bridge between the Linux ecosystem and Apple&#x2F;Android hardware without the overhead of a guest OS.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;high-performance-architecture&quot;&gt;High-Performance Architecture&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona is built on three core pillars that ensure it feels like a first-class citizen on every platform it touches:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-the-rust-core&quot;&gt;1. The Rust Core&lt;&#x2F;h3&gt;
&lt;p&gt;The heart of Wawona is a shared Rust backend managing the complex state of a Wayland compositor. With over &lt;strong&gt;186 Rust crates&lt;&#x2F;strong&gt; integrated into our core, we handle everything from protocol registration to internal surface management with memory safety and high concurrency.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-native-graphics-frontends&quot;&gt;2. Native Graphics Frontends&lt;&#x2F;h3&gt;
&lt;p&gt;We don&#x27;t rely on generic abstraction layers.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Liquid Glass (macOS &amp;amp; iOS)&lt;&#x2F;strong&gt;: A bespoke Metal-based rendering engine that leverages &lt;strong&gt;zero-copy IOSurface integration&lt;&#x2F;strong&gt; for near-instant frame delivery.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Android Vulkan&lt;&#x2F;strong&gt;: A specialized Vulkan frontend designed for the mobile GPU pipeline.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3-the-nix-build-system&quot;&gt;3. The Nix Build System&lt;&#x2F;h3&gt;
&lt;p&gt;Developing across Three platforms (macOS, iOS, Android) usually requires a nightmare of SDK management. Wawona uses &lt;strong&gt;Nix&lt;&#x2F;strong&gt; to provide a hermetic, reproducible environment. We cross-compile &lt;strong&gt;27 native C&#x2F;C++ libraries&lt;&#x2F;strong&gt; (like FFmpeg, OpenSSL, and Weston) for every target automatically.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;beyond-macos&quot;&gt;Beyond macOS&lt;&#x2F;h2&gt;
&lt;p&gt;While Wawona started as a macOS project, our vision is multi-platform.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iOS&lt;&#x2F;strong&gt;: A native iPadOS&#x2F;iOS app that turns your mobile device into a portable Wayland workstation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Android&lt;&#x2F;strong&gt;: A Kotlin&#x2F;JNI frontend that bundles its own Dropbear SSH and Vulkan rendering stack.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;&#x2F;h2&gt;
&lt;p&gt;Wawona is currently in active development (v0.2.x). Whether you are looking to run remote apps via &lt;strong&gt;Waypipe&lt;&#x2F;strong&gt; or test native Wayland clients locally, we are building the fastest way to bridge your Linux-style workflows into the hardware you love.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;docs&#x2F;getting-started&#x2F;&quot;&gt;Read our Documentation&lt;&#x2F;a&gt; to start building, or check the &lt;a href=&quot;&#x2F;faq&#x2F;&quot;&gt;FAQ&lt;&#x2F;a&gt; for deep-dives into our architecture.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
