Web delivery format
HTTP apps on *.velcio.app: bind PORT (8080). Your app must implement GET /healthz.
Delivery format: Web (HTTP) apps
Use Web process mode when your delivery is an HTTP app with a public URL (https://{slug}.velcio.app), or when it needs inbound webhooks or any public HTTP endpoint (for example Discord interactions, WhatsApp, Slack, or Stripe).
For long-running processes with no public URL (Worker mode) see Delivery format. Not sure Worker vs Web? See Choosing Worker or Web.
Port (PORT)
Velcio sets PORT=8080 in the container and sends all public HTTPS traffic to that port.
Your process must:
- Listen on
0.0.0.0 - Bind the port from env
PORT(do not hardcode8000,3000, or other defaults) - Implement
GET /healthzin your app and return HTTP2xxon that same port when ready
Velcio proxies public HTTPS to your process. It does not add a /healthz route for you. If /healthz returns 404, add the route in your code and redeploy.
Do not ship secrets in .env* files. At build time Velcio writes a .dockerignore that excludes .env* (including .env.example) from the image; set values in Production secrets instead.
If you listen on the wrong port, the public URL returns 502 Bad Gateway even when the container looks healthy.
Python (Uvicorn):
import os
import uvicorn
port = int(os.environ["PORT"]) # Velcio sets PORT=8080
uvicorn.run("main:app", host="0.0.0.0", port=port)
Node.js:
const port = Number(process.env.PORT || 8080);
app.listen(port, "0.0.0.0");
Verify before buyer review
After deploy reaches running, Velcio shows your public URL on the project page (Verify delivery). Open the site, confirm it works, and confirm GET /healthz on that hostname returns HTTP 2xx (your app must implement that route). Then Send to buyer for review.
After the buyer accepts, they can rename the subdomain from the project hosting panel (for example my-shop.velcio.app) and optionally attach one custom subdomain via CNAME to the platform hostname. Previous platform URLs keep working forever as aliases for webhooks.
Other requirements
- No user-supplied Dockerfile (Velcio generates one).
- Python: root
requirements.txtor PEP 621pyproject.toml, plus exactly onemain.py. - Node.js: root
package.jsonand a valid entry file. - Declare required env var names in Velcio; never bake secret values into the ZIP. Velcio excludes
.env*from the Docker build context.
Layout
Same ZIP / GitHub snapshot rules as Delivery format, with the HTTP contract above.