This commit is contained in:
parent
a8bc400371
commit
ed61fb5ca5
12 changed files with 254 additions and 38 deletions
|
|
@ -54,6 +54,13 @@ static_assert(kMarkupMinor * 10000 % (10000 + Money::kVatRateBp) == 0,
|
|||
static_assert(kMarkupMinor * 10000 / (10000 + Money::kVatRateBp) == kMarkupNetMinor,
|
||||
"the exact net of the markup must be the €50 the rule promises");
|
||||
|
||||
// The warranty both phones carry, verbatim. Shared rather than pasted per
|
||||
// product because it is a promise about how Catcrafts handles a fault, not a
|
||||
// statement about a particular board — and two copies of a legal text are two
|
||||
// texts that can drift apart, while /legal/terms states exactly one policy.
|
||||
inline constexpr std::string_view kPhoneWarranty =
|
||||
"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.";
|
||||
|
||||
export const std::vector<Product>& Products() {
|
||||
static const std::vector<Product> products = [] {
|
||||
Product p;
|
||||
|
|
@ -72,7 +79,7 @@ export const std::vector<Product>& Products() {
|
|||
p.shipWeightGrams = 700;
|
||||
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.";
|
||||
p.warranty = kPhoneWarranty;
|
||||
// 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
|
||||
|
|
@ -111,15 +118,93 @@ export const std::vector<Product>& Products() {
|
|||
p.priceInclMinor = cheapest->priceInclMinor;
|
||||
}
|
||||
|
||||
// The Fairphone (Gen. 6+): Fairphone's mid-generation refresh, announced
|
||||
// 2026-08-18. A second listing rather than more colours on the entry
|
||||
// above — different silicon, a different price and its own spec sheet,
|
||||
// and the two are bought as different phones.
|
||||
//
|
||||
// It is sellable at all because the SOFTWARE is unchanged: the same
|
||||
// postmarketOS image, the same kernel patches and the same imsd run on
|
||||
// this board, confirmed on a device. The chassis, modem, cameras and
|
||||
// battery are the Gen. 6's; the SoC and the RAM are the only parts the
|
||||
// image had to be re-verified against, and it was.
|
||||
Product q;
|
||||
q.slug = "fp6plus-pmos";
|
||||
q.name = "The Fairphone (Gen. 6+) with postmarketOS";
|
||||
q.brand = "Fairphone";
|
||||
q.tagline = "The mid-generation refresh faster chip, 12 GB of RAM, running the same mainline Linux image.";
|
||||
q.status = "coming-soon";
|
||||
// Same device weight (193 g) in the same retail box, so the outgoing
|
||||
// parcel is the Gen. 6's parcel and lands in the same carrier bracket.
|
||||
// The rounding note on the entry above applies here too: this wants a
|
||||
// scale reading of a real parcel before launch, not a second guess.
|
||||
q.shipWeightGrams = 700;
|
||||
// Fairphone's own Cobalt Blue render, cropped from the 2200 × 2200
|
||||
// original on their Flickr — same rightsholder and same CC BY-SA 4.0
|
||||
// licence as the Gen. 6 render above, credited with the adaptation
|
||||
// notice on /legal/imprint. Deliberately NOT one of the copies the tech
|
||||
// press hosts: an outlet's file carries no licence grant from the
|
||||
// outlet, and the ones in circulation show the phone running stock
|
||||
// Android with the Play Store on screen — which is the single thing
|
||||
// this listing exists to sell the absence of.
|
||||
q.image = "/fp6plus-pmos.jpg";
|
||||
q.summary = "The Fairphone (Gen. 6+), reflashed by Catcrafts to run postmarketOS with the same patches and IMS/VoLTE implementation as the Gen. 6 — that image is confirmed working on this board. The hardware is Fairphone's mid-generation refresh: a faster Snapdragon and 12 GB of RAM in the same repairable chassis, with the same twelve replaceable modules and spare parts through 2033. 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.";
|
||||
q.warranty = kPhoneWarranty;
|
||||
// Supplier €649.00 incl VAT in every colour — Fairphone's own launch
|
||||
// price, which is what the device costs anywhere a day after launch and
|
||||
// the only real number that exists for it today. The Gen. 6 above is
|
||||
// sourced well below list, so expect these to come DOWN once a sourcing
|
||||
// price lands: change the three numbers here (and the pins in
|
||||
// ShouldShipContent) and the €50 net margin holds by construction, as
|
||||
// the static_asserts above guarantee for every supplier price.
|
||||
//
|
||||
// Cobalt Blue leads the list: with one price across the range,
|
||||
// CheapestVariant() returns whichever colour comes first, and that is
|
||||
// the selector's pre-selected default — so it has to be the colour the
|
||||
// photo above actually shows.
|
||||
q.variants = {
|
||||
{ "blue", "Cobalt Blue", 64900 + kMarkupMinor },
|
||||
{ "green", "Forest Green", 64900 + kMarkupMinor },
|
||||
{ "black", "Horizon Black", 64900 + kMarkupMinor },
|
||||
};
|
||||
// The hardware, as Fairphone specifies it. Five rows differ from the
|
||||
// Gen. 6 — the panel, the SoC, the RAM, the charge rate, and Fairphone's
|
||||
// own rounding of the chassis length (156.57 mm here, 156.5 there, one
|
||||
// shell). The other eight are restated rather than cross-referenced: a
|
||||
// spec sheet that says "as above" is not a spec sheet.
|
||||
q.specs = {
|
||||
{ "Display", "6.31″ LTPO AMOLED, 2484 × 1116 (FHD+), 10–120 Hz adaptive, Gorilla Glass 7i" },
|
||||
{ "Processor", "Qualcomm Snapdragon 7s Gen 4, Adreno 810 GPU" },
|
||||
{ "Memory", "12 GB RAM" },
|
||||
{ "Storage", "256 GB, microSD slot up to 2 TB" },
|
||||
{ "Rear cameras", "50 MP main with OIS + 13 MP ultra-wide" },
|
||||
{ "Front camera", "32 MP" },
|
||||
{ "Battery", "4415 mAh, user-replaceable, 27 W fast charging" },
|
||||
{ "Connectivity", "5G, Wi-Fi 6E, Bluetooth 5.4, NFC" },
|
||||
{ "SIM", "Dual: nano-SIM + eSIM" },
|
||||
{ "USB", "USB-C 2.0" },
|
||||
{ "Fingerprint reader", "Side-mounted, in the power button" },
|
||||
{ "Durability", "IP55, 12 user-replaceable modules" },
|
||||
{ "Dimensions", "156.6 × 73.3 × 9.6 mm, 193 g" },
|
||||
};
|
||||
// Same derivation as above: the sticker is the cheapest colour, so the
|
||||
// page cannot advertise a number the default choice doesn't honour.
|
||||
if (const Variant* cheapest = q.CheapestVariant()) {
|
||||
q.priceInclMinor = cheapest->priceInclMinor;
|
||||
}
|
||||
|
||||
// The donation item: the shop's soft opening. It is "available" while
|
||||
// the phone above stays "coming-soon" on purpose — the two rails, the
|
||||
// the phones above stay "coming-soon" on purpose — the two rails, the
|
||||
// ledger, the reconciler and the mailer all run for real money before
|
||||
// the first phone order depends on them. The buyer names the amount
|
||||
// (Form::ValidateDonation bounds it); nothing ships and no VAT is
|
||||
// charged, because a gift with nothing supplied in return is not a
|
||||
// taxable supply — which is also why a donation never gets an invoice.
|
||||
// fp6-pmos stays FIRST in this vector: it is the shop's headline, and
|
||||
// tests address Products()[0] as the priced product.
|
||||
// The order of this vector is the order of the shop grid, and it is
|
||||
// deliberate: fp6-pmos FIRST (the shop's headline, and the tests
|
||||
// address Products()[0] as the priced product), the Gen. 6+ second,
|
||||
// and the donation LAST — it is the odd entry out, not what the shop
|
||||
// is about.
|
||||
Product d;
|
||||
d.slug = "donation";
|
||||
d.name = "Donation";
|
||||
|
|
@ -127,7 +212,7 @@ export const std::vector<Product>& Products() {
|
|||
d.status = "available";
|
||||
d.donation = true;
|
||||
d.summary = "Thank you very much for considering to donate! Your donation will contribute to the maintenance of the image and R&D for new devices.";
|
||||
return std::vector<Product>{ std::move(p), std::move(d) };
|
||||
return std::vector<Product>{ std::move(p), std::move(q), std::move(d) };
|
||||
}();
|
||||
return products;
|
||||
}
|
||||
|
|
@ -308,7 +393,7 @@ export const std::vector<LegalPage>& LegalPages() {
|
|||
{
|
||||
.slug = "imprint",
|
||||
.title = "Imprint & contact",
|
||||
.updated = "2026-08-05",
|
||||
.updated = "2026-08-19",
|
||||
.lede = "Who is behind this site and how to reach them.",
|
||||
.sections = {
|
||||
{ "Contact",
|
||||
|
|
@ -324,6 +409,15 @@ export const std::vector<LegalPage>& LegalPages() {
|
|||
{
|
||||
"If you find a vulnerability, please email at security@catcrafts.net before disclosing it publicly and you will be credited. This site is source-available on Forgejo, so you can read exactly what it does rather than guessing.",
|
||||
} },
|
||||
// The CC BY-SA 4.0 licence on both product renders requires
|
||||
// naming the author, linking the licence and flagging that the
|
||||
// files were changed. project.cpp pointed here for it long
|
||||
// before anything here said it, which is the gap this closes.
|
||||
{ "Image credits",
|
||||
{
|
||||
"The product renders are the manufacturer's own: © Fairphone, used under the Creative Commons Attribution-ShareAlike 4.0 licence, https://creativecommons.org/licenses/by-sa/4.0 . The Fairphone (Gen. 6) in Forest Green came through Wikimedia Commons; the Fairphone (Gen. 6+) in Cobalt Blue comes from Fairphone's own photostream at https://www.flickr.com/photos/fairphone . Both were cropped and recompressed to fit this site, and those adaptations are offered back under the same licence.",
|
||||
"They are renders of stock hardware, which is exactly what Catcrafts ships — the difference is the software on it. No manufacturer render shows postmarketOS, so treat the screens in those images as the manufacturer's artwork rather than a picture of what arrives.",
|
||||
} },
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue