Deploy Your First App on Exovon
Get your code live in under 60 seconds. No configuration files. No YAML. Just code.
Prerequisites
- Node.js 18+
- A GitHub repository with your project
- An Exovon account (free tier works)
Step 1: Authenticate
Exovon supports both interactive credential login and headless environment variable authentication:
Option A: Interactive CLI Login (Recommended for Local Dev)
Run npx exovon login. The CLI prompts for your API key and securely stores it in ~/.exovon/auth.json with 0600 file permissions.
Option B: Environment Variable (Recommended for CI/CD)
- Go to Exovon Dashboard → Settings → API Tokens
- Generate a Personal Access Token (PAT) — starts with
exo_live_... - Export it in your terminal or CI/CD secret manager:
Step 2: Link & Deploy
Link your local project directory once to save your project configuration in .exovon/project.json:
Why npx? No global install needed. You always run the latest audited @exovon/sdk.
.exovonignore: excluded node_modules, .next (1.8 MB payload)asia-south1) in 420msDeployment Flags
| Flag | When to Use |
|---|---|
| (none) | Auto-detect static vs. dynamic vs. Docker |
| --static | Force fast-path static deploy. Assets promoted to edge CDN in < 1 second. |
| --dynamic | Force Cloud Build container pipeline |
| --root-dir <path> | Target a specific package or app folder in a Turborepo, Nx, or pnpm monorepo. |
| --framework <fw> | Explicit framework: nextjs, vite, astro, nuxt, remix, docker |
Examples:
Monorepo Workspaces (Turborepo, Nx, pnpm)
When deploying from a monorepo, pass the --root-dir flag or set Root Directory in Project Settings. Exovon analyzes workspace lockfiles (pnpm-lock.yaml, package-lock.json) at the repo root and packages only the required workspace dependencies into the deploy bundle.
Excluding Files with .exovonignore
Exovon CLI reads .exovonignore (falling back to .gitignore) before archiving. Excluding local dependencies and heavy test suites shrinks your upload payload to <5MB, enabling sub-second CLI upload speeds:
# .exovonignore
node_modules
.git
.env*.local
.next
dist
build
coverage
*.log
.turboWhat Happens Next
- Framework Detection — Exovon inspects your repo:
Dockerfileat root → Sandboxed OCI container buildpackage.jsonwith a start script → NODEJS dynamic app- Neither → STATIC fast-path to edge CDN
- Build — Your code compiles in an isolated container on GCP (
asia-south1). - Container Registration — The built image is registered in our Mumbai (
asia-south1) container pool. - Canary Rollout — Your new revision starts at 0% traffic. We bleed 10% canary traffic and monitor the 500 error rate for 60 seconds. If healthy, we shift to 100%.
- Live URL — You get an instant
.exovon.co.inURL.
Step 3: Manage Secrets
Never commit secrets to Git. Exovon injects them at runtime via the CLI.
Add or Update a Secret
List Secrets (Values Masked)
STRIPE_KEY=********
Remove a Secret
Sync Secrets to Local Dev
How It Works
Secrets are never baked into your container image. They are mounted at runtime.
Step 4: Add a Custom Domain
Every project deployed on Exovon includes a free *.exovon.co.in URL. To connect your own custom domain with automated TLS 1.3 SSL via Cloudflare for SaaS, follow these steps:
- In your project dashboard, navigate to Domains.
- Click Add Domain and enter your domain name (e.g.,
app.customer.comor apexcustomer.com). - Select your configuration mode (connect to Production or set up an Edge Redirect).
- Add the DNS records generated by the dashboard at your domain registrar (GoDaddy, Namecheap, Cloudflare, Route 53, etc.):
Case A: Subdomains (e.g. app.customer.com or www.customer.com)
Supported on 100% of DNS registrars via standard CNAME:
| Type | Host / Name | Target / Value | Purpose |
|---|---|---|---|
| CNAME | app (or www) | router.exovon.co.in | Routes subdomain traffic to Exovon Anycast edge |
| TXT | _exovon-challenge.app | [verification-token-from-dashboard] | Proves domain ownership for automated SSL |
Case B: Root / Apex Domains (e.g. customer.com)
Standard DNS (RFC 1912) prevents CNAME records on the apex root (@). Choose one of the two options below:
| Type | Host / Name | Target / Value | Supported Registrars |
|---|---|---|---|
| A (Primary) | @ (or blank) | 172.67.182.1 | Universal: GoDaddy, Namecheap, Porkbun, Google Domains, etc. |
| A (Secondary) | @ (or blank) | 104.21.70.1 | Anycast failover redundancy IP |
| TXT | _exovon-challenge | [verification-token-from-dashboard] | Proves root domain ownership |
💡 If using Cloudflare, Route 53, or DNSimple, you can alternatively use CNAME Flattening / ALIAS on @ pointing to router.exovon.co.in.
- Once DNS records are published, click Verify DNS Configuration in your dashboard.
- Exovon verifies the challenge and automatically provisions a dedicated TLS 1.3 certificate (typically within 2–5 minutes).
If your domain's DNS is hosted on Cloudflare, set the Proxy status to DNS Only (Grey Cloud) for both the routing record and the verification TXT challenge. Enabling Cloudflare Proxy (Orange Cloud) during initial verification prevents our edge network from validating the challenge and can create redirect loops.
Important Defaults
| Setting | Default | Override |
|---|---|---|
| Container port | 8080 | Your app must bind to PORT=8080. Exovon health-checks this port. |
| Hosting region | asia-south1 (Mumbai) | Contact support for US-East or Delhi (coming Sept 2026). |
| Request timeout | 10s (Free) / 30s (Starter) / 60s (Pro) / 120s (Heavy) | Optimize code or upgrade plan. |
| Max payload | 3MB (Free) / 4MB (Starter) / 6.5MB (Pro) / 20MB (Heavy) | Use multipart uploads or external storage. |
Common Issues
| Symptom | Cause | Fix |
|---|---|---|
| Error: EXOVON_API_KEY not found | Token not found in environment or auth cache | Run npx exovon login or export EXOVON_API_KEY="..." in your shell/CI secrets. |
| BUILD_FAILED | Build script exited with error | Check dashboard logs. Common: missing next build, TypeScript errors, missing dependencies. |
| STARTUP_FAILED | App crashed on boot | Ensure your app listens on PORT=8080. Check that your start script is correct. |
| MEMORY_LIMIT | Container ran out of RAM | Free = 512MB, Starter = 1GB, Pro = 2GB, Heavy = Custom. Remove unused dependencies or upgrade plan. |
| 504 Gateway Timeout | Request took too long | Optimize slow routes. Free = 10s, Starter = 30s, Pro = 60s, Heavy = 120s. Move heavy work to background jobs. |
| Domain shows "Invalid SSL" | DNS not propagated | Wait 2–5 minutes. Ensure both CNAME and TXT records are exact. |
| --framework not recognized | Typo in framework name | Use: nextjs, vite, astro, nuxt, remix, docker |