iii-architecture-patte…
Use when composing iii primitives into backend architectures: durable workflows, reactive backends, agentic pipelines, event-driven CQRS, effect pipelines, and…
Install the iii engine, set up your first worker, and get a working backend running. Use when a user wants to start a new iii project, install the SDK, or needs help with initial setup and configuration.
$ npx -y skills add iii-hq/iii --skill iii-getting-started --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/iii-getting-startedContext preview
The summary Claude sees to decide when to auto-load this skill.
Install the iii engine, set up your first worker, and get a working backend running. Use when a user wants to start a new iii project, install the SDK, or needs help with initial setup and configuration.
name: iii-getting-started description: >- Install the iii engine, set up your first worker, and get a working backend running. Use when a user wants to start a new iii project, install the SDK, or needs help with initial setup and configuration.
iii replaces your API framework, task queue, cron scheduler, pub/sub, state store, and observability pipeline with a single engine and three primitives: **Function**, **Trigger**, **Worker**.
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh
Verify it installed:
iii --version
iii create
Follow the interactive prompts to select a template and language. The default quickstart template includes TypeScript, Python, and Rust workers.
Then change into the project directory you chose at the prompt:
cd <your-project>
iii compose --namespace dev --up --file worker-compose.yaml
The file's `engine:` section starts the engine; `containers:` starts project workers. The engine commonly listens on `ws://localhost:49134`. Keep this foreground supervisor running.
Pick your language:
# TypeScript / Node.js pnpm add iii-sdk @iii-dev/helpers # Python pip install iii-sdk iii-helpers # Rust cargo add iii-sdk iii-helpers
import { registerWorker, TriggerAction } from "iii-sdk";
import { Logger } from "@iii-dev/helpers/observability";
const iii = registerWorker(process.env.III_URL ?? "ws://localhost:49134");
iii.registerFunction(
"hello::greet",
async (input) => {
const logger = new Logger();
const name = input?.name ?? "world";
logger.info("Greeting user", { name });
return { message: `Hello, ${name}!` };
},
{ description: "Greet a user by name" },
);
iii.registerTrigger({
type: "http",
function_id: "hello::greet",
config: { api_path: "/hello", http_method: "POST" },
});from iii import register_worker, InitOptions
from iii_helpers.observability import Logger
iii = register_worker(address="ws://localhost:49134", options=InitOptions(worker_name="hello-worker"))
def greet(data):
logger = Logger()
name = data.get("name", "world") if isinstance(data, dict) else "world"
logger.info("Greeting user", {"name": name})
return {"message": f"Hello, {name}!"}
iii.register_function("hello::greet", greet, description="Greet a user by name")
iii.register_trigger({"type": "http", "function_id": "hello::greet", "config": {"api_path": "/hello", "http_method": "POST"}})use iii_sdk::{register_worker, InitOptions, RegisterFunction};
use iii_sdk::protocol::RegisterTriggerInput;
use iii_helpers::observability::Logger;
use serde_json::json;
let iii = register_worker("ws://127.0.0.1:49134", InitOptions::default());
iii.register_function(
RegisterFunction::new("hello::greet", |input: serde_json::Value| -> Result<serde_json::Value, String> {
let logger = Logger::new();
let name = input["name"].as_str().unwrap_or("world");
logger.info("Greeting user", Some(json!({ "name": name })));
Ok(json!({ "message": format!("Hello, {}!", name) }))
}).description("Greet a user by name"),
);
iii.register_trigger(RegisterTriggerInput {
trigger_type: "http".into(),
function_id: "hello::greet".into(),
config: json!({ "api_path": "/hello", "http_method": "POST" }),
metadata: None,
})?;curl -X POST http://localhost:3111/hello \
-H "Content-Type: application/json" \
-d '{"name": "iii"}'Expected response:
{ "message": "Hello, iii!" }To add a capability that already exists, browse `https://workers.iii.dev/` and add it through the running Compose daemon:
iii trigger -n dev compose::add worker=state iii trigger -n dev compose::add worker=queue iii trigger -n dev compose::add worker=image-resize@0.1.2
`compose::add` resolves dependencies, writes exact versions to `worker-compose.yaml`, and restarts the affected project. A local worker can be declared as a `path://` container or added by path.
Get all iii skills for your AI coding agent:
npx skills add iii-hq/iii/skills
Skills teach your agent the top-level iii model: functions, triggers, workers, registry access, SDKs, engine configuration, architecture patterns, and error handling. Worker-backed capabilities live with the worker docs and registry entries.
calls
min hour day month weekday year)
the worker registry
After getting your first worker running:
1. **Register functions, triggers, and workers** — See `iii-core-primitives` 2. **Choose the right SDK APIs** — See `iii-sdk-reference` 3. **Configure the engine** — See `iii-engine-config` 4. **Explore backend patterns** — See `iii-architecture-patterns` 5. **Handle failures well** — See `iii-error-handling`
What is iii? · Quick Start · Add Workers · SDKs · Agent Skills · Console · Resources
Repo: iii-hq/iii
Use when composing iii primitives into backend architectures: durable workflows, reactive backends, agentic pipelines, event-driven CQRS, effect pipelines, and…
Use when registering iii functions, binding triggers, selecting sync/void/enqueue invocation, creating workers, inspecting the live worker registry, installing…
Configure a managed iii engine through worker-compose.yaml or a directly supervised engine through config.yaml. Use for engine ports, RBAC listeners, streams,…
Handle iii engine and SDK errors across Node, Python, Rust, and browser workers. Use when interpreting error codes, retryability, RBAC denial, timeouts,…
Use when working with iii SDK APIs across Node.js, browser, Python, or Rust: package installation, worker initialization, function/trigger registration,…
Turn a tech-spec directory into an interactive, marketing-grade web presentation — built so engineers understand the design, the reader is convinced of the…