← All documentation
Developers

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:

  1. Listen on 0.0.0.0
  2. Bind the port from env PORT (do not hardcode 8000, 3000, or other defaults)
  3. Implement GET /healthz in your app and return HTTP 2xx on 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.txt or PEP 621 pyproject.toml, plus exactly one main.py.
  • Node.js: root package.json and 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.

Web delivery format | Velcio Docs