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.
75
92%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
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 | shVerify it installed:
iii --versioniii createFollow 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 --config iii-config.yamlThe engine starts and listens for worker connections on ws://localhost:49134. The REST API is
available at http://localhost:3111. The console is available at http://localhost:3113.
Pick your language:
# TypeScript / Node.js
npm install iii-sdk @iii-dev/helpers
# Python
pip install iii-sdk iii-helpers
# Rust
cargo add iii-sdk iii-helpersimport { 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 install the worker by
name:
iii worker add iii-state
iii worker add iii-queue
iii worker add image-resize@0.1.2iii worker add writes project config, installs the worker artifact, starts it, and records the pin
in iii.lock when the worker comes from the registry. Commit iii.lock with your config so other
machines can replay the same worker set with iii worker sync.
Get all iii skills for your AI coding agent:
npx skills add iii-hq/iii/skillsSkills 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.
registerFunction + registerTrigger
calls:: separator for function IDs to namespace them: orders::create, orders::validate{ type: 'cron', config: { expression: '0 0 9 * * * *' } } (7-field: sec
min hour day month weekday year){ type: 'durable:subscriber', config: { topic: 'my-queue' } }iii.trigger() to invoke other functions from within a functionstate::get / state::set to persist data across function callsiii worker add <name> when the capability already exists in the worker registryAfter getting your first worker running:
iii-core-primitivesiii-sdk-referenceiii-engine-configiii-architecture-patternsiii-error-handlingiii-core-primitivesiii-sdk-referenceiii-engine-configengine/src/workers/**/skillsiii-getting-started for installation, initial setup, and first-worker guidanced7ae816
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.