★ IT'S 2026 · THE iPHONE 7 SHIPPED DISPLAY P3 IN 2016

Your gradients are muddy and your colors are stuck in 2014.

The iPhone 7 shipped with Display P3 a decade ago. It's time to upgrade your hex codes.

PalettePunk scans your Xcode project, finds every LinearGradient interpolating in muddy sRGB, every Color(red:green:blue:) locked out of the wider gamut your customers' iPhones have shipped since 2016, and writes the Display P3 + OKLab fix as one git-reversible commit. $99 lifetime license. Nothing uploads. Old iOS keeps working.

Try a snippet · Free $99 Lifetime License →
BEFORE · sRGB · WHAT YOU SHIP TODAY
AFTER · DISPLAY P3 · WHAT PALETTEPUNK WRITES
MUDDY
CLEAN
Real gradient from wikipedia-ios / WMFYearInReviewSlideHighlightsView.swift:42. Best viewed on a Display P3 screen (any Mac, any iPhone Pro since 2016).

The other 99% are doing it wrong. Including Wikipedia. Including Apple.

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 iPhone 7 shipped Display P3 (2016). Hardware's been waiting on developers for a decade.

We scanned 49 famous open-source iOS apps. Here's the security-vuln-scanner-style readout.

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 Twelve of these ten apps 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 5 sRGB-locked color stops that an iPhone Pro can render dramatically better with one engine import. If Wikipedia ships this, your app probably does too.

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. WebAssembly engine scans it. 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.

$99 lifetime license

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

$99
lifetime · pay once · own it
Pre-order · Charged when web tool ships

Web tool ships within 2 weeks · Mac app ships Q1 2027 · HDR upgrade ships Q1 2027 — all included.

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. The web tool uses the browser's File System Access API to read your project folder in-place; the SwiftWasm engine scans it locally inside your browser tab. 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.

Color science · spec sheets

For the scrollers, the search engines, and the developers who want the receipts before they buy.

$ man oklab
NAME oklab — perceptually uniform color space (Ottosson, 2020) DESCRIPTION OKLab is a perceptual color space designed so that equal numerical steps look like equal visual steps to the human eye. Unlike sRGB or HSL, OKLab interpolation produces gradients that feel smooth — no muddy grey-green dead zones in the middle of a blue-to-red ramp. USED BY Photoshop · CSS Color Level 4 · SwiftUI MeshGradient NOT USED BY Most iOS app code shipping today
$ man display-p3
NAME Display P3 — wider color gamut shipped by Apple since 2016 COVERAGE ~25% more visible colors than sRGB, especially saturated reds, oranges, and deep blues. HARDWARE iPhone 7+ · all modern Macs · all iPad Pro DEFAULT SwiftUI Color(red:green:blue:) defaults to sRGB. The hardware capability is silently thrown away.
$ man "muddy gradient"
SYMPTOM LinearGradient without colorSpace: .perceptual interpolates in sRGB linear-RGB, which fails at hue boundaries. A blue-to-red gradient goes through a desaturated grey at the midpoint instead of a proper purple. FIX Add colorSpace: .perceptual to the LinearGradient. Tell SwiftUI to interpolate in OKLab. PALETTEPUNK BEHAVIOR Catches every gradient in your project that's missing it. Emits the fix as an additive patch.
$ man meshgradient
NAME MeshGradient — 2D color grid (iOS 18+) DESCRIPTION A 2D grid of colors interpolated across both axes. Produces organic, painterly washes that 1D LinearGradient mathematically cannot. Apple Weather uses it. Apple Music uses it. WHEN TO USE Hero surfaces (welcome screen, splash, big card background). PALETTEPUNK BEHAVIOR Flags every hero surface where the opportunity exists. Surfaces sample patch (does not auto-rewrite in v1.0).
$ how-to convert HEX to OKLCH in CSS
OLD (sRGB): background: #2a3f8f; NEW (Display P3 + OKLCH): background: #2a3f8f; background: color(display-p3 0.165 0.247 0.561); GRADIENT FIX: background: linear-gradient(to bottom, #2a3f8f, #5a3055); background: linear-gradient(in oklch to bottom, color(display-p3 0.165 0.247 0.561), color(display-p3 0.353 0.188 0.333)); BROWSER SUPPORT Chrome 111+ · Safari 16.4+ · Firefox 113+ Old browsers ignore line 2 and use line 1.
$ how-to fix Safari iOS color banding
SYMPTOM Long sRGB gradients on iPhone display visible bands — 8-bit color depth produces stair-step transitions. ROOT CAUSE sRGB gradient interpolation + 8-bit quantization. FIX 1. Switch to OKLCH interpolation (smoother math at midpoints). 2. Use Display P3 primaries (wider gamut = finer perceptual steps). 3. Add 1-2% noise overlay to defeat residual banding on 8-bit. PALETTEPUNK BEHAVIOR Handles steps 1 and 2 automatically. Step 3 ships in v1.5.
$ man SwiftUI.Color.displayP3
OLD (sRGB-default): Color(red: 0.5, green: 0.3, blue: 0.8) NEW (Display P3 explicit): Color(.displayP3, red: 0.5, green: 0.3, blue: 0.8) FALLBACK FOR PRE-iOS 18: if #available(iOS 14, *) { Color(.displayP3, red: 0.5, green: 0.3, blue: 0.8) } else { Color(red: 0.5, green: 0.3, blue: 0.8) } DIFFERENCE Same numerical values rendered in the wider P3 gamut on capable displays. Visibly more saturated on Pro displays. Identical fallback on standard displays.
$ why my designer's Figma doesn't match
CAUSE Figma exports colors as sRGB hex. Color(hex: "#xxxxxx") in Swift defaults to sRGB. On a Display P3 iPhone, the rendered color is silently flatter than what the designer saw in Figma's calibrated viewport. FIX Reinterpret the same hex code in Display P3. Same source value. More vibrant output. No designer fight. PALETTEPUNK BEHAVIOR Adds .displayP3 to every Color literal automatically.

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 →

PART 3 · LATER

Paint match

Display P3 → Benjamin Moore · Sherwin Williams · Pantone

Pull any Display P3 color out of your app. Get the closest Benjamin Moore, Sherwin Williams, Behr, Farrow & Ball, RAL, or Pantone code — with fidelity scores. For the designer who wants their app's hero color to match their living room wall. For the brand that wants pixel and print to actually align.

"Your app and your living room, same color."