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 6.0 (API 23) 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.
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.
Why do generated apps target SDK 28?
The low targetSdk is deliberate: it lets generated apps fork+exec native runtimes (Node.js, PHP, Python, Go, WordPress) from app storage. The AAB exporter separately rewrites targetSdk for Play distribution.
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.jswithGM_*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 / restore in About, or export individual apps as reusable templates via Export.
Where do I get help?
- GitHub: github.com/shiaho777/web-to-app
- Telegram: t.me/webtoapp777
- X (Twitter): @shiaho777
