★ THE BIGGEST PUNK · EVERY FULL-SCREEN UI ON MOBILE

Your hero gets cut off
behind iOS Safari's URL bar.

HEIGHT: 100VH · ON A MOBILE BROWSER · WHAT COULD GO WRONG

You wrote height: 100vh on your hero section. On desktop it looks perfect. On iPhone, Safari shows a URL bar at the top of the viewport, then collapses it on scroll. The vh unit is measured against the URL-bar-collapsed state — so when the bar is visible (most of the user's session), your hero overflows by ~45px and the CTA gets cut off at the bottom. iOS Safari finally added dvh / svh / lvh in 2023 (Safari 16) — every framework reset, every Tailwind config, every shadcn template still emits the broken 100vh. Essentially 100% of front-end devs building mobile-responsive apps have shipped this bug.

Run the CLI · Free Or drop your URL
★ THE CLI · WHERE DEVS ACTUALLY LIVE

Skip the browser. Run VHPunk against your whole codebase from the terminal you already have open. Walks HTML, JSX, TSX, Vue, Svelte, CSS, SCSS. Prints every broken height: 100vh finding with the exact progressive-enhancement patch (keeps the legacy vh as a fallback for pre-Safari-16 browsers, adds the dvh on top). Exits non-zero if bugs found — drop it in CI to fail PRs that introduce regressions.

$ npx @radioart/vhpunk ./src

Zero install. Zero signup. Zero network calls — runs entirely on your machine. $99 lifetime unlocks --fix mode, which auto-applies every patch in place across your whole repo (preserves the vh fallback so pre-Safari-16 users still work). License verification is offline (Ed25519 signature, never phones home — see the Light Pact).

★ UNIVERSAL AUDIT · ALL 7 PUNKS · NO INSTALL · DROP YOUR URL

Paste your live site below. We fetch the HTML from our edge and scan for every bug pattern we audit — broken 100vh, keyboard traps, sticky death, dropdown Firefox blindness, anchor-positioning ghost tethers, scroll bleed, notch coverage. Free. Anonymous. No signup. Nothing stored.

Honest caveat: we scan your server-rendered HTML. For React/Next/Vue/Svelte sites where the UI loads via JavaScript, the bug may be in your client bundle instead — install the CLI to scan your source code.

★ THE BUG · ONE PARAGRAPH

100vh is measured against the URL-bar-COLLAPSED viewport. When the bar is visible, your content overflows by 45-60 pixels. The CTA gets cut off. Conversions die.

The vh unit was specified in 2012, before any mobile browser had a collapsing URL bar. The CSS spec defines vh as "1% of the LARGEST possible viewport" — which on iOS Safari is the URL-bar-collapsed state. When the bar is visible (page load, on-scroll-up, after focus changes), the actual visible area is ~45-60px shorter than 100vh. Anything sized to 100vh overflows. The CSS Working Group fixed this in 2023 with three new units: 100dvh (dynamic — adjusts as bar shows/hides), 100svh (small — always-collapsed measurement, safe for sticky CTAs), 100lvh (large — matches legacy 100vh). Safari 16 shipped them in September 2022. Chrome shipped them in Chrome 108. Nine years after the bug was first reported, three years after the fix shipped, every framework reset still emits broken 100vh.

~70M
front-end devs building mobile-responsive web apps — essentially all of them have hit this bug · Stack Overflow Developer Survey 2025
2023
Safari 16 shipped dvh, svh, lvh — the fix has been baseline available for nearly 3 years · MDN Compat data
0
popular framework starter templates emit dvh by default. Tailwind h-screen still emits 100vh. Bootstrap. shadcn. Vite. Astro. None of them. · informal survey, June 2026
1
CSS line to fix every occurrence in your codebase. Progressive enhancement preserves pre-Safari-16 fallback. · git-reversible

PLAIN ENGLISH You wrote height: 100vh on your hero because every tutorial does it that way. On your laptop it looks perfect. On your phone, the URL bar at the top of Safari eats 45 pixels of your hero. Your call-to-action button gets pushed below the fold. Users don't tap it. You lose the conversion. This isn't your fault — it's the way CSS was designed in 2012 before phones had collapsing browser chrome. But it IS your problem now. VHPunk finds every place in your code where this is happening and writes the deterministic two-line fix.

★ THE PUNK PASS · $299 · ALL 7 CLIs · LIFETIME

VHPunk catches the 100vh bug. KeyboardPunk catches the iOS keyboard trap. StickyPunk catches the overflow-hidden ancestor that silently kills your sticky header. SelectPunk, AnchorPunk, ScrollPunk catch the rest. The Punk Pass is all seven lifetime CLIs in one $299 purchase. Cheaper than three singles. Every future Punk we ship is included automatically. Built for agency CSS leads + SaaS engineering teams who need ONE thing to drop into CI to prevent these bugs from ever shipping again.

Buy the Punk Pass · $299 lifetime · all 7 CLIs →

14-day refund · no subscription · cancellation never bricks anything · offline license verification · zero telemetry · Light Pact compliant

★ PRICING · STRAIGHT MATH
VHPUNK SINGLE
$99
lifetime · one-time
  • Free CLI (report-only) — already yours, no payment needed
  • $99 unlocks --fix auto-apply mode
  • GitHub Action wrapper for CI gating
  • All future VHPunk updates — included forever
Buy VHPunk · $99 →
PUNK PASS · BEST VALUE
$299
lifetime · all 7 CLIs · save $394
  • VHPunk + KeyboardPunk + StickyPunk + SelectPunk + AnchorPunk + ScrollPunk
  • --fix auto-apply on every CLI
  • Every future Punk we ship — included automatically
  • One license file covers your whole CI matrix
Get the Punk Pass · $299 →
14-day refund · no subscription · cancellation never bricks anything
★ THE FIX HAS SHIPPED SINCE 2023

Safari 16 shipped dvh, svh, and lvh in September 2023. Chrome and Firefox followed within weeks. The spec is three years old, the fix is one CSS line, and the hero still gets cut off on every chat app and SaaS landing page our scanner finds it on. Frameworks defaulted to 100vh when iOS shipped in 2007 and never updated.

The audit is open. The scanner source and raw results live at /methodology. Run it on us. Run it on yourselves. The patch is additive — old browsers see what they saw, new browsers light up the dynamic viewport hardware they've shipped for years. It's time to use what's been there.