Skip to content

Deploying your app

gy deploy is the only command you need to ship. It auto-detects your stack, generates a Dockerfile when one is missing, builds, uploads, and deploys.

Terminal window
# Deploy from the current directory
gy deploy
# Deploy a specific directory
gy deploy ./my-app
# Interactive guided setup
gy deploy --wizard

Aliases: gy d, gy push, gy up.

Type Detector Example frameworks
Node.js package.json Next.js, Express, Vite, Nuxt
Python requirements.txt, pyproject.toml Django, Flask, FastAPI, Streamlit
Go go.mod Gin, Fiber, Echo, Chi
Rust Cargo.toml Any Cargo project
Static index.html Plain HTML
Docker Dockerfile Your own container
Flag Description
-n, --name App name (defaults to the directory name)
-p, --project Project name (auto-created if new)
--port Port your app listens on (auto-detected)
--tier Resource tier: t1, t2, or t3 (default t1)
--domain Custom domain (empty = auto-generated)
--public Make the app publicly accessible (default true)
--dockerfile Path to a Dockerfile (auto-generated if absent)
-w, --wizard Interactive guided setup
--no-ai Disable AI-assisted detection
--ai-key GenAI API key for AI-assisted detection (or set GY_AI_KEY)
--json Emit structured JSON output
Terminal window
# Name the app and pick a tier
gy deploy --name "my-cool-api" --tier t2
# Deploy into a specific project
gy deploy --project team-ops
# Explicit port
gy deploy --port 8080
# Deploy a directory with a script-friendly JSON result
gy deploy ./backend --json

After a successful deploy, gy writes a .gy.json file to your project:

{
"app": "my-cool-api",
"project": "default",
"port": 3000,
"publicAccess": true,
"tier": "t1",
"env": {
"DATABASE_URL": "postgres://…"
}
}

It contains no UUIDs — everything uses friendly names, and the CLI resolves identifiers internally. Commit it so teammates and CI can use the same app.

Run gy deploy again any time. gy reads .gy.json, targets the same app, and ships your changes.