Version every flow. Sync from Git.

Push flows, dashboards, Namespace Files, and execution outputs to any Git provider. Pull back on schedule or webhook. Treat Git as the source of truth, with bidirectional namespace sync, dryRun diffs before every change, protected namespaces, and clone any external repo at flow runtime.

Blueprints for Git-driven Kestra orchestration.

Make Git the source of truth for every flow with an orchestration engine that listens to schedules or PR webhooks, handles bidirectional namespace sync with dryRun diffs and protected namespaces, and chains Clone with Terraform, dbt, and Ansible pulled fresh at runtime. Cut the gap from Git merge to deploy down to the next 5-minute reconcile.

Sync flows from main into Kestra on a 5-minute schedule Open blueprint
Export Kestra to Git every hour, dryRun first, apply after review Open blueprint
Pin a dbt project ref per execution, no container rebuild Open blueprint

Around every flow, every namespace, every tenant.

Kestra runs orchestration. Git holds the source of truth for what runs. The plugin lets you choose which side wins, push and pull by artifact type, sync an entire tenant, dryRun every change first, and clone external repos at runtime so the working directory is always fresh.

GIT or KESTRA: pick which side wins, every sync

NamespaceSync syncs one namespace between a Git branch and Kestra. Set sourceOfTruth: GIT and Kestra reconciles to match the repo, deleting flows that disappeared from main. Set sourceOfTruth: KESTRA and the repo follows what was edited in the UI. whenMissingInSource controls deletion behavior: DELETE, KEEP, or FAIL. The direction is explicit, never implicit.

Push by artifact type, parallel-safe

Four push tasks, one per artifact. PushFlows commits flow YAML under _flows/. PushNamespaceFiles commits files under _files/. PushDashboards commits saved dashboards under _dashboards/. PushExecutionFiles commits run outputs under _outputs/. Run them in parallel across different namespaces, or sequence them inside one namespace to avoid merge conflicts.

TenantSync moves the entire orchestrator state through Git

TenantSync synchronizes every namespace, flow, Namespace File, and dashboard in a tenant in one task. Push from staging-Kestra, pull into prod-Kestra, gated by review. The whole platform state moves between environments through a Git branch with protectedNamespaces keeping critical prod namespaces safe from accidental deletion.

dryRun every push and sync before it lands

Every push and sync task supports dryRun: true. The task computes the full diff and writes it to Kestra's internal storage as an ion file without applying anything. Plug into a review workflow: dryRun on a Schedule, post the diff to Slack or open a PR, gate the apply behind human approval, then re-run with dryRun: false.

Clone any external repo at flow runtime

git.Clone brings external code into the working directory at execution time. Pin a branch, a tag, or a commit. cloneSubmodules: true pulls submodules. The cloned files become the input to subsequent steps (dbt CLI, Terraform CLI, scripts.python). No baked-in artifacts in container images, no stale copies, no rebuild to ship a new dbt project version.

protectedNamespaces stops accidental destruction

The protectedNamespaces list (defaults to [system]) is never deleted, even when whenMissingInSource: DELETE would otherwise remove it. Add prod, finance, or compliance to the list and a Git sync cannot accidentally wipe them. Combine with dryRun for two independent safety layers before a destructive operation.

How platform teams use Kestra and Git

Patterns teams ship in production today. Each one shows the flow end to end, with the real plugin classes in play.

Source of truth

Git is authoritative. Kestra reconciles every five minutes.

A scheduled flow in the system namespace runs NamespaceSync with sourceOfTruth: GIT every five minutes against the main branch of the platform repo. Flows added in Git appear in Kestra. Flows deleted in Git disappear from Kestra (except those listed in protectedNamespaces). The Kestra UI becomes a read-only window onto what is committed to main.

Drift between Git and Kestra is reconciled

If someone edits a flow in the UI by mistake, the next sync overwrites it from main. The intended state lives in Git.

Deletions propagate, safely

Remove a flow from Git and the next sync removes it from Kestra, unless its namespace is in protectedNamespaces.

Commit and run are the same trigger

Merge a PR to main and the next 5-minute sync deploys it. No separate CI step, no kestra-deploy.sh script.

Diff summary surfaces every reconcile

The NamespaceSync output includes a diff file. The follow-up Slack step posts what changed since the last reconcile.

every 5 min
schedule
sync from git
sourceOfTruth: GIT
report changes
diff summary
Export

Continuous export: every Kestra change pushed back to Git

An hourly flow runs PushFlows with dryRun: true against the platform repo. The diff lands in Kestra's internal storage. A follow-up step posts a link to the diff in Slack with a review request. Once approved (manually, or by a bot that opens a PR), the same task re-runs with dryRun: false and commits. Every change in Kestra ends up in Git with attributable authorship.

dryRun before any commit

The first PushFlows runs in plan-only mode. No commit lands until the reviewer resumes the flow.

Per-artifact granularity

Run PushFlows, PushNamespaceFiles, PushDashboards in parallel for the same namespace, each landing in its own _flows / _files / _dashboards subdirectory.

Commit URL flows forward

PushFlows output includes the commitURL. The follow-up Slack message includes a direct link to the commit on GitHub or GitLab.

hourly
schedule
dry-run export
dryRun: true
post diff
Slack link
human gate
review and approve
apply
dryRun: false
confirm
commit URL to Slack
Runtime input

Clone the dbt project at runtime, never bake artifacts into the image

The flow runs Clone against the data-platform repo at a pinned branch. Submodules pulled. The dbt project lands in the working directory. The next task runs dbt build against the freshly cloned project. Branch, tag, or commit can be pinned per-execution as a flow input, so the same flow definition deploys feature branches in CI and main in prod without a container rebuild.

Ref is a flow input

Pass branch, tag, or commit at execution time. CI runs the feature branch, prod runs main, no separate flow definition.

Submodules pulled when needed

cloneSubmodules: true brings in nested repos (shared macros, dbt packages, internal libs) at runtime.

Working directory is the cloned repo

The dbt CLI task does not need a separate path config. The clone landed in working dir, dbt picks it up directly.

No container rebuild to ship a new project version

Updating the dbt models is a Git push, not a Docker image rebuild and registry push.

scheduled
or webhook
clone dbt repo
pinned ref
dbt build
fresh source
post results
Slack with revision
Promotion

Promote orchestrator state from staging to prod through Git

A release flow in staging-Kestra runs TenantSync with sourceOfTruth: KESTRA, dryRun: true. The diff lands and Slack posts the link. After human approval (Pause + reviewer), the same task re-runs with dryRun: false to commit the staging state to a release branch. A second flow in prod-Kestra runs TenantSync with sourceOfTruth: GIT and protectedNamespaces: [prod-finance, prod-compliance] to safely apply. The entire platform state moves through Git, gated, audited, reversible.

Whole-tenant promotion in one task

TenantSync handles every namespace, flow, Namespace File, and dashboard in the tenant at once. No per-namespace orchestration loop.

Protected namespaces never deleted

prod-finance, prod-compliance stay safe even if whenMissingInSource: DELETE. Add prod-billing or any other critical namespace as needed.

Two dryRun gates before prod changes

First on staging export, then on prod apply. Two independent reviews before any destructive operation runs in prod.

Reversible via Git history

Every promotion is a Git commit. Reverting the platform state is a git revert + re-run TenantSync, not a manual recovery.

release trigger
manual or schedule
dry-run from staging
TenantSync KESTRA, dryRun
review
named reviewer
commit staging
TenantSync KESTRA, apply
apply to prod
TenantSync GIT + protected
release notes
Slack to platform
We needed orchestration built for flexibility and scale, without forcing us to rewrite our existing pipelines. Kestra fit naturally into our stack and enabled our teams to move quickly without disruption.
Director of Engineering, Acxiom

Kestra vs Git-for-Kestra alternatives

Capability
Manual export + git CLI on the Kestra host
Custom CI script + Kestra REST API
Kestra UI only (no Git sync)
Bidirectional sync with explicit source of truth
sourceOfTruth: GIT or KESTRA, whenMissingInSource controls deletion
Manual, no direction enforcementWrite your own diff logicNo sync, only manual edits
Push by artifact type (flows, files, dashboards, outputs)
Four dedicated tasks, parallel-safe
Manual per-artifactBuild the export endpoints yourselfNot supported
Tenant-wide sync in one task
TenantSync, every namespace + artifact in one call
Loop over namespaces in shellLoop in codeManual per-namespace UI clicks
dryRun: plan-only mode before any change
Every push and sync task supports dryRun
Not available, every git push landsImplement diff logic yourselfNot applicable
Protected namespaces (never deleted during sync)
protectedNamespaces list on every sync task
Manual safeguardsCode the protection yourselfNot applicable
Clone external repos at flow runtime
git.Clone with branch, tag, commit, submodule support
Shell + git CLI inside the taskCustom codeBake the artifacts into the image
Cross-environment promotion via Git
TenantSync staging to Git, Git to prod, gated
Manual file copyCustom CI pipelineRe-create flows in prod UI
Audit trail of who pushed what when
Commit author + Kestra execution ID per change
Git commits only, no execution linkCustom log correlationKestra audit only, no Git side
Self-hosted, air-gapped, OSS edition
Self-hosted by default, OSS edition free
Self-hostedSelf-hostedSelf-hosted

Git & Kestra: common questions

Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

See How

Ready to make Git the source of truth for every flow?

Push flows, files, and dashboards to any Git provider. Reconcile from Git on schedule. dryRun every change first. Protect critical namespaces. Clone external repos at runtime. Open source, self-hosted, event-driven.