For around a year I am working on bringing a Genode based OS to the Google Pixel 7. I call it MüesliOS. And now there is a first demo: the phone can make calls, with sound in the earpiece, and send and receive SMS. It is a first prototype of a mobile shell with 3 apps, which I hope will become the base of a real mobile OS later.

The hard part: telephony

The main challenge was telephony. The modem is a separate computer inside the phone, and only the kernel driver for it is open source. And this driver gives you just a communication channel with the modem. Over this channel the AP talks with the CP using a proprietary protocol, which is not documented anywhere.

After long debugging and a lot of experiments the solution was found, and it is quite simple: we can just run the unmodified Android vendor services (cbd, rild, rfsd, …) on Genode directly. A small loader maps their ELF files and gives them what they expect from Android: the C library, properties and binder. So now the Android RIL stack runs on top of MüesliOS.

What runs in the demo

  • Genode with its own kernel (base-hw) on all eight cores, with drivers for the panel, touchscreen, keys, UFS storage and audio.
  • The Android modem services on this loader.
  • Telephony split into small components: the link to the modem, call log, SMS store, contacts and notifications.
  • A shell and 3 apps (phone, messages, contacts), written with LVGL.
  • A lock screen with a PIN.
  • Call audio. The speech goes between the modem and the audio DSP. The driver switches on the earpiece for a call and loads the voice processing parameters, which a tool makes from the vendor’s parameter file.

Already working, but not in the demo yet

Some other parts already work in their own tests, and they will extend the functionality in the next iterations:

  • Wi-Fi
  • mobile data over the modem
  • USB gadget (serial console, adb)
  • 3D acceleration on the Mali GPU (Mesa)
  • battery state and real-time clock

Code

The code is on GitHub: the Pixel drivers, the MüesliOS components, and the apps and telephony.

How to build

You need a Pixel 7 with unlocked boot loader, Android with adb root (e.g. LineageOS) on slot a, an active SIM without PIN, and the Genode tool chain 25.05. The demo overwrites modem_b, so slot b can’t boot Android after it.

Get the sources:

git clone -b pixel7 https://github.com/iloskutov/genode.git genode-pub
git clone https://github.com/iloskutov/genode-pixel.git  genode-pub/repos/pixel
git clone https://github.com/iloskutov/genode-muesli.git genode-pub/repos/muesli
git clone https://github.com/iloskutov/goa-packages.git
cd genode-pub
tool/create_builddir arm_v8a

In build/arm_v8a/etc/build.conf enable libports, dde_linux and gems, and add before the base-$(KERNEL) line:

REPOSITORIES += $(GENODE_DIR)/repos/pixel
REPOSITORIES += $(GENODE_DIR)/repos/muesli
BOARD_RUN_OPT(google_pixel7) := --include image/pixel_boot_img

Prepare ports and download the apps from the depot:

tool/ports/prepare_port android_boot_tools pixel_linux google_soc_gs \
    google_display google_touch google_aoc google_amplifiers google_s5300 \
    google_trusty lwext4 hacl libc libpng zlib stdcxx jitterentropy

U=iloskutov_pixel7
mkdir -p repos/muesli/sculpt/depot/$U depot/$U
cp ../goa-packages/depot/$U/* repos/muesli/sculpt/depot/$U/
cp ../goa-packages/depot/$U/* depot/$U/
for a in lvgl/2026-11-11 faenschterli/2026-11-12 telephony/2026-11-13 \
         phone/2026-11-13 messages/2026-11-13 contacts/2026-11-13 \
         android_loader/2026-11-14 android_prop/2026-11-07 \
         android_binder/2026-11-07 modem_orchestrator/2026-11-07 \
         rild_modem/2026-11-07 modem_console/2026-11-07
do tool/depot/download $U/bin/arm_v8a/$a || break; done

Copy the modem daemons and audio firmware from the phone (they are proprietary, so they are not in the repos), build, flash and boot:

adb root
repos/pixel/tool/pull_modem_files
repos/pixel/tool/pull_audio_firmware
cd build/arm_v8a
make run/phone_pixel KERNEL=hw BOARD=google_pixel7
adb reboot bootloader
fastboot flash modem_b var/run/phone_pixel.modem_b.img
fastboot boot var/run/phone_pixel.img

The PIN is 1234. A restart brings Android back.

Next steps

There are still an enormous number of things to do:

  • enabling the remaining hardware
  • performance improvements, like CPU frequency control and CPU balancing
  • power management
  • everyday software (porting it or using virtualization)
  • and many, many others