Catcrafts builds of the postmarketos image for the fairphone 6
  • Shell 84.7%
  • Python 15.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jorijn van der Graaf 970a44f93d
Some checks failed
image / image (push) Has been cancelled
aports/fp6-device-tweaks: stop the modem-gnss 30 s restart loop
pmOS's modem-gnss.service runs two qmicli calls, and the second --
--loc-set-nmea-types=all -- can never succeed on this modem: the LOC
engine answers QMI error 94 'NotSupported' to both get and set. That is
a permanent capability gap, not the boot race Restart=on-failure exists
for, so the unit failed and restarted every 30 s for the whole uptime
(restart counter 25 after 13 minutes; 165 over one evening). Its
StartLimit does not stop it either: 10 restarts at RestartSec=30 span
~303 s, just past StartLimitInterval=300.

Ship a drop-in that tolerates that one command's failure. The boot-race
retry stays armed -- a LOC service that is genuinely not up still fails
the first ExecStart. Nothing is lost: ModemManager issues its own
set-NMEA-types and takes the same 94 regardless, and location comes from
the Position Report path our modemmanager patches add.

Byte-identical to the drop-in verified on the dev phone (sha256
b0b5f71b0f25c3c5a8fc9e926f187412a6711da95f773234065f37ddcc1d3c6d):
across a reboot the unit runs once, Result=success, 0 restarts.

Assisted-by: Claude:claude-opus-5
2026-08-24 19:44:18 +02:00
.forgejo/workflows 112 tested 2026-08-18 15:20:55 +02:00
aports aports/fp6-device-tweaks: stop the modem-gnss 30 s restart loop 2026-08-24 19:44:18 +02:00
.gitignore gitignore dist/; fix empty then-branch (sh syntax) in the NV verdict 2026-08-09 02:44:39 +02:00
build.sh build.sh: carry FP6IMG_NO_CROSSDIRECT across the su re-exec 2026-08-24 05:39:11 +02:00
install.sh text change 2026-08-18 15:19:30 +02:00
README.md readme 2026-08-18 18:45:58 +02:00

fp6-img

Flashable postmarketOS images for the Fairphone 6/6+, built nightly from the Catcrafts milos-linux combined-stable kernel branch, with imsd (userspace VoLTE) preinstalled.

Maintained by Jorijn van der Graaf (TheMightyCat) at Catcrafts.

What works

Everything on the combined-stable branch: display, touch, wifi, cellular data, NFC (reader), speaker audio, microphone, IMU, magnetometer, barometer, ambient light/proximity — plus VoLTE calls (both directions) through imsd.

Verified on exactly one device / one carrier (KPN NL). Reports from other carriers are very welcome.

Flashing

Download fp6-img.tar.xz from the latest release and unlock the bootloader (Fairphone's official process).

Install: with the phone in fastboot mode,

tar xf fp6-img.tar.xz
cd fp6-img
./install.sh

install.sh erases dtbo, flashes the rootfs, RAM-boots the kernel, writes the boot partition from inside Linux where the bootloader's NV-wipe cannot see it, then reads the modem NV back and reports the result. The bootloader never writes boot.

Default login: user / 147147 (same as official postmarketOS images — change it). Never re-lock the bootloader with a custom image installed.

VoLTE configuration

imsd is installed but needs your carrier's P-CSCF address:

# /etc/imsd.env
PCSCF=<your carrier's P-CSCF IPv6 address>

Find it in a stock-firmware capture or your carrier's IMS documentation, then systemctl restart imsd (the service is enabled at boot and waits for this file to exist). See the imsd README for the full variable reference and carrier assumptions.

How it builds

build.sh drives pmbootstrap with the aports/ overlay in this repository:

  • device/linux-postmarketos-qcom-milos — the pmaports kernel aport, repointed at combined-stable with the exact kernel config the development FP6 runs.
  • modem/imsd — imsd, packaged from source. Its provides=81voltd keeps the conflicting modem-firmware IMS helper off the image (two IMS stacks cannot share one PDN).
  • main/postmarketos-config-nftables — adds the -imsd subpackage accepting imsd's IPsec-protected SIP ports on the IMS PDN (auto-installed alongside imsd).
  • device/catcrafts-fp6-repo — subscribes the installed system to the Catcrafts apk registry (signing key + /etc/apk/repositories entry). CI publishes every built package there, so apk upgrade delivers kernel/imsd/GNSS updates between image releases.