Agent skill
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 this agent skill to your Project
npx add-skill https://github.com/iii-hq/iii/tree/main/skills/iii-getting-started
SKILL.md
Getting Started with iii
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.
Step 1: Install the Engine
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh
Verify it installed:
iii --version
Step 2: Create a Project
curl -LO https://github.com/iii-hq/cli-tooling/releases/latest/download/quickstart.zip
unzip quickstart.zip
cd quickstart
The quickstart includes TypeScript, Python, and Rust workers. If you don't have all runtimes, the README includes Docker Compose instructions.
Step 3: Start the Engine
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.
Step 4: Install the SDK
Pick your language:
# TypeScript / Node.js
npm install iii-sdk
# Python
pip install iii-sdk
# Rust — add to Cargo.toml
# [dependencies]
# iii-sdk = "*"
Step 5: Write Your First Worker
TypeScript
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' },
})
Python
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({"id": "hello::greet", "description": "Greet a user by name"}, greet)
iii.register_trigger({"type": "http", "function_id": "hello::greet", "config": {"api_path": "/hello", "http_method": "POST"}})
Rust
use iii_sdk::{register_worker, InitOptions, Logger, RegisterFunctionMessage, RegisterTriggerInput};
use serde_json::json;
let iii = register_worker("ws://127.0.0.1:49134", InitOptions::default());
iii.register_function(
RegisterFunctionMessage::with_id("hello::greet".into()),
|input: serde_json::Value| async move {
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) }))
},
);
iii.register_trigger(RegisterTriggerInput {
trigger_type: "http".into(),
function_id: "hello::greet".into(),
config: json!({ "api_path": "/hello", "http_method": "POST" }),
})?;
Step 6: Test It
curl -X POST http://localhost:3111/hello \
-H "Content-Type: application/json" \
-d '{"name": "iii"}'
Expected response:
{"message": "Hello, iii!"}
Install Agent Skills
Get all iii skills for your AI coding agent:
npx skillkit 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.
Adapting This Pattern
- Add more functions to the same worker — each gets its own
registerFunction+registerTriggercalls - Use
::separator for function IDs to namespace them:orders::create,orders::validate - Add cron triggers with
{ type: 'cron', config: { expression: '0 0 9 * * * *' } }(7-field: sec min hour day month weekday year) - Add queue triggers with
{ type: 'durable:subscriber', config: { topic: 'my-queue' } } - Use
iii.trigger()to invoke other functions from within a function - Use
state::get/state::setto persist data across function calls
Recommended Next Steps
After getting your first worker running:
- Add state — Use
iii-state-managementskill to persist data - Add a queue — Use
iii-queue-processingskill for async job processing - Add a cron job — Use
iii-cron-schedulingskill for scheduled tasks - Build an API — Use
iii-http-endpointsskill for REST endpoints with CRUD - Add observability — Use
iii-observabilityskill for tracing and metrics - Explore architecture patterns — See
iii-agentic-backend,iii-reactive-backend,iii-workflow-orchestration
Key Resources
- Quickstart Guide
- SDK Reference — Node.js
- SDK Reference — Python
- SDK Reference — Rust
- Engine Configuration
- Console Dashboard
Pattern Boundaries
- For HTTP endpoint patterns (CRUD, parameterized routes), prefer
iii-http-endpoints - For cron/scheduling patterns, prefer
iii-cron-scheduling - For queue/async job patterns, prefer
iii-queue-processing - For state persistence patterns, prefer
iii-state-management - For engine configuration, prefer
iii-engine-config - Stay with
iii-getting-startedfor installation, initial setup, and first-worker guidance
When to Use
- Use this skill when the task is about installing iii, creating a new project, or writing a first worker.
- Triggers when the request asks for setup help, quickstart guidance, or getting started with iii.
Boundaries
- Never use this skill as a generic fallback for unrelated tasks.
- You must not apply this skill when a more specific iii skill is a better fit.
- Always verify environment and safety constraints before applying examples from this skill.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
iii-dead-letter-queues
Inspects and redrives jobs that exhausted all retries. Use when handling failed queue jobs, debugging processing errors, or implementing retry strategies.
iii-cron-scheduling
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, health checks, batch processing, or any task that should run every N seconds, minutes, hours, or on a weekly/monthly calendar.
iii-http-invoked-functions
Registers external HTTP endpoints as iii functions using registerFunction(id, HttpInvocationConfig). Use when adapting legacy APIs, third-party webhooks, or immutable services into triggerable iii functions, especially when prompts ask for endpoint maps like { path, id } iterated into registerFunction calls.
iii-channels
Binary streaming between workers via channels. Use when building data pipelines, file transfers, streaming responses, or any pattern requiring binary data transfer between functions.
iii-event-driven-cqrs
Implements CQRS with event sourcing on the iii engine. Use when building command/query separation, event-sourced systems, or fan-out architectures where commands publish domain events and multiple read model projections subscribe independently.
iii-agentic-backend
Creates and orchestrates multi-agent pipelines on the iii engine. Use when building AI agent collaboration, agent orchestration, research/review/synthesis chains, or any system where specialized agents hand off work through queues and shared state.
Didn't find tool you were looking for?