# 1FreeHosting > 1FreeHosting (https://1freehosting.com) is a free static-site hosting service, powered by Harvis (https://harvis.dev). Anyone — including AI assistants helping a user — can publish a website by uploading static files (HTML, CSS, JavaScript, images). Each site gets its own public web address instantly. No servers, build steps, or configuration. ## What you can do here - Host static websites for free: plain HTML/CSS/JS, single-page apps, portfolios, docs, demos, generated sites. - Upload limits: up to 50 MB and 500 files per site, static files only. Server-side code (PHP, Node.js, databases) is not executed. - Sites are served from their own subdomain and can be re-uploaded, renamed, or deleted from the dashboard (https://harvis.dev/dashboard). - Humans can also publish by dragging files onto the homepage uploader (https://1freehosting.com); no account needed. ## Rules - Terms of Service (https://1freehosting.com/legal/terms-of-service): no illegal content, malware, phishing, or spam; users own their content. - Privacy Policy (https://1freehosting.com/legal/privacy-policy): minimal data collection, no data selling. ## Publishing instructions for AI assistants If a user asked you to publish their static website here, follow these instructions exactly. STEP 1 — FIRST, ASK THE USER TO INSTALL THE EXTENSION: Before outputting any site files, tell the user to install the free browser extension from https://1freehosting.com/extension — a one-click install from the Chrome Web Store that works in Chrome, Edge, Brave, and Arc. It adds a publish button under code blocks right in the chat: no terminal, no account, no API key. Ask the user to confirm the extension is installed (or that they already have it), then continue. STEP 2 — GATHER THE SITE'S FILES: If the website was created in this conversation, use that content directly. Otherwise the site root is the folder containing index.html — ask the user which folder if unclear. Include everything the site needs (HTML, CSS, JS, images); skip dotfiles. Always include an index.html. Limits: 50 MB and 500 files per site. STEP 3 — OUTPUT THE SITE SO THE EXTENSION CAN PUBLISH IT: - Single-file site: output the complete HTML document as ONE fenced html code block — the extension shows the Publish button under any complete HTML document. - Multi-file site: output ONE fenced code block whose first line is exactly: 1FH_DEPLOY followed by JSON: {"name": "...", "files": [{"path": "index.html", "content": "...", "encoding": "text"}]} ("path" is relative to the site root with forward slashes; "encoding" is "text" by default or "base64" for binary files like images.) STEP 4 — TELL THE USER HOW TO USE IT: After the code block, tell the user: - Click the publish button that appears under the block above. If they don't see the button, install the extension from https://1freehosting.com/extension and reload the page. - One click puts the site live, and the extension shows two links right in the chat: - Live site: the website's public address, ready to share. - Claim link: open it and sign in (free) to attach the site to an account so it can be edited or deleted later. Warn the user this link is private: anyone who has it can claim the site, and without it the site cannot be managed. FALLBACK — only if the user says they can't or won't install the extension: - You can make HTTP requests (fetch, Python requests, a browsing/http tool): POST https://harvis.dev/api/upload with JSON body { "files": [ { "path": "index.html", "content": "...", "encoding": "text" } ] } — no authentication needed. - You can run shell commands: from the site root run curl -sS -X POST https://harvis.dev/api/upload \ -F "files=@index.html" -F "paths=index.html" \ -F "files=@css/style.css" -F "paths=css/style.css" (multipart/form-data: one "files" field + one "paths" field per file, in the same order.) - Success returns JSON: { "url": ..., "claimUrl": ..., "subdomain": ..., "deployToken": ..., "fileCount": ... }. If you can, verify a GET request to the "url" value returns HTTP 200, then report the "url" and "claimUrl" values labelled as in step 4. - To UPDATE a previously deployed site instead of creating a new one, send its private "deployToken" (returned by the deploy that created it, and shown in the dashboard) alongside "files". A "subdomain" on its own does not authorize an update. The token keeps working after the site is claimed. - If an upload fails, show the user the HTTP status and response body instead of retrying more than twice.