Skip to content

FAQ ​

Practical questions, organized by topic. For full detail, follow the links.

Basics ​

Is WebToApp free? ​

Yes. WebToApp is open source under The Unlicense.

What Android version do I need? ​

Android 7.0 (API 24) or newer.

Do I need a PC to build apps? ​

No. The entire build — binary patching, signing, and AAB export — happens on-device. A PC is only needed if you want to build WebToApp itself from source.

How is this different from a URL-wrapper app? ​

A URL wrapper just opens a website in a WebView. WebToApp additionally runs real server runtimes on-device (Node.js, PHP, Python, Go, WordPress via fork+exec), ships a hardened network stack (DoH, TLS fingerprint, ECH), patches and signs APKs at the binary level, and supports modules/userscripts/MV3 extensions — all without a PC or remote build server.

What app types can I create? ​

Twelve: Web, Multi-Web, HTML, Offline Pack, Frontend, PHP, WordPress, Node.js, Python, Go, Media, and Gallery. See Create App. PHP, WordPress, Node.js, Python, Go, and Media stay out of the create grid until About → Advanced features is on. Gallery does not need that switch.

Creating & editing ​

What's the difference between Edit Core Config and Edit Common Config? ​

  • Edit Core Config — the type-specific source/runtime settings (different for each app type). See Edit Core Config.
  • Edit Common Config — the shared options every app has (appearance, networking, privacy, extensions, export). See Edit Common Config.

Web apps have a single combined Edit entry instead of the two.

What's the difference between preview and export? ​

Preview runs the host path (everything on the builder's classpath). Export builds a standalone APK that runs the shell runtime, reading your config from an embedded app_config.json. See Getting Started.

Building & export ​

What are the build modes (FULL / CONTENT_OVERLAY / REUSE_UNSIGNED)? ​

Rebuilds are incremental and content-addressed:

  • FULL — rebuild from the template (always used for encrypted builds).
  • CONTENT_OVERLAY — only app content changed.
  • REUSE_UNSIGNED — re-sign a previously built unsigned APK.

See Build APK.

What's the difference between APK and AAB export? ​

Build APK produces an installable, signed APK. AAB export (from Google Play) produces a Play-ready bundle and rewrites targetSdk to the Play-required level. See APK Export Config.

Can I publish my app to Google Play? ​

Usually yes. Web, Multi-Web, HTML, Offline Pack, Frontend, Media, and Gallery apps all export a Play-ready AAB. Two cases cannot: Node.js / PHP / Python / Go / WordPress apps, and any build with resource encryption enabled. See Google Play.

What targetSdk do generated apps use? ​

Generated APKs inherit the shell template's targetSdk (currently 35) and minSdk 23. Node.js, PHP, Python, Go, and WordPress APKs are pinned to targetSdk 28 so they can exec bundled binaries; the targetSdk override does not apply to them. Other types can pin targetSdk 28/31/33/34/35/36, and any type can raise minSdk from 23 up to the current targetSdk, from APK Export Config. The AAB exporter rewrites targetSdk to the Play-required level.

How do I sign with my own key? ​

Create or import a keystore (PKCS12/PFX/JKS/BKS) and choose the signature schemes (V1/V2/V3) in APK Export Config.

Where are build outputs stored? ​

In the File Manager — APK builds, AAB exports, app clones, and build logs.

Runtimes ​

Why does my Node/PHP/Python/Go app download something on first use? ​

The runtime binaries aren't bundled into the base app to keep it small; they're downloaded once on first use and cached. Manage them in Runtime Management and the Linux Environment.

My Node.js app fails with a loadNode / loadJniBridge error. Why? ​

The exported APK must embed libnode_bridge.so, libnode.so (16KB-aligned), and libc++_shared.so. A missing native library causes this failure. See the Node.js export requirements.

How are ports managed? What if there's a conflict? ​

Runtime apps allocate ports through the Port Manager with a conflict policy: REASSIGN (pick another port), AUTO_KILL (stop the conflicting service), or ALERT (notify).

Why does my runtime app need a DNS bridge? ​

The packed native binaries (musl-based) can't always reach the system DNS resolver, so a local DNS bridge proxy provides DNS resolution and outbound HTTP. This is wired automatically.

Features & config ​

How do I make my app fullscreen or hide the status bar? ​

Use Fullscreen Mode — it controls immersive mode and whether the status/navigation bars stay visible.

How does ad blocking work in exported apps? ​

The host ad blocker serves preview, and the compiled rule set ships inside the exported APK. Configure rules/subscriptions per app under Ad Blocking; manage lists in Hosts Ad Blocking.

How do I use a custom DNS or DNS-over-HTTPS? ​

See Custom DNS — choose a DoH provider (Cloudflare, Google, AdGuard, NextDNS, CleanBrowsing, Quad9, Mullvad) or a custom endpoint.

Extensions ​

What's the difference between modules, userscripts, and MV3 extensions? ​

  • JS/CSS modules — WebToApp's native format with a config UI and panel. See JS Modules.
  • Userscripts — Tampermonkey/Greasemonkey-style .user.js with GM_* APIs. See Userscripts.
  • MV3 extensions — Chrome Manifest V3 extensions with chrome.* APIs. See Chrome MV3.

Are userscript GM_* functions gated by @grant? ​

No. @grant declarations are parsed and listed in GM_info, but all GM_* functions are exposed unconditionally. Declare grants anyway for portability with real Tampermonkey/Greasemonkey. See the API Reference.

Do MV3 extensions run in a truly isolated world? ​

No. Android WebView has a single JavaScript context; ISOLATED and MAIN worlds are simulated (each extension overwrites globalThis.chrome). See Chrome MV3.

How do I publish a module to the market? ​

Add a folder under modules/, update registry.json, and open a pull request. See Publish to the Market.

Troubleshooting ​

A feature works in preview but not after export. Why? ​

Usually a config field did not flow through the export chain (model → ApkConfig JSON → shell config → runtime). See Config Field Drift for the diagnosis checklist.

My build failed. Where do I look? ​

The build dialog shows a diagnostic report (failure stage, cause, and the build-log tail) that you can copy. Build logs are also viewable in the File Manager.

My exported app can't reach the network. What should I check? ​

Check the app's Custom DNS and proxy settings under Advanced Settings. For runtime apps, the local DNS bridge handles resolution automatically.

Data & help ​

How do I back up or migrate my apps? ​

Use Data Backup (home ⋮ menu) to move the whole workspace. Export source shares one app as an Android Studio project.

Where do I get help? ​