Zero Learning Curve
No new DSL. No replay constraints. Write normal async code — Sayiir makes it durable automatically.
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
@taskdef fetch_user(user_id: int) -> dict: return {"id": user_id, "name": "Alice"}
@taskdef 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 →