Deploying an app
vibe deploy # current foldervibe deploy ./shop --name shop # another folder, explicit nameA deploy uploads the folder, builds an image in the cluster, rolls it out and waits until the new version answers. Then the app is live at https://<name>.tja.nrw. The first deploy writes vibe.json with the name, so later deploys update the same app.
What your app must do
Section titled “What your app must do”- Listen on
0.0.0.0, notlocalhostor127.0.0.1. - Listen on
$PORT. It is8080unless you set a port. If your app can’t readPORT, tell VibeDeploy its port with--port 3000or"port": 3000invibe.json. - Write state to a volume or a database. Files written inside the container are gone after the next deploy. See Storage and Databases.
- Fit in 512 MiB of memory and half a CPU. More is not possible; a process that goes over the memory limit is killed (
OOMKilled).
Stack detection
Section titled “Stack detection”Without a Dockerfile, VibeDeploy picks the build from your files:
Detected by package.json. Runs on node:22-alpine.
- A
startscript: installed and run as a server (npm start). - Only a
buildscript: built once and served as a static single-page app fromdist/,build/orout/, with fallback toindex.htmlfor client-side routes. - npm, pnpm or yarn, chosen by the lockfile.
Detected by requirements.txt or pyproject.toml. Runs on python:3.12-slim.
The start command, in this order:
web:line of aProcfile- FastAPI found:
uvicorn - Flask found:
gunicorn python main.py,app.pyorserver.py
Detected by go.mod. Built as a static binary and run on a minimal distroless image.
A folder with an index.html and none of the above is served as is by nginx.
A Dockerfile in the folder always wins. The port is --port, then the EXPOSE line, then 8080. Images are built for ARM64 (the server is an ARM machine), so base images must support linux/arm64; the official ones do.
What gets uploaded
Section titled “What gets uploaded”In a git repository: the tracked files plus new files that are not ignored. Outside git: the folder without the usual clutter. In both cases these are never uploaded:
.env,.env.localand every other.env*file (.env.exampleis fine)node_modules,.git,.venv,__pycache__,.next- kubeconfigs and SSH private keys
Secrets go in through environment variables, never in the upload.
Rollouts
Section titled “Rollouts”A new version replaces the old one only once it is running. If the new version crashes or never answers, the deploy fails and the previous version keeps serving. The error, a hint and the logs come back to the CLI or your agent, and the dashboard shows them in the app’s Health card.
Two deploys of the same team can build at the same time; more wait in a queue. See Limits.
Deploy history
Section titled “Deploy history”Every deploy is recorded with its status, duration, the git commit and branch (* means uncommitted changes) and where it came from (CLI, MCP, GitHub Actions).
vibe history shop # newest firstvibe history shop shop-mvvf8lzv # the full build and rollout log of one deployThe last 30 deploys per app are kept.
Deleting an app
Section titled “Deleting an app”vibe rm shop --yesThis removes the app, its environment variables, its domains, its volume and its images. Linked databases stay.