Sayiir
Durable workflows for Python, powered by a Rust runtime.
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 platform —
pip install sayiirand 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
BaseModeltypes. - Type-safe — Full type stubs (
.pyi) and PEP 561py.typedmarker. 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 orRetryPolicy),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. Usenameto set an explicit task ID..loop(task_fn, *, max_iterations=10, on_max="fail", name=None)— Add a loop. Body returnsLoopResult.again(value)orLoopResult.done(value)..fork()— Start parallel branches. Returns aForkBuilder..branch(task_fn, ...)— Add a branch (one or more chained tasks)..join(task_fn)— Merge parallel branches. Join function receivesdict[str, value]..delay(name, duration)— Add a durable delay ("30s","5m","1h", seconds, ortimedelta)..wait_for_signal(signal_name, *, timeout=None)— Wait for an external signal..route(key_fn, *, keys=["a", "b"])— Start conditional branching. Returns aBranchBuilder.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 theFlowbuilder..build()— Finalize and return aWorkflow.
Task Context
get_task_context()— Returns aTaskExecutionContextwithworkflow_id,instance_id,task_id,metadata, andworkflow_metadata, orNoneoutside of task execution.
Execution
run_workflow(workflow, input, *, instance_id=None, backend=None)— Execute a workflow. Withoutinstance_id, runs in-memory. Withinstance_idandbackend, runs with full checkpointing (raisesWorkflowErrorif the workflow doesn't complete). Returns the final output.run_durable_workflow(workflow, instance_id, input, backend=None)— Execute with checkpointing. Returns aWorkflowStatus.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 withWorkerfor the distributed model..submit(workflow, instance_id, input)— Submit a workflow for execution. Returns aWorkflowStatus..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 aWorkflowStatus.
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 & 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.0for automatic model validation
License
MIT
Links
⭐ If you find Sayiir useful, give us a star on GitHub ⭐
Metadata
Release files for sayiir 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sayiir-1.0.0.tar.gz | 318.3 kB | Details |
Built distributions (wheels)
Total release size: 63.5 MB
Release files / sayiir-1.0.0.tar.gz
| Download URL | sayiir-1.0.0.tar.gz |
|---|---|
| Size | 318.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ab38d1600f0671d012cb7e43140e4d9fb628cbc03358900fa53898d6657ad5c3
|
|
BLAKE2b-256 checksum How to use checksums |
39a53f3f3a4a605d814e38a30542939a7d2b73478001aa6f7a372bf051fb4204
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp313-cp313-win_amd64.whl
| Download URL | sayiir-1.0.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
1e8a06b72f8480e0ad7d3fef389e6568711a0ca656f496148abf377f3d115b43
|
|
BLAKE2b-256 checksum How to use checksums |
52fb3fc5afa93a25ac022fb25a11b4b17fe691b75a538fafa4fec314051b968c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sayiir-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
29a5d38074e8c818099fd4d0f5b0d5a80c6313a552bdc99d306f2dcae632f3c8
|
|
BLAKE2b-256 checksum How to use checksums |
5502222e5ac680f2fc314eda686c8abc38d2a0be57f2a9104b19a3f06fdbe235
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | sayiir-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
0ca33155dab12d690e4f39c9ca1e92e3dce485730db42923e2c18636138f54a8
|
|
BLAKE2b-256 checksum How to use checksums |
2d215c72bb251fc729f0bfbf1338223f0e2a4b2a18c5db5d32ffaf5ff475090c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | sayiir-1.0.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8a1ce0f1b20f89d9f62597ce2ed71bc1ec34e628043968e9241b7fc247ee1036
|
|
BLAKE2b-256 checksum How to use checksums |
3f300e3c63c42e527fdd8393143f3f6cde33db94490dcc02d508edf63bb60e64
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | sayiir-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
4915b4324ff5789fd513209276c7e87fac2fd9fc6200499c34ee3563871006c1
|
|
BLAKE2b-256 checksum How to use checksums |
2f7521600500ea1304205ec7ec745b30c21a0ef4272a047e3d9e282aec155001
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp312-cp312-win_amd64.whl
| Download URL | sayiir-1.0.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
21312b12401a59536f068a6ce1c3cd34d7723cb3be5feb812595487670c4d718
|
|
BLAKE2b-256 checksum How to use checksums |
7932a8c18a3fc3cd7fc30b324d4d51b494fe200b91def56cf5414197d22e1203
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sayiir-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
0318159a8f9b7579f458bb3ac6134026c390cd3f9e0ec74f325752712983f8d9
|
|
BLAKE2b-256 checksum How to use checksums |
9236e3f0b759f3d55ea13831fe7091f1593001f6f44c7be38b2933a188e042a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | sayiir-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
8f964ddad45ec500d96c551d76ba9611d6345358299c4428ec18fba312540bdb
|
|
BLAKE2b-256 checksum How to use checksums |
67d0612eafbaa69eff5895e14a171fd56be3db7e0fe4483ca5736cc3401def0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | sayiir-1.0.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
63ef8bf749d6a6cc5bda6ce7a442835dad95e3f83dc2c1fcc717df705c6dfbc4
|
|
BLAKE2b-256 checksum How to use checksums |
86e354ed3a703854c95a1b422f721b1eb14cabb9eaf931d5c03aa0605e263a6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | sayiir-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
137d3354e9ae1680f5e23f55073f63954ca4bc4a5073cd5ad22d25fa83fbe463
|
|
BLAKE2b-256 checksum How to use checksums |
90739b8883c6564e73d981094e766ce7483fccb1200bdf947680fe4faf9fdd06
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp311-cp311-win_amd64.whl
| Download URL | sayiir-1.0.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0ba467062c1dd72be4e91c6db0b866dd9f40013377360508a7ab215ce49138f6
|
|
BLAKE2b-256 checksum How to use checksums |
3602ffa23801259a87fc41ade249c71982dd6acae826cd81e34189b09e113ccf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sayiir-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
bd8bc3c64bc3be71b4a317bc359c007ba713a84e732b314d81a1ae421c96b7cd
|
|
BLAKE2b-256 checksum How to use checksums |
5a2c6e98ab96f10b73e9f784ec36b347afdb64efce4d65a003a841badebdb625
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | sayiir-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
f9c332928f6c14bbc0a84210d09fdf4ba46db66f967b0cfa341cc21cc58cdc35
|
|
BLAKE2b-256 checksum How to use checksums |
e075e04788b27f3347e716826b8391f843c49ce6802e3c37865d778883694681
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | sayiir-1.0.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1af3fdcc63d0c9a22961e5092b100686bc3079f138aa5ea75c196cfac0927ed0
|
|
BLAKE2b-256 checksum How to use checksums |
5c65cd638db410b1cbace8d4eae94db01b102fd419710ed043913ef1ea622c65
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | sayiir-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
82bcbfbaff42af6f9bba19edb584f53d8be1470d51ad47b9fd6fe4ff5e976e4c
|
|
BLAKE2b-256 checksum How to use checksums |
bb0821c9c724a98c84b1ed8bf59c22d73c425783c8fe3b4ada0419ed9135ddb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp310-cp310-win_amd64.whl
| Download URL | sayiir-1.0.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d2bbc15368a980011142a725ac0322c52c07e3839b0669356a2fb515243259b1
|
|
BLAKE2b-256 checksum How to use checksums |
30acb5b94d973bafb5b8f9df1ba2626b7a4c0eeaf8f9fc6e188a4b1fa7e8cd3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sayiir-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
c57818ea63d1e07b27126017145a71545c063b8a18962dbaf24d0a3605e9c83b
|
|
BLAKE2b-256 checksum How to use checksums |
33e299164eec6922bbdb8b22999a9e3309716bb127b7ffaaa93610756af14f1a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | sayiir-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
87fe88d60f794601a012795a8aca35655f7cf436c9d89fcc2df8ed7c1a242473
|
|
BLAKE2b-256 checksum How to use checksums |
7f94c02d57fa3b2873dea23d8972e0cc643d7518c5d4a073325f2f51cc604b49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | sayiir-1.0.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8e705cacc5b89b104691625481b32c920b410e0cb3ee5e3f11f8b80d41504168
|
|
BLAKE2b-256 checksum How to use checksums |
b5ef22caa400f5e8176d4cc2b2c1b9c8be25a33c4e8ca75cb2051cd552acecb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency logRelease files / sayiir-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | sayiir-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
866f26967f3756fac1edec9a3aa205de38d6610c1e277e54f86f4bc2cfcc9dca
|
|
BLAKE2b-256 checksum How to use checksums |
ea445fd896202921a2263b80a4b6df3822ce1d904ef59da25e1a994aa032d96c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 7, 2026.
Transparency log