Wawona is a native Wayland Compositor for macOS, iOS, and Android.

More previews
<img src="https://github.com/Wawona/Wawona/raw/v0.2.4/gallery/wawona_nested_xfce.png" alt="Wawona - Wayland Compositor Preview 2" width="800"/>
<img src="https://github.com/Wawona/Wawona/raw/v0.2.4/gallery/wawona_nested_cosmic.png" alt="Wawona - Wayland Compositor Preview 3" width="800"/>
Project Vision: Read about long-term objectives in Project Goals.
Wawona is engineering the world's first App Store–compliant bundled native Z shell on iOS and iPadOS — real zsh + upstream Weston terminal.c, not a remote SSH passthrough or x86 Linux guest. Full architecture, compliance model, Nix plan, spawn policy, and TestFlight checklist:
→ docs/ios-local-shell/README.md
This project uses a simple .envrc file to manage your Apple Development Team ID.
Create or edit .envrc:
bash
echo 'export TEAM_ID="your_apple_team_id_here"' > .envrc
Replace your_apple_team_id_here with your actual Apple Development Team ID.
The environment is automatically loaded when you use nix develop - no additional tools required!
For build targets and Nix pipeline details, see Compilation Guide and Nix Build System. Cross-compiled libraries and toolchains live in upstream
wwn-toolchainand siblingwwn-*repos; Wawona's flake wires them in as inputs.
Use Wawona as a flake input, add its overlay so pkgs.wawona behaves like a normal nixpkgs package, and run Wawona's installer during activation. The installer step is important: pkgs.wawona puts the app wrapper in your profile, while the installer performs the same extra setup as nix run .#install, including the compositor and menubar LaunchAgents.
Example flake.nix with nix-darwin:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-darwin.url = "github:LnL7/nix-darwin";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
wawona.url = "github:Wawona/Wawona/development";
wawona.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = inputs@{ nix-darwin, wawona, ... }: {
darwinConfigurations.my-mac = nix-darwin.lib.darwinSystem {
system = "aarch64-darwin";
modules = [
({ pkgs, ... }: {
nixpkgs.overlays = [ wawona.overlays.default ];
environment.systemPackages = [
pkgs.wawona
];
system.activationScripts.postActivation.text = ''
${wawona.packages.${pkgs.stdenv.hostPlatform.system}.install}/bin/install
'';
})
];
};
};
}
After applying your flake, Wawona is available as pkgs.wawona, and the activation hook writes and loads the Wawona LaunchAgents for the current macOS user. To remove those LaunchAgents later, run nix run github:Wawona/Wawona/development#wawona-uninstall.
nix run .#weston (full compositor) or nix run .#weston-terminal (terminal client)nix run ~/Wawona#weston-terminal), tap Run WaypipeSee Usage Guide and Settings Reference.
nix run .#wawona-wearosadb, it performs install/launch smoke checks.nix run .#wawona-linux-vmkvm on Linux when available; on macOS uses hvf and falls back to tcg if unavailable.hm. Fresh out of luck, I guess! ¯\_(ツ)_/¯
I use Nix to maintain a clean repository free of vendored dependency source code while ensuring hermetic, reproducible builds across all platforms. Nix allows us to define precise build environments for iOS, macOS, and Android without polluting your system.
libwayland or ffmpeg, is pinned to exact versions in flake.lock. This guarantees that if it builds on CI, it will build on your machine.nix develop (or using direnv) automatically enters a shell with all required compilers, headers, and auxiliary tools (like xcodegen or android-sdk) ready to go.flake.nix exports clean, reusable packages and development shells. You can easily integrate Wawona into other NixOS configurations or use its individual modules as building blocks for your own Wayland projects.B
*tch, I worked hard to make nix your ONLY dependency, use it!
Cross-compiling for iOS still depends on Apple's proprietary SDKs and toolchains, so Wawona now follows the same high-level pattern as Nixpkgs xcodeenv: expose the host Xcode installation as an impure Nix package, build the Rust and native dependencies with Nix, then let xcodebuild package the app.
The Apple integration is centralized in dependencies/apple/ and is modeled after nix-xcodeenvtests. This keeps iOS and macOS Xcode discovery, SDK checks, and simulator helpers in one place.
The Apple integration layer now does four distinct jobs:
1. Expose host Xcode into Nix through a thin xcodeenv-style wrapper.
2. Build Rust/static dependencies such as libwawona.a and the iOS support libraries with Nix.
3. Generate the Xcode project with store-path references to those prebuilt artifacts.
4. Package or launch the app through first-class flake outputs.
This keeps the wrapper minimal and lets the same flow work on local machines and on GitHub macOS runners.
nix build .#wawona-ios-app-simnix build .#wawona-ios-app-devicenix build .#weston-compositor-ios — nested Weston (Wayland/Pixman)nix build .#weston-compositor-ios-drm — nested Weston DRM+GL archive (CI)nix build .#wawona-ios-ipa --impurenix build .#wawona-ios-xcarchive --impurenix run .#wawona-iosnix run .#wawona-ios-projectnix run .#wawona-ios-provisionNested Weston on iOS presents in-process via Settings → Compositor clients. Two backends are available:
| Setting | Backend | Presentation |
|---|---|---|
| Wayland (Pixman) — default | --backend=wayland --use-pixman |
xdg_toplevel in Wawona window |
| iland DRM (GL) | --backend=drm |
Metal overlay (WWNIlandPresenter) |
Production weston.ini, bundled terminal.png, and Adwaita cursors ship in the app bundle. Startup target: panel visible within ~2s on the Pixman path.
xcode-select, unless the default selected Xcode is already correct. CI selects the highest Xcode*.app version and exports XCODE_APP before running Nix builds.TEAM_ID and build with --impure so the automatic-signing path can see it.Example:
export TEAM_ID="YOURTEAMID"
nix build .#wawona-ios-ipa --impure
For fast Xcode iteration after a warm Nix store, see Compilation Guide — Xcode Iteration.
Wawona is a massive undertaking to bring a native Wayland compositor to Apple platforms and Android, and I cannot sustain this project alone. Your support whether through code, issues, ideas, or donations is essential to its progress and survival.
You can help by:
Thank you for being part of the journey!
Donate here: Ko‑fi: https://ko-fi.com/aspauldingcode
Share Wawona with friends!
https://discord.gg/wHVSV52uw5
This project is licensed under the MIT License - see the LICENSE file for details.
Third-party dependencies (Rust crates, native libs, Android) use MIT, Apache 2.0, BSD, MPL-2.0, LGPL, or GPL as applicable. For a full list and how to disclose them, see Third-Party Licenses. A NOTICE template is in NOTICE.example.
$ claude mcp add Wawona \
-- python -m otcore.mcp_server <graph>