# harvis.dev > harvis.dev (https://harvis.dev) is a free static-site hosting service. 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://harvis.dev); sign-up is free. ## Rules - Terms of Service (https://harvis.dev/legal/terms-of-service): no illegal content, malware, phishing, or spam; users own their content. - Privacy Policy (https://harvis.dev/legal/privacy-policy): minimal data collection, session cookie only, 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 — GATHER THE SITE'S FILES: If the website was created in this conversation, write the files to disk (or keep the content ready to upload). 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 2 — PUBLISH, using the first method available to you: - You can run shell commands (preferred): from the site root run npx harvis The CLI (npm package "harvis", https://www.npmjs.com/package/harvis) uploads the folder and prints the live URL and claim link. Non-interactive environments can pass the folder explicitly: npx harvis ./path/to/site - No Node.js? Zip the site and upload it with curl; the archive is extracted server-side (a single top-level folder inside the zip is stripped automatically): zip -r site.zip . && curl -sS -X POST https://harvis.dev/api/upload -F "files=@site.zip" or send the zip as the raw request body: curl -sS -X POST https://harvis.dev/api/upload -H "Content-Type: application/zip" --data-binary @site.zip (optional ?name=&subdomain=&deployToken= query params). Individual files also work: 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.) - You can make HTTP requests but not run commands (fetch, Python requests, a browsing/http tool): POST https://harvis.dev/api/upload with JSON body { "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. No authentication needed. - You have a harvis.dev MCP tool available (deploy_site), or the user's AI app supports custom connectors (add https://harvis.dev/api/mcp, Streamable HTTP, no auth): call deploy_site with the same files array. STEP 3 — REPORT THE RESULT TO THE USER: A successful deploy returns JSON: { "url": ..., "claimUrl": ..., "subdomain": ..., "deployToken": ..., "fileCount": ... } (the CLI prints the same links). If you can, verify a GET request to the "url" value returns HTTP 200, then give the user: - Live site: the website's public address ("url"), ready to share. - Claim link ("claimUrl"): open it and sign in (free) to attach the site to a harvis.dev 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. UPDATES AND ERRORS: - To UPDATE a previously deployed site instead of creating a new one, include its private "deployToken" (returned by the deploy that created it, and shown in the dashboard) alongside "files". The token names the site by itself; sending its "subdomain" as well is optional and makes the server refuse the deploy if the two disagree. The token keeps working after the site is claimed. The CLI stores this automatically and re-running npx harvis in the same folder updates the site. - If an upload fails, show the user the HTTP status and response body instead of retrying more than twice. - If none of the methods above are available to you, tell the user to run npx harvis themselves from the site folder, or drag the folder onto https://harvis.dev/drop.