DocumentationMumbai
Quickstart

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)
1

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.

npx exovon login
# Or verify active identity:
npx exovon whoami

Option B: Environment Variable (Recommended for CI/CD)

  1. Go to Exovon Dashboard → Settings → API Tokens
  2. Generate a Personal Access Token (PAT) — starts with exo_live_...
  3. Export it in your terminal or CI/CD secret manager:
export EXOVON_API_KEY="exo_live_..."
2

Step 2: Link & Deploy

Link your local project directory once to save your project configuration in .exovon/project.json:

# Link local directory to Exovon project:
npx exovon link --project "my-app"
# Deploy from linked directory:
npx exovon deploy

Why npx? No global install needed. You always run the latest audited @exovon/sdk.

Visual Deployment Reference
user@laptop:~/projects/my-app$npx exovon deploy
Linked to project my-app (id: prj_8e4b10fa)
Detected Framework: Next.js 15 (App Router)
Applying .exovonignore: excluded node_modules, .next (1.8 MB payload)
Archive uploaded to Mumbai region (asia-south1) in 420ms
[builder] Compiling production build with Turbopack...
[builder] Generating static pages (14/14) in 8.4s
[builder] Optimized container image registered in Mumbai cluster
Canary Health Probes: 10/10 healthy (18ms avg latency)
Global Anycast Edge Router updated: 100% traffic shifted
Deployed in 16.2 seconds

Deployment Flags

FlagWhen to Use
(none)Auto-detect static vs. dynamic vs. Docker
--staticForce fast-path static deploy. Assets promoted to edge CDN in < 1 second.
--dynamicForce 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:

# Fast-path a static site to edge CDN
npx exovon deploy --static --project "my-app"
# Force container build for a Node.js app
npx exovon deploy --dynamic --project "my-app"
# Deploy a specific app from a monorepo root
npx exovon deploy --root-dir apps/web --project "my-web-app"

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:

GITIGNORE
# .exovonignore
node_modules
.git
.env*.local
.next
dist
build
coverage
*.log
.turbo

What Happens Next

  1. Framework Detection — Exovon inspects your repo:
    • Dockerfile at root → Sandboxed OCI container build
    • package.json with a start script → NODEJS dynamic app
    • Neither → STATIC fast-path to edge CDN
  2. Build — Your code compiles in an isolated container on GCP (asia-south1).
  3. Container Registration — The built image is registered in our Mumbai (asia-south1) container pool.
  4. 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%.
  5. Live URL — You get an instant .exovon.co.in URL.
3

Step 3: Manage Secrets

Never commit secrets to Git. Exovon injects them at runtime via the CLI.

Add or Update a Secret

npx exovon env add DATABASE_URL "postgresql://..." --project "my-app"
npx exovon env add STRIPE_KEY "sk_live_..." --project "my-app"

List Secrets (Values Masked)

npx exovon env ls --project "my-app"
DATABASE_URL=********
STRIPE_KEY=********

Remove a Secret

npx exovon env rm STRIPE_KEY --project "my-app"

Sync Secrets to Local Dev

npx exovon env pull --project "my-app" # Writes to .env.local
npx exovon env pull .env.staging --project "my-app" # Writes to custom file

How It Works

Developer CLI → Control Plane API (AES-256 GCM) → Encrypted Secret Vault → GCP Secret Manager → Runtime Memory Mount → Cloud Run container

Secrets are never baked into your container image. They are mounted at runtime.

4

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:

  1. In your project dashboard, navigate to Domains.
  2. Click Add Domain and enter your domain name (e.g., app.customer.com or apex customer.com).
  3. Select your configuration mode (connect to Production or set up an Edge Redirect).
  4. 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:

TypeHost / NameTarget / ValuePurpose
CNAMEapp (or www)router.exovon.co.inRoutes 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:

TypeHost / NameTarget / ValueSupported Registrars
A (Primary)@ (or blank)172.67.182.1Universal: GoDaddy, Namecheap, Porkbun, Google Domains, etc.
A (Secondary)@ (or blank)104.21.70.1Anycast 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.

  1. Once DNS records are published, click Verify DNS Configuration in your dashboard.
  2. Exovon verifies the challenge and automatically provisions a dedicated TLS 1.3 certificate (typically within 2–5 minutes).
⚠️Important for Cloudflare DNS Users:

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

SettingDefaultOverride
Container port8080Your app must bind to PORT=8080. Exovon health-checks this port.
Hosting regionasia-south1 (Mumbai)Contact support for US-East or Delhi (coming Sept 2026).
Request timeout10s (Free) / 30s (Starter) / 60s (Pro) / 120s (Heavy)Optimize code or upgrade plan.
Max payload3MB (Free) / 4MB (Starter) / 6.5MB (Pro) / 20MB (Heavy)Use multipart uploads or external storage.

Common Issues

SymptomCauseFix
Error: EXOVON_API_KEY not foundToken not found in environment or auth cacheRun npx exovon login or export EXOVON_API_KEY="..." in your shell/CI secrets.
BUILD_FAILEDBuild script exited with errorCheck dashboard logs. Common: missing next build, TypeScript errors, missing dependencies.
STARTUP_FAILEDApp crashed on bootEnsure your app listens on PORT=8080. Check that your start script is correct.
MEMORY_LIMITContainer ran out of RAMFree = 512MB, Starter = 1GB, Pro = 2GB, Heavy = Custom. Remove unused dependencies or upgrade plan.
504 Gateway TimeoutRequest took too longOptimize slow routes. Free = 10s, Starter = 30s, Pro = 60s, Heavy = 120s. Move heavy work to background jobs.
Domain shows "Invalid SSL"DNS not propagatedWait 2–5 minutes. Ensure both CNAME and TXT records are exact.
--framework not recognizedTypo in framework nameUse: nextjs, vite, astro, nuxt, remix, docker