Should you self-host?
Trigger.dev Cloud is fully managed, scalable, and comes with dedicated support. For most users, it offers the best experience. However, if you have specific requirements around data residency, compliance, or infrastructure control, self-hosting may be the right choice for you. The self-hosted version is functionally the same as Trigger.dev Cloud with some exceptions, but our managed Cloud infrastructure is designed for high availability, security, and scale. Because we don’t manage self-hosted instances, we cannot guarantee how Trigger.dev will perform on your infrastructure. You assume all responsibility and risk for your deployment, including security, uptime, and data integrity. For more details, carry on reading and follow our guides for instructions on setting up a self-hosted Trigger.dev instance. If you prefer a managed experience, you can sign up for our Cloud offering instead - we have a generous free tier for you to try it out.Architecture
The self-hosted version is a set of containers running on your own infrastructure. It’s split into two parts that can be scaled independently:- Webapp: includes the dashboard and other services like Redis and Postgres.
- Worker: includes the supervisor and the runners that execute your tasks.

Feature comparison
While limits are generally configurable when self-hosting, some features are only available on Trigger.dev Cloud:Limits
Most of the limits are configurable when self-hosting, with some hardcoded exceptions. You can configure them via environment variables on the webapp container.Machine overrides
You can override the machine type for a task by setting theMACHINE_PRESETS_OVERRIDE_PATH environment variable to a JSON file with the following structure.
Custom base images
Deploys build on the publishedtriggerdotdev/node and triggerdotdev/bun Debian images. To require a different base for every deploy to your instance, such as a FIPS-validated or hardened Node image, set DEPLOY_BASE_IMAGES on the webapp (and optionally DEPLOY_BUILD_BASE_IMAGES for the build stage):
runtime=image@sha256:<digest>. The runtimes are node-22, node-24, node-26 and bun, and every image must be pinned by digest. An invalid value prevents the webapp from starting. Projects with runtime: "node" in their config resolve to the current default Node runtime (node-24 today), so set that key for them. With the Helm chart, set the variables through webapp.extraEnvVars.
Runtimes with an entry build on that image; the others keep the published images. Deploys from CLI versions that cannot apply the images are rejected with an error asking to upgrade, and so are --native-build, --local-bundle and --from-bundle deploys. This is a self-hosting setting and does not apply to Trigger.dev Cloud.
You own a custom base image. It must provide:
nodeonPATHat the runtime’s major version (forbun, bothbunandnode, because the final stage starts the app withdumb-init node)busybox,ca-certificates,dumb-init,gitandopenssl- a
nodeuser (abunuser for the Bun runtime) - glibc, so native modules built in the build stage load at runtime
DEPLOY_BUILD_BASE_IMAGES image needs everything the base image provides, plus python3, make and g++. Build extensions that add image instructions are replayed on it. Without an entry, the build stage uses the published build image, except for projects whose build extensions add image instructions: those build from your base image and install the toolchain with apt-get, so that base must be Debian-based. To avoid the published images entirely, set both variables.
Community support
It’s dangerous to go alone! Join the self-hosting channel on our Discord server.Next steps
Docker compose
Learn how to self-host Trigger.dev with Docker compose.
Kubernetes
Learn how to self-host Trigger.dev with Kubernetes.
Security
Report vulnerabilities and stay informed about security releases.

