Common questions about building, running, and developing with Wawona.
Building & Installation
Why does the Nix build take so long?
The first build is slow because Nix compiles everything from source — there are no pre-built binaries. Here's what it builds:
Native C/C++ Libraries (27 packages):
| Library | Purpose | Approx. Build Size |
|---|---|---|
| FFmpeg | Video codec support (waypipe) | ~150 MB |
| OpenSSL | TLS/crypto | ~60 MB |
| KosmicKrisp / MoltenVK | Vulkan-over-Metal | ~200 MB |
| ANGLE | OpenGL-over-Metal | ~180 MB |
| libwayland | Wayland protocol library | ~8 MB |
| xkbcommon | Keyboard layout handling | ~12 MB |
| Weston | Nested compositor + clients | ~40 MB |
| pixman | Pixel manipulation | ~5 MB |
| zstd + lz4 | Compression (waypipe) | ~8 MB |
| freetype + fontconfig | Font rendering | ~25 MB |
| Other (15 libs) | libffi, expat, libxml2, etc. | ~50 MB |
Rust Backend (186 crates):
| Component | Crates | Approx. Build Size |
|---|---|---|
| Wayland protocol crates | ~15 | ~30 MB |
| FFI / UniFFI | ~10 | ~15 MB |
| Crypto / networking | ~20 | ~25 MB |
| Serialization / parsing | ~30 | ~20 MB |
| Core utilities | ~111 | ~40 MB |
Platform Tooling:
| Tool | Purpose | Approx. Size |
|---|---|---|
| Rust toolchain | Compiler + std for 4 targets | ~800 MB |
| Xcode CLI tools | iOS SDK, simulator runtimes | ~5–15 GB |
| Android NDK + SDK | Cross-compilation, emulator | ~3–8 GB |
Total first build: ~30–60 minutes depending on your Mac's CPU and SSD speed.
Good news: Subsequent builds are fast (~10–30 seconds) because Nix caches every derivation. Only changed crates rebuild.
Why does Wawona require so much storage space?
Wawona's Nix store footprint is large because it builds an entire graphics stack, compositor, and cross-compilation toolchains from source. Here's the breakdown:
Per-Platform Storage Estimate:
| Component | macOS | iOS | Android |
|---|---|---|---|
| Rust toolchain (4 targets) | 800 MB | 800 MB | 800 MB |
| Native C/C++ libraries | 750 MB | 900 MB | 700 MB |
| Rust backend (186 crates) | 130 MB | 130 MB | 130 MB |
| App bundle | 60 MB | 80 MB | 120 MB |
| Graphics drivers (CTS, Mesa) | 400 MB | 400 MB | 200 MB |
| Platform SDK (Xcode / NDK) | — | 5–15 GB | 3–8 GB |
| Subtotal | ~2.1 GB | ~7–17 GB | ~5–10 GB |
Why so big?
- No shared system libraries — Nix builds everything hermetically. Even
zlibandlibffiare compiled from source rather than using system copies - Multiple target triples — iOS needs
aarch64-apple-ios+aarch64-apple-ios-sim; Android needsaarch64-linux-android; macOS needs native. Each target has its own compiled copy of every library - Graphics stacks — MoltenVK, KosmicKrisp, ANGLE, SwiftShader are complete GPU driver implementations
- Weston — a full reference compositor compiled for macOS, with all its dependencies
- FFmpeg — full multimedia framework for waypipe video compression
Mitigation: Run nix store gc periodically to clean up old build artifacts. Only the current generation is kept.
Why do I have to install Nix?
Nix is the only dependency you need to install — it replaces every other tool:
| Without Nix | With Nix |
|---|---|
| Install Rust via rustup | Nix provides the exact Rust version |
| Install Xcode CLI tools | Nix wraps xcodebuild |
| Install Android SDK + NDK | Nix provides NDK, SDK, emulator |
| Install CMake, Meson, pkg-config | Nix provides all build tools |
| Install 27 C libraries manually | Nix builds them from source |
| Hope versions are compatible | Nix guarantees reproducibility |
Why not Cargo alone? Wawona depends on 27 native C/C++ libraries (libwayland, xkbcommon, FFmpeg, OpenSSL, etc.) that don't exist on macOS. Cargo can compile Rust crates, but it can't build C libraries, cross-compile for iOS/Android, or manage platform SDKs.
Why not Homebrew? Homebrew installs pre-built macOS binaries, but Wawona needs iOS and Android cross-compiled variants of every library. Homebrew can't cross-compile.
Nix gives you:
- Reproducible builds — same result on every Mac
- Hermetic isolation — doesn't pollute your system
- Cross-compilation — one command for macOS, iOS, and Android
- Incremental caching — only rebuild what changed
We recommend Determinate Nix because it enables flakes out of the box.
Why can't I just download a pre-built DMG, IPA, or APK?
We're working on it! Pre-built binaries are planned but not available yet. Here's the status:
| Platform | Format | Status |
|---|---|---|
| macOS | .dmg | Planned — needs code signing + notarization |
| iOS | TestFlight .ipa | Planned — setting up Fastlane for beta distribution |
| Android | .apk | Planned — needs signing key + Play Store or direct download |
Why not yet?
- Code signing — Apple requires a paid Developer Program enrollment ($99/year) for distributing .app and .ipa files. We're a student-funded project
- Fastlane setup — We're planning to integrate Fastlane for automated TestFlight and Play Store deployment, but the CI/CD pipeline isn't configured yet
- Rapid development — Wawona is still in active development (v0.2.2). Building from source ensures you always get the latest version with all protocol improvements
For now: nix run is the fastest way to build and launch. Once Fastlane is configured, beta testers will be able to install directly via TestFlight (iOS) or sideload an APK (Android).
Using Wawona
How do I port Linux software to macOS with Wawona?
Wawona doesn't "port" Linux apps — it runs them as-is by implementing the Wayland protocol natively on macOS. Here's how it works:
What Wawona does:
- Creates a Wayland compositor socket (
wayland-0) on macOS - Any Wayland client that connects to this socket can display its windows
- Wawona translates Wayland protocol messages into native macOS rendering (Metal) and input (NSEvent)
How to run a Linux Wayland app on your Mac:
| Method | How | Best For |
|---|---|---|
| Build locally | Cross-compile the app for macOS using Nix | Apps with few dependencies |
| Waypipe (remote) | Run on a Linux server, display on Mac via SSH | Complex apps, no porting needed |
| Weston (nested) | Run inside Weston, which runs inside Wawona | Testing, development |
Example — Running a remote Linux app:
# On your Mac, with Wawona running:
nix run .#waypipe -- ssh user@linux-server foot
This runs foot (a Wayland terminal) on the Linux server and displays it on your Mac through Wawona. No porting required.
Example — Building a Wayland app locally:
If the app supports Wayland and compiles on macOS (or can be cross-compiled with Nix), you can add it as a Nix package in dependencies/libs/ following the same pattern as Weston. The key requirements are:
- The app must use the Wayland protocol (not X11)
- It must link against
libwayland-client(which Wawona builds for macOS) - Any Linux-specific APIs (epoll, signalfd, etc.) need shims — Wawona includes
epoll-shimfor this
What Wayland protocols are supported?
Wawona registers 68 Wayland protocol globals, but not all are fully implemented yet:
| Status | Count | Meaning |
|---|---|---|
| ✓ Functional | ~10 | Full request handling, state management, events |
| ~ Partial | ~8 | Some requests work, others are incomplete |
| – Stub | ~49 | Registered but handlers only log — no state changes |
Fully functional protocols include: wl_compositor, wl_shm, wl_output, xdg_wm_base, and zxdg_decoration_manager_v1.
For the complete list, see Protocol Support.
Does Wawona work on Intel Macs?
Currently, Wawona targets Apple Silicon (M1, M2, M3, M4) only. Intel Mac support is not actively tested or maintained. The Nix build system and Rust backend could theoretically compile for x86_64-darwin, but the Metal rendering pipeline and native libraries are only validated on ARM64.
Development
How do I set up iOS device signing?
See the full walkthrough in the Getting Started — Team ID guide. The short version:
- Run
nix run .#xcodegento generate the Xcode project - Open in Xcode → Signing & Capabilities → sign in and select your team
- Copy the Team ID from the
.pbxprojfile - Save it:
echo 'export TEAM_ID="YOUR_ID"' > .envrc - From now on:
nix develop→nix run .#xcodegenauto-fills your signing identity
How do I contribute protocol implementations?
Protocol modules live in src/core/wayland/ and follow a consistent pattern:
- Pick a stub protocol from the Protocol Support page (– status)
- Study the spec at wayland.app for the protocol's expected behavior
- Implement handlers — turn the
tracing::debug!()stubs into real state mutations and response events - Test with a known client that uses that protocol (e.g.,
footforzwp_text_input_manager_v3)
See Architecture for how the source is organized.