To convert a ZIP to an APK, put index.html at the root of the archive, keep every link relative, and upload the ZIP to an HTML 2 APK builder. The whole folder is unpacked into the APK and served from the device, so every page, image and script works offline. Free builds accept 5 MB; Pro accepts 18 MB.
- Multi-page static sites and portfolios
- Course material, manuals and e-books in HTML
- HTML5 games with sprite sheets and audio
- Production builds of React, Vue, Svelte or Angular apps
The structure the builder expects
my-app.zip
├── index.html ← the start page, at the top level
├── about.html
├── css/style.css
├── js/app.js
├── img/logo.png
└── fonts/inter.woff2The builder chooses the start page in this order: index.html at the root; otherwise, if every file sits inside one wrapping folder, that folder's index.html (the folder name is stripped from all paths); otherwise the shallowest HTML file it can find. The third rule means a ZIP never fails outright — but it is a guess. Put the real start page at the root and there is nothing to guess. The ZIP structure checker reads your archive in the browser and tells you which page will open.
Relative paths, case and the other rules
- Relative links only.
css/style.cssand./img/logo.pngwork. A leading slash —/css/style.css— does not: the app serves your files from a/web/sub-folder of its local origin, so root-relative paths miss. Neither doC:\Users\...orhttp://localhost:3000/.... The absolute path fixer rewrites them. - Case-sensitive names. Windows and macOS forgive
Logo.PNGvslogo.png; Android does not. A broken image that works on your desktop is almost always this. - Folders do not auto-expand. A link to
docs/does not servedocs/index.html(only the root does). Link to the file. - Litter is ignored.
__MACOSX/folders and._files that macOS adds to archives are dropped automatically. - Standard ZIP only. DEFLATE or stored. Not RAR, 7z, TAR, or password-protected ZIPs.
Staying under the size limit
The limit is measured on the zipped bundle: 5 MB free, 18 MB Pro. Text compresses well — a 3 MB JavaScript bundle may zip to 800 KB — but images, audio, video and WOFF2 fonts barely compress, so media is what pushes an archive over. Convert PNG photos to WebP, re-encode audio to 96 kbps OGG or MP3, and stream long videos from a server instead of bundling them. The APK size estimator shows the final app size before you build.
ZIP to APK in five steps
- Open your
index.htmlby double-clicking it, or better, through a local server (npx serve). If it works there with relative links, it will work in the app. - Select the contents of the folder (not the folder itself) and compress them — or zip the folder; the builder unwraps a single top folder for you.
- In the HTML & ZIP to APK Builder app choose ZIP and pick the archive. The phone preview runs it as the finished app will.
- Set the name, icon, colour and package name; on Pro add a splash screen, onboarding, bottom tabs or push.
- Build, download, install. Rebuild with a higher version number whenever the content changes.
ZIP to APK — questions
What should be inside the ZIP?
Everything the site loads: index.html at the root, plus its CSS, JavaScript, images, fonts, audio and JSON, with relative links between them. Anything still loaded from another server will need a connection.
How big can the ZIP be?
5 MB zipped on the free plan and 18 MB on Pro. The finished APK is larger by roughly 4–6 MB, the size of the Android runtime around your files.
Do I need to rebuild when the site changes?
Yes. A ZIP-built app carries its content inside it, so new content means a new build with a higher version code. If you want instant updates without rebuilding, host the site and convert its URL instead.
Can a ZIP app call my API?
Yes. fetch() and XMLHttpRequest to https APIs work while the phone is online. Your API must allow the origin https://appassets.androidplatform.net in its CORS headers.