microsoft/pg_durablePublic

PostgreSQL in-database durable execution

AI summary: A PostgreSQL extension that enables fault-tolerant, durable background execution directly within the database.

Stars
2.8K
+3 today
Forks
80
Watchers
4
Open issues
10
Open PRs
7
Contributors
~24
Commits
397
Branches
34

RustOtherCreated Feb 13, 2026Last push 2d agoLatest release v0.2.8+8 stars this week+29 this month

Quick answers

What is pg_durable?
A PostgreSQL extension that enables fault-tolerant, durable background execution directly within the database.
What does pg_durable do?
pg_durable is a specialized PostgreSQL extension designed to manage long-running, fault-tolerant background tasks directly within the database environment. It allows developers to define complex workflows in standard SQL, automatically checkpointing each step to ensure state is never lost. By handling crash recovery, restarts, and failed steps natively, pg_durable eliminates the need for external message queues, worker services, and status tables. This approach brings the industry-standard pattern of durable execution entirely inside Postgres, significantly simplifying backend architecture for teams already utilizing the database as their primary state store.
Who is pg_durable for?
This extension is perfect for backend developers and database administrators who use PostgreSQL heavily and want to simplify their architecture by removing external job queues and workers.
How do I get started with pg_durable?
https://github.com/microsoft/pg_durable
How popular is pg_durable on GitHub?
microsoft/pg_durable has 2,829 stars and 80 forks on GitHub, and gained 8 stars in the last 7 days.
What license does pg_durable use?
microsoft/pg_durable is released under the Other license.

Star history

since Jul 29, 2026
01K2KJul 2026Aug 2026Sep 2026Oct 2026
2.8K stars as of Oct 2, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 8 commits2025-12-05: 0 commits2025-12-06: 1 commit2025-12-07: 17 commits2025-12-08: 4 commits2025-12-09: 5 commits2025-12-10: 6 commits2025-12-11: 1 commit2025-12-12: 0 commits2025-12-13: 1 commit2025-12-14: 2 commits2025-12-15: 1 commit2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 3 commits2025-12-22: 3 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 3 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 1 commit2025-12-31: 2 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 1 commit2026-01-04: 3 commits2026-01-05: 0 commits2026-01-06: 2 commits2026-01-07: 0 commits2026-01-08: 1 commit2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 1 commit2026-01-15: 1 commit2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 4 commits2026-01-22: 0 commits2026-01-23: 1 commit2026-01-24: 1 commit2026-01-25: 2 commits2026-01-26: 2 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 1 commit2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 3 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 2 commits2026-02-18: 4 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 1 commit2026-02-23: 2 commits2026-02-24: 6 commits2026-02-25: 0 commits2026-02-26: 2 commits2026-02-27: 2 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 13 commits2026-03-05: 2 commits2026-03-06: 2 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 2 commits2026-03-10: 3 commits2026-03-11: 1 commit2026-03-12: 2 commits2026-03-13: 4 commits2026-03-14: 3 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 3 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 1 commit2026-03-21: 0 commits2026-03-22: 4 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 1 commit2026-03-28: 1 commit2026-03-29: 8 commits2026-03-30: 2 commits2026-03-31: 3 commits2026-04-01: 3 commits2026-04-02: 3 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 6 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 1 commit2026-04-21: 0 commits2026-04-22: 3 commits2026-04-23: 1 commit2026-04-24: 2 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 1 commit2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 4 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 2 commits2026-05-20: 1 commit2026-05-21: 0 commits2026-05-22: 5 commits2026-05-23: 3 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 4 commits2026-05-27: 2 commits2026-05-28: 11 commits2026-05-29: 22 commits2026-05-30: 1 commit2026-05-31: 2 commits2026-06-01: 1 commit2026-06-02: 1 commit2026-06-03: 3 commits2026-06-04: 1 commit2026-06-05: 3 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 5 commits2026-06-11: 2 commits2026-06-12: 5 commits2026-06-13: 1 commit2026-06-14: 1 commit2026-06-15: 4 commits2026-06-16: 0 commits2026-06-17: 3 commits2026-06-18: 8 commits2026-06-19: 2 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 4 commits2026-06-23: 3 commits2026-06-24: 1 commit2026-06-25: 4 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 1 commit2026-06-29: 5 commits2026-06-30: 2 commits2026-07-01: 2 commits2026-07-02: 3 commits2026-07-03: 0 commits2026-07-04: 2 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 1 commit2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 2 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 1 commit2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 4 commits2026-07-28: 2 commits2026-07-29: 4 commits2026-07-30: 12 commits2026-07-31: 2 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 3 commits2026-08-05: 4 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 1 commit2026-08-11: 1 commit2026-08-12: 1 commit2026-08-13: 0 commits2026-08-14: 1 commit2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 4 commits2026-08-22: 0 commits2026-08-23: 2 commits2026-08-24: 4 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 1 commit2026-08-28: 3 commits2026-08-29: 0 commits2026-08-30: 1 commit2026-08-31: 2 commits2026-09-01: 1 commit2026-09-02: 3 commits2026-09-03: 0 commits2026-09-04: 0 commits2026-09-05: 0 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 0 commits2026-09-09: 0 commits2026-09-10: 2 commits2026-09-11: 3 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 6 commits2026-09-15: 1 commit2026-09-16: 2 commits2026-09-17: 0 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 1 commit2026-09-22: 2 commits2026-09-23: 0 commits2026-09-24: 1 commit2026-09-25: 1 commit2026-09-26: 0 commits2026-09-27: 0 commits2026-09-28: 3 commits2026-09-29: 1 commit2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
382 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Continuous integration

    Automated checks passing

What pg_durable does

pg_durable is a specialized PostgreSQL extension designed to manage long-running, fault-tolerant background tasks directly within the database environment. It allows developers to define complex workflows in standard SQL, automatically checkpointing each step to ensure state is never lost. By handling crash recovery, restarts, and failed steps natively, pg_durable eliminates the need for external message queues, worker services, and status tables. This approach brings the industry-standard pattern of durable execution entirely inside Postgres, significantly simplifying backend architecture for teams already utilizing the database as their primary state store.

This extension is perfect for backend developers and database administrators who use PostgreSQL heavily and want to simplify their architecture by removing external job queues and workers.

  • Native SQL Workflows: Define and execute complex, multi-step background jobs entirely using standard SQL functions.
  • Automatic Checkpointing: Saves the state of a workflow after every step to ensure absolute data durability.
  • Crash Recovery: Automatically resumes interrupted tasks from the last successful checkpoint following a database crash or restart.
  • Zero External Infrastructure: Eliminates the need for separate message brokers like Redis or RabbitMQ for job queuing.
  • Fault-Tolerant Execution: Intelligently handles failed workflow steps, allowing for retries or graceful error handling.

Where teams use it

Background Job Processing

Execute long-running data transformations or report generation tasks reliably in the background.

Payment Processing

Manage multi-step financial transactions where failure at any point must be safely recovered and logged.

Data Pipeline Orchestration

Coordinate complex ETL workflows directly within Postgres without setting up external orchestration tools like Airflow.

Infrastructure Simplification

Remove the operational overhead of managing external job queues by bringing durable execution into the database layer.

Getting started: https://github.com/microsoft/pg_durable

README

main branch
pg_durable logo

Website · Docs · Quick Example · GitHub

License PostgreSQL 17 & 18

Durable Execution inside PostgreSQL

Long-running, fault-tolerant SQL functions for teams that already keep their state in Postgres and want to stop stitching together cron jobs, workers, queues, and status tables to make background work reliable. Define the workflow in SQL, let pg_durable checkpoint each step, and resume after crashes, restarts, or failed steps.

Durable execution is now a standard industry pattern, and pg_durable brings it inside Postgres with no extra service infrastructure required. Part of our mission to bring compute close to data.

Azure HorizonDB logo Try pg_durable now in Azure HorizonDB, Microsoft's new PostgreSQL cloud service engineered for performance and built with pg_durable inside

Is this for me?

Who it's for

  • Backend and data engineers who want workflows to live next to the data they touch.
  • DBAs and SREs automating runbooks that must survive restarts and be auditable in SQL.
  • Teams building data or AI pipelines that need durable execution per row, document, or batch.

The core idea

A pg_durable function is a graph of SQL steps that PostgreSQL executes and checkpoints as it goes. If the database crashes, restarts, or a step fails, execution resumes from the last durable checkpoint instead of making you reconstruct state by hand.

A durable function fans out into three parallel queries — count users, count orders, sum revenue — that join into a dashboard step

Workloads this is useful for

  • Vector embedding pipelines: chunk, call an embedding API, and upsert into pgvector.
  • Ingest pipelines: stage, deduplicate, transform, and publish large batches.
  • Scheduled maintenance: detect bloat, notify, wait for approval, then run the next action.
  • Fan-out aggregation: run independent queries in parallel, then join the results.
  • External API workflows: enrichment, classification, and webhook-style calls from SQL.

What you're probably doing today instead

  • pg_cron plus a jobs table, status columns, retry counters, and a polling worker.
  • An external orchestrator such as Airflow, Temporal, Step Functions, or Argo calling back into Postgres.
  • A queue plus workers plus a separate state table to coordinate retries and partial completion.
  • A plpgsql procedure that works until a crash or long-running transaction forces you to start over.

Pain points it addresses

  • A restart in the middle of a long job means rerunning work that already succeeded.
  • One failed row or one failed API call turns into manual cleanup and uncertain replay.
  • Long transactions hold locks, grow WAL, and make batch jobs fragile at larger scale.
  • Parallel work in the app tier creates more places for partial-failure bugs and drift.
  • The workflow logic ends up spread across SQL, workers, queues, dashboards, and status tables.

What changes in your architecture

  • The workflow definition moves into SQL and starts with df.start(...).
  • Retry state, progress tracking, and checkpointing move into Postgres instead of bespoke app code.
  • Some app-tier workers, queue consumers, or scheduler glue can disappear entirely.
  • Operational visibility comes from Postgres tables such as df.instances, using the same auth and backup model as your data.

When not to use it

  • The job is already a single INSERT ... SELECT or one ordinary SQL statement.
  • You need sub-millisecond synchronous request handling rather than durable background execution.
  • You cannot install extensions or run a background worker in your Postgres environment.
  • The workflow mostly lives outside Postgres and spans many heterogeneous systems.
  • You need arbitrary application logic that does not map cleanly to SQL steps, branching, loops, or HTTP calls.

How it works

  1. Define a workflow in SQL using composable operators such as ~> and |=>.
  2. Start it with df.start() and get back an instance ID.
  3. Let the runtime execute each step durably with checkpointing between steps.
  4. Query status and results from PostgreSQL while the workflow runs or after it completes.

Limitations

The model is intentionally SQL-shaped. If a step needs arbitrary code, a non-HTTP SDK, or rich in-memory control flow, you may need to wrap that logic in a SQL function, expose it behind an HTTP endpoint for df.http(), or use a general-purpose orchestrator for that part of the system.

Features

  • Durable — Function state persists to PostgreSQL. Survives crashes, restarts, and failovers.
  • SQL-native — Define functions in SQL using composable operators.
  • Database-aware — First-class primitives for scheduling, conditions, and parallel execution.
  • Zero infrastructure — Runs as a PostgreSQL extension. No Redis, no Temporal, no external services.

Quick Example

-- A durable function that processes data in steps
SELECT df.start(
    'SELECT id FROM documents WHERE processed = false LIMIT 100' |=> 'batch'
    ~> 'UPDATE documents SET processed = true WHERE id IN (SELECT id FROM $batch.*)'
);

Packages

Tagged releases publish Debian packages for PostgreSQL 17 and 18 on amd64 from the GitHub release assets. Packages are named pg-durable-postgresql-<PG major>_<pg_durable version>-1_<arch>.deb and install the extension library, control file, and SQL upgrade files into the matching PostgreSQL installation directories.

Tagged releases also publish a ready-to-run Docker image (linux/amd64) for PostgreSQL 17 and 18 to GitHub Container Registry: ghcr.io/microsoft/pg_durable. The image installs the released Debian package on top of the official postgres image. Each release publishes immutable X.Y.Z-pg<major> and vX.Y.Z-pg<major> tags (for example 0.2.2-pg17, 0.2.2-pg18); the highest stable release additionally updates the floating pg<major> tags, and the default major (pg17) also updates latest. The PG major version is part of every tag so multiple PostgreSQL versions can be published alongside each other. Browse all published images and tags at https://github.com/microsoft/pg_durable/pkgs/container/pg_durable.

Warning: The published Docker image is intended for evaluating and learning pg_durable only — do not use it in production. It enables superuser durable instances for a frictionless out-of-the-box demo. It explicitly configures restricted HTTP at startup, permitting the default Azure service subdomains and api.github.com. See HTTP security for configuration in v0.2.9+. Multi-arch (linux/arm64) images are not published yet; they will follow once arm64 Debian packages are available.

Run the published image — PostgreSQL 17 and 18 can run side by side on different host ports:

# PostgreSQL 17 (the `latest` tag also points at the newest PG17 release)
docker run -d --name pg_durable_pg17 \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=secret \
  ghcr.io/microsoft/pg_durable:pg17

# PostgreSQL 18 (run alongside PG17 on a different host port)
docker run -d --name pg_durable_pg18 \
  -p 5433:5432 \
  -e POSTGRES_PASSWORD=secret \
  ghcr.io/microsoft/pg_durable:pg18

# Connect with psql (PG17 on 5432, PG18 on 5433)
psql "postgresql://postgres:secret@localhost:5432/postgres"
psql "postgresql://postgres:secret@localhost:5433/postgres"

The extension is preloaded and created in the postgres database on first init. POSTGRES_DB is ignored — pg_durable always installs into postgres so the extension and the background worker never target different databases. For reproducible deployments, pin an immutable X.Y.Z-pg<major> tag (for example 0.2.2-pg17) rather than the floating pg<major>/latest tags; immutable tags are never overwritten once published.

After installing a package, add pg_durable to shared_preload_libraries, restart PostgreSQL, and create the extension in the configured pg_durable database:

CREATE EXTENSION pg_durable;

The default pg_durable database is postgres; see User Guide for background worker configuration and privilege setup.

Each release also publishes source archives and a SHA256SUMS file. To build and install from a source archive, initialize cargo-pgrx for the target PostgreSQL installation, build the package as your normal user, then install the generated artifacts with elevated privileges:

export PG_CONFIG=/usr/lib/postgresql/17/bin/pg_config
cargo pgrx init --pg17 "$PG_CONFIG"
make PG_CONFIG="$PG_CONFIG"
sudo make install PG_CONFIG="$PG_CONFIG"

Source installation is supported on Linux and macOS for PostgreSQL 17 and 18. Windows source installation is not currently supported. Configure HTTP policy with pg_durable.http_security in postgresql.conf or through an authorized ALTER SYSTEM SET, then restart PostgreSQL. The default is restricted; no HTTP Cargo feature is needed. See HTTP security. DESTDIR may be set on make install when staging files for a package.

sudo make uninstall PG_CONFIG="$PG_CONFIG" removes the installed files again. It needs no build, so it also works from an unbuilt source tree.

Installing from PGXN

The extension is listed on PGXN, the PostgreSQL Extension Network. PGXN carries the source distribution, not a binary: pgxn install downloads the source and compiles it on your machine, so it needs the same toolchain as a source-archive build and takes several minutes. For prebuilt binaries use the Debian packages or the Docker image above.

Prerequisites:

  • PostgreSQL 17 or 18, including development headers and pg_config (postgresql-server-dev-17 on Debian/Ubuntu)

  • A Rust toolchain — see rustup

  • pgxnclient (pip install pgxnclient)

  • cargo-pgrx, matching the pgrx version pinned in Cargo.toml:

    cargo install --locked cargo-pgrx --version 0.16.1

Then, for a PostgreSQL installed from a package:

pgxn install --sudo -- pg_durable

Both parts of --sudo -- are load-bearing. pgxn install elevates only when told to, so without --sudo it stops before building:

ERROR: PostgreSQL library directory (...) not writable: you should run the
program as superuser, or specify a 'sudo' program

The build itself still runs as your user; only the install step is elevated. The -- separator is required because --sudo takes an optional program name and would otherwise swallow pg_durable as that argument, leaving no distribution to install. If pg_config --libdir is writable by your user — a PostgreSQL you built yourself, for instance — plain pgxn install pg_durable works.

make package registers your PostgreSQL with cargo-pgrx automatically the first time, so no separate cargo pgrx init step is needed. From a source checkout you can also run make install-pgrx to install the pinned cargo-pgrx, or make pgrx-init PG_CONFIG="$PG_CONFIG" to register PostgreSQL explicitly; set PGRX_AUTO_INIT=0 to make the build report the command to run instead of initializing on its own.

Afterwards, add pg_durable to shared_preload_libraries, restart PostgreSQL, and run CREATE EXTENSION pg_durable as described above.

pgxn uninstall --sudo -- pg_durable removes the installed files again.

Development Installation

Prerequisites

  • PostgreSQL 17 or 18
  • Rust (stable)
  • cargo-pgrx 0.16.1

GitHub Codespace

The main branch prebuild installs PostgreSQL 17, builds pg_durable, and prepares a local cluster under ~/.pgrx with the extension ready. PostgreSQL is not left running, so start it when you begin working.

# Start PostgreSQL
./scripts/pg-start.sh

# Connect
~/.pgrx/17.*/pgrx-install/bin/psql -h localhost -p 28817 -d postgres

On a branch without a ready prebuild, run pg-start.sh — it will build and install the extension on first run (expect a few minutes):

./scripts/pg-start.sh

Other environments

Local and Dev Container

A VS Code Dev Container (.devcontainer/) provides Rust, cargo-pgrx, and PostgreSQL 17 pre-installed. For a bare local machine, install the toolchain first by following the steps in .devcontainer/onCreateCommand.sh.

# Build, initialize PostgreSQL, and install the extension
# This takes a while - go do something else
./scripts/pg-start.sh

# Connect to the local pgrx PostgreSQL instance
~/.pgrx/17.*/pgrx-install/bin/psql -h localhost -p 28817 -d postgres

pg-start.sh bootstraps new local data directories with a postgres superuser and also creates a matching superuser role for the current OS user, so default local psql usage continues to work. Use -U postgres if you want to force the canonical bootstrap role explicitly.

Docker

To run the prebuilt published image, see the Packages section. For local development and testing, build and run from source:

# Build and test (source Dockerfile — compiles the extension)
./scripts/test-e2e-docker.sh --rebuild

# Optional: Deploy to ACR (for a custom PG17 image with pg_durable baked-in)
./scripts/deploy-acr.sh

The published GHCR image installs the released .deb on top of the official postgres image; the source Dockerfile used here compiles the extension and is meant for CI and local development. They are different artifacts.

Multi-User Setup

CREATE EXTENSION pg_durable does not grant any privileges to PUBLIC. After installing the extension, the admin must explicitly grant access to application roles. Row-level security (RLS) ensures each user can only see and manage their own durable function instances and nodes.

Grant privileges to an application role:

-- Grant to specific roles after CREATE EXTENSION
SELECT df.grant_usage('app_role');

Alternatively, create an indirection role and grant membership to application roles:

-- Create a shared role for pg_durable access
CREATE ROLE pg_durable_user NOLOGIN;
SELECT df.grant_usage('pg_durable_user');

-- Grant membership to application roles
GRANT pg_durable_user TO app_backend, etl_service;

See the User Guide — Privilege Grants section for the full list of individual grants, revoking access, and hardening upgraded installs.

Note: GRANT EXECUTE ON ALL FUNCTIONS only applies to functions that exist when the grant runs. After upgrading pg_durable with ALTER EXTENSION pg_durable UPDATE, re-run df.grant_usage('role') (or re-issue the manual grants) so new functions are accessible.

Key points:

  • The background worker role (pg_durable.worker_role GUC, default: postgres) must be a superuser — it bypasses RLS to manage all users' instances
  • Users get SELECT + INSERT on df.instances / df.nodes, column-level UPDATE (status, updated_at) on instances for df.cancel()
  • Identity column (submitted_by) cannot be modified by users
  • df.vars uses per-user scoping — each user has their own variable namespace via an owner column and RLS. Superusers bypass RLS but DSL functions still scope to the calling user via explicit filters. Avoid storing secrets in plain text

Continuous Integration

All pull requests must pass the following checks before merging:

  1. Format Check — cargo fmt --check
  2. Clippy & Tests — cargo clippy, unit tests (cargo pgrx test pg17), pg_regress tests, and E2E tests

The CI workflow is defined in .github/workflows/ci.yml. It uses pgrx to download and manage PostgreSQL.

Testing

pg_durable has two test suites:

pg_regress Tests (Standard PostgreSQL Regression Tests)

Fast, deterministic tests for core DSL functionality using PostgreSQL's standard testing framework. Test SQL lives in sql/, expected output in expected/, and PGXS is configured in the root Makefile.

make test-regress          # recommended: reset the dedicated local cluster and run
make installcheck          # advanced: run against a disposable configured server

Direct installcheck drops and recreates its regression database. It also requires explicit connection settings when PostgreSQL is not on the default socket and port. See Testing for the full command and server prerequisites.

E2E Tests (Comprehensive Scenario Tests)

Complex local integration tests with pgrx PostgreSQL:

./scripts/test-e2e-local.sh                                                  # All local SQL E2E tests, including special restart/config phases
./scripts/test-e2e-local.sh 04_parallel                                      # Specific test
./scripts/test-e2e-local.sh --default-build-phases                            # Only the default-build phase group

See tests/e2e/ for details.

Benchmarks

The reusable pgbench harness measures completed SQL, HTTP, and multipart HTTP workflows with configurable concurrency, warmups, and repetitions. See benchmarks/README.md for setup, result interpretation, and adding workloads. Benchmark correctness tests run in CI; performance measurements are opt-in.

Documentation

  • User Guide — Complete usage guide with examples
  • MVP Guide — Implementation details and internals
  • Examples — Example conventions and smoke-check guidance

Architecture

pg_durable is a PostgreSQL extension (built with pgrx) — everything runs inside the PostgreSQL server, no external services. The extension exposes a SQL DSL for building function graphs and registers a background worker that executes them durably on top of two lower-level Rust libraries:

  • duroxide — a durable task framework providing the orchestration runtime (deterministic replay, checkpoints, sub-orchestrations, timers).
  • duroxide-pg — a PostgreSQL-backed state provider for duroxide. It persists runtime state (instances, history, work queues) in a dedicated duroxide.* schema owned by the extension.
┌────────────────────────────────────────────────────────────────────┐
│                             PostgreSQL                             │
│                                                                    │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │                 pg_durable extension (pgrx)                  │  │
│  │                                                              │  │
│  │  SQL DSL     'sql' |=> 'name' ~> 'sql2'                      │  │
│  │              df.if() | df.join() | df.loop()                 │  │
│  │                                                              │  │
│  │  Background worker (hosts the duroxide runtime in-process)   │  │
│  │  ┌────────────────────────────────────────────────────────┐  │  │
│  │  │  duroxide        (orchestration runtime)               │  │  │
│  │  │  ┌──────────────────────────────────────────────────┐  │  │  │
│  │  │  │  duroxide-pg   (PostgreSQL state provider)       │  │  │  │
│  │  │  └──────────────────────────────────────────────────┘  │  │  │
│  │  └────────────────────────────────────────────────────────┘  │  │
│  └──────────────────────────────────────────────────────────────┘  │
│                                                                    │
│  Schemas                                                           │
│    df.*         DSL graphs (nodes, instances, vars)                │
│    duroxide.*   runtime state (owned by duroxide-pg)               │
└────────────────────────────────────────────────────────────────────┘

If you'd rather author durable functions in Rust, Python, or Node while still persisting state in PostgreSQL, you can use duroxide and duroxide-pg directly from your host language — pg_durable is what you'd build on top of that pair when you'd prefer authoring in SQL.

Status

Preview - This project is currently in preview.

Support

Use GitHub Issues for bug reports and feature requests. Do not report security vulnerabilities through public GitHub issues; follow the instructions in SECURITY.md instead.

Code of Conduct

This project has adopted the Microsoft Open Source Code of Conduct. For more information, see the Code of Conduct FAQ or contact [email protected] with questions or comments.

Security

Microsoft takes the security of our software products and services seriously. Please do not report security vulnerabilities through public GitHub issues. See SECURITY.md for security reporting instructions.

Privacy and Telemetry

pg_durable does not send telemetry to Microsoft.

Trademarks

This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos is subject to those third-party policies.

License

PostgreSQL License

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

7 total
  1. Release v0.2.8v0.2.8Sep 11, 20261.1K downloads

    ## What's Changed * Initialize cargo-pgrx when building without an existing configuration by @waldemort-auto[bot] in https://github.com/microsoft/pg_durable/pull/370 * Fix caller transaction graph handoff by @haiderz07 in https://github.com/microsoft/pg_durable/pull/367 * Keep internal documents out of the PGXN search index and document the PGXN install by @waldemort-auto[bot] in https://github.com/microsoft/pg_durable/pull/373 * Improve secrets handling by @thomcc-work in https://github.com/microsoft/pg_durable/pull/378 * Add failure-isolated loop iterations by @tjgreen42 in https://github.com/microsoft/pg_durable/pull/377 * chore(deps): bump actions/deploy-pages from 5.0.0 to 5.0.1 in the github-actions group by @dependabot[bot] in https://github.com/microsoft/pg_durable/pull/387 * Prepare release v0.2.8 by @tjgreen42 in https://github.com/microsoft/pg_durable/pull/385 ## New Contributors * @haiderz07 made their first contribution in https://github.com/microsoft/pg_durable/pull/367 * @thomcc-work made their first contribution in https://github.com/microsoft/pg_durable/pull/378 **Full Changelog**: https://github.com/microsoft/pg_durable/compare/v0.2.7...v0.2.8

  2. Release v0.2.7v0.2.7Sep 1, 2026110 downloads

    v0.2.7 adds explicit worker connection routing and tightens HTTP and role-name handling. ## Highlights - Configure the PostgreSQL host used by pg_durable connections with the new `pg_durable.host` setting. - Restricted HTTP builds now require HTTPS and use one canonical parsed URL for both validation and transport, closing an SSRF allow-list bypass. - Worker connections now preserve catalog role names verbatim, including names that require quoting. **Full Changelog**: https://github.com/microsoft/pg_durable/compare/v0.2.6...v0.2.7

  3. Release v0.2.6v0.2.6Aug 24, 202655 downloads

    pg_durable 0.2.6 makes large workflow graphs safer and faster, hardens worker lifecycle behavior, and adds a supported PGXN source distribution. ## Highlights - Deeply nested workflows are materialized iteratively and inserted in bounded batches, removing parser and recursive-traversal limits while reducing SPI round trips. - Variable substitution is deterministic, malformed workflow envelopes fail cleanly, and extension drop/recreate races no longer leave a stale runtime marked ready. - Graceful PostgreSQL shutdown is substantially faster and no longer hangs on background-worker pool cleanup. - Independent `transaction_mode => 'new'` starts now have cluster-wide admission control, with configurable concurrency and timeout settings. - Internal connections expose stable PostgreSQL `application_name` values, and source installs now support conventional `pg_config` discovery, `DESTDIR`, and macOS. ## Upgrade notes The transient `Durofut` JSON envelope changed; persisted `df.nodes` rows and in-flight instances are unaffected, but applications must not store this internal envelope for replay across upgrades or downgrades. The undocumented `df.ensure_durofut(text)` helper was remove

  4. Release v0.2.5v0.2.5Jul 30, 2026144 downloads

    ## Highlights - **Richer HTTP workflows:** `df.http_multipart()` sends form and file uploads, while HTTP nodes preserve binary responses as base64 with an explicit `encoding` field. - **Audio round-trip example:** chains Azure OpenAI text-to-speech output directly into a Whisper multipart transcription request. - **Independent starts:** `df.start(..., transaction_mode => 'new')` commits on a separate session, allowing asynchronously started work to survive a caller rollback. - **Direct HTTP result access:** response fields such as `$resp.body`, `$resp.status`, `$resp.ok`, and `$resp.encoding` work with dot notation. ## Reliability - Nested and non-root `df.loop()` workflows that previously failed now execute and restart correctly, with consistent `df.break()` behavior. - Workers can connect when `PGHOST` names a Unix-socket directory. ## Upgrade Notes > **Drain in-flight work before upgrading when continuity is required.** JOIN/RACE branches started on v0.2.4 will fail on replay, and in-flight loops may fail. See `docs/upgrade-testing.md` for details. --- ## Acknowledgements Thanks to everyone who contributed to this release: @pinodeca @sweatybridge @tjgreen42. ## New Contr

  5. Release v0.2.4v0.2.4Jul 24, 2026352 downloads

    ## Highlights - **Bounded instance history:** retention and hard-cap pruning prevent unbounded growth of `df.instances`. - **Better instance listing:** `df.list_instances()` adds label filtering and keyset pagination, with a configurable page-size limit that now fails loudly instead of silently truncating results. - **More accurate monitoring:** node status follows durable execution lineage, and `df.start()` reports engine hand-off failures immediately. - **Correct schedule timing:** recurring schedules calculate their next tick when execution begins. - **Safer completion waits:** use `df.await_instance()` in place of `df.wait_for_completion()`. ## Reliability and Security - Hardened instance and node ID allocation against collisions. - Added loop and result-expansion limits, improved connection recovery, and sped up instance listing. - Extended HTTP SSRF protection to the CGNAT range and restricted `df.metrics()` to explicitly authorized roles. ## Upgrade Notes > **Drain all in-flight instances before upgrading.** Durable-history input changes make work started on earlier versions incompatible with v0.2.4 replay, including instances waiting on schedules. The node-key migratio

Code frequency

additions and deletions
+22.4K-22.4KWeek of 2025-11-30: +6,387 linesWeek of 2025-11-30: -1,011 linesWeek of 2025-12-07: +22,385 linesWeek of 2025-12-07: -6,527 linesWeek of 2025-12-14: +26 linesWeek of 2025-12-14: -8 linesWeek of 2025-12-21: +3,528 linesWeek of 2025-12-21: -155 linesWeek of 2025-12-28: +497 linesWeek of 2025-12-28: -335 linesWeek of 2026-01-04: +925 linesWeek of 2026-01-04: -86 linesWeek of 2026-01-11: +146 linesWeek of 2026-01-11: -3 linesWeek of 2026-01-18: +400 linesWeek of 2026-01-18: -95 linesWeek of 2026-01-25: +1,337 linesWeek of 2026-01-25: -38 linesWeek of 2026-02-01: +0 linesWeek of 2026-02-01: -0 linesWeek of 2026-02-08: +29 linesWeek of 2026-02-08: -28 linesWeek of 2026-02-15: +105 linesWeek of 2026-02-15: -4 linesWeek of 2026-02-22: +15,233 linesWeek of 2026-02-22: -1,520 linesWeek of 2026-03-01: +3,690 linesWeek of 2026-03-01: -1,876 linesWeek of 2026-03-08: +8,782 linesWeek of 2026-03-08: -1,135 linesWeek of 2026-03-15: +1,319 linesWeek of 2026-03-15: -11 linesWeek of 2026-03-22: +3,261 linesWeek of 2026-03-22: -6,446 linesWeek of 2026-03-29: +16,002 linesWeek of 2026-03-29: -9,682 linesWeek of 2026-04-05: +0 linesWeek of 2026-04-05: -0 linesWeek of 2026-04-12: +2,022 linesWeek of 2026-04-12: -410 linesWeek of 2026-04-19: +1,837 linesWeek of 2026-04-19: -403 linesWeek of 2026-04-26: +21 linesWeek of 2026-04-26: -3 linesWeek of 2026-05-03: +1,090 linesWeek of 2026-05-03: -35 linesWeek of 2026-05-10: +0 linesWeek of 2026-05-10: -0 linesWeek of 2026-05-17: +1,117 linesWeek of 2026-05-17: -93 linesWeek of 2026-05-24: +15,341 linesWeek of 2026-05-24: -11,712 linesWeek of 2026-05-31: +1,018 linesWeek of 2026-05-31: -181 linesWeek of 2026-06-07: +3,866 linesWeek of 2026-06-07: -719 linesWeek of 2026-06-14: +1,756 linesWeek of 2026-06-14: -1,167 linesWeek of 2026-06-21: +1,612 linesWeek of 2026-06-21: -337 linesWeek of 2026-06-28: +3,550 linesWeek of 2026-06-28: -527 linesWeek of 2026-07-05: +0 linesWeek of 2026-07-05: -0 linesWeek of 2026-07-12: +105 linesWeek of 2026-07-12: -1 linesWeek of 2026-07-19: +21 linesWeek of 2026-07-19: -9 linesWeek of 2026-07-26: +9,803 linesWeek of 2026-07-26: -1,485 linesWeek of 2026-08-02: +2,218 linesWeek of 2026-08-02: -1,580 linesWeek of 2026-08-09: +679 linesWeek of 2026-08-09: -70 linesWeek of 2026-08-16: +815 linesWeek of 2026-08-16: -89 linesWeek of 2026-08-23: +1,146 linesWeek of 2026-08-23: -331 linesWeek of 2026-08-30: +1,766 linesWeek of 2026-08-30: -156 linesNov 30, 2025Aug 30, 2026
+133.8K lines added, -48.3K removed over the last year.

Commits per week

last 52 weeks
400Week of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 9 commitsWeek of 2025-12-07: 34 commitsWeek of 2025-12-14: 3 commitsWeek of 2025-12-21: 9 commitsWeek of 2025-12-28: 4 commitsWeek of 2026-01-04: 6 commitsWeek of 2026-01-11: 2 commitsWeek of 2026-01-18: 6 commitsWeek of 2026-01-25: 5 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 3 commitsWeek of 2026-02-15: 6 commitsWeek of 2026-02-22: 13 commitsWeek of 2026-03-01: 17 commitsWeek of 2026-03-08: 15 commitsWeek of 2026-03-15: 4 commitsWeek of 2026-03-22: 6 commitsWeek of 2026-03-29: 19 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 6 commitsWeek of 2026-04-19: 7 commitsWeek of 2026-04-26: 1 commitsWeek of 2026-05-03: 4 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 11 commitsWeek of 2026-05-24: 40 commitsWeek of 2026-05-31: 11 commitsWeek of 2026-06-07: 13 commitsWeek of 2026-06-14: 18 commitsWeek of 2026-06-21: 12 commitsWeek of 2026-06-28: 15 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 1 commitsWeek of 2026-07-19: 3 commitsWeek of 2026-07-26: 24 commitsWeek of 2026-08-02: 7 commitsWeek of 2026-08-09: 4 commitsWeek of 2026-08-16: 4 commitsWeek of 2026-08-23: 10 commitsWeek of 2026-08-30: 7 commitsWeek of 2026-09-06: 5 commitsWeek of 2026-09-13: 9 commitsWeek of 2026-09-20: 5 commitsWeek of 2026-09-27: 4 commitsOct 4, 2025Sep 27, 2026
382 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 5 commitsSun 1:00 — 2 commitsSun 2:00 — 3 commitsSun 3:00 — 0 commitsSun 4:00 — 2 commitsSun 5:00 — 1 commitsSun 6:00 — 1 commitsSun 7:00 — 0 commitsSun 8:00 — 3 commitsSun 9:00 — 1 commitsSun 10:00 — 0 commitsSun 11:00 — 3 commitsSun 12:00 — 1 commitsSun 13:00 — 1 commitsSun 14:00 — 0 commitsSun 15:00 — 5 commitsSun 16:00 — 2 commitsSun 17:00 — 1 commitsSun 18:00 — 1 commitsSun 19:00 — 3 commitsSun 20:00 — 0 commitsSun 21:00 — 0 commitsSun 22:00 — 7 commitsSun 23:00 — 5 commitsMon 0:00 — 1 commitsMon 1:00 — 2 commitsMon 2:00 — 1 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 1 commitsMon 8:00 — 2 commitsMon 9:00 — 5 commitsMon 10:00 — 3 commitsMon 11:00 — 1 commitsMon 12:00 — 3 commitsMon 13:00 — 7 commitsMon 14:00 — 2 commitsMon 15:00 — 5 commitsMon 16:00 — 10 commitsMon 17:00 — 5 commitsMon 18:00 — 3 commitsMon 19:00 — 4 commitsMon 20:00 — 2 commitsMon 21:00 — 2 commitsMon 22:00 — 1 commitsMon 23:00 — 1 commitsTue 0:00 — 0 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 2 commitsTue 7:00 — 0 commitsTue 8:00 — 1 commitsTue 9:00 — 1 commitsTue 10:00 — 0 commitsTue 11:00 — 2 commitsTue 12:00 — 1 commitsTue 13:00 — 4 commitsTue 14:00 — 8 commitsTue 15:00 — 1 commitsTue 16:00 — 7 commitsTue 17:00 — 6 commitsTue 18:00 — 5 commitsTue 19:00 — 5 commitsTue 20:00 — 1 commitsTue 21:00 — 1 commitsTue 22:00 — 4 commitsTue 23:00 — 1 commitsWed 0:00 — 1 commitsWed 1:00 — 2 commitsWed 2:00 — 2 commitsWed 3:00 — 0 commitsWed 4:00 — 1 commitsWed 5:00 — 1 commitsWed 6:00 — 1 commitsWed 7:00 — 3 commitsWed 8:00 — 1 commitsWed 9:00 — 2 commitsWed 10:00 — 2 commitsWed 11:00 — 3 commitsWed 12:00 — 3 commitsWed 13:00 — 7 commitsWed 14:00 — 3 commitsWed 15:00 — 4 commitsWed 16:00 — 6 commitsWed 17:00 — 9 commitsWed 18:00 — 8 commitsWed 19:00 — 4 commitsWed 20:00 — 2 commitsWed 21:00 — 2 commitsWed 22:00 — 1 commitsWed 23:00 — 1 commitsThu 0:00 — 2 commitsThu 1:00 — 0 commitsThu 2:00 — 1 commitsThu 3:00 — 0 commitsThu 4:00 — 2 commitsThu 5:00 — 7 commitsThu 6:00 — 1 commitsThu 7:00 — 3 commitsThu 8:00 — 1 commitsThu 9:00 — 0 commitsThu 10:00 — 2 commitsThu 11:00 — 3 commitsThu 12:00 — 3 commitsThu 13:00 — 5 commitsThu 14:00 — 3 commitsThu 15:00 — 5 commitsThu 16:00 — 4 commitsThu 17:00 — 6 commitsThu 18:00 — 2 commitsThu 19:00 — 2 commitsThu 20:00 — 2 commitsThu 21:00 — 3 commitsThu 22:00 — 2 commitsThu 23:00 — 9 commitsFri 0:00 — 2 commitsFri 1:00 — 1 commitsFri 2:00 — 1 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 1 commitsFri 7:00 — 1 commitsFri 8:00 — 2 commitsFri 9:00 — 3 commitsFri 10:00 — 4 commitsFri 11:00 — 6 commitsFri 12:00 — 1 commitsFri 13:00 — 4 commitsFri 14:00 — 2 commitsFri 15:00 — 15 commitsFri 16:00 — 16 commitsFri 17:00 — 8 commitsFri 18:00 — 3 commitsFri 19:00 — 4 commitsFri 20:00 — 0 commitsFri 21:00 — 0 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 3 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 2 commitsSat 10:00 — 0 commitsSat 11:00 — 3 commitsSat 12:00 — 2 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 1 commitsSat 18:00 — 1 commitsSat 19:00 — 1 commitsSat 20:00 — 1 commitsSat 21:00 — 0 commitsSat 22:00 — 1 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Jun 6, 2026daily#20+55
Jun 5, 2026daily#24+19
  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    195.2K stars · Rust

  • farion1231/cc-switch

    A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

    140K stars · Rust

  • openai/codex

    Lightweight coding agent that runs in your terminal

    127.8K stars · Rust

  • denoland/deno

    A modern runtime for JavaScript and TypeScript.

    108.6K stars · Rust

  • ruvnet/RuView

    π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.

    96.4K stars · Rust

  • oven-sh/bun

    Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one

    96.1K stars · Rust