112 tested
All checks were successful
Deploy / build-deploy (push) Successful in 3m21s

This commit is contained in:
Jorijn van der Graaf 2026-08-18 14:52:49 +02:00
commit 593bdb17d4
6 changed files with 28 additions and 16 deletions

View file

@ -73,10 +73,13 @@ export const std::vector<Product>& Products() {
p.image = "/fp6-pmos.jpg";
p.summary = "The Fairphone (Gen. 6), reflashed by Catcrafts to run postmarketOS with the patches and IMS/VoLTE implementation Catcrafts maintains. All of that software is open source. You can download it and flash a Fairphone yourself, and you are welcome to. What you pay for here is the thing open source doesn't come with: real support. A phone that arrives working, and one email address that answers for it. Not a forum, not a git issue, but support like any other manufacturer offers. And the margin funds the development itself.";
p.warranty = "Two years from Catcrafts, worldwide, one counter: every claim goes to Catcrafts, whatever turns out to be broken. The software (postmarketOS, the patches, imsd) is Catcrafts' own work and is fixed by Catcrafts with updates, delivered over the air. Even a phone that no longer boots is normally recovered in place: as long as fastboot still comes up, Catcrafts walks you through reflashing it over a USB cable in minutes. Only a phone that shows nothing at all, not even fastboot, travels for a software fault. For a hardware fault Catcrafts takes the phone back and handles the manufacturer's process, including the temporary reflash to stock Android it requires, and returns it running postmarketOS. When a phone does have to travel, warranty shipping is paid by Catcrafts, both directions, worldwide. User inflicted damage, including software faults caused by relocking the bootloader do not fall under this policy. The full terms are on the terms page.";
// The one claim on this page that is about safety rather than
// features. It stays until emergency calling has been verified on a
// real network — removing it is a decision, not a cleanup.
p.safetyNote = "Emergency calling (112/911) is implemented in imsd, including carrier-broadcast emergency numbers, but not yet verified against a live network.";
// No safety note. There was one — the emergency-calling caveat — and
// it came off on 2026-08-18, when imsd placed calls to 112 on a live
// network in a test session approved by TB112 (the Dutch 1-1-2
// operator). That verification is exactly what the caveat was waiting
// for, so the claim it hedged is now a plain fact and the warning box
// would only mislead. The field stays in the model for the next real
// safety claim; leaving it empty is the decision, not an oversight.
p.variants = {
// supplier €513.30 incl VAT
{ "green", "Forest Green", 51330 + kMarkupMinor },

View file

@ -226,10 +226,11 @@ export struct Product {
std::string image;
std::string summary;
std::string warranty;
// Rendered as a prominent warning box when non-empty. Exists for exactly
// one thing today: the emergency-calling caveat — the single claim on the
// page that is about safety rather than features, which is why it gets a
// warning box instead of a table row.
// Rendered as a prominent warning box when non-empty. No product sets it
// today: it existed for the emergency-calling caveat, which came off once
// 112 was verified on a live network. It stays because the next safety
// claim — something about safety rather than features — belongs in a
// warning box above the fold, not in a spec-table row.
std::string safetyNote;
std::vector<Spec> specs;

View file

@ -1279,8 +1279,7 @@ export RenderedPage RenderProduct(const Product& product,
R"(<h2 class="section__title">Specifications</h2>)"
R"(<p class="section__lede">The hardware is a stock Fairphone )"
R"((Gen. 6), unmodified. Fairphone's spec sheet is this product's spec sheet, )"
R"(and all of it works under postmarketOS. The one caveat is the )"
R"(emergency-calling warning above.</p>)"
R"(and all of it works under postmarketOS.</p>)"
R"(<table class="spec-table"><tbody>{}</tbody></table>)"
R"(</section>)",
Join(specRows));