Skip to main content

Durable workflow engine with Rust core and Python bindings — checkpointing, fork/join, distributed workers

Project description

Sayiir

Durable workflows for Python, powered by a Rust runtime.

License: MIT Python 3.10+ Discord Socket Badge

Write plain Python functions. Sayiir makes them durable — automatic checkpointing, crash recovery, and parallel execution with zero infrastructure.

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)
# "Sent welcome to Alice"

No DSL. No YAML. No determinism constraints. No infrastructure to deploy.

Why Sayiir?

  • No replay, no determinism rules — Unlike Temporal, Restate, and other replay-based engines, Sayiir checkpoints after each task and resumes from the last checkpoint. Your tasks can call any API, use any library, read the clock, generate random values. No restrictions.
  • A library, not a platformpip install sayiir and write workflows. No server cluster, no separate services. Optional PostgreSQL for production persistence.
  • Rust core — All orchestration, checkpointing, and execution runs in Rust via PyO3. You write Python; Rust handles the hard parts.
  • Pydantic integration — Automatic input validation and output serialization for BaseModel types.
  • Type-safe — Full type stubs (.pyi) and PEP 561 py.typed marker. Works with mypy and pyright.

Installation

pip install sayiir

From source (development):

git clone https://github.com/sayiir/sayiir.git
cd sayiir/sayiir-python
pip install -e ".[dev]"

Requires a Rust toolchain (rustup) for building from source.

Quickstart

Inline lambdas — zero boilerplate

from sayiir import Flow, run_workflow

workflow = (
    Flow("pipeline")
    .then(lambda x: x * 2)
    .then(lambda x: x + 1)
    .then(lambda x: str(x))
    .build()
)
result = run_workflow(workflow, 5)
# "11"  (5 * 2 = 10, 10 + 1 = 11, str(11))

No decorators, no registration — just pass any callable. Use @task when you need metadata (retries, timeouts, tags) or explicit naming.

Sequential workflow

from sayiir import task, Flow, run_workflow

@task
def double(x: int) -> int:
    return x * 2

@task
def add_ten(x: int) -> int:
    return x + 10

workflow = Flow("math").then(double).then(add_ten).build()
result = run_workflow(workflow, 5)
# 20  (5 * 2 = 10, 10 + 10 = 20)

Durable workflow (survives crashes)

from sayiir import task, Flow, run_durable_workflow

@task(timeout="30s")
def process_order(order_id: int) -> dict:
    return {"order_id": order_id, "status": "processed"}

@task
def send_confirmation(order: dict) -> str:
    return f"Confirmed order {order['order_id']}"

workflow = Flow("order").then(process_order).then(send_confirmation).build()

# Checkpoints after each task — resumes from last checkpoint on crash
status = run_durable_workflow(workflow, "order-123", 42)
print(status.output)           # "Confirmed order 42"
print(status.is_completed())   # True

PostgreSQL persistence

from sayiir import task, Flow, PostgresBackend, run_durable_workflow

@task
def process(x: int) -> int:
    return x * 2

workflow = Flow("persistent").then(process).build()

# Auto-runs migrations on first connect
backend = PostgresBackend("postgresql://localhost/sayiir")
status = run_durable_workflow(workflow, "run-001", 21, backend=backend)

Retry policy

from sayiir import task, RetryPolicy

# Int shorthand (1s initial delay, 2x backoff)
@task(retries=3)
def flaky_call(url: str) -> dict:
    return requests.get(url).json()

# Full control
@task(retries=RetryPolicy(max_retries=3, initial_delay_secs=0.5, backoff_multiplier=2.0))
def precise_retry(url: str) -> dict:
    return requests.get(url).json()

Parallel execution (fork/join)

from sayiir import task, Flow, run_workflow

@task
def validate_payment(order: dict) -> dict:
    return {"payment": "valid"}

@task
def check_inventory(order: dict) -> dict:
    return {"stock": "available"}

@task
def finalize(results: dict) -> str:
    return f"Order complete: {results}"

workflow = (
    Flow("checkout")
    .fork()
        .branch(validate_payment)
        .branch(check_inventory)
    .join(finalize)
    .build()
)
result = run_workflow(workflow, {"order_id": 1})

Multi-step branches

workflow = (
    Flow("pipeline")
    .fork()
        .branch(fetch_data, transform, validate)  # 3-step branch
        .branch(fetch_metadata)                    # 1-step branch
    .join(merge_results)
    .build()
)

Loops

Repeat a task until it signals completion with LoopResult.done().

from sayiir import task, Flow, LoopResult, run_workflow

@task
def refine(draft: str) -> dict:
    improved = improve(draft)
    if is_good_enough(improved):
        return LoopResult.done(improved).to_dict()
    return LoopResult.again(improved).to_dict()

workflow = (
    Flow("iterative")
    .then(initial_draft)
    .loop(refine, max_iterations=5)
    .then(publish)
    .build()
)
result = run_workflow(workflow, "rough draft")

The body task returns LoopResult.again(value) to continue iterating or LoopResult.done(value) to exit. When max_iterations is reached, the default behavior is to fail; pass on_max="exit_with_last" to exit with the last value instead.

Task execution context

Access workflow and task metadata from within a running task using get_task_context().

from sayiir import task, get_task_context

@task(timeout="30s", tags=["io"])
def fetch_data(url: str) -> dict:
    ctx = get_task_context()
    if ctx is not None:
        print(f"Running task {ctx.task_id} in workflow {ctx.workflow_id}")
        print(f"Instance: {ctx.instance_id}")
        print(f"Timeout: {ctx.metadata.timeout_secs}s")
        print(f"Tags: {ctx.metadata.tags}")
        print(f"Workflow metadata: {ctx.workflow_metadata}")
    return do_fetch(url)

get_task_context() returns a TaskExecutionContext with workflow_id, instance_id, task_id, metadata (timeout, retries, tags, version, etc.), and workflow_metadata (the dict passed via Flow("name", metadata={...})), or None if called outside of a task execution.

Pydantic integration

from pydantic import BaseModel
from sayiir import task, Flow, run_workflow

class OrderInput(BaseModel):
    order_id: int
    amount: float

class OrderResult(BaseModel):
    status: str
    message: str

@task
def process(order: OrderInput) -> OrderResult:
    return OrderResult(status="ok", message=f"Processed ${order.amount}")

workflow = Flow("typed").then(process).build()
result = run_workflow(workflow, {"order_id": 1, "amount": 99.99})
# Automatic validation on input, serialization on output

Conditional branching

from sayiir import task, Flow, run_workflow

@task
def classify(ticket: dict) -> str:
    return "billing" if ticket["type"] == "invoice" else "tech"

@task
def handle_billing(ticket: dict) -> str:
    return f"Billing handled: {ticket['id']}"

@task
def handle_tech(ticket: dict) -> str:
    return f"Tech resolved: {ticket['id']}"

@task
def fallback(ticket: dict) -> str:
    return f"Routed to general: {ticket['id']}"

workflow = (
    Flow("support-router")
    .route(classify, keys=["billing", "tech"])
        .branch("billing", handle_billing)
        .branch("tech", handle_tech)
        .default_branch(fallback)
    .done()
    .build()
)
result = run_workflow(workflow, {"id": 1, "type": "invoice"})
# {"branch": "billing", "result": "Billing handled: 1"}

The key function returns a string routing key. The matching branch runs; if no match and no default, the workflow fails. The output is a BranchEnvelope with branch (the key) and result (the branch output).

Task metadata

@task(
    "Process Payment",
    timeout="60s",
    retries=3,
    tags=["payments", "critical"],
    description="Charges the customer's payment method",
)
def process_payment(order: dict) -> dict:
    ...

API Reference

Decorators

  • @task — Mark a function as a workflow task. Accepts a positional name string: @task("name"). Optional params: name, timeout (duration string or seconds), retries (int shorthand or RetryPolicy), tags, description.

Flow Builder

  • Flow(name) — Create a new workflow builder.
  • .then(task_fn, *, name=None) — Append a task to the workflow. Accepts @task-decorated functions, plain functions, or lambdas. Use name to set an explicit task ID.
  • .loop(task_fn, *, max_iterations=10, on_max="fail", name=None) — Add a loop. Body returns LoopResult.again(value) or LoopResult.done(value).
  • .fork() — Start parallel branches. Returns a ForkBuilder.
  • .branch(task_fn, ...) — Add a branch (one or more chained tasks).
  • .join(task_fn) — Merge parallel branches. Join function receives dict[str, value].
  • .delay(name, duration) — Add a durable delay ("30s", "5m", "1h", seconds, or timedelta).
  • .wait_for_signal(signal_name, *, timeout=None) — Wait for an external signal.
  • .route(key_fn, *, keys=["a", "b"]) — Start conditional branching. Returns a BranchBuilder.
  • BranchBuilder.branch(key, *tasks) — Add a named branch for a routing key.
  • BranchBuilder.default_branch(*tasks) — Set the fallback branch for unmatched keys.
  • BranchBuilder.done() — Finish branching and return to the Flow builder.
  • .build() — Finalize and return a Workflow.

Task Context

  • get_task_context() — Returns a TaskExecutionContext with workflow_id, instance_id, task_id, metadata, and workflow_metadata, or None outside of task execution.

Execution

  • run_workflow(workflow, input, *, instance_id=None, backend=None) — Execute a workflow. Without instance_id, runs in-memory. With instance_id and backend, runs with full checkpointing (raises WorkflowError if the workflow doesn't complete). Returns the final output.
  • run_durable_workflow(workflow, instance_id, input, backend=None) — Execute with checkpointing. Returns a WorkflowStatus.
  • resume_workflow(workflow, instance_id, backend) — Resume a workflow from its last checkpoint.
  • cancel_workflow(instance_id, backend, reason=None, cancelled_by=None) — Cancel a running workflow.
  • pause_workflow(instance_id, backend, reason=None, paused_by=None) — Pause a running workflow.
  • unpause_workflow(instance_id, backend) — Unpause a paused workflow.
  • send_signal(instance_id, signal_name, payload, backend) — Send an external signal.

WorkflowStatus

  • .output — The final output value (if completed).
  • .status"completed", "failed", "cancelled", or "in_progress".
  • .is_completed() / .is_failed() / .is_cancelled() / .is_paused() / .is_in_progress() — Status checks.
  • .error — Error message (if failed).
  • .reason / .cancelled_by — Cancellation details.

Retry

  • RetryPolicy(max_retries=2, initial_delay_secs=1.0, backoff_multiplier=2.0) — Exponential backoff retry policy for tasks.

Loop Control

  • LoopResult.again(value) — Continue iterating with a new value.
  • LoopResult.done(value) — Exit the loop with a final value.
  • OnMax.FAIL / OnMax.EXIT_WITH_LAST — Policy when max iterations is reached.

Backends

  • InMemoryBackend() — In-memory storage for development and testing (default).
  • PostgresBackend(url) — PostgreSQL persistence. Auto-runs migrations on first connect.

WorkflowClient (distributed)

  • WorkflowClient(backend, *, conflict_policy=None) — Client for submitting and controlling workflow instances without executing tasks. Used with Worker for the distributed model.
  • .submit(workflow, instance_id, input) — Submit a workflow for execution. Returns a WorkflowStatus.
  • .cancel(instance_id, *, reason=None, cancelled_by=None) — Cancel a workflow instance.
  • .pause(instance_id, *, reason=None, paused_by=None) — Pause a workflow instance.
  • .unpause(instance_id) — Unpause a paused workflow.
  • .send_signal(instance_id, signal_name, payload) — Send an external signal.
  • .status(instance_id) — Get the current status. Returns a WorkflowStatus.

Architecture

graph LR
    A["Your Python code<br/><b>@task</b> functions"] -->|input| B["Sayiir · Rust<br/>Orchestration<br/>Checkpointing<br/>Crash recovery<br/>Fork/join/branch<br/>Loops &amp; routing<br/>Serialization"]
    B -->|checkpoint<br/>after each task| C["Storage"]
    C -->|resume| B
    B -->|output| A

Python provides task implementations. Rust handles everything else: building the execution graph, running tasks in order, checkpointing results, recovering from crashes, and managing parallel branches.

The project follows hexagonal architecture — the core domain has zero infrastructure dependencies, all dependencies flow inward, and every integration point (storage, serialization, execution) is a swappable trait-based adapter.

Requirements

  • Python 3.10+
  • Optional: pydantic >= 2.0 for automatic model validation

License

MIT

Links


⭐ If you find Sayiir useful, give us a star on GitHub

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sayiir-0.4.0.tar.gz (254.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sayiir-0.4.0-cp313-cp313-win_amd64.whl (2.9 MB view details)

Uploaded CPython 3.13Windows x86-64

sayiir-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

sayiir-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

sayiir-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

sayiir-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

sayiir-0.4.0-cp312-cp312-win_amd64.whl (2.9 MB view details)

Uploaded CPython 3.12Windows x86-64

sayiir-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sayiir-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

sayiir-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

sayiir-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

sayiir-0.4.0-cp311-cp311-win_amd64.whl (2.9 MB view details)

Uploaded CPython 3.11Windows x86-64

sayiir-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sayiir-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

sayiir-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

sayiir-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

sayiir-0.4.0-cp310-cp310-win_amd64.whl (2.9 MB view details)

Uploaded CPython 3.10Windows x86-64

sayiir-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

sayiir-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

sayiir-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

sayiir-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file sayiir-0.4.0.tar.gz.

File metadata

  • Download URL: sayiir-0.4.0.tar.gz
  • Upload date:
  • Size: 254.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sayiir-0.4.0.tar.gz
Algorithm Hash digest
SHA256 bd42562da2822c60c54641ba33e4e4f16989417579591aa5e36979fea3a574c4
MD5 f9a9a786a3a7eb0cb274ede87c13d0a3
BLAKE2b-256 06cd62427cdc70fb5cc6ab5ef45f7645166bac8eecda706a2f9c04f02255a253

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0.tar.gz:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: sayiir-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sayiir-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2cfea254d94ee6f2ac4457738065329331e1ae941ed1c62b9d0611fb6e1e6617
MD5 9fa3f9b61342d6504f7a14147b953de9
BLAKE2b-256 cf89a762bdfa942dd82962e83284d5437225587a936648e9e36b755fcfbad07b

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5c46373bc2ceaf370782175eb4dc22218b1401b8fee2c98f61ec027baacc3625
MD5 e62964a7d4fd6e5d5ee0af7921c3e4d1
BLAKE2b-256 c90907cf8dd90712c0e23cd78df0a0d5ad752ee28e7ad13fd1d7e1b3ecdff8c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f528d9a7f5ff67feaead304b4ac11b7f6c6e0b5956864a730b7084a7aee203a1
MD5 8d3d133004b8c734ed4a041771d69dc8
BLAKE2b-256 5776613a80d136ec693e65ac58b60883aac3df9e47377a517b5bb3cf5ae147f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 429cba443fdaa899476d8373ad716b8190c8a49cee52bae5578a95d2c24214b7
MD5 44fa1abb7523c7e1c508293998a28f49
BLAKE2b-256 adc44641ea83b225a4135a4caad248c8d4ef184597c3283c716fc2a7d100d303

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8ffaebe858a1bb78f6c539158a93136a14f08e817b5028e12c6741be58a10379
MD5 af099b52c159946567effb5da8d944fb
BLAKE2b-256 076cf157e00f2f0611019096297db0d88c45193b734f96c778055183d34a16b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sayiir-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sayiir-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c9690f3d9602786362849058d094a8b7c597a5b37610531f1c6774882b56db81
MD5 94b94317a4a963aebed58020da92b610
BLAKE2b-256 0cf4179412c60449654e4e001a90befc338671c5caeb79895974a21d285b25bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf42239ceea9a9ee3fc88bc0efd5c2c70ac662bd3d6f82b60bdd8a66e063e652
MD5 a2d1160a0cd838809400dd022fbbdd5f
BLAKE2b-256 35db9e83d589bb4923ce152be71237b05e7cce0abc6c2698d8adf76432ec048e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5efd0fd894ac4c3465075a53784be1b3f32df00c5852b27c8261ab5f0c1e702a
MD5 b629169a2c0a22f7dd9bc2141b2d757e
BLAKE2b-256 b5509234bc5007356e6c4b43bae1d878cca29a03838af3ffb65663f9b392df8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f8d2804e43b330945e59a48c689448a219c5e3fb7cc094066da623f87200915
MD5 27a2fd4133ed614d194fece4c53bcb02
BLAKE2b-256 68dac0ae85b4d5ce4c6aa7a19be4f20a4d7446e28d786145c5cff4a1ee9dd861

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3f67ea7c192d48a55a5f2c8ce94f6774ea5dfadb4e32b5c99d5de63b50e31b35
MD5 5b8a4d776b0695150ec5242576ac4a4c
BLAKE2b-256 5838b1dab1584fa5420d7c65fb6429ecf74d55037d71e96f28482fccedf5e280

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sayiir-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sayiir-0.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 890cf31b290da2dee68a924c807bb59a26ce3705020e54bbe73ff32ac4f93cce
MD5 a0b04a92455d160b1bb7d46f4c582f6f
BLAKE2b-256 889a49ef894e5a82bd955462acbb48aacb49910d761bf37fc93822c644821362

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 07ab570dec6694a9083d14d40fc5c63c018b1a8e9661b868b242dc1ade9f6012
MD5 e4ce9e436a52478310f5020a0ab0843a
BLAKE2b-256 bd852ba697ba01d444e8f025cdb5b6dd68440d55caa23b48c4fdc69e602a837b

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1c534d8bdf064f62004766e85b394114873fe37ae5023ef6cf0ae9975dbe972a
MD5 96d0ea75272d5cd18e991509342d3c9e
BLAKE2b-256 7bae2d4014f70a099cc7894f4ccf0ada1a60a247849246d586769e4bf852a217

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05b1715d321199f6afae5c140b17c23a21d7f3f90a0306d1570f94f5a17cc20e
MD5 641f4677bff208898aa0faf6be3cd3a8
BLAKE2b-256 7acdad6c4907f5872aac292658e2650b1cd309301a9ee242de995d3063002137

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4b59da2ea6f469be39c46890fb70ed12ae8c40074999a6c94a1364043d32ac03
MD5 dc50137c24ad85013eac54d6f3e6b0ef
BLAKE2b-256 68344a1f1b1f58b582b825cd7874920ec6f48b34d762a2e6ed5d361825aef5c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: sayiir-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sayiir-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8522046730cddf0b6ff7960e9f54d45cb4308f10085c4b28fdb35d3e6ec94a7f
MD5 192e2c5799ae585b718dfc3ef299955c
BLAKE2b-256 a696055800519d8f3e967afbb0ef76996f260c86522c3c2e5238b4de5c8ef3df

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4f026f4dd5af949871d8ae73378b09fdaed79be46014987d1101690353b998a2
MD5 6dedc260e532b21694b02c9801e003ea
BLAKE2b-256 4d5a11a6ce4e63f84a95da207af33c12efa7017932c33038da792071492ebac9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0000ba5d88844b318cfe5d4d441d916c95439a20d34a0073a1a15f8ddd966077
MD5 cd2a7ada1fd1bf3703dda664ea1b24e4
BLAKE2b-256 68d016e93bc22537e4dfcea5208a6e135b7c43de0112e5b949475a221929b517

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4cd29e2e6c7e9227e9a88bbf50200432c0d623325b7167ef5ab844a49a7cf427
MD5 34b5d330f9bd2c7d43808ec15f805bc4
BLAKE2b-256 886a9e44a34e767560751aaccb6d9892a2168a315cf4d0117e090f87f25d38ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sayiir-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for sayiir-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 46983c4f3baf683289e642d5c6b4d9956d74a71e65dc8bc397c650d7c35e82a2
MD5 ffe48a757b1c3c77305393fcabdf0247
BLAKE2b-256 31b50e40f68d5f6e087d672d56b428e01e6fe7a2fe8c9c6555237efd76a38eaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for sayiir-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: release.yml on sayiir/sayiir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page