Skip to content

Sayiir — Fast, Simple Durable Workflow Engine

The fast, simple durable workflow engine. Zero learning curve — just write normal Python or Rust. Native performance, automatic checkpointing, no infrastructure to deploy.

Zero Learning Curve

No new DSL. No replay constraints. Write normal async code — Sayiir makes it durable automatically.

Simple — Library Not Platform

pip install sayiir or add a Cargo dependency. No orchestrator to deploy, no infrastructure to manage.

Fast — Native Rust Performance

Rust core with zero-copy serialization (rkyv). Sub-millisecond checkpointing, hundreds of thousands of concurrent activities.

Pluggable & Lightweight

Swap backends, codecs, and runners. InMemory for tests, Postgres for production. Minimal footprint.

from sayiir import task, Flow, run_workflow
@task
def fetch_user(user_id: int) -> dict:
return {"id": user_id, "name": "Alice"}
@task
def send_email(user: dict) -> str:
return f"Sent welcome to {user['name']}"
workflow = Flow("welcome").then(fetch_user).then(send_email).build()
result = run_workflow(workflow, 42)
use sayiir_runtime::prelude::*;
#[task(timeout = "30s", retries = 3)]
async fn fetch_user(id: u64) -> Result<User, BoxError> {
db.get_user(id).await
}
#[task]
async fn send_email(user: User) -> Result<(), BoxError> {
email_service.send_welcome(&user).await
}
let workflow = workflow!("welcome", JsonCodec, registry,
fetch_user => send_email
).unwrap();

Sayiir Server — Coming Soon

Same workflows, same code — plus a managed platform with a web dashboard, multi-tenancy, scheduled triggers, observability, and Kubernetes-native deployment. Learn more →