{"id":44728372,"url":"https://github.com/sayiir/sayiir","last_synced_at":"2026-03-05T10:03:57.578Z","repository":{"id":331607472,"uuid":"1129167623","full_name":"sayiir/sayiir","owner":"sayiir","description":"Sayiir — Lightweight embeddable durable workflow engine in Rust with Python bindings. Checkpoint-based recovery, no deterministic replay. Alternative to Temporal, Restate, Airflow..","archived":false,"fork":false,"pushed_at":"2026-02-22T21:50:40.000Z","size":4317,"stargazers_count":3,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-23T00:56:09.870Z","etag":null,"topics":["ai-agents","async-rust","checkpointing","distributed","distributed-systems","durable-execution","durable-workflows","embeddable","orchestration","pyo3","python","rust","temporal-alternative","workflow","workflow-automation","workflow-engine"],"latest_commit_sha":null,"homepage":"http://docs.sayiir.dev/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sayiir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-06T17:46:15.000Z","updated_at":"2026-02-22T21:50:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sayiir/sayiir","commit_stats":null,"previous_names":["sayiir/sayiir"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/sayiir/sayiir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayiir%2Fsayiir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayiir%2Fsayiir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayiir%2Fsayiir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayiir%2Fsayiir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sayiir","download_url":"https://codeload.github.com/sayiir/sayiir/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayiir%2Fsayiir/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29943690,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T13:49:17.081Z","status":"ssl_error","status_checked_at":"2026-02-28T13:48:50.396Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["ai-agents","async-rust","checkpointing","distributed","distributed-systems","durable-execution","durable-workflows","embeddable","orchestration","pyo3","python","rust","temporal-alternative","workflow","workflow-automation","workflow-engine"],"created_at":"2026-02-15T18:04:18.690Z","updated_at":"2026-02-28T17:04:35.889Z","avatar_url":"https://github.com/sayiir.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sayiir\n\n**Durable, fast workflow engine that feels like writing normal code.** Graph-based, continuation-driven execution with a Rust core and Python/Node.js bindings — no DSL, no replay, workflows from your plain code.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Discord](https://img.shields.io/badge/Discord-Join-7289da)](https://discord.gg/A2jWBFZsNK)\n\n[![crates.io](https://img.shields.io/crates/v/sayiir-core.svg)](https://crates.io/crates/sayiir-core)\n[![docs.rs](https://docs.rs/sayiir-core/badge.svg)](https://docs.rs/sayiir-core)\n[![crates.io downloads](https://img.shields.io/crates/d/sayiir-core.svg)](https://crates.io/crates/sayiir-core)\n[![MSRV](https://img.shields.io/badge/MSRV-1.85-93450a.svg)](https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html)\n\n[![PyPI](https://img.shields.io/pypi/v/sayiir.svg)](https://pypi.org/project/sayiir/)\n[![PyPI downloads](https://static.pepy.tech/badge/sayiir/month)](https://pepy.tech/project/sayiir)\n[![Python](https://img.shields.io/badge/python-3.10–3.13-3776ab.svg)](https://www.python.org)\n\n[![npm](https://img.shields.io/npm/v/sayiir.svg)](https://www.npmjs.com/package/sayiir)\n[![npm downloads](https://img.shields.io/npm/dm/sayiir.svg)](https://www.npmjs.com/package/sayiir)\n[![Node.js](https://img.shields.io/badge/node-18%20%7C%2020%20%7C%2022-339933.svg)](https://nodejs.org)\n\n\u003e Sayiir is under active development. Core functionality works. We welcome contributors, maintainers, and sponsors.\n\n- \u0026#129408; **Rust core** — High-performance, memory-safe workflow engine\n- \u0026#128737; **Durable** — Automatic checkpointing \u0026 crash recovery with pluggable persistence\n- \u0026#129520; **Multi-language** — Type-safe Python, TypeScript, and Rust bindings\n- \u0026#10024; **Built for developers** — Low learning curve; native language idioms, async code you already know, no DSL. No separate server or infra to deploy; get up and running in minutes. [Enterprise server](https://docs.sayiir.dev/roadmap/) in active development for when you need one\n- \u0026#9208; **Workflow control** — Cancel, pause, and resume running workflow instances\n- \u0026#128065; **Observability** — Built-in OpenTelemetry tracing and logging for full workflow visibility\n\n---\n\n## Why Sayiir?\n\n\u0026#9889;\u0026ensp;**No replay overhead.** Resume from the last checkpoint, not from the beginning of your workflow history. JSON by default, swap to zero-copy rkyv or any binary format via the pluggable codec abstraction.\n\n\u0026#128274;\u0026ensp;**No determinism constraints.** Continuation-based execution means your code can call any API, use any library — no purity rules, no sandboxing.\n\n\u0026#9997;\u0026ensp;**Minimal learning curve.** Familiar language patterns with sensible defaults that get out of your way. No DSL, no YAML — just code.\n\n#### 🐍 Python\n\n```python\nfrom sayiir import task, Flow, run_workflow\n\n@task\ndef fetch_user(user_id: int) -\u003e dict:\n    return {\"id\": user_id, \"name\": \"Alice\"}\n\n@task\ndef send_email(user: dict) -\u003e str:\n    return f\"Sent welcome to {user['name']}\"\n\nworkflow = Flow(\"welcome\").then(fetch_user).then(send_email).build()\n\n# Quick run — no persistence\nresult = run_workflow(workflow, 42)\n\n# Or plug in a durable backend for crash recovery\nfrom sayiir import run_durable_workflow, PostgresBackend\ninstance_id = f\"welcome-{user_id}\"\nstatus = run_durable_workflow(workflow, instance_id, 42, backend=PostgresBackend(\"postgresql://localhost/sayiir\"))\n```\n\n\u003ca href=\"https://docs.sayiir.dev/playground/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Try_it_live-▶-00C853\" alt=\"Try it live\" height=\"20\"\u003e\u003c/a\u003e\n\n#### 🦀 Rust\n\n```rust\nuse sayiir_runtime::prelude::*;\n\n#[task(timeout = \"30s\", retries = 3)]\nasync fn fetch_user(id: UserId) -\u003e Result\u003cUser, BoxError\u003e {\n    db.get_user(id).await\n}\n\n#[task]\nasync fn send_email(user: User) -\u003e Result\u003c(), BoxError\u003e {\n    email_service.send_welcome(\u0026user).await\n}\n\n// Compose — workflow! auto-registers all tasks\nlet workflow = workflow! {\n    name: \"welcome\",\n    steps: [fetch_user, send_email]\n}\n.unwrap();\n\n// Quick run — no persistence\nworkflow.run_once(user_id).await?;\n\n// Or plug in a durable backend for crash recovery\nlet runner = CheckpointingRunner::new(PostgresBackend::connect(\"postgres://...\").await?);\nlet instance_id = format!(\"welcome-{user_id}\");\nrunner.run(\u0026workflow, \u0026instance_id, user_id).await?;\n```\n\n#### \u003cimg src=\"https://img.shields.io/badge/Node.js-339933?logo=nodedotjs\u0026logoColor=white\u0026style=flat-square\" height=\"20\"\u003e\n\n```typescript\nimport { task, flow, runWorkflow } from \"sayiir\";\n\nconst fetchUser = task(\"fetch-user\", (id: number) =\u003e {\n  return { id, name: \"Alice\" };\n});\n\nconst sendEmail = task(\"send-email\", (user: { id: number; name: string }) =\u003e {\n  return `Sent welcome to ${user.name}`;\n});\n\nconst workflow = flow\u003cnumber\u003e(\"welcome\")\n  .then(fetchUser)\n  .then(sendEmail)\n  .build();\n// Quick run — no persistence\nconst result = await runWorkflow(workflow, 42);\n\n// Or plug in a durable backend for crash recovery\nimport { runDurableWorkflow, PostgresBackend } from \"sayiir\";\nconst instanceId = `welcome-${42}`;\nconst status = runDurableWorkflow(workflow, instanceId, 42, PostgresBackend.connect(\"postgresql://localhost/sayiir\"));\n```\n\n\u003ca href=\"https://docs.sayiir.dev/playground/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Try_it_live-▶-00C853\" alt=\"Try it live\" height=\"20\"\u003e\u003c/a\u003e\n\n---\n\n## When to Use Sayiir\n\nSayiir is a full-featured, embeddable workflow engine — branching, loops, fork/join, signals, cancel, pause, resume, retries, timeouts — that lives inside your application as a library, not beside it as a platform.\n\n**Sayiir shines when you:**\n\n- Need durable workflows (order sagas, onboarding flows, ETL, data pipelines) without deploying separate infrastructure\n- Want `cargo add` / `pip install` / `npm install` and a working workflow engine in minutes, not days\n- Already have a Postgres (or just want in-memory for dev) and don't want to manage a separate cluster\n- Value a low learning curve — write normal async code, add `@task`, ship to production\n\n\u003e Sayiir isn't trying to replace major workflow platforms. But for many use cases, those platforms add significant infrastructure overhead and complexity that feels like overkill. Sayiir gives you real durability and covers most workflow composition and execution scenarios with less ceremony.\n\n---\n\n## Documentation\n\n**[docs.sayiir.dev](https://docs.sayiir.dev)** — Full documentation with guides, tutorials, and API reference.\n\n**Getting Started**\u0026ensp;\n[Python](https://docs.sayiir.dev/getting-started/python/) \u0026#183;\n[Node.js](https://docs.sayiir.dev/getting-started/nodejs/) \u0026#183;\n[Rust](https://docs.sayiir.dev/getting-started/rust/)\n\n**Learn**\u0026ensp;\n[How It Works](https://docs.sayiir.dev/concepts/how-it-works/) \u0026#183;\n[Architecture](https://docs.sayiir.dev/concepts/architecture/) \u0026#183;\n[Guides](https://docs.sayiir.dev/guides/durable-workflows/) \u0026#183;\n[Tutorials](https://docs.sayiir.dev/tutorials/order-processing-python/) \u0026#183;\n[Examples](https://github.com/sayiir/sayiir/tree/main/examples)\n\n**Reference**\u0026ensp;\n[Python API](https://docs.sayiir.dev/reference/python-api/) \u0026#183;\n[Node.js API](https://docs.sayiir.dev/reference/nodejs-api/) \u0026#183;\n[Rust API](https://docs.sayiir.dev/reference/rust-api/) \u0026#183;\n[Observability \u0026 OpenTelemetry](https://docs.sayiir.dev/guides/observability/) \u0026#183;\n[Roadmap](https://docs.sayiir.dev/roadmap/) \u0026#183;\n[Contributing](CONTRIBUTING.md)\n\n---\n\n## Status\n\n| Component | Status |\n|:--|:--|\n| **Rust**\u0026ensp; sayiir-core \u0026#183; sayiir-macros \u0026#183; sayiir-runtime \u0026#183; sayiir-persistence | ![stable](https://img.shields.io/badge/stable-brightgreen) |\n| **Python** bindings | ![stable](https://img.shields.io/badge/stable-brightgreen) |\n| **Node.js** bindings | ![stable](https://img.shields.io/badge/stable-brightgreen) |\n| **PostgreSQL** backend | ![stable](https://img.shields.io/badge/stable-brightgreen)\u0026ensp;requires PG 13+ |\n| **Cloudflare Workers** | ![in progress](https://img.shields.io/badge/in%20progress-yellow) |\n| **Enterprise server** | ![planned](https://img.shields.io/badge/planned-lightgrey) |\n\n---\n\n## Community\n\nWe're looking for **contributors**, **maintainers**, **sponsors**, and **early adopters**.\n\n[![Discord](https://img.shields.io/badge/Discord-Join%20us-7289da?style=for-the-badge\u0026logo=discord\u0026logoColor=white)](https://discord.gg/A2jWBFZsNK)\n\n[GitHub Issues](https://github.com/sayiir/sayiir/issues) — Bugs and feature requests\u0026ensp;\u0026#183;\u0026ensp;PRs welcome — check `good first issue` labels\u0026ensp;\u0026#183;\u0026ensp;[CONTRIBUTING.md](CONTRIBUTING.md)\n\n## License\n\nMIT\n\n---\n\n\u003e **Stop fighting your workflow engine. Start shipping.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayiir%2Fsayiir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsayiir%2Fsayiir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayiir%2Fsayiir/lists"}