# miri.dev — Deploy static sites & get a fixed URL (LLM guide) > miri.dev is a self-hosted static-site deployment platform. Drag-and-drop or CLI/MCP. > Every deploy gets a live URL. Log in for permanent hosting and a **fixed project URL** > that always serves your latest deploy. Two official tools: `miridev-cli` and `miridev-mcp`. > This file is written for coding agents (Claude Code, Codex). Follow it literally. ## Install (npm, Node.js required) - CLI: `npm i -g miridev-cli` (command: `miridev`) - MCP: `npm i -g miridev-mcp` (for Claude Desktop / Cursor / any MCP host) ## Golden path — CLI (fixed URL, redeploy many times) ```bash miridev login # browser login; required for permanent hosting + projects miridev deploy --project my-site # 1st time: creates project → https://my-site-.miri.dev miridev deploy # after that: same folder redeploys to the SAME fixed URL ``` - The 1st deploy writes `.miri-project.json` in the folder. Keep it; later `miridev deploy` reuses it automatically (no `--project` needed). Commit it or leave it — either works. - The fixed URL `my-site-.miri.dev` ALWAYS serves the latest deploy of that project. - Deploy a specific folder: `miridev deploy --project my-site --dir ./dist` - Add a note (kept in project history): `miridev deploy -m "release notes"` ## Golden path — MCP (natural language, Claude Desktop) Register in `claude_desktop_config.json`, then restart Claude Desktop: ```json { "mcpServers": { "miridev": { "command": "npx", "args": ["-y", "miridev-mcp"] } } } ``` MCP tools: - `deploy_website(projectPath, siteName?, projectName?)` — deploy a folder. Pass `projectName` for a fixed URL; the binding is saved to `.miri-project.json` and reused. Requires login. - `login_miridev` — log in (permanent hosting). - `check_auth_status` — verify you are logged in. - `get_deployment_status` — last deploy info. Natural language examples (Claude Desktop): "이 폴더 배포해줘", "my-site 프로젝트로 배포해줘". ## Rules that actually matter (learned the hard way) 1. **index.html**: put an `index.html` at the folder ROOT. If the folder has exactly ONE `.html` file it is auto-detected as the index even if named differently. 2. **Subfolders WORK**: `panels/panel_001.jpg`, `assets/app.css`, etc. all serve. You do NOT need to flatten files to the root. Reference them with normal relative paths. 3. **Login = permanent, guest = temporary**: without `miridev login` a deploy is a short-lived guest deploy. Log in for lasting sites and for `--project` fixed URLs. 4. **Keep uploads reasonably small**: very large payloads (tens of MB) can fail to upload. For image-heavy sites (webtoons, galleries) optimize first — e.g. resize to ~800–1200px wide, JPEG q80. A few MB total deploys reliably. After deploy, VERIFY images load (`curl -o /dev/null -w "%{http_code}" https:///`), not just index. 5. **One project per name**: deploying with the same `--project ` reuses the existing project (no duplicates). Prefer reusing `.miri-project.json` over passing `--project` again. ## Verify a deploy ```bash curl -s -o /dev/null -w "%{http_code}\n" https://my-site-.miri.dev/ # index curl -s -o /dev/null -w "%{http_code}\n" https://my-site-.miri.dev/some.jpg # an asset ``` Both should be `200`. If the index is 200 but assets 404, re-check the asset paths and that the files were actually uploaded (a partial upload can leave only index.html). ## Custom domains (connect your own domain) Serve a project on your own domain (e.g. `shop.mybrand.com`) instead of `*.miri.dev`. **Requires a paid plan (monthly/yearly) and SMS phone verification.** No reverse proxy — the server auto-provisions a TLS cert; you add ONE DNS record. - CLI: `miridev domains add shop.mybrand.com --project -` then `miridev domains ls` (interactive: enter phone → SMS code → done; run in the project folder or pass --project) - Web: https://www.miri.dev/my-page → the "커스텀 도메인 / Custom domain" tab → pick project → verify phone → apply. After applying, add the printed DNS record at your DNS provider (proxy OFF / DNS only): ``` CNAME shop → miridev.fly.dev ``` Within a few minutes HTTPS is live and the domain follows the project's latest deploy (redeploy the project → same custom domain shows the new version, no re-setup). ## Links - Website / dashboard: https://www.miri.dev - This guide (raw): https://www.miri.dev/llms.txt - Claude Code skill: https://www.miri.dev/skill.md - CLI on npm: https://www.npmjs.com/package/miridev-cli - MCP on npm: https://www.npmjs.com/package/miridev-mcp ## One-liners ```bash # Learn (print this guide) curl -s https://www.miri.dev/llms.txt # Install + deploy with a fixed URL npm i -g miridev-cli && miridev login && miridev deploy --project my-site # Install as a Claude Code skill mkdir -p ~/.claude/skills/miri-deploy && curl -fsSL https://www.miri.dev/skill.md -o ~/.claude/skills/miri-deploy/SKILL.md ```