بنقرة واحدة
iii-getting-started
// 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.
// 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.
Browser SDK for connecting to the iii engine from web applications via WebSocket. Use when building browser-based clients that register functions, invoke triggers, or consume streams from the frontend.
Binary streaming between workers via channels. Use when building data pipelines, file transfers, streaming responses, or any pattern requiring binary data transfer between functions.
Registers cron triggers with 7-field expressions to run functions on recurring schedules. Use when scheduling periodic jobs, timed automation, crontab replacements, cleanup routines, report generation, batch processing, or calendar-based work that is genuinely time-driven.
Builds custom trigger types for events iii does not handle natively. Use when integrating webhooks, file watchers, IoT devices, database CDC, or any external event source.
Configures the iii engine via iii-config.yaml — workers, adapters, queue configs, ports, and environment variables. Use when deploying, tuning, or customizing the engine.
Handle iii engine and SDK errors across Node, Python, Rust, and browser workers. Use when interpreting error codes, retryability, RBAC denial, timeouts, handler failures, or SDK-specific exception surfaces.
| 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 --config iii-config.yaml
The 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
# Python
pip install iii-sdk
# Rust
cargo add iii-sdk
import { registerWorker, Logger, TriggerAction } from "iii-sdk";
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, 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, Logger, RegisterFunction, RegisterTriggerInput};
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!" }
Get all iii skills for your AI coding agent:
npx skills add iii-hq/iii/skills
Skills teach your agent how to use every iii primitive — HTTP endpoints, cron scheduling, queues, state management, streams, channels, and more. Available for Claude Code, Cursor, Codex, Gemini CLI, and 30+ other agents.
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 callsAfter getting your first worker running:
iii-state-management skill to persist dataiii-queue-processing skill for async job processingiii-cron-scheduling skill for scheduled tasksiii-http-endpoints skill for REST endpoints with CRUDiii-observability skill for tracing and metricsiii-agentic-backend, iii-reactive-backend,
iii-workflow-orchestrationiii-http-endpointsiii-cron-schedulingiii-queue-processingiii-state-managementiii-engine-configiii-getting-started for installation, initial setup, and first-worker guidance