Hello everyone,
Don't know about you, but I find it rather annoying to repeatedly copy files to the real device during development, so I thought, why can't we have something like waydro.id for PB? Turns out we can! Let me present you a full-fledged emulator that I've been vibe-coding over the last couple of months:
https://codeberg.org/datyoma/pbemu
All you need is a modern Linux desktop with Wayland, podman, and Python.
The way it works is qemu-arm (user-mode emulation) + LD_PRELOAD to shim all sorts of stuff + framebuffer/sound forwarding via mounted sockets.
Quick start:
* ./pbemu image - builds the Debian-based image with all the development tooling
* ./pbemu install <firmware.zip> - extracts the files downloaded from PB support page
* ./pbemu build <extracted dir> - uses the container to compile the shim & co.
* ./pbemu start <extracted dir> - launches the system and the UI viewer
* ./pbemu stop - stops the container
Firmware unpacking is loosely based on the scripts from this thread: https://www.mobileread.com/forums/sh...d.php?t=314722
The viewer copies framebuffer data to Wayland over the mounted host socket. Mouse/keyboard input is supported, no wheel scrolling though.
Network traffic is forwarded by qemu-arm out of the box, there are stubs to make firmware believe it's connected to Wi-Fi.
Sound is forwarded via mounted PulseAudio/PipeWire socket.
Cloud-related application icons are removed during installation. (I guess you could copy registration data from a real device, if you are adventurous.)
I tested it on various 6.x firmwares, and it works starting from 6.1 onwards more or less reliably now. There had to be a few utterly abhorrent hacks introduced to support 3 variants of hardware event struct layout and different inner workings of NewTaskEx in older firmware.
ARM32 emulation on x86 is quite slow, so the speed is about the same as that of real devices.
At the moment the project is very much in "works on my machine" stage, so your mileage may vary. Any feedback is welcome!
Don't know about you, but I find it rather annoying to repeatedly copy files to the real device during development, so I thought, why can't we have something like waydro.id for PB? Turns out we can! Let me present you a full-fledged emulator that I've been vibe-coding over the last couple of months:
https://codeberg.org/datyoma/pbemu
All you need is a modern Linux desktop with Wayland, podman, and Python.
The way it works is qemu-arm (user-mode emulation) + LD_PRELOAD to shim all sorts of stuff + framebuffer/sound forwarding via mounted sockets.
Quick start:
* ./pbemu image - builds the Debian-based image with all the development tooling
* ./pbemu install <firmware.zip> - extracts the files downloaded from PB support page
* ./pbemu build <extracted dir> - uses the container to compile the shim & co.
* ./pbemu start <extracted dir> - launches the system and the UI viewer
* ./pbemu stop - stops the container
Firmware unpacking is loosely based on the scripts from this thread: https://www.mobileread.com/forums/sh...d.php?t=314722
The viewer copies framebuffer data to Wayland over the mounted host socket. Mouse/keyboard input is supported, no wheel scrolling though.
Network traffic is forwarded by qemu-arm out of the box, there are stubs to make firmware believe it's connected to Wi-Fi.
Sound is forwarded via mounted PulseAudio/PipeWire socket.
Cloud-related application icons are removed during installation. (I guess you could copy registration data from a real device, if you are adventurous.)
I tested it on various 6.x firmwares, and it works starting from 6.1 onwards more or less reliably now. There had to be a few utterly abhorrent hacks introduced to support 3 variants of hardware event struct layout and different inner workings of NewTaskEx in older firmware.
ARM32 emulation on x86 is quite slow, so the speed is about the same as that of real devices.
At the moment the project is very much in "works on my machine" stage, so your mileage may vary. Any feedback is welcome!









