Show HN: WiPhone Lab – Doom on an Open ESP32 Wi-Fi Phone An unofficial fork of the WiPhone open-source phone firmware (v0.8.30) adds a System Benchmark, test harness, and ports of Doom and Gravity Defied to the ESP32-based Wi-Fi phone, with most of the fork written by AI agents using hardware-in-the-loop testing. The fork keeps full telephony intact and runs on the ESP32-D0WDQ6-V3 with 520 KiB SRAM and 4 MiB PSRAM, achieving ~22 FPS for Gravity Defied and ~13.6 FPS for Doom at 320×240 resolution. An unofficial fork of the WiPhone open-source phone firmware v0.8.30 that keeps the full phone working and adds a reproducible System Benchmark , an on-device test harness , and optional Doom and Gravity Defied ports. Not affiliated with or endorsed by MZJ Technology / HackEDA. The very first commit, "WiPhone 0.8.30 original firmware" , is their pristine upstream release; every commit after it is this fork's work. How this was built.Most of this fork was written by AI agents — the game ports, the shared display pipeline, the benchmark and the harness itself.The work was hardware-in-the-loop rather than code review on faith: the agents built firmware, flashed it to the phone, drove it over UART through the @WP1 harness, and read back telemetry and frame CRCs from the running device. Most of the numbers in this README were measured that way, and more than one conclusion came from watching the panel disagree with what the firmware believed it had drawn — seeDisplay clockbelow for the worst of them. WiPhone https://wiphone.io is an open-source, hackable mobile phone built around an ESP32 . It places calls over Wi‑Fi using SIP/VoIP , and the firmware is a single Arduino sketch WiPhone.ino . Target hardware / toolchain: | SoC | ESP32‑D0WDQ6‑V3, dual‑core Xtensa LX6 @ 240 MHz | | RAM | 520 KiB internal SRAM + 4 MiB PSRAM mapped, 40 MHz | | Display | ST7789 240×320 over VSPI, driven by TFT eSPI | | Audio | WM8750 codec over I²S | | Radios | Wi‑Fi SIP/VoIP , optional LoRa messaging | | Build | Arduino‑ESP32 1.0.5 pinned , ESP‑IDF 3.3.4 | Stock firmware features telephony, SIP, address book, messaging, settings, etc. are unchanged and documented in CHANGELOG.txt . Everything below sits on top of the stock 0.8.30 firmware; telephony is left fully intact. The additions are reachable from the phone's menus. A port of the classic J2ME motorcycle physics game. - Deterministic fixed‑point Q16.16 physics, level loader and renderer. - Runs at ~22 FPS a fixed 45 ms frame period using the shared raw‑VSPI async DMA display pipeline. - Includes an in‑app deterministic benchmark. A ride with the in-game FPS/LCD overlay enabled, on the device: gravity-defied-ride.mp4 A playable Doom port based on FPDoom . - Full‑screen 320×240 landscape output via the async DMA pipeline ~13.6 FPS at full quality with sound — see Performance notes . Sound: a real SFX mixer plus OPL2 music DOSBox dbopl emulator with GENMIDI instruments, MUS→MIDI conversion . SFX and music are mixed and played through the shared WM8750 codec/I²S using a snapshot/restore audio lease that restores the exact telephony audio state on exit.- The Doom zone and most engine buffers live in PSRAM to fit alongside the phone firmware without running the internal heap out of memory. Gameplay recorded off the device, with sound for the OPL music: doom-gameplay.mp4 A raw‑VSPI worker core 0 that converts indexed frames to RGB565 and streams them in ping‑pong DMA chunks, overlapping the game's next‑frame render. Used by both Gravity Defied and Doom; it leases the VSPI bus from TFT eSPI and returns it cleanly on exit. A production diagnostics app that takes a reproducible performance and correctness snapshot of the whole environment CPU on both cores; integer, fixed‑point, float and double kernels; internal RAM and PSRAM; audio codecs; renderer; completed display transfers; flash reads . Deterministic workloads are guarded by frozen CRC32 values and scored against an explicitly saved baseline, so an optimization can be told apart from a regression or a broken computation. On‑device harness TestHarness.cpp/.h , compiled only in harness builds : a line‑based @WP1 UART protocol for automated testing, driven by the Python host client tools/harness/wiphone harness.py . Reproducible builds tools/system benchmark/build.py : produces regular / harness firmware with a content‑addressed Build ID B1-