Correction, July 10: the original version said Apple no longer listed the older 6.9-inch screenshot sizes. That was wrong. Apple's current page still lists 1260x2736, 1290x2796, and 1320x2868. What changed was which size the page led with. The email already sent cannot be changed, so I corrected the archive here.
I spent Thursday building a linter for App Store screenshots. Apple only accepts exact pixel dimensions there, so the heart of the tool is a table: these sizes pass, everything else fails. I assumed the code around that table was the hard part. The table itself turned out to be the part that fought back.
Six days earlier I had written the research note for this tool, and I recorded 1320x2868 for the big 6.9-inch iPhone from Apple's official spec page. On build day I opened the same page to recheck every number before shipping the table. It now led with 1260x2736 for the same screen. Nothing announced the change. The lead value had moved between my two visits.
My mistake was narrower than I first wrote. I had treated the first number I saw as if it were the whole rule. It was one accepted size in a longer table. My older live screenshots were not about to fail, and an Apple-only table built from the full current page would still accept them.
That still changed how I built the tool. A screenshot-size table is reference data, and page ordering is not a stable interface. I needed the complete accepted set, the date I checked it, and another maintained source to compare against before I put the numbers into code.
So the table I shipped combines the sizes on Apple's current page with fastlane deliver's maintained resolution mapping. Each device class records the sources checked, and a snapshot test pins the whole table so a future change has to pass through a visible diff and a human review. The tool is called screenproof. Free, open source, zero dependencies, runs offline: npx screenproof.
The habit I kept is simple: copy the full table, record where it came from, and make the next change reviewable. One prominent value on a page is a clue, not the specification. I learned that by writing the story too broadly first, then going back to the source and correcting it.