Getting started

Converting a website ZIP into an Android app

Multi-file sites bring problems a single HTML file never has: folder depth, entry pages, case-sensitive paths and the file:// origin. Here is what to check before you zip.

8 min read Updated September 2026

A single HTML file converts trivially — everything is in one place, nothing can point at the wrong thing. A ZIP of a real site is where conversions go wrong, because now there are paths, folders, an entry page to identify, and a filesystem that behaves differently from your web server.

What the ZIP should contain

An index.html at the top level, with its assets alongside it:

site.zip
├── index.html          ← the entry page, at the root
├── about.html
├── css/
│   └── style.css
├── js/
│   └── app.js
├── img/
│   └── logo.png
└── fonts/
    └── inter.woff2

The classic mistake is zipping the folder rather than its contents, so everything ends up one level deeper under mysite/. Good converters detect and flatten a single wrapper folder, but relying on that is optimistic — select the files inside your folder and compress those.

On macOS, compressing a selection also produces a __MACOSX/ directory of metadata. It is harmless and normally stripped, but it is not part of your site.

The entry page

The app has to know which page to open first. index.html at the root is the convention and the safest choice. If yours is called something else — home.html, main.html — either rename it or make sure the entry page is set explicitly during conversion.

If there is no index.html anywhere, the app has nothing to load and opens blank.

Paths: the rule that decides everything

Your web server resolves /css/style.css against the site root. Inside an app, there is no server and no site root — pages are loaded from a directory on the device. Root-relative paths therefore resolve somewhere unhelpful, and absolute paths to your own machine resolve nowhere at all.

PathIn the app
css/style.cssWorks — relative to the page
./img/logo.pngWorks
../shared/app.jsWorks, if the folder is inside the ZIP
/css/style.cssFragile — depends where the bundle is mounted
C:\Users\me\site\style.cssNever works
https://cdn.example.com/lib.jsWorks online, blank offline

Case sensitivity will catch you

Windows and macOS filesystems are usually case-insensitive; Android's is not. <img src="Logo.PNG"> pointing at a file named logo.png works perfectly on your laptop and silently fails on the phone. It is one of the most common "it worked before I built it" bugs, and it only appears on the device.

The fix is a habit rather than a tool: lowercase every filename, and never rely on your OS to paper over a mismatch.

The file:// restrictions

Bundled pages load from file://, which browsers treat as a restrictive origin. Three things stop working, and none of them announce themselves clearly:

Two ways around it: build your modules into a single classic script, or serve the bundled files from a small local HTTP server inside the app so the origin becomes http://localhost. The second is what a good converter does for you, and it is why bundled sites with modern build output work at all.

HTML ValidatorCheck HTML for problems that break inside an app Open the tool
The HTML validator flagging module scripts, absolute paths, mixed content and duplicate IDs
Run the entry page through this before zipping — most ZIP failures are visible in the HTML.

Trim before you zip

Whatever is in the ZIP ends up in the app. Things that routinely should not be:

That last group matters beyond size: everything inside an APK can be extracted by anyone who downloads it. An API key in a bundled JavaScript file is public the moment you publish.

The APK size calculator showing a breakdown by file type and the largest files in a project
The breakdown is a fast way to spot something that should not have been zipped.
APK Size CalculatorEstimate your app's size before you build Open the tool

A pre-flight checklist

That last check is the highest-value thing on the list: double-click your index.html and look. Most conversion failures are visible right there, before any build has run.

Questions people ask

What should the ZIP file contain?

The contents of your site folder, with index.html at the top level — not the folder itself. Select the files inside the folder and compress the selection, otherwise everything ends up nested one level too deep.

Why do my images not appear in the app?

Two usual causes: a path that is root-relative or absolute rather than relative, and a case mismatch. Android's filesystem is case-sensitive, so Logo.PNG does not match logo.png even though it does on Windows and macOS.

Can I test my ZIP before converting?

Yes, and you should. Unzip it and open index.html directly in your browser from the filesystem. That reproduces the file:// origin the app uses, so anything broken there — missing assets, blocked modules — will be broken in the app too.

How large can the ZIP be?

Practical limits come from the service you use and from Play's app size limits rather than from ZIP itself. Keep the packaged app well under 50 MB if you can; install rates fall as size grows, and bundled video is almost always the wrong choice.

Do I need to include node_modules?

No. Ship the built output — the HTML, CSS, JavaScript and assets your pages actually reference. Build-time dependencies are never needed at runtime and would add hundreds of megabytes.

Read next

Ready to turn your site into an app?

Upload an HTML file or a ZIP, set your icon and name, and download a signed Android app. No Android Studio, no command line.

Open the builder