Put index.html at the top of a folder with the rest of your files beside it, zip the folder (or drag the folder itself), and upload it on HTMLtoLink. Every file is served at the same path it has in the folder, so css/style.css becomes https://your-site.htmltolink.dev/css/style.css. Sites up to 2 MB and 1,000 files are free; paid plans allow up to 75 MB (ZIP uploads up to 25 MB).
The folder layout that just works
my-site/
├── index.html ← the page the link opens
├── about.html ← /about.html (or /about)
├── css/
│ └── style.css
├── js/
│ └── app.js
├── images/
│ ├── logo.svg
│ └── hero.webp
└── fonts/
└── inter.woff2
Inside index.html, refer to files relative to the HTML file:
<link rel="stylesheet" href="css/style.css">
<img src="images/logo.svg" alt="Logo">
<script src="js/app.js"></script>
<a href="about.html">About</a>
Zipping correctly
- macOS: right-click the folder → Compress "my-site".
- Windows: right-click the folder → Send to → Compressed (zipped) folder (or Compress to ZIP file on Windows 11).
- Linux:
cd my-site && zip -r ../my-site.zip .
Zipping the folder itself puts everything one level down (my-site/index.html). That is fine — HTMLtoLink detects a single wrapping folder and strips it. Junk such as __MACOSX/, .DS_Store and Thumbs.db is ignored automatically.
Open a ZIP or folder and find missing files, wrong case and bad paths Open the free tool
What happens on upload
- The ZIP is unpacked on our side; empty folders are dropped.
- If there is no
index.htmlbut exactly one HTML file, that file becomes the start page. With several HTML files and no index, you are asked to rename one. - Executables and installers (
.exe,.apk,.sh…) are refused. - Each file is served with the right content type, so fonts, SVG, WebAssembly, audio and video work.
Paths: relative, absolute and "pretty" URLs
- Relative paths (
images/logo.svg,../css/a.css) work everywhere and are the portable choice. - Root-absolute paths (
/images/logo.svg) also work on HTMLtoLink, because every site is the root of its own subdomain. They break on hosts that put you in a sub-folder, such as GitHub Pages project sites. - Clean URLs: a link to
/aboutservesabout.htmlorabout/index.htmlautomatically. - Case: web servers are normally case-sensitive. HTMLtoLink falls back to a case-insensitive match so
Logo.PNGvslogo.pngstill loads — but fix it anyway if the site may move elsewhere.
Single-page apps (React, Vue, Svelte, Vite)
Upload the build output (dist/ or build/), never the source folder with package.json. Client-side routes such as /dashboard fall back to index.html when no file matches and the site has only one or two HTML pages, so routers work. Add your own 404.html to control what other missing paths show.
Updating the site
Zip the new version and use Update content from My links. The whole site is replaced atomically at the same address — no half-updated state, and the QR code you printed keeps working.