Home/Hardware Tinkering/ztOS
ztOS
A phone operating system with Windows Phone 8.1's look and motion, on Arch Linux ARM and mainline Linux, running on a Galaxy S9, with its own shell, apps, SDK and an image builder for other phones.
- When
- 2026
- Built with
- C, Python, Qt 6, OpenGL ES, wlroots, Linux kernel, Arch Linux ARM



ztOS started on Stargate, as the system I put together for my first desktop. This is its second life: a phone operating system. It's my own shell, ztMETRO, which looks and moves like Windows Phone 8.1, on an ordinary Arch Linux ARM system with a mainline kernel. It runs every day on a Samsung Galaxy S9, and in an emulator for anyone without one.
It's alpha, version 0.1.0 alpha 2. The S9's display, GPU, touch, Wi-Fi, 4G data, speaker and sensors all work. Calls connect but nobody is heard yet, and there's no suspend.
flowchart LR M["ztMETRO, the shell"] --> SV N["Native apps in C"] --> SV S["SDK apps in Python and Qt"] --> SV SV["ztOS's services: sensors, networking, audio, power"] --> K["Mainline Linux 7.1 on the Galaxy S9"] A["Arch Linux ARM"] --- SV Z["ztConflo"] -. "images for other phones" .-> A
ztMETRO
ztMETRO is a Wayland compositor on wlroots that is the whole phone interface: Start and its live tiles, the app list, the action centre, the app switcher, the lock screen and the keyboard. I measured its motion frame by frame against screen recordings of real Lumias, so a tile tilts under your finger and Start swings away the way it did on Windows Phone.
It draws itself with OpenGL ES. Every tile, bar and app is a textured quad with its own matrix, text is drawn once and kept as a texture, and nothing is drawn while nothing moves. One setting sets the speed of every animation, in the shell and in the apps. It's 75% by default.
The apps and the SDK
The built-in apps are written in C on ZrnMetroCore, a small toolkit with the shell's own widgets and page turns: Settings, Phone, Messaging, People and ZrnDevTest, which shows what the hardware reports. Firefox, Chromium and other Linux apps run as windows inside the shell.
For everyone else there's the ztOS SDK: apps in Python and Qt that look and move like the built-in ones. An app builds into a single file, a small C launcher with the code zipped behind it. Anything that moves is handed to the GPU, drawn by a small C renderer. A warm runtime keeps Qt loaded and forks each app from it, which saves about a second at every launch.
The Galaxy S9 port
The S9 is an Exynos 9810 phone, built for Samsung's own kernel. ztOS runs mainline Linux 7.1 on it, with the chip's drivers and my hardware support built as loadable modules, so I can work on a driver over Wi-Fi without reflashing. The GPU is a Mali-G72 driven by Mesa's Panfrost, which is what makes ztMETRO possible. The modem and sensor hub still lean on Samsung's own daemons, run from the phone's stock partitions.
Nothing here can leave the phone unbootable. A failed boot drops into a rescue shell over USB, a hung kernel resets into TWRP after 30 seconds, and the phone's download mode can always put the stock firmware back.
ztConflo
The S9 is one phone, and an awkward one. ztConflo is how ztOS leaves it. Give it a phone's codename and it builds a flashable ztOS image on a kernel that postmarketOS already boots: pmbootstrap for the kernel and firmware, pacstrap for Arch Linux ARM, and ztMETRO compiled from source inside the new system under QEMU. It looks in a ztOS device registry first, and only reuses kernels that already exist. It never ports hardware.
It has a terminal UI in ztOS's own look that installs its tools on first run. Today 135 phones pass its filter. 20 of them have no GPU driver, so they build but come with a warning that ztMETRO won't start, and 71 are ports postmarketOS has archived, which build with a warning too. No ztConflo image has booted on a phone yet; the first one will be the registry's first entry.