Capacitor Custom Native Header UI on iOS (Free Guide)
The header is where 'native or not' is decided at first glance, so it's worth getting right.
TL;DR
A Capacitor app renders web content, and the header is the giveaway. Make it native: respect safe-area insets so it clears the notch and status bar, use iOS navigation-bar conventions (title, large title on scroll, back chevron), set a matching status bar with Capacitor's plugin, and reference a free VP0 iOS design.
Capacitor wraps a web app in a native shell, which is a fast path to the App Store, but the giveaway that an app is web-based is usually the header: a web-styled top bar that ignores the notch, the status bar, and iOS large-title conventions. The short answer is, make the header genuinely native, respect the safe area and status bar, use an iOS-style navigation bar (ideally a real native one, not a web div), and design it from a free VP0 iOS reference. The header is where “native or not” is decided at first glance, so it is worth getting right.
Why the header gives a Capacitor app away
A Capacitor app renders web content in a WebView, so by default the top of the screen looks like a website: a flat bar that may collide with the status bar or notch, no large-title behavior, and web-style back navigation. Users read this instantly as “not a real app,” and it feels off, around 38% of people disengage from layouts that feel wrong. The fix is to treat the header as native chrome: account for the safe-area insets so content does not hide under the notch or status bar, adopt iOS navigation-bar conventions (title, back chevron, large title on scroll), and make the status bar style match your header.
How to build a native-feeling header in Capacitor
VP0 is a free iOS design library for AI builders, useful as the target for what the header should look like. Build the header to iOS conventions: read the safe-area insets (Capacitor exposes them, and CSS env(safe-area-inset-top) helps) so the bar sits below the status bar, style an iOS navigation bar with a centered or large title and a proper back chevron, and set the status bar style with Capacitor’s status-bar plugin to match. For the most authentic feel, render the navigation as native chrome rather than a web div where your stack allows. Follow Apple’s Human Interface Guidelines for navigation bars. For the broader web-to-native translation, see web app to iOS app UI kit Figma.
Native header building blocks
Here is what each part should do.
| Part | What to get right |
|---|---|
| Safe area | Header below notch/status bar |
| Title | iOS style, large-title on scroll |
| Back navigation | iOS chevron, expected behavior |
| Status bar | Style matches the header |
| Native chrome | Real nav bar where possible |
A worked example
Say you ship a Capacitor app and the header looks web-y. Fix it: pad the header by env(safe-area-inset-top) so it clears the status bar, restyle it as an iOS navigation bar (title centered, large title that collapses on scroll, a back chevron with iOS behavior), and use Capacitor’s status-bar plugin to set a matching style. Use a VP0 iOS design as the reference for the exact look. Suddenly the app reads as native at the top, where users judge first. For making the rest of the screens feel native, see Compose Multiplatform iOS UI look and feel for the parallel idea, and server-driven UI JSON to React Native examples for dynamic content.
Common mistakes
The most common mistake is a web-styled header that ignores the safe area and collides with the status bar or notch. The second is no large-title behavior or wrong back navigation, breaking iOS expectations. The third is a status bar style that clashes with the header (dark text on a dark bar). The fourth is faking the header entirely in web CSS when native chrome would feel far better. The fifth is having no iOS reference, so the header is approximate rather than correct.
Key takeaways
- The header is where a Capacitor app’s web origin shows; make it genuinely native.
- Respect safe-area insets so the header clears the notch and status bar.
- Use iOS navigation-bar conventions (title, large title on scroll, back chevron) and a matching status bar.
- Reference a free VP0 iOS design for the exact look, and prefer native chrome where your stack allows.
Frequently asked questions
How do I make a Capacitor app’s header feel native on iOS? Respect the safe-area insets so it clears the status bar, style it as an iOS navigation bar (title, large title on scroll, back chevron), set a matching status bar style with Capacitor’s plugin, and reference a VP0 iOS design for the look.
Why does my Capacitor app look like a website? Usually the header: a web-styled top bar that ignores the safe area and iOS navigation conventions. Fixing the header to native conventions is the highest-impact change for native feel.
Do I need native code for the header? Not necessarily, CSS safe-area handling plus Capacitor’s status-bar plugin gets you far. For the most authentic feel, rendering the navigation as native chrome where your stack allows is even better.
What is the quickest native-feel win in Capacitor? The header. It is the first thing users see, and respecting the safe area plus iOS navigation conventions makes the app read as native immediately.
Frequently asked questions
How do I make a Capacitor app's header feel native on iOS?
Respect the safe-area insets so it clears the status bar, style it as an iOS navigation bar (title, large title on scroll, back chevron), set a matching status bar style with Capacitor's plugin, and reference a VP0 iOS design for the look.
Why does my Capacitor app look like a website?
Usually the header: a web-styled top bar that ignores the safe area and iOS navigation conventions. Fixing the header to native conventions is the highest-impact change for native feel.
Do I need native code for the header?
Not necessarily, CSS safe-area handling plus Capacitor's status-bar plugin gets you far. For the most authentic feel, rendering the navigation as native chrome where your stack allows is even better.
What is the quickest native-feel win in Capacitor?
The header. It is the first thing users see, and respecting the safe area plus iOS navigation conventions makes the app read as native immediately.
Part of the AI App Builders & Vibe Coding Tools hub. Browse all VP0 topics →
Keep reading
Tauri Mobile (Rust) iOS UI: Lightweight, Native-Feeling
Tauri mobile pairs a Rust core with a web UI for small, fast iOS apps. The UI runs in a web view, so design to iOS conventions using a free VP0 design.
Web App to iOS App UI: How to Translate It (Not Wrap)
Don't wrap your website in a WebView. Translate web patterns to native iOS (top nav to tab bar, hover to sheets), rebuilding each screen from a free VP0 design.
How to Build an iOS App With AI: A 2026 Guide
Start from a real iOS design, drive an AI builder like Claude Code, and ship to the App Store in days. The full workflow, tool by tool.
Framer for iOS Apps: Where It Fits and Where It Stops
Framer is brilliant for design and prototypes, but it is web-first. See where Framer fits in an iOS workflow, and how to get from a Framer concept to a real app.
Kotlin Multiplatform on iOS: Share Logic, Keep Native UI
KMP shares business logic, not UI. Build truly native SwiftUI navigation from a free VP0 design over your shared Kotlin code, so iOS feels like iOS.
React Native WebView Wrapper: Do It Without Getting Rejected
Wrapping a web app in React Native is tempting but risky. Build a WebView shell from a free VP0 design with native chrome and real native value.