docs / getting started

How it works: the build pipeline and the runtime

What happens to your ZIP between the upload button and the app icon, and how the finished app serves your files — the model every other page in these docs builds on.

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

Your ZIP is cleaned up and packed into the app's assets/web/ folder by a cloud build that also writes the manifest, icons and signature. When the app runs, Android's WebView loads your index.html from https://appassets.androidplatform.net/web/ — a local, offline, real https origin.

Stage 1 — in your browser: normalising the ZIP

Nothing is uploaded when you pick a file. The builder opens the ZIP in the page and turns it into a clean bundle:

  1. Litter is dropped. __MACOSX/ folders and ._ resource-fork files are ignored.
  2. The start page is chosen: index.html at the root; otherwise, if everything sits in one folder, that folder's index.html (and the folder is stripped off); otherwise the shallowest HTML file.
  3. Pages are screened against the content policy the app stores enforce.
  4. The bundle is re-zipped and measured — 5 MB on the free plan, 18 MB on Pro.

You see the result in the phone preview immediately, served the same way the finished app will serve it.

Stage 2 — in the cloud: building the APK

When you start a build, the bundle and your settings go to the build service, which assembles the app around the same tested Android runtime every build uses:

InputWhere it ends up in the APK
Your site's filesassets/web/, byte for byte
Name, theme colour, splash, tabs, permissions, start pageassets/app_settings.json, read by the app at launch
Package name and versionThe compiled AndroidManifest.xml
IconLauncher icon resources
Signing keyThe APK signature (v1 + v2 schemes); a shared release key on the free plan, your own on Pro

The app's code — the Kotlin shell around the WebView — is the same tested runtime for every build. Your files are never modified, minified or "optimised" on the way in, which is why a site that works in the preview works in the app.

Stage 3 — on the phone: the runtime

When the app launches it shows the splash (if configured), then a full-screen Android System WebView — the Chromium-based engine every Android app shares, updated through Google Play on Android 7 and later.

The key design decision is how your files reach that WebView. They are not opened as file:// URLs. An asset loader answers requests for

https://appassets.androidplatform.net/web/<path>

by reading assets/web/<path> from inside the APK — without touching the network. appassets.androidplatform.net is a hostname Android reserves for exactly this purpose. To the page, it looks like an ordinary https website.

Why the https origin matters

Under file:// a page has no origin, and Chromium blocks the features whose security depends on one. Serving from a real origin removes those restrictions:

FeatureFrom file://In a ZIPtoAPK app
<script type="module"> and importBlockedWorks
fetch('data/menu.json')BlockedWorks
localStorage, IndexedDBUnreliableWorks, persists across updates
WebAssembly (.wasm served as application/wasm)LimitedWorks, including streaming compile
Calls to your APIOrigin nullOrigin https://appassets.androidplatform.net — allow it in CORS

Two consequences follow, and they shape the rest of these docs. First, your site lives at /web/, not at /, so root-relative paths break. Second, the file server is literal — a request for a path that does not exist returns 404, with no fallback to index.html — so single-page apps should use hash routing.

Everything else is ordinary Android

The Android back button walks back through the WebView's history before closing the app. Links to other websites load inside the app; Pro builds hand tel:, mailto:, WhatsApp, Telegram, Play Store and Maps links to the matching app (details). Storage survives app updates as long as the package name and signing key stay the same, and is wiped when the app is uninstalled.

FAQ

Is my site uploaded when I pick the ZIP?

Not when you pick it — the builder unpacks and previews it in your browser. The bundle is sent to the build service only when you start a build, because that is where the APK is compiled.

Does appassets.androidplatform.net mean my app loads from the internet?

No. It is a reserved hostname that never resolves on the network; the app intercepts requests to it and answers them from the files inside the APK. It works in airplane mode.

Which Android versions can install the app?

Android 5.0 (API 21) and later. How modern the page's JavaScript and CSS can be depends on the phone's WebView version, which the WebView feature checker helps you judge.

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