Versions & Git Review
Version history, collaboration checkpoints, and the GitHub review flow for workflow changes.
Confluye stores each workflow as numbered versions. A workflow has one Production destination and can have several named previews. Each destination chooses its candidate and deployed version independently. A linked GitHub repository adds a review requirement to publication.
Version history
Each save (except collaboration draft saves) appends a version in the workflow's shared version history. You can name a version without changing its fixed number or graph. The version label and preview name are separate: v7 · CRM experiment can be deployed in a preview named Sales test. Every run records which version and destination it executed.
Within the selected destination, the editor distinguishes:
- Candidate — the saved version you are editing and testing in this destination.
- Active — the immutable deployment serving this destination's triggers and live execution.
- Git review — a proposal for the exact candidate, with its own PR and commit evidence.
A candidate dry run simulates effects. Deploying a preview enables real execution with that preview's explicit connections and separate webhook URLs. It requires an AIMS decision for that destination, version and connection configuration. Production continues serving its existing deployment while you test. See Running and debugging for switches, connections and promotion.
With a repository, previews can publish the exact commit of an open PR; Production requires its verified merge. Settings → GitHub repository → Require merged PRs for previews lets a workspace Admin or Owner require merge for previews too. A changed head, changed base branch or different merged artifact blocks publication. An existing deployment keeps running. No repository means Git review is not required; live AIMS approval still is.
The older production review transport below retains a Synchronized identity for imported merges. Its status does not authorize a different preview or replace the destination's AIMS decision.
- List —
GET /api/v1/workflows/{id}/versions→{ versions[], links[] }with restore URLs. Auth: bearer;403if the workflow is in another workspace. - Restore —
POST /api/v1/workflows/{id}/versions/{version}/restore.{version}is an integer ≥ 1. It creates a new candidate from that historical graph; it does not repoint the active version or reconcile production triggers.
Collaboration checkpoints create one grouped version for a live session (see Collaboration). Restoring an old version does not reopen that session.
Restoring into a selected destination saves the restored candidate immediately. You can switch destinations without saving it again. If a save is already running, navigation waits for it to finish; discarding local changes cannot cancel a save that has already been sent.
Review states
Review exists only when Settings → repository is configured (GitHub owner/repo, default branch main, path prefix workflows unless changed). Without a repository, derived status is untracked and deploy is not blocked by review.
Artifact hash is computed from the portable workflow files. The derived state.status is one of:
| Status | Meaning | Typical next action |
|---|---|---|
untracked | No repository | Configure repo (Admin/Owner) |
synced | Hash matches last synced review | Deploy allowed |
modified | Draft hash ≠ last synced | Create review (Member+) |
pr_open | Open GitHub PR | Update review or merge |
rejected | PR closed without merge | Create a new review if the graph still differs |
merged | PR merged, not yet imported | POST .../sync-from-repo (Admin/Owner) |
drifted | Open PR but branch or draft moved | Update review, or resolve proposal_branch_changed |
conflict | Provider write conflict | Recreate review with a current expectedHeadSha |
failed | Last GitHub write failed | Retry create review |
state also returns drifted, driftReason, canCreateReview, canUpdateReview, canSyncMerged. The TypeScript union still includes approved; deriveWorkflowGitReviewState does not currently emit it (open PRs stay pr_open until merged, closed, drifted, or conflicted).
GET review includes a semantic diff (nodes added/removed/renamed/moved/reconfigured, edges, credentials/schedules/webhooks, severity) and a visual diff (before/after graphs). diffBase is repository_default_branch, last_review_snapshot, or empty. Layout-only moves are marked as moved, not as logic changes.
API
| Method | Path | Auth | Notes |
|---|---|---|---|
| GET | /api/v1/workflows/{id}/review | Bearer | Status + diffs |
| POST | /api/v1/workflows/{id}/review | Bearer and workspace Member / Admin / Owner | Body { expectedHeadSha? }. 200 if status: "open", 409 otherwise. Setup errors 400 with code: missing_credential | invalid_credential | unsupported_provider |
| GET | /api/v1/workflows/{id}/sync-from-repo?ref= | Bearer | Preview import of artifact at ref (200 preview or 400 failed) |
| POST | /api/v1/workflows/{id}/sync-from-repo | Bearer and Admin / Owner | No caller-selected ref. Imports only the provider-verified merge commit; 200 synced creates a candidate with git provenance, 400 failed |
| POST | /api/v1/workflows/validate-artifact | Bearer | Body { files } object or array. Validates artifact files against the workspace |
GitHub is the only provider. Optimistic concurrency: pass expectedHeadSha so a stale branch is not overwritten. Provider probe failures surface as providerError on GET status without throwing.
There is no v1 route to attach the repository; that is session GET|PATCH|DELETE /api/settings/repository (see Workspace settings).
Import without git
You can still import/export JSON without a repository — Importing n8n and POST /api/v1/workflows with importJson / importBundleJson.
