01
Write canopy.pipeline.ts
Describe your build and deploy steps as real TypeScript - functions, types, and imports, not a YAML dialect with its own rules for loops and conditionals.
Canopy Pipelines
Describe your build and deploy logic as real TypeScript instead of a YAML dialect. Canopy compiles it into a graph inside a hermetic sandbox, then runs every step of that graph for real, in its own isolated sandbox, as a gate your deploy has to pass.
Part of Canopy Host. See the full deployment platform →
The problem
A pipeline written in YAML has no functions, no types, and no way to run a unit test against its own logic. Teams route around that with templating, anchors, and copy-pasted steps across every repository — workarounds that create the exact complexity YAML was supposed to avoid. And because most pipeline engines execute your configuration directly, nothing stops it from calling an API, reading the clock, or branching on today’s weather — which means the same pipeline can produce a different result on two different runs, for no reason anyone can point to.
Canopy Pipelines removes that gap. Write your pipeline as TypeScript. Canopy compiles it — doesn’t execute it — inside a hermetic sandbox with a frozen clock, no randomness, and no network, into a plain graph. Only then does it run, one sandboxed step at a time.
How it works
01
Describe your build and deploy steps as real TypeScript - functions, types, and imports, not a YAML dialect with its own rules for loops and conditionals.
02
Your file runs once, inside a hardened sandbox with a frozen clock, no randomness, and no network - and produces a plain, static graph of steps and their dependencies. Nothing about that graph depends on what your code does when it runs; it depends only on what your code decided to build.
03
Each step in the graph executes for real, one at a time, in its own sandbox. If a step fails, the gate fails loudly and your deploy never reaches the legacy build path - nothing partial ships.
What you get
Your pipeline is a normal .ts file - use functions, shared modules, types, and your existing editor tooling. Nothing about it is a new language to learn or a subset of one to fight.
Writing your pipeline doesn’t run it. It produces a plain graph of steps and dependencies, which Canopy schedules, caches, and executes - the same separation a build tool like Bazel or Buck makes, applied to your deploy pipeline instead of your compiler.
Your pipeline file compiles inside a hardened sandbox with a frozen clock, no randomness, and no network - the same category of guarantee Bazel gets from Starlark, without inventing a new language to get it.
No step shares a shell with another, or with the machine that scheduled it. Each one gets a declared resource limit, a declared network egress allowlist, and nothing else - the same isolation model Canopy already uses for sandboxed agent execution.
A step that hasn’t changed - not by name, by actual content - doesn’t re-run. Rename a file without changing what it produces, and the cache still holds.
A Canopy Pipelines graph is one gate inside the same deploy your project already runs - it doesn’t replace Canopy Connect or introduce a second deploy mechanism to keep in sync with the first.
How this fits with Canopy Connect
Canopy Connect imports the CI you already run, unmodified, and correlates it with your deploys. Canopy Pipelines is for the pipeline logic you haven’t written yet — when the default staged build isn’t enough and you want real control over what runs, in what order, with what’s cached.
Good to know
Canopy Pipelines is live on a small number of allowlisted environments while we finish the isolation and dependency-verification work a general release needs.
FAQ
No. Canopy Connect imports and correlates CI you already have - your existing GitHub Actions, GitLab CI, or Bitbucket Pipelines config, unmodified. Canopy Pipelines is for writing new pipeline logic yourself, in TypeScript, when you want more than the default staged build gives you.
No. Canopy Pipelines is opt-in. Without a canopy.pipeline.ts file in your repository, your project builds and deploys exactly as it does today.
The gate fails loudly and your deploy never reaches the legacy build path - not a warning buried in a log, a real stop.
Yes, against Canopy’s own npm-compatible registry or your usual one. Verified, lockfile-checked dependency integrity for pipeline definitions is on our roadmap, not shipped yet - treat a pipeline file’s dependencies with the same care as your app’s until then.
Not yet. Canopy Pipelines is in early access on a small number of allowlisted environments while we finish the isolation work described above. Request early access below and we’ll get your environment allowlisted.
Get started
Canopy Pipelines is in early access — tell us about your project and we’ll get your environment allowlisted.