docs / runtime behaviour

Links, downloads and pop-ups

Inside an app, "open this link" can mean four different things. Here is what each kind of link does in a ZIP-built app, and how to get the behaviour you want.

6 min read·5 sections·updated Sep 2026
TL;DR

Relative links navigate inside the app. External https:// links also open inside the app; target="_blank" opens a full-screen pop-up. In Pro builds tel:, mailto:, sms:, geo:, intent: and wa.me/t.me/Play/Maps links open the matching app. Downloads, blob URLs, PDFs and window.print() are not supported — use the workarounds below.

LinkBehaviour
about.html, #/settingsNavigates inside the app; back returns
https://other-site.comLoads inside the app (online only); back returns to your page
target="_blank" or window.open()Opens a full-screen pop-up window over the app; back closes it
tel: mailto: sms: geo: market: intent: whatsapp:Pro: opens the dialler, mail app, Maps… · Free: shows an error page
wa.me, api.whatsapp.com, t.me, m.me, play.google.com, maps.google.com, maps.app.goo.glPro: opens WhatsApp, Telegram, Messenger, Play Store or Maps · Free: loads the website inside the app

"Loads inside the app" is usually what you want for your own pages and often not for anyone else's: a user reading a news article inside your app has no address bar and may not realise they left. Keep external links to a minimum, and for app-style actions prefer the link forms in the last row, which Pro hands off to the right app.

Contact buttons that just work

<a href="tel:+15551234567">Call us</a>
<a href="mailto:hello@example.com?subject=Order%2042">Email</a>
<a href="https://wa.me/15551234567?text=Hi%21">WhatsApp</a>
<a href="https://maps.google.com/?q=Eiffel+Tower">Directions</a>

On a Pro build each of these opens the phone's own app. On a free build, prefer the https:// forms (wa.me, maps.google.com), which at least load a working page instead of an error.

Downloads

The app has no download manager. A link with the download attribute, a blob: or data: URL generated by your code, or a server response with Content-Disposition: attachment does nothing visible. Workarounds, by use case:

  • Letting the user keep some text or data — show it on screen with a Copy button (navigator.clipboard.writeText).
  • Sending a generated file to someone — upload it to your server and share the resulting https link via mailto: or wa.me.
  • Exporting app data for backup — sync it to your backend, or show it as JSON the user can copy.
  • Images — the WebView has no long-press "save image" menu. Show the image full-screen so the user can take a screenshot, or share its hosted https URL.

PDFs and printing

Android WebView cannot display PDF files, and window.print() does nothing. For documents the user reads, render them as HTML pages in the ZIP, or use PDF.js (bundled) to draw them on a canvas. For receipts and tickets, an HTML page designed for the phone screen beats a PDF anyway.

Pop-ups and OAuth windows

window.open() opens a separate full-screen WebView. Simple pop-ups (a terms page, a help article) behave as expected; payment and sign-in flows that depend on the pop-up talking back to its opener may not complete, and many providers refuse embedded WebViews outright (see sign-in methods). Prefer redirect-based flows, and test every third-party pop-up on a device before relying on it.

FAQ

How do I make a link open in the phone's browser instead of the app?

There is no web-standard way from inside a WebView. Pro builds pass intent: URLs to Android, so a link such as intent://example.com/#Intent;scheme=https;end asks the system to open the page in the default browser. On free builds, keep users in the app or show the URL for them to copy.

Why does tapping a phone number show an error page?

Free builds load every link in the WebView, and the WebView cannot open tel: itself. Pro builds hand tel:, mailto:, sms: and similar links to the matching app.

Can my app open a PDF?

Not natively — Android WebView has no PDF viewer. Bundle PDF.js to render it in the page, or convert the document to HTML.

Tools for this step

Unzip it on a phone today

Upload the ZIP, name the app, pick an icon — and download a signed APK a few minutes later. Free builds, no watermark, no Android Studio.

Convert a ZIP — free site.zip → app-release.apk