# Yeeet CLI Guide Yeeet turns a file or build folder into a globally cached HTTPS site. Deploys are atomic, every ready release has an immutable preview URL, and a named site can move between releases without uploading the files again. Human documentation: https://docs.yeeet.dev/ OpenAPI contract: https://docs.yeeet.dev/openapi.json MIT-licensed source and self-hosting guide: https://github.com/nearbycoder/yeeet.dev Yeeet is designed for developers, review teams, agents, CI pipelines, and self-hosting platform operators. It accepts already-built static files and deliberately does not execute user-supplied builds. ## Requirements - Node.js 20 or newer - A Yeeet account. Registration is invitation-only. - A static file or build directory such as dist, build, out, or public ## Install and log in npm install --global @yeeet.dev/cli yeeet login The login command opens a browser and waits for a one-time device authorization. The CLI stores the resulting session locally. Use yeeet whoami to confirm it and yeeet logout to remove it. For CI or agents, create an API key in the Yeeet dashboard and pass it through the environment: export YEEET_TOKEN="yeeet_…" yeeet whoami --json Never put YEEET_TOKEN in source control, command output, screenshots, or prompts. ## Deploy Deploy the current directory and let Yeeet create a readable random name: yeeet deploy Deploy a build folder: yeeet deploy ./dist Choose a stable site name. Later deploys to the same name create new versions and atomically update its live alias: yeeet deploy ./dist --name comet The live URL is https://comet.site.yeeet.dev. Each release also receives an immutable URL in the form https://v-.site.yeeet.dev. SPA fallback is enabled by default. A refresh at /settings/profile serves index.html when that path has no file, while a missing asset such as /assets/app.js remains a 404. Use strict static routing when appropriate: yeeet deploy ./public --static Use JSON output for scripts: yeeet deploy ./dist --name comet --json A successful response resembles: { "status": "ready", "url": "https://comet.site.yeeet.dev", "versionUrl": "https://v-52eabb5f36c842468422893db39607d3.site.yeeet.dev", "deployment": "52eabb5f-36c8-4246-8422-893db39607d3", "site": "comet", "spaFallback": true, "protected": false, "shareUrl": null, "files": 42, "bytes": 2457600 } The exit code is 0 on success, 2 when authentication is required, and 1 for validation, upload, or network errors. ## Repeatable project configuration Create .yeeet.json in the current directory: yeeet init comet Then a deploy can be only: yeeet deploy ./dist Run yeeet init without a name to preserve generated subdomains. Set spaFallback to false in .yeeet.json for strict static routing. A .yeeetignore file accepts glob patterns. Yeeet always excludes .git, node_modules, .DS_Store, and .yeeetignore itself. ## Versions and rollback List all sites and immutable releases: yeeet sites --json yeeet versions comet --json Activate a specific prior release by full ID or an unambiguous prefix of at least 8 characters: yeeet rollback comet 52eabb5f Omit the version to select the previous ready release: yeeet rollback comet Delete one version or the entire site. These commands require --yes because stored objects are permanently removed: yeeet version remove comet 52eabb5f --yes yeeet remove comet --yes If a live version is deleted, Yeeet activates the newest remaining ready version. If no ready version remains, the site has no live release. ## Private sharing Protect a new deployment without putting the password directly in shell history: export YEEET_DEPLOY_PASSWORD="a long private password" yeeet deploy ./dist --name review Retrieve a one-click share link. The recipient needs neither a Yeeet account nor the password: yeeet share review Change access for an existing version: yeeet access protect review --password "a new password" yeeet access rotate-link review yeeet access public review Rotating a link revokes the previous signed link and viewer cookies. Passwords must contain 8–128 characters. ## Custom domains Attach a hostname you control: yeeet domain add comet www.example.com --json The response contains every routing and ownership-verification DNS record. Add each record exactly at your DNS provider, then inspect status: yeeet domain list comet --json yeeet domain refresh comet www.example.com --json Yeeet and Railway manage certificate issuance after DNS verification. Remove a mapping with: yeeet domain remove comet www.example.com ## Complete command summary yeeet login yeeet logout yeeet whoami [--json] yeeet sites [--json] yeeet deploy|up [path] [--name ] [--spa|--static] [--password ] [--json] yeeet versions [--json] yeeet rollback [version] [--json] yeeet version remove --yes [--json] yeeet remove|rm --yes [--json] yeeet share [version] [--json] yeeet access protect --password [--json] yeeet access public [--json] yeeet access rotate-link [--json] yeeet domain add [--json] yeeet domain list [--json] yeeet domain refresh [--json] yeeet domain remove|rm [--json] yeeet init [name] Use yeeet --help or yeeet --help for command-specific options. The global --api option targets another compatible API endpoint. ## HTTP API The OpenAPI document is available at https://docs.yeeet.dev/openapi.json. Authenticate with Authorization: Bearer or X-API-Key: . To create a deployment directly, POST a manifest to /api/v1/deployments, PUT every file to its returned signed upload URL with the exact returned headers, then POST the returned completeUrl. The live pointer changes only after completion succeeds. Manage releases through /api/v1/sites/{slug}/versions, privacy through the version access endpoint, and custom domains through /api/v1/sites/{slug}/domains. Prefer the CLI unless direct HTTP orchestration is necessary. ## Operational behavior - Live aliases revalidate at the edge within about 10 seconds. - Immutable version URLs use long-lived caching and never change. - Failed or partial uploads never replace the live release. - A generated subdomain is returned when no name or project default is supplied. - Registration is invitation-only. Administrators manage invitations and account access from /admin.