{"id":24623162,"url":"https://github.com/pgflow-dev/pgflow","last_synced_at":"2026-02-03T11:07:41.053Z","repository":{"id":273775995,"uuid":"905963710","full_name":"pgflow-dev/pgflow","owner":"pgflow-dev","description":"Postgres-centric workflow engine with deep integration with Supabase","archived":false,"fork":false,"pushed_at":"2025-05-07T10:10:54.000Z","size":3758,"stargazers_count":70,"open_issues_count":2,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-07T10:52:13.085Z","etag":null,"topics":["edge-functions","pgmq","postgres","queue-workers","supabase","workflow-automation","workflow-engine"],"latest_commit_sha":null,"homepage":"https://pgflow.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pgflow-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-12-19T21:43:12.000Z","updated_at":"2025-05-07T07:56:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"d21de22d-0836-4dd4-86cf-c9b3b4d2d44a","html_url":"https://github.com/pgflow-dev/pgflow","commit_stats":null,"previous_names":["pgflow-dev/pgflow"],"tags_count":134,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgflow-dev%2Fpgflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgflow-dev%2Fpgflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgflow-dev%2Fpgflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgflow-dev%2Fpgflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pgflow-dev","download_url":"https://codeload.github.com/pgflow-dev/pgflow/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252903334,"owners_count":21822426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["edge-functions","pgmq","postgres","queue-workers","supabase","workflow-automation","workflow-engine"],"created_at":"2025-01-25T03:33:49.872Z","updated_at":"2025-12-30T18:05:22.829Z","avatar_url":"https://github.com/pgflow-dev.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\u003ca href=\"https://pgflow.dev/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg src=\"logo-with-text.svg\" alt=\"pgflow logo\" width=\"450\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAI workflows in Supabase, no extra infra.\u003c/strong\u003e\n  \u003cbr\u003e\n  TypeScript workflows with full autocomplete, zero boilerplate, automatic retries and realtime progress. Built on Postgres + Edge Functions.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pgflow.dev\"\u003eDocs\u003c/a\u003e |\n  \u003ca href=\"https://demo.pgflow.dev\"\u003eDemo\u003c/a\u003e |\n  \u003ca href=\"https://github.com/pgflow-dev/pgflow\"\u003eGitHub\u003c/a\u003e |\n  \u003ca href=\"https://pgflow.dev/discord/\"\u003eDiscord\u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-Apache%202.0-blue\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://supabase.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Built%20for-Supabase-3ECF8E?logo=supabase\" alt=\"Built for Supabase\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem style=\"font-size: 1.2em;\"\u003e\"A workflow engine built on Supabase primitives.\"\u003c/em\u003e\n  \u003cbr\u003e\n  \u003cstrong\u003ePaul Copplestone, CEO, Supabase\u003c/strong\u003e (\u003ca href=\"https://x.com/kiwicopple/status/1990686524229181856\"\u003evia X\u003c/a\u003e)\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"dag-animation.svg\" alt=\"pgflow DAG execution showing parallel steps with automatic retry\" width=\"400\"\u003e\n\u003c/p\u003e\n\n## Quick Start\n\n```bash\n# Install pgflow in your Supabase project\nnpx pgflow@latest install\n\n# Restart Supabase and apply migrations\nnpx supabase stop \u0026\u0026 npx supabase start\nnpx supabase migrations up\n```\n\nThen define your workflow ([full guide](https://pgflow.dev/get-started/installation/#next-steps)):\n\n```typescript\nimport { Flow } from '@pgflow/dsl';\n\nnew Flow\u003c{ url: string }\u003e({ slug: 'analyzeArticle' })\n  .step({ slug: 'scrape' }, (flowInput) =\u003e scrapeWebsite(flowInput.url))\n  .step({ slug: 'summarize', dependsOn: ['scrape'] }, (deps) =\u003e\n    summarize(deps.scrape)\n  )\n  .step({ slug: 'extractKeywords', dependsOn: ['scrape'] }, (deps) =\u003e\n    extractKeywords(deps.scrape)\n  )\n  .step(\n    { slug: 'publish', dependsOn: ['summarize', 'extractKeywords'] },\n    (deps) =\u003e\n      publish({ summary: deps.summarize, keywords: deps.extractKeywords })\n  );\n```\n\nThis replaces ~240 lines of queue setup, state management, and coordination code. [See full comparison](https://supabase.com/blog/processing-large-jobs-with-edge-functions)\n\n## Why pgflow?\n\nBuilding workflows in Supabase today means wiring together pgmq, pg_cron, state tables, and Edge Functions yourself. It works, but it's tedious.\n\n**pgflow gives you:**\n\n- **Declarative workflows** - Define steps and dependencies in TypeScript. pgflow handles queues, state, and coordination.\n- **Built for Supabase** - Runs entirely in your existing project. No Redis, no Temporal, no external services.\n- **AI-ready** - Automatic retries with exponential backoff for flaky LLM APIs. Per-step, not per-workflow.\n- **Parallel processing** - Fan out over arrays with independent retries. If 3 of 100 items fail, only those 3 retry.\n- **Full observability** - All workflow state in Postgres. Query runs, debug failures, inspect outputs with SQL.\n- **Flexible triggers** - Start from your app, database triggers, pg_cron, or direct SQL calls.\n\n## What can you build?\n\n- **AI Pipelines** - Scrape websites, chunk content, generate embeddings, summarize with LLMs. Each step retries independently when APIs flake.\n- **Background Jobs** - Process uploads, send emails, sync data. Reliable task queue processing without Redis or external services.\n- **RAG Pipelines** - Chunk documents, generate embeddings, index content. Perfect for AI applications with multi-step LLM chains.\n- **Data Workflows** - ETL pipelines, scheduled imports, multi-step transformations. All orchestrated in Postgres.\n\nSee how pgflow compares to [Trigger.dev](https://pgflow.dev/comparisons/trigger/), [Inngest](https://pgflow.dev/comparisons/inngest/), [DBOS](https://pgflow.dev/comparisons/dbos/), and [Vercel Workflows](https://pgflow.dev/comparisons/vercel-workflows/).\n\n## How it works\n\n1. **Define workflows** using the TypeScript DSL\n2. **Compile** them to SQL migrations\n3. **Deploy** as Supabase Edge Functions\n4. **Trigger** from your app, SQL, or pg_cron\n\nThe execution engine handles scheduling, retries, and result aggregation automatically.\n\n## Packages\n\n| Package                                    | Version                                                                                             | Description                                             |\n| ------------------------------------------ | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |\n| [pgflow](./pkgs/cli/)                      | [![npm](https://img.shields.io/npm/v/pgflow)](https://www.npmjs.com/package/pgflow)                 | CLI for installing and compiling flows                  |\n| [@pgflow/core](./pkgs/core/)               | [![npm](https://img.shields.io/npm/v/@pgflow/core)](https://www.npmjs.com/package/@pgflow/core)     | SQL Core - foundational tables and functions            |\n| [@pgflow/dsl](./pkgs/dsl/)                 | [![npm](https://img.shields.io/npm/v/@pgflow/dsl)](https://www.npmjs.com/package/@pgflow/dsl)       | TypeScript DSL for defining flows with type inference   |\n| [@pgflow/edge-worker](./pkgs/edge-worker/) | [![JSR](https://jsr.io/badges/@pgflow/edge-worker)](https://jsr.io/@pgflow/edge-worker)             | Task queue worker for Supabase Edge Functions           |\n| [@pgflow/client](./pkgs/client/)           | [![npm](https://img.shields.io/npm/v/@pgflow/client)](https://www.npmjs.com/package/@pgflow/client) | TypeScript client for starting and monitoring workflows |\n\n## Releases\n\n- **Release Process**: See [RELEASES.md](./RELEASES.md) for how versions are managed and published\n- **Snapshot Releases**: See [SNAPSHOT_RELEASES.md](./SNAPSHOT_RELEASES.md) for testing changes before release\n\n---\n\n\u003e [!NOTE]\n\u003e This project and all its components are licensed under [Apache 2.0](./LICENSE) license.\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgflow-dev%2Fpgflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpgflow-dev%2Fpgflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgflow-dev%2Fpgflow/lists"}