← Builds
Pausedstopped on purpose, 1 October 2026

Quest 1 to postmarketOS

A first-generation Quest is a decent computer welded to an OS you do not control. The bootloader had just become unlockable, and the community Linux port existed but did not boot.

Hardware
Snapdragon 835, dual 1440 by 1600 panels, four global-shutter cameras
Kernel
4.4.205. systemd will not boot on it, so OpenRC.
Frames
19.5 to 72 per second. None of 1,200 intervals over 25 ms.
Drift
0.15 degrees over 14.4 seconds at rest
Wi-Fi
Associates on 5 GHz 88 seconds after a cold boot

What stopped it booting

Two faults. The root filesystem had been built with 1 KB blocks on storage that uses 4 KB sectors. Blocks smaller than sectors cannot be mounted, and this kernel panics rather than reporting it. One flag fixes it.

The boot header also carries 512 bytes for kernel arguments and an overflow field this bootloader ignores, so the root filesystem ID was being truncated mid-string. Trimming other arguments made room.

Display and rendering

Writing pixels into the framebuffer the obvious way produces a black panel. The display controller needs the mode unblanked and a page flip every frame, synced to the panel.

Lens correction uses the headset's own calibration data: 52 KB holding a 32 by 32 correction grid per eye, the lens separation and the asymmetric field of view. The visible distortion turned out to be stereo centring rather than field of view, and is fixed by shifting each eye 100 pixels inward.

All of it is drawn on the CPU. The GPU sits unused, because its initialization call segfaults.

Wi-Fi

There is no open driver. Getting online means running Meta's own Android daemon on musl, on top of four Qualcomm services. One needed a real fix: firmware requests use offsets relative to a shared buffer, and the open implementation treated them as absolute addresses, which killed the modem at boot.

This is an Android blob bring-up, not a free driver, and it depends on the stock Android install still being in the other slot.

Orientation, not position

What is installed tracks where the head is pointing, not where it is. Integrating the accelerometer as intended drifts ten meters; distrusting it a hundredfold brings that to ten centimeters but loses lock on almost any quick movement.

Orientation holds to 0.15 degrees over 14.4 seconds at rest, which is enough for head-aimed drawing in 3D.

Status

Stopped on request. Nothing was written to the bootloader. It boots, joins Wi-Fi by itself, streams all four cameras and renders stereo with correct lens warp at 72 fps.

Frame cadence clusters around 58, 72 and 86 per second depending on panel state.

Stereo VR view from the headset: wireframe cube on a curved grid floor, diagnostics overlay, live camera panel
Straight off the headset's framebuffer. Both eyes, pre-warped for the lenses. The overlay line with the device's address is blacked out.
Stereo wireframe cube and grid floor with an overlay reading 89.8 frames per second
The grid curves because the lenses bend it back straight.