★ IT'S 2026 · WE'RE THE ONLY ONES WHO NOTICED

Apple has shipped Display P3 hardware for a decade. They still don't use it. Neither does anyone else. We noticed.

PalettePunk scans your iOS or web codebase, finds every gradient stuck in muddy sRGB and every color literal locked out of Display P3, and writes the wide-gamut fix as one git-reversible commit. $99 lifetime license. Nothing uploads. Old browsers and old iOS keep working exactly as they did.

See the live web audit ↓ $99 Lifetime License →
★ THE RECEIPTS · LIVE WEB AUDIT 2026-06-23
apple.com 13 sRGB-only gradients · 1,291 sRGB tokens · zero color(display-p3) calls 40/100
figma.com 5 sRGB-only gradients · 735 sRGB tokens · zero wide-gamut anywhere 40/100
youtube.com 192 sRGB-only gradients · 2,745 sRGB tokens · 2.9 MB of CSS, zero modern color 40/100

Three sites. Three scores in the 40s. The internet is rendering 2014 color in 2026 and somehow we're the only ones saying it.

BEFORE · sRGB · WHAT YOU SHIP TODAY
AFTER · DISPLAY P3 · WHAT PALETTEPUNK WRITES
MUDDY
CLEAN
Real gradient pulled from wikipedia-ios / WMFYearInReviewSlideHighlightsView.swift:42. Best viewed on a Display P3 screen — any Mac, any iPhone Pro since 2016.

iOS apps doing it wrong. Websites doing it wrong. Same problem, both sides of the platform.

The first audit below is iOS apps (open-source projects we cloned and scanned with the Swift-side scanner). The web audit is further down the page. Same engine. Same rules. Two surfaces.

0.4%
of web images use Display P3
(Web Almanac 2024)
<1%
of iOS apps ship HDR
(Meta's Instagram HDR launch was front-page tech news, Nov 2025)
187★
SmoothGradient Swift package — exists only because Apple's default is muddy. 187 devs hand-built the fix.
10 yrs
since the iPhone 7 added Display P3 (2016). The iMac added it in 2015. Hardware's been waiting on developers for a decade.

iOS audit · twelve representative scores from the 49 open-source apps we scanned.

AppFilesStatusScore
wikipedia-ios1,230CRITICAL · SRGB MUD42
wordpress-ios2,609CRITICAL · SRGB MUD58
element-ios1,884HIGH · GAMUT LOCKED78
openterface147HIGH · GAMUT LOCKED78
firefox-ios1,988MED · sRGB BIAS84
loop149MED · GRADIENT LERP88
duckduckgo-ios1,197LOW · MINOR DRIFT92
kickstarter-ios2,035LOW · MINOR DRIFT94
mastodon-ios793LOW · MINOR DRIFT98
signal-ios2,542CLEAN100
wire-ios4,875CLEAN100
netnewswire601CLEAN100

PLAIN ENGLISH Most of the apps above have real visible color tech debt that PalettePunk catches in seconds. The worst — Wikipedia at 42/100 — has a Year-in-Review hero gradient with five sRGB-locked color stops. The same five stops, rendered through PalettePunk's engine, look dramatically better on any iPhone Pro. If Wikipedia ships this, your app probably does too.

★ SIX MORE GRADIENTS · SAME HEX CODES · DIFFERENT MATH

What every browser does by default vs what one line of CSS gets you.

Each pair below uses the same starting and ending hex codes. Only the interpolation math differs. Left column: sRGB linear blend (the browser default). Right column: OKLCH interpolation through Display P3 (one CSS keyword: in oklch). Watch the midpoints. The grey-mud zones disappear and the saturation holds all the way across.

Apple Intelligence palette
BEFORE · sRGB
AFTER · OKLCH + P3
Stripe brand gradient
BEFORE · sRGB
AFTER · OKLCH + P3
Figma cursor blob
BEFORE · sRGB
AFTER · OKLCH + P3
Adobe Creative Cloud red
BEFORE · sRGB
AFTER · OKLCH + P3
Yellow → Blue (the classic mud)
BEFORE · sRGB
AFTER · OKLCH + P3
YouTube red → cyan complementary
BEFORE · sRGB
AFTER · OKLCH + P3

Same hex codes. Same designer choices respected. Only the interpolation changes. On a Display P3 screen (any iPhone Pro since 2016, any modern Mac) the right column also gets the wider gamut — more saturated reds, oranges, and deep blues. On any display, the interpolation difference at the midpoint is visible to the naked eye.

How it works

Three steps. No installs, no SDKs, no servers. The whole tool runs in your browser.

01

Micro-Drop (test the waters)

Don't trust a web tool with your whole repo? Fair. Start with one file. Drop just your Colors.swift, Theme.swift, or tailwind.config.js to see PalettePunk work locally before you give it the project. Nothing uploads. Browser reads the file in-place via the File System Access API on Chrome and Edge — for Safari and Firefox, a zip-upload fallback parses entirely client-side. WebAssembly engine scans it either way. Findings render in your tab.

02

Whole-project scan

Once Micro-Drop convinces you it stays local, drop the project folder. PalettePunk walks every .swift file and flags the three rule families: gradients lerped in RGB, Color literals locked to sRGB, missing MeshGradient opportunities on hero surfaces. Severity-tagged. File:line referenced. Side-by-side rendered.

03

Review · Apply Selected

Each finding gets Smart Context (why it matters, the math, references, plain-English close). Pick the fixes you want. PalettePunk generates a palettepunk/<project>/<timestamp> git branch with one clean commit. Review in Xcode. git revert if you hate it.

★ THE DOCTRINE · NON-NEGOTIABLE

Five things we will never do.

We never store your code.

PalettePunk Web runs as a WebAssembly bundle in your browser. There's no database. No upload endpoint. No "we anonymize the data" lie. We literally do not have a place to put your code even if we wanted to.

We never replace your code.

Every patch is additive. Your existing LinearGradient stays as the fallback; the modern syntax is added as a second declaration (CSS) or wrapped in if #available(iOS 18, *) (Swift). Old browsers and old iOS see exactly what they used to. New browsers and new iOS see the win. Nobody loses anything.

We never ship dependencies.

Zero dependencies. PalettePunk outputs raw CSS and native SwiftUI / UIKit color literals. No npm package. No Swift Package Manager bloat. No proprietary PalettePunk-SDK. We change your hex codes and get out of your way.

We never make irreversible changes.

Every Apply Fixes is one PalettePunk branch with one commit via libgit2. Don't like it? Switch back to your branch and delete the PalettePunk branch in 5 seconds. Or git revert. The tool refuses to operate on a dirty working tree — your changes never tangle with ours.

We never run AI on your code.

PalettePunk is deterministic SwiftSyntax-based static analysis with a small color-science library (RadioArtColor) underneath. The only on-device language model use is Apple's FoundationModels framework for short fix-rationale explanations — we call that "Smart Context," not "AI." Your scans are reproducible. Nothing hallucinates.

★ THE WEB AUDIT · NAMED & SHAMED · 14 SITES SCANNED

Seven sites you know. Seven scores you should see.

Run on 2026-06-23 against the public marketing/product surfaces of each site. Open-source script. Open-source results. Re-run it yourself.

SiteTop findingScore
apple.com13 sRGB-only gradients · 1,291 sRGB tokens · 0 modern color fns40
behance.net (Adobe-owned)30 sRGB-only gradients · 1,108 sRGB tokens · 0 modern fns40
figma.com5 sRGB-only gradients · 735 sRGB tokens · 0 color(display-p3)40
google.com17 sRGB-only gradients · 462 sRGB tokens · 0 modern fns40
youtube.com192 sRGB-only gradients · 2.9 MB CSS · 0 modern fns anywhere40
notion.so9 sRGB-only gradients · 197 sRGB tokens · 0 modern fns40
linear.app17 of 18 gradients sRGB-only · 131 sRGB tokens · 3 modern fns43

ADOBE NOTE adobe.com kills our HTTP/2 stream mid-connection. We literally couldn't audit them. So we audited Behance, which Adobe owns. It scored 40/100 with zero modern color functions. Make of that what you want.

ALSO RAN Vercel scored 76, Shopify 72, Spotify 75, Framer 70 — they actually ship some color(display-p3) and oklch(). The good news is the floor is rising. The bad news is half a dozen of the biggest brands on the internet are still at the floor.

★ AUDIT METHODOLOGY · THE FULL RECEIPT

How the scanner works. And what it can't see.

We are going to tell you the limits of our own script up front. That way the Hacker News commenter who's been saving the takedown for tomorrow morning won't have to write it.

What we scan

  • Linked stylesheets (<link rel="stylesheet">) — top 8 per site, capped at ~5 MB of CSS payload
  • Inline <style>…</style> blocks in the document
  • Inline style="…" attributes on elements

What we check for

  • R1 · gradient functions (linear-gradient, radial-gradient, conic-gradient) without modern interpolation (in oklch, in oklab, in display-p3)
  • R2 · sRGB color literals (#hex, rgb(), rgba()) without any complementary wide-gamut usage (color(display-p3 …), oklch(), oklab())
  • R3 · modern color functions (color-mix, oklch, oklab, color(display-p3)) as a signal of modernity — present, absent, frequency

What we honestly do not catch

Our scanner parses static and dynamically loaded CSS payloads. It does not currently evaluate <canvas> output, inline <svg> injected post-load, or encoded color profiles in raster images. If Apple is hiding Display P3 inside a Shadow DOM root we couldn't scrape, we'll update the board. But for standard CSS tokens — which is the entire color-system layer for every site on this audit — these numbers are exact.

What this audit is NOT: not a statistical survey of the web. It is a named audit of famous public surfaces, run with a published static CSS scanner. The score is not a total design-quality score. It measures one thing: whether a site's public CSS uses modern color syntax and wide-gamut alternatives where gradients and color tokens appear.

Scoring math · download the receipts

0–100 scale. Gradients without modern interpolation lose up to 40 points (proportional to ratio). A large palette of sRGB color literals with zero wide-gamut alternatives loses 30. Presence of modern color functions earns up to 10 back. Floor: 40. Ceiling: 100.

Download the actual files: scanner.py (the Python source) and results.csv (raw audit data for all 14 sites). /methodology has a full README explaining how to re-run it on any site you want.

If a single number on the leaderboard is wrong on a site you can prove it on, email [email protected] with the receipt and we update it within 24 hours. We'd rather be corrected than be cute.

★ WHAT WORKS TODAY · WHAT SHIPS LATER · NO PROMISE GAP

$99 lifetime includes all of it. Pay once. Get every release. No subscription, no quota, no per-audit fee.

$99 lifetime license

One price. Pay once. Use forever. No subscription. No SaaS. No expiring license.

$99
lifetime · pay once · own it
Get on the launch list · $99 lifetime opens when Stripe clears Or $149 · Founding Supporter (same product, more fuel for the fight)

Stripe verification is mid-queue. Until it clears, the buttons above email Tom directly and you go on the launch list. The moment Stripe activates we send the buy link and you pay then — not before.

FAQ

What about my users on older iOS / older browsers?

PalettePunk patches are additive, never replacive. Your existing code stays as the fallback. The modern syntax is added as a second declaration (CSS) or wrapped in if #available(iOS 18, *) (Swift). Old devices see exactly what they used to. Modern devices see the win. No user sees a worse experience than they would have before.

Does PalettePunk support Tailwind CSS?

Yes. The same rule families apply: linear-gradient(...) without in oklch, color(display-p3 ...) opportunities, oklch() palette extensions. PalettePunk Web scans your tailwind.config.js, your generated CSS, and any inline style="..." attributes. The patch follows Tailwind conventions — we don't replace your design tokens, we add wide-gamut variants.

Does PalettePunk upload my source code?

No. Never. On Chrome and Edge the web tool uses the browser's File System Access API to read your project folder in-place. On Safari and Firefox (where that API isn't fully supported) it falls back to a client-side zip-upload that's parsed entirely in your browser tab — the zip never leaves your machine. The SwiftWasm engine scans either way. The Mac app uses SwiftSyntax to parse on your Mac. We never see your code. We don't run a server that could see your code. We don't have a database that could store your code. Our entire backend is a static HTML/CSS/WASM bundle on Cloudflare Pages.

My company forbids dragging proprietary source into Chrome. Now what?

Two options. (1) Micro-Drop: drop just your Colors.swift or tailwind.config.js — one file, almost-zero IP exposure, lets you verify the tool works without uploading. (2) Offline CLI: brew install palettepunk, runs entirely on your machine, never touches the network. The CLI ships free with the $99 lifetime license.

Will my designer / brand team approve this?

Yes — PalettePunk doesn't change your brand colors. We keep your existing source hex codes; we just render them with better math (perceptual OKLab interpolation through Display P3). The brand red stays the brand red — it just looks like the brand red the designer originally specified in Figma, not the slightly-flatter version sRGB gives you on a Pro display.

What if PalettePunk's patch breaks my build?

It can't. We require a clean git working tree before applying. We create a separate palettepunk/<project>/<timestamp> branch with one commit. If anything looks wrong: switch back to your main branch and delete the PalettePunk branch. Under 5 seconds to undo.

Why hasn't anyone fixed this already?

Because shipping color science correctly requires six teams to coordinate — designer, brand, developer, build system, browser/OS, asset pipeline. Most teams have at least one broken link in that chain. PalettePunk solves the developer's slice conservatively and correctly, so the dev can ship the win without needing anyone else's approval.

What about AI? Is PalettePunk an "AI tool"?

No. PalettePunk is deterministic SwiftSyntax-based static analysis with a small color-science library underneath. The only on-device language model use is Apple's FoundationModels framework for short fix-rationale explanations — and we call that "Smart Context," not "AI." Your scans are reproducible across runs; nothing hallucinates.

How long does an audit actually take?

For a small project (under 100 Swift files): 10-30 seconds end-to-end. Medium (100-500 files): 30-90 seconds. Large (500-3,000 files): 1-4 minutes. The scan itself is under 10 seconds even on huge projects.

Does it work on React Native / Flutter?

v1.0 is Swift + CSS only. The rules transfer 1-for-1 to web CSS (we already verified — see our parallel audit of apple.com, stripe.com, vercel.com). If you ship a React Native iOS app and want the underlying native Swift wrappers audited, PalettePunk v1.0 still helps with the wrapper layer.

What if I'm not on iOS 18 yet?

PalettePunk reads your project's minimum deployment target from Package.swift or .xcodeproj and adapts. iOS 18+ targets get the modern syntax directly. iOS 17 and earlier get the modern syntax wrapped in if #available(iOS 18, *) { ... } else { ... } with your existing code as the else branch. Old-iOS users get exactly what they had before.

Roadmap · this is part one

v1.0 is the first chapter. Part 2 (HDR) is already specced. Part 3 (paint match) is on the horizon. $99 lifetime includes all of it.

PART 1 · NOW

Gamut fix

Display P3 · OKLab · MeshGradient

Catch every SwiftUI gradient interpolating in muddy sRGB. Catch every Color(red:green:blue:) locked out of the wider gamut your customers' devices have shipped since 2016. Surface every hero surface that could use a MeshGradient. Fix all of it with one git-reversible commit.

"The gradient looks muddy in the middle" — solved.

PART 2 · Q1 2027 · INCLUDED IN $99 LIFETIME

HDR · the sequel

EDR headroom · selective glow · graceful SDR fallback

iPhone Pro displays have 1.6x-2x EDR headroom most apps never use. PalettePunk v1.5 surfaces every hero surface that could glow — sun glints in your weather app, ice sparkle on your hero card, lightning in your animation. Renders brighter-than-white selectively. SDR fallback on standard devices is automatic. Same additive-patch model: no user loses.

Be the first to know when v1.5 ships →