Every project is a Web Service by default: we expect it to serve HTTP on the port Nixpacks starts it on, we route <slug>.ethiodeploy.com(and any custom domain) to it, and every deploy waits for a health check to pass before switching traffic over — the old version keeps serving until the new one proves it's ready.
Some projects don't serve HTTP at all — a Telegram bot polling getUpdates, a queue consumer, any long-running background process. For those, set the project's Service Type to Background Worker — either when creating the project, or later from Settings → Build. A worker changes three things:
- No domain routing and no HTTP health check — there's no port to check. A deploy is considered healthy once the new process stays running past a short startup grace period.
- Deploys stop the previous instance before starting the new one, instead of running both briefly side by side. For most apps that overlap is harmless; for something holding a single long-poll connection open (like a Telegram bot), running two instances at once causes the provider to kill one of them with a conflict error. Sequential deploys mean a few seconds of downtime instead.
- On the Free plan, a worker never sleeps when idle — there's no traffic to idle on in the first place, and the process needs to stay running to keep polling. It's still bound by the same monthly usage quota as everything else, so a worker that uses meaningfully more memory than a lightweight bot can trip that quota before the month is out.