← Back to runs
article_flow Failed
56834b08-2774-446a-9a4e-fa1bd2220067
Progress
2/5 steps
40.0%
Duration
10.4h
Started
2026-08-19 06:36:08
Workflow
Click a node to view its output
Step States
Click a step to view its output
Completed
fetch_article
7.1s
Tasks: 1/1
Completed
convert_to_markdown
84ms
Tasks: 1/1
Running
extract_keywords
10.4h
Tasks: 0/1
(1 failed)
Failed
summarize
10.4h
Tasks: 0/1
(1 failed)
Pending
publish
-
Timeline
Step execution timing · Total: 10.4h
Completed
Running
Failed
Pending
Step: fetch_article
Step selectedInput
This step has no dependencies - it receives the run input directly.
{
"url": "https://www.pgflow.dev/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution/"
}
Output
Task 0
{
"fetched_at": "2026-08-19T06:36:15.510087Z",
"html": "<!DOCTYPE html><html lang=\"en\" dir=\"ltr\" data-theme=\"dark\" data-has-toc data-has-sidebar class=\"astro-lkmsl3sa\"> <head><meta charset=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><title>pgflow 0.13.1: CLI Fix + Step Output Storage for Conditional Execution | pgflow (Workflow Engine for Supabase)</title><link rel=\"canonical\" href=\"https://www.pgflow.dev/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution/\"/><link rel=\"sitemap\" href=\"/sitemap-index.xml\"/><script defer data-domain=\"www.pgflow.dev\" data-api=\"https://wispy-pond-c6f8.jumski.workers.dev/data/event\" src=\"https://wispy-pond-c6f8.jumski.workers.dev/assets/script.hash.outbound-links.pageview-props.tagged-events.js\"></script><script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script><link href=\"https://www.pgflow.dev/news/rss.xml\" rel=\"alternate\" title=\"News\" type=\"application/rss+xml\"/><link rel=\"shortcut icon\" href=\"/favicons/favicon.ico\" type=\"image/x-icon\"/><meta name=\"generator\" content=\"Astro v5.15.9\"/><meta name=\"generator\" content=\"Starlight v0.34.8\"/><meta property=\"og:title\" content=\"pgflow 0.13.1: CLI Fix + Step Output Storage for Conditional Execution\"/><meta property=\"og:url\" content=\"https://www.pgflow.dev/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution/\"/><meta property=\"og:locale\" content=\"en\"/><meta property=\"og:description\" content=\"Fixes local development with recent Supabase CLI versions, plus 2x faster Map chains\"/><meta property=\"og:site_name\" content=\"pgflow (Workflow Engine for Supabase)\"/><meta name=\"twitter:card\" content=\"summary_large_image\"/><meta name=\"description\" content=\"Fixes local development with recent Supabase CLI versions, plus 2x faster Map chains\"/><meta name=\"twitter:site\" content=\"@pgflow_dev\"/><meta name=\"robots\" content=\"noindex,nofollow\"/><meta property=\"og:image\" content=\"https://www.pgflow.dev/og-image.jpg\"/><meta property=\"twitter:image\" content=\"https://www.pgflow.dev/og-image.jpg\"/><meta property=\"og:type\" content=\"website\"/><script>\n\twindow.StarlightThemeProvider = (() => {\n\t\tconst storedTheme =\n\t\t\ttypeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');\n\t\tconst theme =\n\t\t\tstoredTheme ||\n\t\t\t(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');\n\t\tdocument.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';\n\t\treturn {\n\t\t\tupdatePickers(theme = storedTheme || 'auto') {\n\t\t\t\tdocument.querySelectorAll('starlight-theme-select').forEach((picker) => {\n\t\t\t\t\tconst select = picker.querySelector('select');\n\t\t\t\t\tif (select) select.value = theme;\n\t\t\t\t\t/** @type {HTMLTemplateElement | null} */\n\t\t\t\t\tconst tmpl = document.querySelector(`#theme-icons`);\n\t\t\t\t\tconst newIcon = tmpl && tmpl.content.querySelector('.' + theme);\n\t\t\t\t\tif (newIcon) {\n\t\t\t\t\t\tconst oldIcon = picker.querySelector('svg.label-icon');\n\t\t\t\t\t\tif (oldIcon) {\n\t\t\t\t\t\t\toldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t})();\n</script><template id=\"theme-icons\"><svg aria-hidden=\"true\" class=\"light astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z\"/></svg><svg aria-hidden=\"true\" class=\"dark astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z\"/></svg><svg aria-hidden=\"true\" class=\"auto astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z\"/></svg></template><link rel=\"stylesheet\" href=\"/_astro/print.DNXP8c50.css\" media=\"print\"><link rel=\"stylesheet\" href=\"/_astro/Authors.DOjgMhCN.css\">\n<style>.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.hero-anim{width:100%;margin:0;padding:0}.animation-wrapper{position:relative;width:100%}.anim-ctrl{position:absolute;bottom:12px;right:12px;z-index:10;background:transparent;border:1px solid var(--sl-color-accent);color:var(--sl-color-accent-high);padding:4px 10px;border-radius:3px;cursor:pointer;font-size:11px;font-weight:500;line-height:1.4;transition:all .2s;opacity:.7}.anim-ctrl:hover{opacity:1;background-color:var(--sl-color-accent-low)}.anim-ctrl:focus-visible{outline:2px solid var(--sl-color-accent);outline-offset:2px}.anim-ctrl:active{background-color:var(--sl-color-accent);color:var(--sl-color-white)}#animation-container{width:100%;margin:0;padding:0;background:transparent;position:relative;overflow:visible}.hero-anim-caption{font-size:14px;color:#a0b5b0;margin:12px 0 0;text-align:center}.hero-anim-caption strong{color:#e0e8e5}.anim-learn{font-weight:600;color:#5b8def;text-decoration:none;margin-left:8px}.anim-learn:hover{text-decoration:underline}#dag-animation{width:100%;height:auto;display:block}.node rect{transition:fill .3s ease,stroke .3s ease,box-shadow .3s ease;stroke-width:2.5}.node text{fill:#fff;font-size:16px;font-weight:600;text-anchor:middle;dominant-baseline:middle;pointer-events:none}.hero-anim[data-large=true] .node text{font-size:20px}.node rect{stroke-width:2.5;filter:drop-shadow(3px 4px 4px rgba(0,0,0,.25))}.node.pending rect{fill:#3d524d;stroke:#607b75}.node.running rect{fill:#3b5bdb;stroke:#5b8def}.node.failed rect{fill:#c94a2e;stroke:#f08060}.node.retrying rect{fill:#4460ff;stroke:#7a91ff;stroke-dasharray:8 4;animation:dashflow 1.2s linear infinite}.node.success rect{fill:#177a51;stroke:#20a56f}@keyframes dashflow{to{stroke-dashoffset:-12}}@media(prefers-reduced-motion:reduce){.node.retrying rect{animation:none}.node.running rect,.node.retrying rect{filter:none}.hero-anim[data-anim-state=running]{animation-play-state:paused}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.edge{stroke:#607b75;stroke-width:2.5;fill:none;opacity:.6;stroke-dasharray:8 4}.edge.active{stroke:#6b8c85;stroke-width:3;opacity:.9;stroke-dasharray:8 4;animation:dash-flow 1s linear infinite}.edge.active.complete{stroke:#1a9c64;stroke-dasharray:none;animation:none}@keyframes dash-flow{to{stroke-dashoffset:-12}}\n@layer starlight.components{:root{--sl-badge-default-border: var(--sl-color-accent);--sl-badge-default-bg: var(--sl-color-accent-low);--sl-badge-default-text: #fff;--sl-badge-note-border: var(--sl-color-blue);--sl-badge-note-bg: var(--sl-color-blue-low);--sl-badge-note-text: #fff;--sl-badge-danger-border: var(--sl-color-red);--sl-badge-danger-bg: var(--sl-color-red-low);--sl-badge-danger-text: #fff;--sl-badge-success-border: var(--sl-color-green);--sl-badge-success-bg: var(--sl-color-green-low);--sl-badge-success-text: #fff;--sl-badge-caution-border: var(--sl-color-orange);--sl-badge-caution-bg: var(--sl-color-orange-low);--sl-badge-caution-text: #fff;--sl-badge-tip-border: var(--sl-color-purple);--sl-badge-tip-bg: var(--sl-color-purple-low);--sl-badge-tip-text: #fff}[data-theme=light]:root{--sl-badge-default-bg: var(--sl-color-accent-high);--sl-badge-note-bg: var(--sl-color-blue-high);--sl-badge-danger-bg: var(--sl-color-red-high);--sl-badge-success-bg: var(--sl-color-green-high);--sl-badge-caution-bg: var(--sl-color-orange-high);--sl-badge-tip-bg: var(--sl-color-purple-high)}.sl-badge:where(.astro-auj3iet6){display:inline-block;border:1px solid var(--sl-color-border-badge);border-radius:.25rem;font-family:var(--sl-font-system-mono);line-height:normal;color:var(--sl-color-text-badge);background-color:var(--sl-color-bg-badge);overflow-wrap:anywhere}.sidebar-content .sl-badge:where(.astro-auj3iet6){line-height:1;font-size:var(--sl-text-xs);padding:.125rem .375rem}.sidebar-content a[aria-current=page]>.sl-badge:where(.astro-auj3iet6){--sl-color-bg-badge: transparent;--sl-color-border-badge: currentColor;color:inherit}.default:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-default-bg);--sl-color-border-badge: var(--sl-badge-default-border);--sl-color-text-badge: var(--sl-badge-default-text)}.note:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-note-bg);--sl-color-border-badge: var(--sl-badge-note-border);--sl-color-text-badge: var(--sl-badge-note-text)}.danger:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-danger-bg);--sl-color-border-badge: var(--sl-badge-danger-border);--sl-color-text-badge: var(--sl-badge-danger-text)}.success:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-success-bg);--sl-color-border-badge: var(--sl-badge-success-border);--sl-color-text-badge: var(--sl-badge-success-text)}.tip:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-tip-bg);--sl-color-border-badge: var(--sl-badge-tip-border);--sl-color-text-badge: var(--sl-badge-tip-text)}.caution:where(.astro-auj3iet6){--sl-color-bg-badge: var(--sl-badge-caution-bg);--sl-color-border-badge: var(--sl-badge-caution-border);--sl-color-text-badge: var(--sl-badge-caution-text)}.small:where(.astro-auj3iet6){font-size:var(--sl-text-xs);padding:.125rem .25rem}.medium:where(.astro-auj3iet6){font-size:var(--sl-text-sm);padding:.175rem .35rem}.large:where(.astro-auj3iet6){font-size:var(--sl-text-base);padding:.225rem .45rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) .sl-badge:where(.astro-auj3iet6){vertical-align:middle}}\n@layer starlight.components{.card-grid:where(.astro-y4xfamor){display:grid;grid-template-columns:100%;gap:1rem}.card-grid:where(.astro-y4xfamor)>*{margin-top:0!important}@media(min-width:50rem){.card-grid:where(.astro-y4xfamor){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-y4xfamor){--stagger-height: 5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-y4xfamor)>*:nth-child(2n){transform:translateY(var(--stagger-height))}}}\n@layer starlight.components{.card:where(.astro-5y3mj7uu){--sl-card-border: var(--sl-color-purple);--sl-card-bg: var(--sl-color-purple-low);border:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-black);padding:clamp(1rem,calc(.125rem + 3vw),2.5rem);flex-direction:column;gap:clamp(.5rem,calc(.125rem + 1vw),1rem)}.card:where(.astro-5y3mj7uu):nth-child(4n+1){--sl-card-border: var(--sl-color-orange);--sl-card-bg: var(--sl-color-orange-low)}.card:where(.astro-5y3mj7uu):nth-child(4n+3){--sl-card-border: var(--sl-color-green);--sl-card-bg: var(--sl-color-green-low)}.card:where(.astro-5y3mj7uu):nth-child(4n+4){--sl-card-border: var(--sl-color-red);--sl-card-bg: var(--sl-color-red-low)}.card:where(.astro-5y3mj7uu):nth-child(4n+5){--sl-card-border: var(--sl-color-blue);--sl-card-bg: var(--sl-color-blue-low)}.title:where(.astro-5y3mj7uu){font-weight:600;font-size:var(--sl-text-h4);color:var(--sl-color-white);line-height:var(--sl-line-height-headings);gap:1rem;align-items:center}.card:where(.astro-5y3mj7uu) .icon:where(.astro-5y3mj7uu){border:1px solid var(--sl-card-border);background-color:var(--sl-card-bg);padding:.2em;border-radius:.25rem;flex-shrink:0}.card:where(.astro-5y3mj7uu) .body:where(.astro-5y3mj7uu){margin:0;font-size:clamp(var(--sl-text-sm),calc(.5rem + 1vw),var(--sl-text-body))}}\n@layer starlight.components{svg:where(.astro-i27iqf3l){color:var(--sl-icon-color);font-size:var(--sl-icon-size, 1em);width:1em;height:1em}}\n@layer starlight.components{starlight-tabs:where(.astro-iavvnwyp){display:block}.tablist-wrapper:where(.astro-iavvnwyp){overflow-x:auto}:where(.astro-iavvnwyp)[role=tablist]{display:flex;list-style:none;border-bottom:2px solid var(--sl-color-gray-5);padding:0}.tab:where(.astro-iavvnwyp){margin-bottom:-2px}.tab:where(.astro-iavvnwyp)>:where(.astro-iavvnwyp)[role=tab]{display:flex;align-items:center;gap:.5rem;padding:0 1.25rem;text-decoration:none;border-bottom:2px solid var(--sl-color-gray-5);color:var(--sl-color-gray-3);outline-offset:var(--sl-outline-offset-inside);overflow-wrap:initial}.tab:where(.astro-iavvnwyp) :where(.astro-iavvnwyp)[role=tab][aria-selected=true]{color:var(--sl-color-white);border-color:var(--sl-color-text-accent);font-weight:600}.tablist-wrapper:where(.astro-iavvnwyp)~[role=tabpanel]{margin-top:1rem}}\n@layer starlight.components{.sl-link-card:where(.astro-bhcct7ef){display:grid;grid-template-columns:1fr auto;gap:.5rem;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;box-shadow:var(--sl-shadow-sm);position:relative}a:where(.astro-bhcct7ef){text-decoration:none;line-height:var(--sl-line-height-headings)}a:where(.astro-bhcct7ef):before{content:\"\";position:absolute;inset:0}.stack:where(.astro-bhcct7ef){flex-direction:column;gap:.5rem}.title:where(.astro-bhcct7ef){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-bhcct7ef){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-bhcct7ef){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-bhcct7ef):hover{background:var(--sl-color-gray-7, var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-bhcct7ef):hover .icon:where(.astro-bhcct7ef){color:var(--sl-color-white)}}\n@layer starlight.components{.sl-steps{--bullet-size: calc(var(--sl-line-height) * 1rem);--bullet-margin: .375rem;list-style:none;counter-reset:steps-counter var(--sl-steps-start, 0);padding-inline-start:0}.sl-steps>li{counter-increment:steps-counter;position:relative;padding-inline-start:calc(var(--bullet-size) + 1rem);padding-bottom:1px;min-height:calc(var(--bullet-size) + var(--bullet-margin))}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(steps-counter);position:absolute;top:0;inset-inline-start:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);font-weight:600;text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);border-radius:99rem;box-shadow:inset 0 0 0 1px var(--sl-color-gray-5)}.sl-steps>li:after{--guide-width: 1px;content:\"\";position:absolute;top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2);width:var(--guide-width);background-color:var(--sl-color-hairline-light)}}@layer starlight.content{.sl-steps>li>:first-child{--lh: calc(1em * var(--sl-line-height));--shift-y: calc(.5 * (var(--bullet-size) - var(--lh)));transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh: calc(1em * var(--sl-line-height-headings))}@supports (--prop: 1lh){.sl-steps>li>:first-child{--lh: 1lh}}}\n@layer starlight.components{starlight-file-tree:where(.astro-i6hikuar){--x-space: 1.5rem;--y-space: .125rem;--y-pad: 0;display:block;border:1px solid var(--sl-color-gray-5);padding:1rem;background-color:var(--sl-color-gray-6);font-size:var(--sl-text-xs);font-family:var(--__sl-font-mono);overflow-x:auto}starlight-file-tree:where(.astro-i6hikuar) .directory>details{border:0;padding:0;padding-inline-start:var(--x-space);background:transparent}starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary{margin-inline-start:calc(-1 * var(--x-space));border:0;padding:var(--y-pad) .625rem;font-weight:400;color:var(--sl-color-white);max-width:100%}starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary::marker,starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary::-webkit-details-marker{color:var(--sl-color-gray-3)}starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary:hover,starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary:hover .tree-icon{cursor:pointer;color:var(--sl-color-text-accent);fill:currentColor}starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary:hover~ul{border-color:var(--sl-color-gray-4)}starlight-file-tree:where(.astro-i6hikuar) .directory>details>summary:hover .highlight .tree-icon{color:var(--sl-color-text-invert);fill:currentColor}starlight-file-tree:where(.astro-i6hikuar) ul{margin-inline-start:.5rem;border-inline-start:1px solid var(--sl-color-gray-5);padding:0;padding-inline-start:.125rem;list-style:none}starlight-file-tree:where(.astro-i6hikuar)>ul{margin:0;border:0;padding:0}starlight-file-tree:where(.astro-i6hikuar) li{margin:var(--y-space) 0;padding:var(--y-pad) 0}starlight-file-tree:where(.astro-i6hikuar) .file{margin-inline-start:calc(var(--x-space) - .125rem);color:var(--sl-color-white)}starlight-file-tree:where(.astro-i6hikuar) .tree-entry{display:inline-flex;align-items:flex-start;flex-wrap:wrap;max-width:calc(100% - 1rem)}@media(min-width:30em){starlight-file-tree:where(.astro-i6hikuar) .tree-entry{flex-wrap:nowrap}}starlight-file-tree:where(.astro-i6hikuar) .tree-entry>:first-child{flex-shrink:0}starlight-file-tree:where(.astro-i6hikuar) .empty{color:var(--sl-color-gray-3);padding-inline-start:.375rem}starlight-file-tree:where(.astro-i6hikuar) .comment{color:var(--sl-color-gray-3);padding-inline-start:1.625rem;max-width:24rem;min-width:12rem}starlight-file-tree:where(.astro-i6hikuar) .highlight{display:inline-block;border-radius:.25rem;padding-inline-end:.5rem;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}starlight-file-tree:where(.astro-i6hikuar) svg{display:inline;fill:var(--sl-color-gray-3);vertical-align:middle;margin-inline:.25rem .375rem;width:.875rem;height:.875rem}starlight-file-tree:where(.astro-i6hikuar) .highlight svg.tree-icon{fill:currentColor}}\n@layer starlight.components{.sl-link-button:where(.astro-5v627irg){align-items:center;border:1px solid transparent;border-radius:999rem;display:inline-flex;font-size:var(--sl-text-sm);gap:.5em;line-height:1.1875;outline-offset:.25rem;padding:.4375rem 1.125rem;text-decoration:none}.sl-link-button:where(.astro-5v627irg).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-5v627irg).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-5v627irg).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-5v627irg).minimal{color:var(--sl-color-white);padding-inline:0}.sl-link-button:where(.astro-5v627irg) svg{flex-shrink:0}@media(min-width:50rem){.sl-link-button:where(.astro-5v627irg){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}.sl-markdown-content .sl-link-button:where(.astro-5v627irg){margin-inline-end:1rem}.sl-markdown-content .sl-link-button:where(.astro-5v627irg):not(:where(p *)){margin-block:1rem}}\n</style><script type=\"module\" src=\"/_astro/page.DJvz4Mfu.js\"></script></head> <body class=\"astro-lkmsl3sa\"> <a href=\"#_top\" class=\"astro-n4s4e6uq\">Skip to content</a> <div class=\"page sl-flex astro-nspgss52\"> <header class=\"header astro-nspgss52\"><div class=\"header astro-2bzkuzuh\"> <div class=\"title-wrapper sl-flex astro-2bzkuzuh\"> <a href=\"/\" class=\"site-title sl-flex astro-litqodtp\"> <img class=\"light:sl-hidden print:hidden astro-litqodtp\" alt src=\"/_astro/pgflow-logo-dark.BuQDBcad.svg\" width=\"48\" height=\"48\"> <img class=\"dark:sl-hidden print:block astro-litqodtp\" alt src=\"/_astro/pgflow-logo-light.BO9Ty74m.svg\" width=\"48\" height=\"48\"> <span class=\"sr-only astro-litqodtp\" translate=\"no\"> pgflow (Workflow Engine for Supabase) </span> </a> </div> <div class=\"sl-flex print:hidden astro-2bzkuzuh\"> <site-search class=\"astro-2bzkuzuh astro-hmexjgs7\" data-translations=\"{"placeholder":"Search"}\"> <button data-open-modal disabled aria-label=\"Search\" aria-keyshortcuts=\"Control+K\" class=\"astro-hmexjgs7\"> <svg aria-hidden=\"true\" class=\"astro-hmexjgs7 astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z\"/></svg> <span class=\"sl-hidden md:sl-block astro-hmexjgs7\" aria-hidden=\"true\">Search</span> <kbd class=\"sl-hidden md:sl-flex astro-hmexjgs7\" style=\"display: none;\"> <kbd class=\"astro-hmexjgs7\">Ctrl</kbd><kbd class=\"astro-hmexjgs7\">K</kbd> </kbd> </button> <dialog style=\"padding:0\" aria-label=\"Search\" class=\"astro-hmexjgs7\"> <div class=\"dialog-frame sl-flex astro-hmexjgs7\"> <button data-close-modal class=\"sl-flex md:sl-hidden astro-hmexjgs7\"> Cancel </button> <div class=\"search-container astro-hmexjgs7\"> <div id=\"starlight__search\" class=\"astro-hmexjgs7\"></div> </div> </div> </dialog> </site-search> <script>\n\t(() => {\n\t\tconst openBtn = document.querySelector('button[data-open-modal]');\n\t\tconst shortcut = openBtn?.querySelector('kbd');\n\t\tif (!openBtn || !(shortcut instanceof HTMLElement)) return;\n\t\tconst platformKey = shortcut.querySelector('kbd');\n\t\tif (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {\n\t\t\tplatformKey.textContent = '⌘';\n\t\t\topenBtn.setAttribute('aria-keyshortcuts', 'Meta+K');\n\t\t}\n\t\tshortcut.style.display = '';\n\t})();\n</script> <script type=\"module\" src=\"/_astro/Search.astro_astro_type_script_index_0_lang.cjYDvRdi.js\"></script> </div> <div class=\"sl-hidden md:sl-flex print:hidden right-group astro-2bzkuzuh\"> <div class=\"sl-flex social-icons astro-2bzkuzuh\"> <a href=\"https://github.com/pgflow-dev/pgflow\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">GitHub</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z\"/></svg></a><a href=\"https://x.com/pgflow_dev\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">X/Twitter</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M24 4.4a10 10 0 0 1-2.83.78 5.05 5.05 0 0 0 2.17-2.79 9.7 9.7 0 0 1-3.13 1.23 4.89 4.89 0 0 0-5.94-1.03 5 5 0 0 0-2.17 2.38 5.15 5.15 0 0 0-.3 3.25c-1.95-.1-3.86-.63-5.61-1.53a14.04 14.04 0 0 1-4.52-3.74 5.2 5.2 0 0 0-.09 4.91c.39.74.94 1.35 1.61 1.82a4.77 4.77 0 0 1-2.23-.63v.06c0 1.16.4 2.29 1.12 3.18a4.9 4.9 0 0 0 2.84 1.74c-.73.22-1.5.26-2.24.12a4.89 4.89 0 0 0 4.59 3.49A9.78 9.78 0 0 1 0 19.73 13.65 13.65 0 0 0 7.55 22a13.63 13.63 0 0 0 9.96-4.16A14.26 14.26 0 0 0 21.6 7.65V7c.94-.72 1.75-1.6 2.4-2.6Z\"/></svg></a><a href=\"https://pgflow.dev/discord/\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">Discord</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M20.32 4.37a19.8 19.8 0 0 0-4.93-1.51 13.78 13.78 0 0 0-.64 1.28 18.27 18.27 0 0 0-5.5 0 12.64 12.64 0 0 0-.64-1.28h-.05A19.74 19.74 0 0 0 3.64 4.4 20.26 20.26 0 0 0 .11 18.09l.02.02a19.9 19.9 0 0 0 6.04 3.03l.04-.02a14.24 14.24 0 0 0 1.23-2.03.08.08 0 0 0-.05-.07 13.1 13.1 0 0 1-1.9-.92.08.08 0 0 1 .02-.1 10.2 10.2 0 0 0 .41-.31h.04a14.2 14.2 0 0 0 12.1 0l.04.01a9.63 9.63 0 0 0 .4.32.08.08 0 0 1-.03.1 12.29 12.29 0 0 1-1.9.91.08.08 0 0 0-.02.1 15.97 15.97 0 0 0 1.27 2.01h.04a19.84 19.84 0 0 0 6.03-3.05v-.03a20.12 20.12 0 0 0-3.57-13.69ZM8.02 15.33c-1.18 0-2.16-1.08-2.16-2.42 0-1.33.96-2.42 2.16-2.42 1.21 0 2.18 1.1 2.16 2.42 0 1.34-.96 2.42-2.16 2.42Zm7.97 0c-1.18 0-2.15-1.08-2.15-2.42 0-1.33.95-2.42 2.15-2.42 1.22 0 2.18 1.1 2.16 2.42 0 1.34-.94 2.42-2.16 2.42Z\"/></svg></a><a href=\"/cdn-cgi/l/email-protection#355d5059595a75455253595a421b515043\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">Contact author</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M19 4H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3Zm-.41 2-5.88 5.88a1 1 0 0 1-1.42 0L5.41 6ZM20 17a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7.41l5.88 5.88a3 3 0 0 0 4.24 0L20 7.41Z\"/></svg></a><a href=\"https://www.pgflow.dev/news/rss.xml\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">RSS</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M2.88 16.88a3 3 0 0 0 0 4.24 3 3 0 0 0 4.24 0 3 3 0 0 0-4.24-4.24Zm2.83 2.83a1 1 0 0 1-1.42-1.42 1 1 0 0 1 1.42 0 1 1 0 0 1 0 1.42ZM5 12a1 1 0 0 0 0 2 5 5 0 0 1 5 5 1 1 0 0 0 2 0 7 7 0 0 0-7-7Zm0-4a1 1 0 0 0 0 2 9 9 0 0 1 9 9 1 1 0 0 0 2 0 11.08 11.08 0 0 0-3.22-7.78A11.08 11.08 0 0 0 5 8Zm10.61.39A15.11 15.11 0 0 0 5 4a1 1 0 0 0 0 2 13 13 0 0 1 13 13 1 1 0 0 0 2 0 15.11 15.11 0 0 0-4.39-10.61Z\"/></svg></a> </div> <div class=\"astro-3nauopy5\"> <a href=\"/news/\" class=\"astro-3nauopy5\">News</a> </div> <starlight-theme-select> <label style=\"--sl-select-width: 6.25em\" class=\"astro-ozffonnq\"> <span class=\"sr-only astro-ozffonnq\">Select theme</span> <svg aria-hidden=\"true\" class=\"icon label-icon astro-ozffonnq astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z\"/></svg> <select value=\"auto\" autocomplete=\"off\" class=\"astro-ozffonnq\"> <option value=\"dark\" class=\"astro-ozffonnq\">Dark</option><option value=\"light\" class=\"astro-ozffonnq\">Light</option><option value=\"auto\" selected class=\"astro-ozffonnq\">Auto</option> </select> <svg aria-hidden=\"true\" class=\"icon caret astro-ozffonnq astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z\"/></svg> </label> </starlight-theme-select> <script data-cfasync=\"false\" src=\"/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js\"></script><script>\n\tStarlightThemeProvider.updatePickers();\n</script> <script type=\"module\">const r=\"starlight-theme\",o=e=>e===\"auto\"||e===\"dark\"||e===\"light\"?e:\"auto\",c=()=>o(typeof localStorage<\"u\"&&localStorage.getItem(r));function n(e){typeof localStorage<\"u\"&&localStorage.setItem(r,e===\"light\"||e===\"dark\"?e:\"\")}const l=()=>matchMedia(\"(prefers-color-scheme: light)\").matches?\"light\":\"dark\";function t(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e===\"auto\"?l():e,n(e)}matchMedia(\"(prefers-color-scheme: light)\").addEventListener(\"change\",()=>{c()===\"auto\"&&t(\"auto\")});class s extends HTMLElement{constructor(){super(),t(c()),this.querySelector(\"select\")?.addEventListener(\"change\",a=>{a.currentTarget instanceof HTMLSelectElement&&t(o(a.currentTarget.value))})}}customElements.define(\"starlight-theme-select\",s);</script> <script type=\"module\">class s extends HTMLElement{constructor(){super();const e=this.querySelector(\"select\");e&&(e.addEventListener(\"change\",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener(\"pageshow\",t=>{if(!t.persisted)return;const n=e.querySelector(\"option[selected]\")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define(\"starlight-lang-select\",s);</script> </div> </div> </header> <nav class=\"sidebar print:hidden astro-nspgss52\" aria-label=\"Main\"> <starlight-menu-button class=\"print:hidden astro-zwz2cmvw\"> <button aria-expanded=\"false\" aria-label=\"Menu\" aria-controls=\"starlight__sidebar\" class=\"sl-flex md:sl-hidden astro-zwz2cmvw\"> <svg aria-hidden=\"true\" class=\"open-menu astro-zwz2cmvw astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z\"/></svg> <svg aria-hidden=\"true\" class=\"close-menu astro-zwz2cmvw astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z\"/></svg> </button> </starlight-menu-button> <script type=\"module\">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector(\"button\"),this.btn.addEventListener(\"click\",()=>this.toggleExpanded());const t=this.closest(\"nav\");t&&t.addEventListener(\"keyup\",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute(\"aria-expanded\",String(t)),document.body.toggleAttribute(\"data-mobile-menu-expanded\",t)}toggleExpanded(){this.setExpanded(this.getAttribute(\"aria-expanded\")!==\"true\")}closeOnEscape(t){t.code===\"Escape\"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define(\"starlight-menu-button\",s);</script> <div id=\"starlight__sidebar\" class=\"sidebar-pane astro-nspgss52\"> <div class=\"sidebar-content sl-flex astro-nspgss52\"> <sl-sidebar-state-persist data-hash=\"1o2vwph\" class=\"astro-yuwwt5no\"> <script aria-hidden=\"true\">\n\t\t(() => {\n\t\t\ttry {\n\t\t\t\tif (!matchMedia('(min-width: 50em)').matches) return;\n\t\t\t\t/** @type {HTMLElement | null} */\n\t\t\t\tconst target = document.querySelector('sl-sidebar-state-persist');\n\t\t\t\tconst state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');\n\t\t\t\tif (!target || !state || target.dataset.hash !== state.hash) return;\n\t\t\t\twindow._starlightScrollRestore = state.scroll;\n\t\t\t\tcustomElements.define(\n\t\t\t\t\t'sl-sidebar-restore',\n\t\t\t\t\tclass SidebarRestore extends HTMLElement {\n\t\t\t\t\t\tconnectedCallback() {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst idx = parseInt(this.dataset.index || '');\n\t\t\t\t\t\t\t\tconst details = this.closest('details');\n\t\t\t\t\t\t\t\tif (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t})();\n\t</script> <ul class=\"top-level astro-zy72yfpm\"> <li class=\"astro-zy72yfpm\"> <a href=\"/news/\" aria-current=\"false\" class=\"large astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">All posts</span> </a> </li><li class=\"astro-zy72yfpm\"> <details open class=\"astro-zy72yfpm\"> <sl-sidebar-restore data-index=\"0\"></sl-sidebar-restore> <summary class=\"astro-zy72yfpm\"> <div class=\"group-label astro-zy72yfpm\"> <span class=\"large astro-zy72yfpm\">Featured posts</span> </div> <svg aria-hidden=\"true\" class=\"caret astro-zy72yfpm astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.25rem;\"><path d=\"m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z\"/></svg> </summary> <ul class=\"astro-zy72yfpm\"> <li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-14-0-conditional-step-execution/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.14.0: Conditional Step Execution</span> </a> </li> </ul> </details> </li><li class=\"astro-zy72yfpm\"> <details open class=\"astro-zy72yfpm\"> <sl-sidebar-restore data-index=\"1\"></sl-sidebar-restore> <summary class=\"astro-zy72yfpm\"> <div class=\"group-label astro-zy72yfpm\"> <span class=\"large astro-zy72yfpm\">Recent posts</span> </div> <svg aria-hidden=\"true\" class=\"caret astro-zy72yfpm astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.25rem;\"><path d=\"m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z\"/></svg> </summary> <ul class=\"astro-zy72yfpm\"> <li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-13-3-authentication-fix-for-ensure-workers-and-edge-worker/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.13.3: Authentication Fix for ensure_workers and EdgeWorker</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-13-2-stalled-task-recovery-and-config-fixes/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.13.2: Stalled Task Recovery and Config Fixes</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution/\" aria-current=\"page\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.13.1: CLI Fix + Step Output Storage for Conditional Execution</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-12-0-simpler-handler-signatures-for-flow-composition/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.12.0: Simpler Handler Signatures for Flow Composition</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/pgflow-0-11-0-compilation-config/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgflow 0.11.0: Compilation Configuration Overhaul</span> </a> </li> </ul> </details> </li><li class=\"astro-zy72yfpm\"> <details open class=\"astro-zy72yfpm\"> <sl-sidebar-restore data-index=\"2\"></sl-sidebar-restore> <summary class=\"astro-zy72yfpm\"> <div class=\"group-label astro-zy72yfpm\"> <span class=\"large astro-zy72yfpm\">Tags</span> </div> <svg aria-hidden=\"true\" class=\"caret astro-zy72yfpm astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.25rem;\"><path d=\"m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z\"/></svg> </summary> <ul class=\"astro-zy72yfpm\"> <li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/release/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">release (13)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/bugfix/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">bugfix (5)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/edge-worker/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">edge-worker (5)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/breaking-change/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">breaking-change (4)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/client/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">client (3)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/configuration/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">configuration (3)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/context/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">context (3)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/dsl/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">dsl (3)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/compilation/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">compilation (2)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/core/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">core (2)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/migration/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">migration (2)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/realtime/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">realtime (2)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/supabase/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">supabase (2)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/authentication/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">authentication (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/auto-compilation/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">auto-compilation (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/cli/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">cli (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/conditional-execution/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">conditional-execution (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/control-plane/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">control-plane (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/deployment/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">deployment (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/developer-experience/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">developer-experience (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/documentation/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">documentation (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/map-steps/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">map-steps (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/patch/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">patch (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/performance/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">performance (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/pgmq/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">pgmq (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/public-beta/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">public-beta (1)</span> </a> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/tags/worker-management/\" aria-current=\"false\" class=\"astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">worker-management (1)</span> </a> </li> </ul> </details> </li><li class=\"astro-zy72yfpm\"> <a href=\"/news/rss.xml\" aria-current=\"false\" class=\"large astro-zy72yfpm\"> <span class=\"astro-zy72yfpm\">RSS</span> </a> </li> </ul> <script aria-hidden=\"true\">\n\t\t(() => {\n\t\t\tconst scroller = document.getElementById('starlight__sidebar');\n\t\t\tif (!window._starlightScrollRestore || !scroller) return;\n\t\t\tscroller.scrollTop = window._starlightScrollRestore;\n\t\t\tdelete window._starlightScrollRestore;\n\t\t})();\n\t</script> </sl-sidebar-state-persist> <div class=\"md:sl-hidden\"> <div class=\"mobile-preferences sl-flex astro-ermroiay\"> <div class=\"social-icons astro-ermroiay\"> <a href=\"https://github.com/pgflow-dev/pgflow\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">GitHub</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z\"/></svg></a><a href=\"https://x.com/pgflow_dev\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">X/Twitter</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M24 4.4a10 10 0 0 1-2.83.78 5.05 5.05 0 0 0 2.17-2.79 9.7 9.7 0 0 1-3.13 1.23 4.89 4.89 0 0 0-5.94-1.03 5 5 0 0 0-2.17 2.38 5.15 5.15 0 0 0-.3 3.25c-1.95-.1-3.86-.63-5.61-1.53a14.04 14.04 0 0 1-4.52-3.74 5.2 5.2 0 0 0-.09 4.91c.39.74.94 1.35 1.61 1.82a4.77 4.77 0 0 1-2.23-.63v.06c0 1.16.4 2.29 1.12 3.18a4.9 4.9 0 0 0 2.84 1.74c-.73.22-1.5.26-2.24.12a4.89 4.89 0 0 0 4.59 3.49A9.78 9.78 0 0 1 0 19.73 13.65 13.65 0 0 0 7.55 22a13.63 13.63 0 0 0 9.96-4.16A14.26 14.26 0 0 0 21.6 7.65V7c.94-.72 1.75-1.6 2.4-2.6Z\"/></svg></a><a href=\"https://pgflow.dev/discord/\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">Discord</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M20.32 4.37a19.8 19.8 0 0 0-4.93-1.51 13.78 13.78 0 0 0-.64 1.28 18.27 18.27 0 0 0-5.5 0 12.64 12.64 0 0 0-.64-1.28h-.05A19.74 19.74 0 0 0 3.64 4.4 20.26 20.26 0 0 0 .11 18.09l.02.02a19.9 19.9 0 0 0 6.04 3.03l.04-.02a14.24 14.24 0 0 0 1.23-2.03.08.08 0 0 0-.05-.07 13.1 13.1 0 0 1-1.9-.92.08.08 0 0 1 .02-.1 10.2 10.2 0 0 0 .41-.31h.04a14.2 14.2 0 0 0 12.1 0l.04.01a9.63 9.63 0 0 0 .4.32.08.08 0 0 1-.03.1 12.29 12.29 0 0 1-1.9.91.08.08 0 0 0-.02.1 15.97 15.97 0 0 0 1.27 2.01h.04a19.84 19.84 0 0 0 6.03-3.05v-.03a20.12 20.12 0 0 0-3.57-13.69ZM8.02 15.33c-1.18 0-2.16-1.08-2.16-2.42 0-1.33.96-2.42 2.16-2.42 1.21 0 2.18 1.1 2.16 2.42 0 1.34-.96 2.42-2.16 2.42Zm7.97 0c-1.18 0-2.15-1.08-2.15-2.42 0-1.33.95-2.42 2.15-2.42 1.22 0 2.18 1.1 2.16 2.42 0 1.34-.94 2.42-2.16 2.42Z\"/></svg></a><a href=\"/cdn-cgi/l/email-protection#a4ccc1c8c8cbe4d4c3c2c8cbd38ac0c1d2\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">Contact author</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M19 4H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3Zm-.41 2-5.88 5.88a1 1 0 0 1-1.42 0L5.41 6ZM20 17a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7.41l5.88 5.88a3 3 0 0 0 4.24 0L20 7.41Z\"/></svg></a><a href=\"https://www.pgflow.dev/news/rss.xml\" rel=\"me\" class=\"sl-flex astro-d24x6kmv\"><span class=\"sr-only astro-d24x6kmv\">RSS</span><svg aria-hidden=\"true\" class=\"astro-d24x6kmv astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M2.88 16.88a3 3 0 0 0 0 4.24 3 3 0 0 0 4.24 0 3 3 0 0 0-4.24-4.24Zm2.83 2.83a1 1 0 0 1-1.42-1.42 1 1 0 0 1 1.42 0 1 1 0 0 1 0 1.42ZM5 12a1 1 0 0 0 0 2 5 5 0 0 1 5 5 1 1 0 0 0 2 0 7 7 0 0 0-7-7Zm0-4a1 1 0 0 0 0 2 9 9 0 0 1 9 9 1 1 0 0 0 2 0 11.08 11.08 0 0 0-3.22-7.78A11.08 11.08 0 0 0 5 8Zm10.61.39A15.11 15.11 0 0 0 5 4a1 1 0 0 0 0 2 13 13 0 0 1 13 13 1 1 0 0 0 2 0 15.11 15.11 0 0 0-4.39-10.61Z\"/></svg></a> </div> <div class=\"astro-3nauopy5\"> <a href=\"/news/\" class=\"astro-3nauopy5\">News</a> </div> <starlight-theme-select> <label style=\"--sl-select-width: 6.25em\" class=\"astro-ozffonnq\"> <span class=\"sr-only astro-ozffonnq\">Select theme</span> <svg aria-hidden=\"true\" class=\"icon label-icon astro-ozffonnq astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z\"/></svg> <select value=\"auto\" autocomplete=\"off\" class=\"astro-ozffonnq\"> <option value=\"dark\" class=\"astro-ozffonnq\">Dark</option><option value=\"light\" class=\"astro-ozffonnq\">Light</option><option value=\"auto\" selected class=\"astro-ozffonnq\">Auto</option> </select> <svg aria-hidden=\"true\" class=\"icon caret astro-ozffonnq astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z\"/></svg> </label> </starlight-theme-select> <script data-cfasync=\"false\" src=\"/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js\"></script><script>\n\tStarlightThemeProvider.updatePickers();\n</script> </div> </div> </div> </div> </nav> <div class=\"main-frame astro-nspgss52\"> <script type=\"module\">const a=document.getElementById(\"starlight__sidebar\"),n=a?.querySelector(\"sl-sidebar-state-persist\"),o=\"sl-sidebar-state\",i=()=>{let t=[];const e=n?.dataset.hash||\"\";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||\"{}\");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener(\"click\",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest(\"summary\")?.closest(\"details\");if(!e)return;const s=e.querySelector(\"sl-sidebar-restore\"),r=parseInt(s?.dataset.index||\"\");isNaN(r)||l(!e.open,r)});addEventListener(\"visibilitychange\",()=>{document.visibilityState===\"hidden\"&&d()});addEventListener(\"pageHide\",d);</script> <div class=\"lg:sl-flex astro-mndfwee4\"> <aside class=\"right-sidebar-container print:hidden astro-mndfwee4\"> <div class=\"right-sidebar astro-mndfwee4\"> <div class=\"lg:sl-hidden astro-xvkfk6h2\"><mobile-starlight-toc data-min-h=\"2\" data-max-h=\"3\" class=\"astro-mfxxoetl\"><nav aria-labelledby=\"starlight__on-this-page--mobile\" class=\"astro-mfxxoetl\"><details id=\"starlight__mobile-toc\" class=\"astro-mfxxoetl\"><summary id=\"starlight__on-this-page--mobile\" class=\"sl-flex astro-mfxxoetl\"><div class=\"toggle sl-flex astro-mfxxoetl\">On this page<svg aria-hidden=\"true\" class=\"caret astro-mfxxoetl astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1rem;\"><path d=\"m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z\"/></svg></div><span class=\"display-current astro-mfxxoetl\"></span></summary><div class=\"dropdown astro-mfxxoetl\"><ul class=\"isMobile astro-qdijszvq\" style=\"--depth: 0;\"> <li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#_top\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Overview</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#supabase-cli-compatibility-fix\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Supabase CLI Compatibility Fix</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#step-output-storage\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Step Output Storage</span> </a> <ul class=\"isMobile astro-qdijszvq\" style=\"--depth: 1;\"> <li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#what-changed\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">What Changed</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#how-it-worked-before\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">How It Worked Before</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#performance-gains\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">Performance Gains</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#simpler-manual-queries\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">Simpler Manual Queries</span> </a> </li> </ul> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#migration-guide\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Migration Guide</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#looking-ahead\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Looking Ahead</span> </a> </li> </ul> </div></details></nav></mobile-starlight-toc><script type=\"module\" src=\"/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.C181hMzK.js\"></script></div><div class=\"right-sidebar-panel sl-hidden lg:sl-block astro-xvkfk6h2\"><div class=\"sl-container astro-xvkfk6h2\"><starlight-toc data-min-h=\"2\" data-max-h=\"3\"><nav aria-labelledby=\"starlight__on-this-page\"><h2 id=\"starlight__on-this-page\">On this page</h2><ul class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#_top\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Overview</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#supabase-cli-compatibility-fix\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Supabase CLI Compatibility Fix</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#step-output-storage\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Step Output Storage</span> </a> <ul class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#what-changed\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">What Changed</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#how-it-worked-before\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">How It Worked Before</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#performance-gains\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">Performance Gains</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <a href=\"#simpler-manual-queries\" class=\"astro-qdijszvq\" style=\"--depth: 1;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 1;\">Simpler Manual Queries</span> </a> </li> </ul> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#migration-guide\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Migration Guide</span> </a> </li><li class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <a href=\"#looking-ahead\" class=\"astro-qdijszvq\" style=\"--depth: 0;\"> <span class=\"astro-qdijszvq\" style=\"--depth: 0;\">Looking Ahead</span> </a> </li> </ul> </nav></starlight-toc><script type=\"module\" src=\"/_astro/TableOfContents.astro_astro_type_script_index_0_lang.CKWWgpjV.js\"></script></div></div> </div> </aside> <div class=\"main-pane astro-mndfwee4\"> <main data-pagefind-body class=\"astro-lkmsl3sa\" lang=\"en\" dir=\"ltr\"> <div class=\"content-panel astro-a6uhbnxq\"> <div class=\"sl-container astro-a6uhbnxq\"> <h1 id=\"_top\" class=\"astro-ciolyesy\">pgflow 0.13.1: CLI Fix + Step Output Storage for Conditional Execution</h1> </div> </div> <div class=\"content-panel astro-a6uhbnxq\"> <div class=\"sl-container astro-a6uhbnxq\"> <starlight-image-zoom> <template class=\"astro-soknys5x\"> <dialog class=\"starlight-image-zoom-dialog astro-soknys5x\"> <button aria-label=\"Unzoom image\" class=\"starlight-image-zoom-control astro-soknys5x\"> <svg aria-hidden=\"true\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"astro-soknys5x\"> <use href=\"#starlight-image-zoom-icon-unzoom\" class=\"astro-soknys5x\"></use> </svg> </button> <figure class=\"astro-soknys5x\"></figure> </dialog> </template> <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:none\" class=\"astro-soknys5x\"> <symbol id=\"starlight-image-zoom-icon-zoom\" viewBox=\"0 0 24 24\" class=\"astro-soknys5x\"> <path d=\"M9.79 12.79 4 18.59V17a1 1 0 0 0-2 0v4a1 1 0 0 0 .08.38 1 1 0 0 0 .54.54A1 1 0 0 0 3 22h4a1 1 0 0 0 0-2H5.41l5.8-5.79a1 1 0 0 0-1.42-1.42ZM21.92 2.62a1 1 0 0 0-.54-.54A1 1 0 0 0 21 2h-4a1 1 0 0 0 0 2h1.59l-5.8 5.79a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0L20 5.41V7a1 1 0 0 0 2 0V3a1 1 0 0 0-.08-.38Z\" class=\"astro-soknys5x\"></path> </symbol> <symbol id=\"starlight-image-zoom-icon-unzoom\" viewBox=\"0 0 24 24\" class=\"astro-soknys5x\"> <path d=\"M21.71 2.29a1 1 0 0 0-1.42 0l-5.79 5.8V6.5a1 1 0 0 0-2 0v4a1 1 0 0 0 .08.38 1 1 0 0 0 .54.54 1 1 0 0 0 .38.08h4a1 1 0 0 0 0-2h-1.59l5.8-5.79a1 1 0 0 0 0-1.42ZM10.88 12.58a1 1 0 0 0-.38-.08h-4a1 1 0 0 0 0 2h1.59l-5.8 5.79a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l5.79-5.8v1.59a1 1 0 0 0 2 0v-4a1 1 0 0 0-.08-.38 1 1 0 0 0-.54-.54Z\" class=\"astro-soknys5x\"></path> </symbol> </svg> </starlight-image-zoom> <script type=\"module\" src=\"/_astro/ImageZoom.astro_astro_type_script_index_0_lang.J1tlcSSG.js\"></script> <div class=\"sl-markdown-content\"><div class=\"metadata not-content astro-pyfm3m6g\"> <div class=\"dates astro-pyfm3m6g\"> <time datetime=\"2026-01-03T00:00:00.000Z\" class=\"astro-pyfm3m6g\"> Jan 3, 2026 </time> <span class=\"metadata-alt astro-pyfm3m6g\"> - 3 min read </span> </div> <div class=\"authors astro-pyfm3m6g\"> <a href=\"https://github.com/jumski\" class=\"author astro-3z66okhy\"><img src=\"/jumski-avatar.png\" alt=\"Wojciech Majewski (@jumski)\" loading=\"eager\" decoding=\"async\" fetchpriority=\"auto\" width=\"40\" height=\"40\" class=\"astro-3z66okhy\"><div class=\"text astro-3z66okhy\"> <div class=\"name astro-3z66okhy\">Wojciech Majewski (@jumski)</div> <div class=\"title astro-3z66okhy\">Creator and Maintainer</div> </div> </a> </div> </div> <aside aria-label=\"Note on 0.13.0\" class=\"starlight-aside starlight-aside--caution\"> <p class=\"starlight-aside__title\" aria-hidden=\"true\"> <svg aria-hidden=\"true\" class=\"starlight-aside__icon astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M12 16a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm10.67 1.47-8.05-14a3 3 0 0 0-5.24 0l-8 14A3 3 0 0 0 3.94 22h16.12a3 3 0 0 0 2.61-4.53Zm-1.73 2a1 1 0 0 1-.88.51H3.94a1 1 0 0 1-.88-.51 1 1 0 0 1 0-1l8-14a1 1 0 0 1 1.78 0l8.05 14a1 1 0 0 1 .05 1.02v-.02ZM12 8a1 1 0 0 0-1 1v4a1 1 0 0 0 2 0V9a1 1 0 0 0-1-1Z\"/></svg>Note on 0.13.0 </p> <div class=\"starlight-aside__content\"> <p>Version 0.13.0 was yanked from npm and JSR due to unreliable local environment detection. The key-based detection approach did not work correctly with recent Supabase CLI versions. This release (0.13.1) replaces it with a more robust URL-based detection method.</p> </div> </aside>\n<p>pgflow 0.13.1 fixes a compatibility issue with recent Supabase CLI versions and introduces atomic step output storage for 2x faster Map chains.</p>\n<div class=\"sl-heading-wrapper level-h2\"><h2 id=\"supabase-cli-compatibility-fix\">Supabase CLI Compatibility Fix</h2><a class=\"sl-anchor-link\" href=\"#supabase-cli-compatibility-fix\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Supabase CLI Compatibility Fix”</span></a></div>\n<p><strong>If local development stopped working after a Supabase CLI update, this release fixes it.</strong></p>\n<p>pgflow now detects local development by checking the <code dir=\"auto\">SUPABASE_URL</code> environment variable. When running locally, Supabase CLI sets this to <code dir=\"auto\">http://kong:8000</code> (the Docker-internal API gateway). This is more reliable than the previous key-based detection, which broke when Supabase CLI transitioned to new opaque API keys.</p>\n<div class=\"sl-heading-wrapper level-h2\"><h2 id=\"step-output-storage\">Step Output Storage</h2><a class=\"sl-anchor-link\" href=\"#step-output-storage\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Step Output Storage”</span></a></div>\n<div class=\"sl-heading-wrapper level-h3\"><h3 id=\"what-changed\">What Changed</h3><a class=\"sl-anchor-link\" href=\"#what-changed\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “What Changed”</span></a></div>\n<p>Step outputs are now stored in <code dir=\"auto\">step_states.output</code> when a step completes, rather than being aggregated on-demand.</p>\n<div class=\"sl-heading-wrapper level-h3\"><h3 id=\"how-it-worked-before\">How It Worked Before</h3><a class=\"sl-anchor-link\" href=\"#how-it-worked-before\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “How It Worked Before”</span></a></div>\n<p>Previously, every time a downstream step needed its dependency’s output, pgflow ran an aggregation query:</p>\n<div class=\"expressive-code\"><link rel=\"stylesheet\" href=\"/_astro/ec.v4551.css\"><script type=\"module\" src=\"/_astro/ec.p1z7b.js\"></script><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SELECT</span><span style=\"--0:#D6DEEB;--1:#403F53\"> jsonb_agg(</span><span style=\"--0:#C792EA;--1:#8844AE\">output</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">ORDER BY</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">index</span><span style=\"--0:#D6DEEB;--1:#403F53\">)</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">FROM</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">step_tasks</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> run_id </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> $</span><span style=\"--0:#F78C6C;--1:#AA0982\">1</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">AND</span><span style=\"--0:#D6DEEB;--1:#403F53\"> step_slug </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> $</span><span style=\"--0:#F78C6C;--1:#AA0982\">2</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"SELECT jsonb_agg(output ORDER BY index)FROM pgflow.step_tasksWHERE run_id = $1 AND step_slug = $2\"><div></div></button></div></figure></div>\n<p>For a Map step with 500 items, this query scanned 500 rows. When another Map step depended on it with 500 tasks, that’s 500 tasks x 500 rows = 250,000 row scans.</p>\n<div class=\"sl-heading-wrapper level-h3\"><h3 id=\"performance-gains\">Performance Gains</h3><a class=\"sl-anchor-link\" href=\"#performance-gains\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Performance Gains”</span></a></div>\n<p>With outputs pre-stored, downstream tasks now read a single column instead of aggregating:</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Benchmark</th><th>Before</th><th>After</th><th>Improvement</th></tr></thead><tbody><tr><td>Start 500 tasks reading 500-element output</td><td>189s</td><td>87s</td><td><strong>2.17x faster</strong></td></tr></tbody></table>\n<p>The complexity dropped from O(N^2) to O(N) for Map-to-Map chains.</p>\n<div class=\"sl-heading-wrapper level-h3\"><h3 id=\"simpler-manual-queries\">Simpler Manual Queries</h3><a class=\"sl-anchor-link\" href=\"#simpler-manual-queries\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Simpler Manual Queries”</span></a></div>\n<p>Querying step outputs is now straightforward:</p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#919F9F;--1:#5F636F\">-- Get output for a specific step in a run</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SELECT</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">output</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">FROM</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">step_states</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> run_id </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#ECC48D;--1:#984E4D\">run-abc</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">AND</span><span style=\"--0:#D6DEEB;--1:#403F53\"> step_slug </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#ECC48D;--1:#984E4D\">process</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#D6DEEB;--1:#403F53\">;</span></div></div><div class=\"ec-line\"><div class=\"code\">\n</div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#919F9F;--1:#5F636F\">-- Get all step outputs for a run</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SELECT</span><span style=\"--0:#D6DEEB;--1:#403F53\"> step_slug, </span><span style=\"--0:#C792EA;--1:#8844AE\">output</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">FROM</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">step_states</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> run_id </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#ECC48D;--1:#984E4D\">run-abc</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#D6DEEB;--1:#403F53\">;</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"-- Get output for a specific step in a runSELECT outputFROM pgflow.step_statesWHERE run_id = 'run-abc' AND step_slug = 'process';-- Get all step outputs for a runSELECT step_slug, outputFROM pgflow.step_statesWHERE run_id = 'run-abc';\"><div></div></button></div></figure></div>\n<p>No need to aggregate from <code dir=\"auto\">step_tasks</code> - the output is ready to use.</p>\n<div class=\"sl-heading-wrapper level-h2\"><h2 id=\"migration-guide\">Migration Guide</h2><a class=\"sl-anchor-link\" href=\"#migration-guide\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Migration Guide”</span></a></div>\n<p>This release includes a data migration that backfills <code dir=\"auto\">step_states.output</code> for existing completed steps.</p>\n<aside aria-label=\"Data Migration - Test First\" class=\"starlight-aside starlight-aside--caution\"> <p class=\"starlight-aside__title\" aria-hidden=\"true\"> <svg aria-hidden=\"true\" class=\"starlight-aside__icon astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\"><path d=\"M12 16a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm10.67 1.47-8.05-14a3 3 0 0 0-5.24 0l-8 14A3 3 0 0 0 3.94 22h16.12a3 3 0 0 0 2.61-4.53Zm-1.73 2a1 1 0 0 1-.88.51H3.94a1 1 0 0 1-.88-.51 1 1 0 0 1 0-1l8-14a1 1 0 0 1 1.78 0l8.05 14a1 1 0 0 1 .05 1.02v-.02ZM12 8a1 1 0 0 0-1 1v4a1 1 0 0 0 2 0V9a1 1 0 0 0-1-1Z\"/></svg>Data Migration - Test First </p> <div class=\"starlight-aside__content\"> <p>This migration backfills data for all completed steps. Download a production database dump and test the migration locally before applying to production. The backfill is safe (only touches completed rows) but should run during low-traffic periods and with no workers running.</p> </div> </aside>\n<ol role=\"list\" class=\"sl-steps\">\n<li>\n<p><strong>Test locally with production data</strong></p>\n<p>Download a production backup and restore it locally to test the migration. See <a href=\"https://supabase.com/docs/guides/local-development/restoring-downloaded-backup/\">Restoring a downloaded backup</a> in the Supabase docs, then run <code dir=\"auto\">npx supabase db push</code> to test the migration.</p>\n</li>\n<li>\n<p><strong>Record enabled worker functions</strong></p>\n<p>Before disabling, note which functions are currently enabled:</p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SELECT</span><span style=\"--0:#D6DEEB;--1:#403F53\"> function_name </span><span style=\"--0:#C792EA;--1:#8844AE\">FROM</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">worker_functions</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">enabled</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> true;</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"SELECT function_name FROM pgflow.worker_functions WHERE enabled = true;\"><div></div></button></div></figure></div>\n<p>Save this list - you’ll need it in step 7.</p>\n</li>\n<li>\n<p><strong>Disable all worker functions</strong></p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">UPDATE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">worker_functions</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">SET</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">enabled</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> false;</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"UPDATE pgflow.worker_functions SET enabled = false;\"><div></div></button></div></figure></div>\n</li>\n<li>\n<p><strong>Deprecate running workers</strong></p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">UPDATE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">workers</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SET</span><span style=\"--0:#D6DEEB;--1:#403F53\"> deprecated_at </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">NOW</span><span style=\"--0:#D6DEEB;--1:#403F53\">()</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> deprecated_at </span><span style=\"--0:#C792EA;--1:#8844AE\">IS</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">NULL</span></div></div><div class=\"ec-line\"><div class=\"code\"><span class=\"indent\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">AND</span><span style=\"--0:#D6DEEB;--1:#403F53\"> stopped_at </span><span style=\"--0:#C792EA;--1:#8844AE\">IS</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">NULL</span><span style=\"--0:#D6DEEB;--1:#403F53\">;</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"UPDATE pgflow.workersSET deprecated_at = NOW()WHERE deprecated_at IS NULL AND stopped_at IS NULL;\"><div></div></button></div></figure></div>\n</li>\n<li>\n<p><strong>Wait for all workers to stop</strong></p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SELECT</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C5E478;--1:#3B61B0\">COUNT</span><span style=\"--0:#D6DEEB;--1:#403F53\">(</span><span style=\"--0:#7FDBCA;--1:#096E72\">*</span><span style=\"--0:#D6DEEB;--1:#403F53\">) </span><span style=\"--0:#C792EA;--1:#8844AE\">FROM</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">workers</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> stopped_at </span><span style=\"--0:#C792EA;--1:#8844AE\">IS</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">NULL</span><span style=\"--0:#D6DEEB;--1:#403F53\">;</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"SELECT COUNT(*) FROM pgflow.workers WHERE stopped_at IS NULL;\"><div></div></button></div></figure></div>\n<p>Wait until this returns <code dir=\"auto\">0</code>.</p>\n</li>\n<li>\n<p><strong>Apply database migration</strong></p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"bash\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#82AAFF;--1:#3B61B0\">npx</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">supabase</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">db</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">push</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"npx supabase db push\"><div></div></button></div></figure></div>\n</li>\n<li>\n<p><strong>Deploy workers and re-enable</strong></p>\n<p>Deploy your workers and re-enable only the functions that were enabled before:</p>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"bash\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#82AAFF;--1:#3B61B0\">npx</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">supabase</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">functions</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#ECC48D;--1:#3B61B0\">deploy</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"npx supabase functions deploy\"><div></div></button></div></figure></div>\n<div class=\"expressive-code\"><figure class=\"frame not-content\"><figcaption class=\"header\"></figcaption><pre data-language=\"sql\"><code><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">UPDATE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#82AAFF;--1:#3B61B0\">pgflow</span><span style=\"--0:#D6DEEB;--1:#403F53\">.</span><span style=\"--0:#82AAFF;--1:#3B61B0\">worker_functions</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">SET</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">enabled</span><span style=\"--0:#D6DEEB;--1:#403F53\"> </span><span style=\"--0:#C792EA;--1:#8844AE\">=</span><span style=\"--0:#D6DEEB;--1:#403F53\"> true</span></div></div><div class=\"ec-line\"><div class=\"code\"><span style=\"--0:#C792EA;--1:#8844AE\">WHERE</span><span style=\"--0:#D6DEEB;--1:#403F53\"> function_name </span><span style=\"--0:#C792EA;--1:#8844AE\">IN</span><span style=\"--0:#D6DEEB;--1:#403F53\"> (</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#ECC48D;--1:#984E4D\">worker-1</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#D6DEEB;--1:#403F53\">, </span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#ECC48D;--1:#984E4D\">worker-2</span><span style=\"--0:#D9F5DD;--1:#111111\">'</span><span style=\"--0:#D6DEEB;--1:#403F53\">); </span><span style=\"--0:#919F9F;--1:#5F636F\">-- from step 2</span></div></div></code></pre><div class=\"copy\"><button title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"UPDATE pgflow.worker_functionsSET enabled = trueWHERE function_name IN ('worker-1', 'worker-2'); -- from step 2\"><div></div></button></div></figure></div>\n</li>\n</ol>\n<div class=\"sl-heading-wrapper level-h2\"><h2 id=\"looking-ahead\">Looking Ahead</h2><a class=\"sl-anchor-link\" href=\"#looking-ahead\"><span aria-hidden=\"true\" class=\"sl-anchor-icon\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"></path></svg></span><span class=\"sr-only\">Section titled “Looking Ahead”</span></a></div>\n<p>This change stores step outputs in a queryable location - a prerequisite for conditional execution. Future releases will use these stored outputs to evaluate conditions and skip steps dynamically.</p>\n<hr>\n<p>Questions or issues? Join the <a href=\"https://discord.gg/pgflow\">Discord community</a> or <a href=\"https://github.com/pgflow-dev/pgflow/issues\">open a GitHub issue</a>.</p> <div class=\"post-footer astro-62ksc4ck\"> <div class=\"astro-mxodwxki\"><b class=\"astro-mxodwxki\">Tags:</b><ul class=\"astro-mxodwxki\"><li class=\"astro-mxodwxki\"><a href=\"/news/tags/release/\" class=\"astro-mxodwxki\">release</a></li><li class=\"astro-mxodwxki\"><a href=\"/news/tags/performance/\" class=\"astro-mxodwxki\">performance</a></li></ul></div> <div class=\"pagination astro-63u4djld\" data-pagefind-ignore><div class=\"card-grid astro-y4xfamor\"><div class=\"sl-link-card astro-bhcct7ef\"> <span class=\"sl-flex stack astro-bhcct7ef\"> <a href=\"/news/pgflow-0-13-2-stalled-task-recovery-and-config-fixes/\" rel=\"prev\" class=\"astro-63u4djld astro-bhcct7ef\"> <span class=\"title astro-bhcct7ef\">pgflow 0.13.2: Stalled Task Recovery and Config Fixes</span> </a> </span> <svg aria-hidden=\"true\" class=\"icon rtl:flip astro-bhcct7ef astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.333em;\"><path d=\"M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z\"/></svg> </div> <div class=\"sl-link-card astro-bhcct7ef\"> <span class=\"sl-flex stack astro-bhcct7ef\"> <a href=\"/news/pgflow-0-12-0-simpler-handler-signatures-for-flow-composition/\" rel=\"next\" class=\"astro-63u4djld astro-bhcct7ef\"> <span class=\"title astro-bhcct7ef\">pgflow 0.12.0: Simpler Handler Signatures for Flow Composition</span> </a> </span> <svg aria-hidden=\"true\" class=\"icon rtl:flip astro-bhcct7ef astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.333em;\"><path d=\"M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z\"/></svg> </div> </div> </div> </div> </div> <footer class=\"sl-flex astro-7hkty3uh\"> <div class=\"meta sl-flex astro-7hkty3uh\"> <a href=\"https://github.com/pgflow-dev/pgflow/edit/main/pkgs/website/src/content/docs/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution.mdx\" class=\"sl-flex print:hidden astro-ajbslzzy\"><svg aria-hidden=\"true\" class=\"astro-ajbslzzy astro-i27iqf3l\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1.2em;\"><path d=\"M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z\"/></svg>Edit page</a> </div> <div class=\"pagination-links print:hidden astro-sbnakd2b\" dir=\"ltr\"> </div> </footer> </div> </div> </main> </div> </div> </div> </div> <a href=\"/author/\" class=\"hire-sticker astro-4toy2ex6\">\nChat with Author\n</a> <script type=\"module\" src=\"https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496\" integrity=\"sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==\" data-cf-beacon='{\"version\":\"2024.11.0\",\"token\":\"6a9f65c63e1249e3868e0df7798f3b54\",\"r\":1}' crossorigin=\"anonymous\"></script>\n</body></html>",
"url": "https://www.pgflow.dev/news/pgflow-0-13-1-cli-fix-step-output-storage-for-conditional-execution/"
}