Saikuro
Cross-language invocation fabric. Typed function calls, streams, and channels across TypeScript, Python, C#, Rust, C, and C++.
Transport Agnostic
Strict Schema
Six Primitives
WASM Ready
Normal multi-language setups mean HTTP boilerplate, JSON that drifts out of sync, and a week debugging silent failures.
Saikuro replaces all of it. One protocol, thin adapters, zero hand-written bindings. Define functions once, call them from any language.
Features
Same wire format whether you are talking in-process, over a Unix socket, or across a WebSocket. Pick the transport that fits; the protocol does not care.
Functions, types, capabilities, and namespaces are all declared in a schema the runtime enforces. No more “I thought it accepted a string” surprises.
Call, cast, stream, channel, batch, and resource. Use the right primitive for the job instead of shoehorning everything into request/response.
Thin clients for TypeScript, Python, C#, Rust, C, and C++. Consistent API surface across every language. Adding a new language means writing a transport and a schema mapper.
Providers announce their schema automatically during development. No codegen step until you freeze things for production.
Run the runtime and providers entirely in the browser via WASM. WasmHost transport uses BroadcastChannel for same-origin adapter communication. Storage backends for IndexedDB, OPFS, and Web Storage.
Quick Example
TypeScript provider, Python caller. No IDL, no stub generator, no HTTP server.
import { SaikuroProvider } from "@nisoku/saikuro";
const provider = new SaikuroProvider("math");
provider.register("add", (a: number, b: number) => a + b);
await provider.serve("unix:///tmp/saikuro.sock");
from saikuro import SaikuroClient
async with SaikuroClient.connect("unix:///tmp/saikuro.sock") as client:
result = await client.call("math.add", [1, 2])
print(result) # 3
Installation
npm install @nisoku/saikuro
pip install saikuro
dotnet add package Saikuro
[dependencies]
saikuro = "0.1"