Learn from OSS
Trigger.dev

How Trigger.dev Is Built

Repository structure, build system, dependencies, deployment pipeline, and developer experience

How Trigger.dev Is Built

Trigger.dev is built as a pnpm monorepo that combines a Remix dashboard, task orchestration services, provider runtimes, and published TypeScript packages in one repository. This page explains the repo layout, build system, dependencies, and deployment path behind the platform.

For Product Managers

This page answers "how does the engineering team ship Trigger.dev?" — the tools, processes, and infrastructure that turn source code into a running platform. Understanding this helps you grasp engineering timelines, deployment complexity, and maintenance costs.

Repository Structure

Trigger.dev is a pnpm monorepo with Turborepo for build orchestration. Applications, published packages, and internal packages all live in a single Git repository.

trigger.dev/
├── apps/
│   ├── webapp/              ← Remix dashboard + REST API (port 3030)
│   ├── supervisor/          ← Container lifecycle manager
│   ├── coordinator/         ← Worker instance coordination
│   ├── docker-provider/     ← Docker container management
│   └── kubernetes-provider/ ← Kubernetes pod management
├── packages/
│   ├── trigger-sdk/         ← @trigger.dev/sdk — public TypeScript SDK
│   ├── core/                ← @trigger.dev/core — shared types, schemas, tracer
│   ├── cli-v3/              ← trigger.dev CLI (dev, deploy, login)
│   ├── build/               ← @trigger.dev/build — build extensions
│   ├── react-hooks/         ← @trigger.dev/react-hooks — SWR hooks
│   ├── python/              ← @trigger.dev/python — Python runtime
│   ├── rsc/                 ← @trigger.dev/rsc — React Server Components
│   └── schema-to-json/      ← Zod/Yup/Arktype → JSON Schema
├── internal-packages/
│   ├── database/            ← Prisma schema + client
│   ├── run-engine/          ← Run orchestration engine
│   ├── schedule-engine/     ← Cron scheduling
│   ├── redis/               ← Redis client (ioredis)
│   ├── redis-worker/        ← Redis-backed job worker
│   ├── cache/               ← Caching layer
│   ├── clickhouse/          ← ClickHouse analytics client
│   ├── tracing/             ← OpenTelemetry instrumentation
│   ├── tsql/                ← Custom query language for logs
│   ├── replication/         ← ElectricSQL replication
│   ├── otlp-importer/       ← OTLP data ingestion
│   ├── emails/              ← Email templates
│   ├── zod-worker/          ← Zod-based worker
│   └── testcontainers/      ← Test infrastructure
├── references/              ← Example projects (hello-world, prisma, nextjs, etc.)
├── docker/                  ← Docker Compose for dev infrastructure
├── hosting/                 ← Self-hosting configs (Docker + Helm)
├── docs/                    ← Documentation site
├── tests/                   ← E2E test suites
├── .github/                 ← CI workflows
├── turbo.json               ← Turborepo pipeline config
├── pnpm-workspace.yaml      ← Workspace definitions
└── package.json             ← Root config (pnpm 10.23.0, Node 20.20.0)

The 5 Applications

AppTechnologyPurpose
webappRemix 2 + Express + React 18 + TailwindDashboard UI, REST API, WebSocket coordination, run engine
supervisorNode.js + Dockerode / K8s clientContainer lifecycle management (start, monitor, cleanup)
coordinatorNode.js + Socket.io + tinyexecWorker instance coordination and execution relay
docker-providerNode.js + DockerodeDocker-specific container provisioning
kubernetes-providerNode.js + @kubernetes/client-nodeKubernetes pod provisioning and management

The 8 Published Packages

Packagenpm NamePurpose
trigger-sdk@trigger.dev/sdkTask definition, triggering, waiting, scheduling
core@trigger.dev/coreShared types, schemas, JWT, OTEL, Zod helpers
cli-v3trigger.devCLI binary: trigger dev, trigger deploy, trigger login
build@trigger.dev/buildBuild extensions (Prisma, Puppeteer, Playwright, etc.)
react-hooks@trigger.dev/react-hooksSWR-based hooks for run status in React apps
python@trigger.dev/pythonPython runtime extension for tasks
rsc@trigger.dev/rscReact Server Components support
schema-to-json@trigger.dev/schema-to-jsonConvert Zod/Yup/Arktype schemas to JSON Schema

The 14 Internal Packages

PackagePurpose
@internal/databasePrisma schema + generated client (PostgreSQL)
@internal/run-engineRun orchestration — queue, retry, checkpoint, waitpoint
@internal/schedule-engineCron evaluation and distributed scheduling
@internal/redisRedis client wrapper (ioredis)
@trigger.dev/redis-workerFair multi-tenant job worker (DRR queuing)
@internal/cacheCaching abstraction
@internal/clickhouseClickHouse query and schema management
@internal/tracingOpenTelemetry setup and utilities
@internal/tsqlCustom query language for log search
@internal/replicationElectricSQL real-time replication
@internal/otlp-importerOTLP data ingestion pipeline
@internal/emailsTransactional email templates
@internal/zod-workerZod-validated background worker
@internal/testcontainersTestcontainers setup for integration tests

Why a Monorepo?

The SDK, CLI, webapp, and worker all share types from @trigger.dev/core. When the team adds a new task option, the type definition in core is immediately available to the SDK, the CLI build system, and the webapp API validation — no publishing, no version drift. Turborepo ensures only affected packages rebuild.

Build System

Package Build Tools

Different packages use different build tools based on their requirements:

ToolUsed ByWhy
tshySDK, core, build, react-hooks, python, rsc, schema-to-json, CLIDual ESM/CJS output for broad compatibility
tsupredis-workerFast bundling for internal packages
esbuildcoordinator, docker-provider, kubernetes-providerFast single-file bundling for container apps
tscrun-engine, supervisor, databaseStandard TypeScript compilation

Build Pipeline

pnpm install                    ← installs all deps + runs postinstall
    │                              (fumadocs-mdx for docs)

turbo build                     ← Turborepo orchestrates parallel builds

    ├──► @trigger.dev/core       (tshy → dist/esm + dist/commonjs)
    ├──► @trigger.dev/sdk        (tshy → dist/esm + dist/commonjs)
    ├──► trigger.dev (CLI)       (tshy → dist/esm)
    ├──► @internal/database      (prisma generate + tsc)
    ├──► @internal/run-engine    (tsc)
    ├──► webapp                  (remix build → server + client bundles)
    ├──► supervisor              (tsc)
    ├──► coordinator             (esbuild → single file)
    ├──► docker-provider         (esbuild → single file)
    └──► kubernetes-provider     (esbuild → single file)

Versioning and Publishing

pnpm changeset:add           ← developer describes the change


pnpm changeset:version       ← bumps versions based on changesets


pnpm changeset:release       ← builds + publishes to npm
    │                           uses scripts/updateVersion.ts

GitHub Release                ← auto-created with changelog


Docker Build (triggered)      ← publishes webapp + worker images to GHCR

Dependency Map

Webapp Dependencies (Key Libraries)

DependencyPurpose
Remix 2.1.0Server-rendered React framework
Express 4.20.0HTTP server with middleware
React 18UI framework
Tailwind CSSUtility-first styling
Socket.ioReal-time WebSocket communication
PrismaPostgreSQL ORM
ioredisRedis client
graphile-workerLegacy background jobs
remix-authAuthentication (GitHub, Google, Magic Link)
@electric-sql/reactReal-time database sync
@opentelemetry/*Distributed tracing
posthog-jsProduct analytics
@sentry/remixError tracking

SDK Dependencies

DependencyPurpose
@opentelemetry/apiTracing instrumentation
wsWebSocket client
chalkCLI colored output
cronstrueHuman-readable cron descriptions
slugURL-safe identifiers
ulid / uuidUnique ID generation
evtType-safe event emitter

CLI Dependencies

DependencyPurpose
commanderCLI framework
@clack/promptsInteractive CLI prompts
chokidarFile watching (hot reload)
esbuildTask code bundling
magicastAST-based code modification
partysocketReconnecting WebSocket
socket.io-clientPlatform communication
@depot/cliRemote Docker builds

Infrastructure Services

ServiceVersionPurpose
PostgreSQL15+ (pg_partman)Primary database with table partitioning
Redis7+Queue, locks, caching, pub/sub
ClickHouse25.6+Analytics, logs, task events
ElectricSQLLatestReal-time PostgreSQL replication
S2 (Streamstore)LatestRealtime stream data (v2)
MinIOLatestS3-compatible object storage (self-hosted)

Deployment

Cloud Platform (cloud.trigger.dev)

The managed cloud runs all five applications plus infrastructure services. Deployments are automated via CI:

  1. Changesets trigger a release PR
  2. Merge publishes npm packages
  3. Docker images are built with Depot (build caching)
  4. Images pushed to GitHub Container Registry (GHCR)
  5. Deployed to production infrastructure

Self-Hosted (Docker Compose)

docker/docker-compose.yml
  ├── database         → PostgreSQL (pg_partman_bgw)
  ├── redis            → Redis 7
  ├── electric         → ElectricSQL
  ├── clickhouse       → ClickHouse 25.6+
  └── webapp           → Remix dashboard + API

hosting/docker/
  ├── webapp/          → Webapp compose config
  └── worker/          → Supervisor compose config

Self-Hosted (Kubernetes / Helm)

ComponentHelm Chart
WebappMain deployment + service
SupervisorWorker management deployment
ElectricSQLReal-time replication
RegistryContainer image registry
PostgreSQLBitnami subchart
RedisBitnami subchart
ClickHouseBitnami subchart
MinIOBitnami subchart

Deployment Options

StrategyTargetComplexity
Cloudcloud.trigger.devNone — fully managed
Docker ComposeSingle serverLow — docker compose up
Helm ChartKubernetes clusterMedium — chart version 4.0.5
CustomAny infrastructureHigh — bring your own registry + orchestration

Quality Assurance

Testing

LayerToolScope
Unit testsVitestPackage-level unit tests
Integration testsVitest + TestcontainersRun engine, Redis worker, ClickHouse (with real services)
E2E testsPlaywright + CLIFull deploy → trigger → execute → verify
SDK compatibilityCustom harnessCross-version SDK testing

CI/CD Workflows

WorkflowTriggerPurpose
release.ymlChangeset mergeBuild, typecheck, npm publish, Docker build
publish.ymlRelease tagDocker image publish (webapp + workers)
unit-tests.ymlPRWebapp, packages, internal unit tests
unit-tests-packages.ymlPRTestcontainers-based integration tests
e2e.ymlPRCLI E2E on Ubuntu/Windows, npm/pnpm
typecheck.ymlPRFull monorepo type checking
sdk-compat.ymlPRSDK cross-version compatibility

Code Quality

ToolPurpose
TypeScript strict modeType safety across all packages
ChangesetsSemver-compliant versioning
Turbo cacheSkip unchanged package builds
DepotFast Docker image builds with caching

Developer Experience

Getting Started

# Prerequisites: Node 20.20.0, pnpm 10.23.0, Docker, protobuf

# Clone and install
git clone https://github.com/triggerdotdev/trigger.dev && cd trigger.dev
pnpm install

# Copy env and set encryption key
cp .env.example .env

# Start infrastructure
pnpm run docker    # PostgreSQL, Redis, ElectricSQL, ClickHouse

# Run database migrations
pnpm run db:migrate

# Build required packages
pnpm run build --filter webapp
pnpm run build --filter trigger.dev
pnpm run build --filter @trigger.dev/sdk

# Start the webapp
pnpm run dev --filter webapp    # Dashboard at http://localhost:3030

Key Developer Commands

TaskCommand
Start webapppnpm run dev --filter webapp
Build everythingpnpm run build
Run all testspnpm test
Run webapp testspnpm test:webapp
Run package testspnpm test:packages
Type checkturbo typecheck
DB migrationspnpm run db:migrate
Start Docker infrapnpm run docker

Reference Projects

The references/ directory contains example projects for testing the SDK and CLI:

ReferencePurpose
hello-worldBasic SDK + CLI integration test
prisma-6 / prisma-7Prisma build extension testing
nextjs-realtimeNext.js + React hooks integration
d3-chatAI chat with streaming
effectEffect TS integration

For PMs: Why Reference Projects?

Reference projects are real working examples that double as integration tests. When the team changes the SDK, they run these projects to verify nothing breaks. This is cheaper than maintaining a full E2E test suite for every use case, and the projects also serve as documentation for users.

What's Next