The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone
6,330
stars
595
commits
Kotlin
primary language
Sep 11, 2026
updated
An on-device APK workshop that goes far beyond URL wrapping — it can fork and exec full server runtimes, ship a hardened anti-censorship network stack, sign bundles for Google Play, and run MV3 browser extensions, all without a PC or a remote build server.
English · 简体中文
What's different · What you can build · Capability overview · Feature map · Module market · Documentation · Architecture · Build
Most "website to app" tools stop at wrapping a URL in a WebView. WebToApp is closer to a pocket-sized APK workshop, and the hard parts are exactly where it diverges:
apksig — no remote build queue, no PC.A quick scan of what's in the box. Each links to the detailed feature map below.
| Area | Highlights |
|---|---|
| Build targets | Web · HTML · Frontend · WordPress · Node.js · PHP · Python · Go · Image · Video · Gallery · Multi-Web |
| Browser engines | System WebView by default; optional GeckoView (Firefox) runtime for ECH / SNI encryption |
| Network & anti-censorship | DoH (7 providers), TLS fingerprint spoofing + MITM bridge, ECH, static/PAC/SOCKS5 proxies, CORS bypass |
| Privacy & hardening | 50+ vector browser fingerprint disguise, resource encryption (AES-256-GCM), anti-debug, activation gating |
| Local runtimes | Native Node.js 18.20, PHP 8.4 + Composer 2.10, Python 3.14, official Go 1.26, WordPress 7.x over SQLite |
| Extensions | Built-in modules, userscripts with GM_*, MV3 Chrome extensions, live Chrome Web Store search |
| APK/AAB output | On-device V1/V2/V3 signing, Google Play AAB export with targetSdk rewrite, keystore management |
| Agent | Full-app automation via 50+ tools: generate, build, export, manage ports/engines/runtimes, clone apps, ad-block rules, config templates, and more; auto-retry on 429/5xx |
| Host languages | 10 UI languages — 中文 · English · العربية · Português · Español · Français · Deutsch · Русский · 日本語 · 한국어 (Arabic RTL) |
| Input | Output | Good for |
|---|---|---|
| Website URL | WebView-based APK | Landing pages, tools, dashboards, docs, internal systems |
| HTML / static front-end | Localhost-backed APK | React, Vue, Vite, static builds, offline web apps |
| Node.js / PHP / Python / Go | APK with an on-device local server | Small server apps, admin tools, demos, prototypes |
| WordPress | APK running WordPress over local PHP + SQLite | Portable sites, theme/plugin demos, content packages |
| Images / video / galleries | Media-focused APK | Albums, course materials, portfolios, offline viewers |
| Multiple sites | Tab/card/feed/drawer multi-web APK | Link hubs, portals, app collections |
| Installed APK | Rebranded clone or shortcut disguise | Icon/name/package experiments, repackaging research |
WebToApp has a large number of switches. The sections below group them by use case, kept collapsible so the top of the page stays scannable.
PrivateNetworkNativeBridgeAdapter without the full Native Bridge surface.:nodejs OS process via a native node_launcher wrapper loading libnode.so; supports custom native .node extensions.pmmp/PHP-Binaries, downloaded once on first use, with Composer 2.10.x and custom native extensions (zend_extension, .so)..pypackages, custom native extensions supported; binary names are versioned so future bumps do not hard-code paths..tar.gz from dl.google.com, USTC mirror for CN), on-device go build / go mod / go run, vendor/ offline builds, static serving, and the native go_exec_loader wrapper; DNS and CA trust go through the same local JVM bridge used by PHP.sqlite-database-integration), with theme and plugin import..user.js with a GM_* bridge (storage, requests, styles, menu commands) and promise-based GM.* APIs gated by script grants.chrome.* polyfills for runtime, storage, tabs, scripting, and declarative network-request parsing.WTA1: gzip + Base64) and QR sharing via ZXing.window.print() and blob/data-URL PDFs to the Android print framework / PDF export (with an onPageStarted re-inject fallback so late navigations stay hooked).versionName, versionCode, icon, label, architecture target, and export format.targetSdk rewritten to the Play-required level (currently 36) and protobuf metadata generated locally; cancellable mid-build.META-INF/<name>.SF / .RSA.url(), srcset, @import, path rewriting, same-domain limits, depth limits, and size limits; parallel streaming worker pool with main-thread progress callbacks.WebToApp ships a built-in AI agent (open from ⋮ → Agent) that can operate the entire app through natural-language conversation. Instead of tapping through menus, you describe what you want and the Agent executes it via a tool-calling loop backed by any OpenAI-compatible LLM you configure in AI Settings.
How it works:
tool_calls.40+ built-in tools, grouped by domain:
| Domain | Examples |
|---|---|
| Files | Read, Write, Edit, Delete, List, Glob, Grep project files |
| Apps | List, Get, Create, Update app configurations |
| App lifecycle | Build APK/AAB, Export, Share, Create shortcut, Duplicate, Delete, Move to category |
| Ports & engines | Scan/kill ports, check/select/delete browser engines (WebView, GeckoView) |
| Runtimes | Status, install, and cache-clear for Node.js, PHP, Python, Go, WordPress, Linux env |
| Ad-block | Rule counts, import/remove/enable/disable hosts subscriptions |
| Stats & health | Usage statistics, URL health checks |
| App modifier | List installed apps, clone/rebrand, batch import, export templates |
| Build env & compliance | Initialize Linux build env, install components, Google Play policy checks |
| Modules | List, create, update extension modules |
| Interaction | Ask user questions (multi-select), plan mode (propose → approve → execute), todo tracking |
WebToApp has a GitHub-backed module market for community JS/CSS extension modules. The catalog is just files in this repository, so contributions use a normal pull-request flow.
modules/
├── registry.json # app-facing catalog
├── submissions.json # CI-generated PR / contributor metadata
├── README.md # contributor guide
└── <module-folder>/ # each module
The app fetches both registry.json and submissions.json and only shows modules present in both, keeping the in-app catalog aligned with actually-merged PRs. The submissions file also records every contributor per module, so the catalog shows stacked avatars and a contributors leaderboard. Catalog files and module icons route through a global mirror first, with raw.githubusercontent.com and jsDelivr as automatic fallbacks, so the store loads fast everywhere (including mainland China).
modules/, update registry.json, and open a PR.The high-level architecture lives here; the canonical submission rules, field schemas, reviewer checklist, and CI validation details live in modules/README.md.
The community market carries only JS/CSS extension modules. Browser extensions (MV3) are no longer a community catalog — instead the Browser Extensions tab searches the Chrome Web Store live: type a keyword, browse results, and install on demand through the existing CRX pipeline. Live search requires a network that can reach Google.
The official documentation site is published at shiaho777.github.io/web-to-app, in English and 简体中文:
| Section | URL | Covers |
|---|---|---|
| Guide | /guide/introduction | Getting started, main screen, app types, per-app actions and common config, FAQ |
| Developer | /developer/ | Architecture, export pipeline, shell sync, config drift, i18n, change recipes |
| Extensions | /extensions/ | JS/CSS modules, userscripts, Chrome MV3, API reference, publishing |
| 简体中文 | /zh/ | Full Chinese mirror of every page above |
app (the full builder and host), shell (the runtime host embedded into generated APKs), and clone-host (host code for app cloning — compiled to a classes.jar, converted to DEX via d8, and bundled as an asset for AppCloner).app and synchronized into shell, so shared WebView/runtime behavior has one source of truth (core/shell, core/webview, core/engine, core/extension, ui/shell, etc.).apksig. A separate encrypted build path (EncryptedApkBuilder) offers resource encryption, shelling, and integrity checks.targetSdk = 28 deliberately (via the shell template) — it is what lets them fork+exec native runtimes (Node.js, PHP, Python, Go, WordPress) from app storage, a capability URL-wrapper tools lack. The host app itself targets 35 (antivirus engines flag low-targetSdk builds as legacy malware); SELinux W^X at that level blocks host-side preview of the exec-based runtimes, which degrade with an explicit message — Node.js preview (JNI) and every exported app are unaffected. For Play Store distribution the AAB exporter separately rewrites targetSdk to the Play-required level (currently 36). WebView-only app types (Web/HTML/Frontend/Gallery/Media/MultiWeb) can also opt to raise the standalone APK's targetSdk (34/35/36) from the APK export section; server-runtime types are gated to 28 because targetSdk >= 29 enforces W^X and breaks fork+exec of the bundled binaries..so + omni.ja) are downloaded on first use rather than bundled into the base APK; the GeckoView API classes come from a gradle dependency, while the heavy native artifacts are fetched on demand.WebApp (data/model/WebApp.kt) and its *Config classes — the single source of truth for all feature settings, carried through a full packaging passthrough chain into the generated APK.okhttp-dnsoverhttpscom.android.tools.build:apksig 8.3.0 for APK signingprotobuf-javalite 3.25.5 for AAB metadatanode_launcher and go_exec_loaderSee app/build.gradle.kts for the complete dependency list.
Requirements: Android Studio Hedgehog or newer, JDK 17. The Gradle wrapper pins Gradle 9.4.1.
git clone https://github.com/shiaho777/web-to-app.git
cd web-to-app
./gradlew assembleDebug
For release builds, configure signing through local.properties and app/build.gradle.kts.
| Lane | What you do | Guide |
|---|---|---|
modules/ | Publish a community module to the in-app market | modules/README.md |
| Issues | Report a bug or request a feature | GitHub Issues |
| Code | Fix a bug or build a feature in the Android client | CONTRIBUTING.md |
AGENTS.md | Authoritative guide for AI coding agents and deep contributors (architecture, shell sync, export pipeline, config drift, packaging constraints) | AGENTS.md |
Developed by shiaho.
| Platform | Link |
|---|---|
| GitHub | github.com/shiaho777/web-to-app |
| Telegram | t.me/webtoapp777 |
| X (Twitter) | @shiaho777 |
| Bilibili | b23.tv/8mGDo2N |
| QQ Group | 1041130206 |
Advanced features such as device disguise are intended for technical demonstration and must only be used with informed user consent.
Open source · Built for Android power users · Star to support the project
Kotlin
56.8%
Python
40.3%
The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone
6,330
stars
595
commits
Kotlin
primary language
Sep 11, 2026
updated
An on-device APK workshop that goes far beyond URL wrapping — it can fork and exec full server runtimes, ship a hardened anti-censorship network stack, sign bundles for Google Play, and run MV3 browser extensions, all without a PC or a remote build server.
English · 简体中文
What's different · What you can build · Capability overview · Feature map · Module market · Documentation · Architecture · Build
Most "website to app" tools stop at wrapping a URL in a WebView. WebToApp is closer to a pocket-sized APK workshop, and the hard parts are exactly where it diverges:
apksig — no remote build queue, no PC.A quick scan of what's in the box. Each links to the detailed feature map below.
| Area | Highlights |
|---|---|
| Build targets | Web · HTML · Frontend · WordPress · Node.js · PHP · Python · Go · Image · Video · Gallery · Multi-Web |
| Browser engines | System WebView by default; optional GeckoView (Firefox) runtime for ECH / SNI encryption |
| Network & anti-censorship | DoH (7 providers), TLS fingerprint spoofing + MITM bridge, ECH, static/PAC/SOCKS5 proxies, CORS bypass |
| Privacy & hardening | 50+ vector browser fingerprint disguise, resource encryption (AES-256-GCM), anti-debug, activation gating |
| Local runtimes | Native Node.js 18.20, PHP 8.4 + Composer 2.10, Python 3.14, official Go 1.26, WordPress 7.x over SQLite |
| Extensions | Built-in modules, userscripts with GM_*, MV3 Chrome extensions, live Chrome Web Store search |
| APK/AAB output | On-device V1/V2/V3 signing, Google Play AAB export with targetSdk rewrite, keystore management |
| Agent | Full-app automation via 50+ tools: generate, build, export, manage ports/engines/runtimes, clone apps, ad-block rules, config templates, and more; auto-retry on 429/5xx |
| Host languages | 10 UI languages — 中文 · English · العربية · Português · Español · Français · Deutsch · Русский · 日本語 · 한국어 (Arabic RTL) |
| Input | Output | Good for |
|---|---|---|
| Website URL | WebView-based APK | Landing pages, tools, dashboards, docs, internal systems |
| HTML / static front-end | Localhost-backed APK | React, Vue, Vite, static builds, offline web apps |
| Node.js / PHP / Python / Go | APK with an on-device local server | Small server apps, admin tools, demos, prototypes |
| WordPress | APK running WordPress over local PHP + SQLite | Portable sites, theme/plugin demos, content packages |
| Images / video / galleries | Media-focused APK | Albums, course materials, portfolios, offline viewers |
| Multiple sites | Tab/card/feed/drawer multi-web APK | Link hubs, portals, app collections |
| Installed APK | Rebranded clone or shortcut disguise | Icon/name/package experiments, repackaging research |
WebToApp has a large number of switches. The sections below group them by use case, kept collapsible so the top of the page stays scannable.
PrivateNetworkNativeBridgeAdapter without the full Native Bridge surface.:nodejs OS process via a native node_launcher wrapper loading libnode.so; supports custom native .node extensions.pmmp/PHP-Binaries, downloaded once on first use, with Composer 2.10.x and custom native extensions (zend_extension, .so)..pypackages, custom native extensions supported; binary names are versioned so future bumps do not hard-code paths..tar.gz from dl.google.com, USTC mirror for CN), on-device go build / go mod / go run, vendor/ offline builds, static serving, and the native go_exec_loader wrapper; DNS and CA trust go through the same local JVM bridge used by PHP.sqlite-database-integration), with theme and plugin import..user.js with a GM_* bridge (storage, requests, styles, menu commands) and promise-based GM.* APIs gated by script grants.chrome.* polyfills for runtime, storage, tabs, scripting, and declarative network-request parsing.WTA1: gzip + Base64) and QR sharing via ZXing.window.print() and blob/data-URL PDFs to the Android print framework / PDF export (with an onPageStarted re-inject fallback so late navigations stay hooked).versionName, versionCode, icon, label, architecture target, and export format.targetSdk rewritten to the Play-required level (currently 36) and protobuf metadata generated locally; cancellable mid-build.META-INF/<name>.SF / .RSA.url(), srcset, @import, path rewriting, same-domain limits, depth limits, and size limits; parallel streaming worker pool with main-thread progress callbacks.WebToApp ships a built-in AI agent (open from ⋮ → Agent) that can operate the entire app through natural-language conversation. Instead of tapping through menus, you describe what you want and the Agent executes it via a tool-calling loop backed by any OpenAI-compatible LLM you configure in AI Settings.
How it works:
tool_calls.40+ built-in tools, grouped by domain:
| Domain | Examples |
|---|---|
| Files | Read, Write, Edit, Delete, List, Glob, Grep project files |
| Apps | List, Get, Create, Update app configurations |
| App lifecycle | Build APK/AAB, Export, Share, Create shortcut, Duplicate, Delete, Move to category |
| Ports & engines | Scan/kill ports, check/select/delete browser engines (WebView, GeckoView) |
| Runtimes | Status, install, and cache-clear for Node.js, PHP, Python, Go, WordPress, Linux env |
| Ad-block | Rule counts, import/remove/enable/disable hosts subscriptions |
| Stats & health | Usage statistics, URL health checks |
| App modifier | List installed apps, clone/rebrand, batch import, export templates |
| Build env & compliance | Initialize Linux build env, install components, Google Play policy checks |
| Modules | List, create, update extension modules |
| Interaction | Ask user questions (multi-select), plan mode (propose → approve → execute), todo tracking |
WebToApp has a GitHub-backed module market for community JS/CSS extension modules. The catalog is just files in this repository, so contributions use a normal pull-request flow.
modules/
├── registry.json # app-facing catalog
├── submissions.json # CI-generated PR / contributor metadata
├── README.md # contributor guide
└── <module-folder>/ # each module
The app fetches both registry.json and submissions.json and only shows modules present in both, keeping the in-app catalog aligned with actually-merged PRs. The submissions file also records every contributor per module, so the catalog shows stacked avatars and a contributors leaderboard. Catalog files and module icons route through a global mirror first, with raw.githubusercontent.com and jsDelivr as automatic fallbacks, so the store loads fast everywhere (including mainland China).
modules/, update registry.json, and open a PR.The high-level architecture lives here; the canonical submission rules, field schemas, reviewer checklist, and CI validation details live in modules/README.md.
The community market carries only JS/CSS extension modules. Browser extensions (MV3) are no longer a community catalog — instead the Browser Extensions tab searches the Chrome Web Store live: type a keyword, browse results, and install on demand through the existing CRX pipeline. Live search requires a network that can reach Google.
The official documentation site is published at shiaho777.github.io/web-to-app, in English and 简体中文:
| Section | URL | Covers |
|---|---|---|
| Guide | /guide/introduction | Getting started, main screen, app types, per-app actions and common config, FAQ |
| Developer | /developer/ | Architecture, export pipeline, shell sync, config drift, i18n, change recipes |
| Extensions | /extensions/ | JS/CSS modules, userscripts, Chrome MV3, API reference, publishing |
| 简体中文 | /zh/ | Full Chinese mirror of every page above |
app (the full builder and host), shell (the runtime host embedded into generated APKs), and clone-host (host code for app cloning — compiled to a classes.jar, converted to DEX via d8, and bundled as an asset for AppCloner).app and synchronized into shell, so shared WebView/runtime behavior has one source of truth (core/shell, core/webview, core/engine, core/extension, ui/shell, etc.).apksig. A separate encrypted build path (EncryptedApkBuilder) offers resource encryption, shelling, and integrity checks.targetSdk = 28 deliberately (via the shell template) — it is what lets them fork+exec native runtimes (Node.js, PHP, Python, Go, WordPress) from app storage, a capability URL-wrapper tools lack. The host app itself targets 35 (antivirus engines flag low-targetSdk builds as legacy malware); SELinux W^X at that level blocks host-side preview of the exec-based runtimes, which degrade with an explicit message — Node.js preview (JNI) and every exported app are unaffected. For Play Store distribution the AAB exporter separately rewrites targetSdk to the Play-required level (currently 36). WebView-only app types (Web/HTML/Frontend/Gallery/Media/MultiWeb) can also opt to raise the standalone APK's targetSdk (34/35/36) from the APK export section; server-runtime types are gated to 28 because targetSdk >= 29 enforces W^X and breaks fork+exec of the bundled binaries..so + omni.ja) are downloaded on first use rather than bundled into the base APK; the GeckoView API classes come from a gradle dependency, while the heavy native artifacts are fetched on demand.WebApp (data/model/WebApp.kt) and its *Config classes — the single source of truth for all feature settings, carried through a full packaging passthrough chain into the generated APK.okhttp-dnsoverhttpscom.android.tools.build:apksig 8.3.0 for APK signingprotobuf-javalite 3.25.5 for AAB metadatanode_launcher and go_exec_loaderSee app/build.gradle.kts for the complete dependency list.
Requirements: Android Studio Hedgehog or newer, JDK 17. The Gradle wrapper pins Gradle 9.4.1.
git clone https://github.com/shiaho777/web-to-app.git
cd web-to-app
./gradlew assembleDebug
For release builds, configure signing through local.properties and app/build.gradle.kts.
| Lane | What you do | Guide |
|---|---|---|
modules/ | Publish a community module to the in-app market | modules/README.md |
| Issues | Report a bug or request a feature | GitHub Issues |
| Code | Fix a bug or build a feature in the Android client | CONTRIBUTING.md |
AGENTS.md | Authoritative guide for AI coding agents and deep contributors (architecture, shell sync, export pipeline, config drift, packaging constraints) | AGENTS.md |
Developed by shiaho.
| Platform | Link |
|---|---|
| GitHub | github.com/shiaho777/web-to-app |
| Telegram | t.me/webtoapp777 |
| X (Twitter) | @shiaho777 |
| Bilibili | b23.tv/8mGDo2N |
| QQ Group | 1041130206 |
Advanced features such as device disguise are intended for technical demonstration and must only be used with informed user consent.
Open source · Built for Android power users · Star to support the project
Kotlin
56.8%
Python
40.3%