docs / getting started

ZIP requirements reference

Every rule the builder applies to your archive, in one table — and the reasoning behind each, so the edge cases make sense.

7 min read·6 sections·updated Sep 2026
TL;DR

A .zip (or single .html), at most 5 MB zipped on free and 18 MB on Pro, with index.html at the root or inside one wrapping folder. Names are case-sensitive. Everything is served with the right MIME type for web files, including .mjs, .wasm and .woff2.

At a glance

RuleRequirement
Accepted inputA .zip archive, or a single .html/.htm file (which becomes index.html)
CompressionStandard ZIP (DEFLATE or stored). No RAR, 7z, TAR or password-protected ZIPs
Size≤ 5 MB zipped on the free plan · ≤ 18 MB on Pro
Start pageindex.html at the root (recommended) — see the resolution order below
Ignored__MACOSX/ and ._* files
PathsCase-sensitive; forward slashes; relative links
ContentScreened against app-store content policy before building

How the size is measured

The builder re-packs your archive (without the ignored files) and measures the zipped result. That number is usually within a few percent of your ZIP's own size. Text compresses well — a 3 MB JavaScript bundle may zip to 800 KB — while images, audio, video and WOFF2 fonts barely compress at all, so media is almost always what pushes an archive over the limit.

ZIP Size TreemapSee what fills your ZIP as a treemap, by file and by type, against the upload limits Open tool

How the start page is chosen

  1. index.html at the top of the archive.
  2. Otherwise, if every file sits inside a single top-level folder and that folder contains index.html, that page — and the folder prefix is removed from every path.
  3. Otherwise, the shallowest .html file, shortest path first.

Rule 3 exists so a ZIP never fails outright, but it guesses. A project archive with index.html (the dev template) at the root and the real build in dist/ will open the template. Put the real page at the root and the question never comes up.

File names

  • Case matters. The asset store inside an APK is case-sensitive; Logo.PNG ≠ logo.png.
  • Spaces and non-ASCII characters work — the browser URL-encodes them in the request and the app decodes them again — but they trip up other tools (build scripts, CSS url() without quotes). Lower-case, hyphenated names avoid the question.
  • No .. escapes. A request that tries to climb above the site folder is refused.
  • Directory URLs are not expanded. A link to docs/ does not serve docs/index.html, except for the site root itself. Link to docs/index.html explicitly.

MIME types the app serves

The WebView refuses to execute a script or apply a stylesheet served with the wrong type, so the app's file server maps extensions explicitly:

ExtensionServed as
.html .htmtext/html
.js .mjsapplication/javascript
.csstext/css
.json .mapapplication/json
.svgimage/svg+xml
.wasmapplication/wasm
.woff .woff2 .ttffont/woff, font/woff2, font/ttf
Everything elseAndroid's built-in type table, or application/octet-stream

Files served as application/octet-stream (a .glb model, a custom .dat) still load fine through fetch() and game-engine loaders; they just are not rendered directly by the browser.

What should not be in the ZIP

Anything in the ZIP ships in the APK, and anyone can unzip an APK. Keep out .env files, private keys, .git, node_modules and source maps — the junk cleaner removes all of them in one pass. And never rely on a "hidden" file for security: a value your JavaScript can read is a value any user can read.

FAQ

Is there a limit on the number of files?

No separate limit — only the size. Thousands of small files are fine, although very large file counts make the build and install slightly slower.

Can the ZIP contain several HTML pages?

Yes. Every page is bundled; the start page is the one the app opens first, and ordinary relative links move between the others.

What does the content screening check?

The text of your pages, against the categories app stores do not allow (for example gambling or adult content). A normal site passes without noticing it happened.

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