@roxer/cli
v1.4.0
Published
Deploy apps and publish HTML from the command line. Custom domains, real-time logs, MCP-ready.
Maintainers
Readme
roxer
Deploy apps and publish HTML from the command line.
No git. No config files. Just ship it.
npm install -g @roxer/cliQuick Start
Publish a static site
roxer publish index.html
# => https://roxer.com/abc123That's it. One command, one URL. Works with files, directories, and ZIP archives. No login required for roxer publish.
Deploy a Node.js or Python app
roxer login
roxer deploy .
# => https://my-app.roxer.comServer-side build, your own Lambda, live in seconds. Express, Fastify, Hono, Koa, Flask, FastAPI, and more.
Each server app gets its own subdomain. Static-site deploys (./dist, ./build, plain HTML) get a path under roxer.com instead.
Attach a custom domain
roxer domain add preview.acme.com --app my-appWalks you through two CNAME records (one for SSL validation, one for routing). Roxer auto-issues the certificate. Hosting plan required.
Commands
Pages (static publishing, no login required)
| Command | Description |
|---------|-------------|
| roxer publish <path> | Publish an HTML file, directory, or ZIP |
| roxer update <id> <path> | Update an existing page |
| roxer delete <id> | Delete a page |
| roxer stats <id> | View page analytics |
| roxer pages | List all published pages |
Apps (login required)
| Command | Description |
|---------|-------------|
| roxer deploy [path] | Deploy a Node.js or Python app |
| roxer apps | List all deployed apps |
| roxer apps status <id> | Show app status and details |
| roxer apps delete <id> | Delete a deployed app |
| roxer logs <app> | Tail app logs in real time (use --no-follow for one-shot) |
| roxer status <app> | Show app status |
| roxer env list <app> | List environment variables |
| roxer env set <app> KEY=VALUE | Set an environment variable |
| roxer env unset <app> KEY | Remove an environment variable |
| roxer init [template] | Scaffold a new project (express, fastify, hono, flask, fastapi, react, svelte) |
Custom domains (Hosting plan, login required)
| Command | Description |
|---------|-------------|
| roxer domain add <domain> | Attach a custom domain to an app or page |
| roxer domain list | List your custom domains |
| roxer domain status <domain> | Show DNS setup status for a domain |
| roxer domain delete <domain> | Remove a custom domain |
Account
| Command | Description |
|---------|-------------|
| roxer login | Connect the CLI to your Roxer account |
| roxer logout | Disconnect the CLI |
| roxer account | Show current plan and limits |
| roxer activate <token> | Redeem an activation token |
| roxer request-access | Request access (invite-only mode) |
Features
- Zero ceremony: no YAML, no git remote, no Dockerfile
- Instant publishing: HTML files go live in under a second
- Full app deploys: Express, Fastify, Hono, Koa, Next.js, NestJS, and more
- Python support: Flask, FastAPI, Django, Starlette
- Server-side builds: dependencies install on the server, not your machine
- Custom slugs: pick your own URL with
--slug my-name(or--namefor apps) - Custom domains: attach your own domain in 60 seconds with
roxer domain add(Hosting plan) - Password protection: lock any page with
--password secret(Hosting plan) - Page expiry: free pages expire after 30 days, Hosting pages are permanent
- SQLite support: persistent database storage via EFS, auto-detected
- Environment variables: manage secrets without touching your code
- Real-time logs: tail your app's output from the terminal
- MCP server: deploy from Claude Code or Claude Desktop via @roxer/mcp
- Lightweight: two dependencies, runs on Node 18+
How It Works
Static publishing: Your HTML, directory, or ZIP is uploaded, stored, and served globally. Each page gets a unique URL at roxer.com/<slug>. Tokens are saved locally so you can update or delete later.
App deploys: Your source code is zipped (excluding node_modules, .env, and build artifacts), uploaded, and built on the server. Each Node.js or Python app runs as its own AWS Lambda function with a dedicated subdomain at <app>.roxer.com. Apps that use SQLite get persistent storage via EFS automatically. Static-site builds (dist/, build/, plain HTML) skip the Lambda layer and serve straight from the CDN at roxer.com/<slug>.
Custom domains: roxer domain add walks you through two CNAME records (one for ACM validation, one for routing). The certificate is auto-issued. The domain becomes the primary URL for that app or page once the second CNAME propagates.
Options
Publish options
--slug <name> Custom URL slug
--password <pw> Password-protect the page (Hosting plan)
--ttl <days> Expiry in days (default: 30, permanent on Hosting)
--entry <file> Entry point for directory/ZIP publishes (default: index.html)Deploy options
--name <name> Custom app name (used as subdomain for server apps, slug for static)
--app <name> Redeploy to an existing app by nameDomain options
--app <app_id> Which app or page to attach the domain to
--token <token> Delete token for the app/page (falls back to local apps.json)
--json Machine-readable NDJSON output (for scripts and CI)Links
- Website: roxer.com
- Docs: roxer.com/docs
- Pricing: roxer.com/pricing
- MCP server: @roxer/mcp
