build unreasonably simple software

Modern software stacks are an exercise in integrating services.

Every new capability means a new system to learn, configure, deploy, and monitor.

The complexity of actual integrations is quadratic which is overwhelming for devs and for AI. Leading to both making bad decisions about large codebases.

iii eliminates this complexity by shipping working services the same way node ships packages, so using a new service is as easy as importing a new library.

get started

Read https://iii.dev/llms.txt and https://iii.dev/AGENTS.md…

same run. from inside the harness.
your agentic harness is part of your system. so it can move faster, better, and with less tokens than any other harness.

same work. two outcomes.
One agent researches a stack and resolves merge conflicts. The other finds what it needs and ships in the same timeframe.

§ 00 · EXPERIENCE

any task. one experience.
iii makes it unreasonably efficient to create and extend software.

Slack Messages

any language. one protocol.
python registers a function. rust registers a function. node consumes both.

Node.js Worker
orchestrator
01
import { registerWorker, Logger } from "iii-sdk"

const iii = registerWorker(
  "ws://localhost:49134"
)
const logger = new Logger()

const nums = await iii.trigger({
  function_id: "data::transform",
  payload: [1.0, 2.0, 3.0],
}) // → [2.0, 4.0, 6.0]

const pred = await iii.trigger({
  function_id: "ml::predict",
  payload: { data: nums },
}) // → { predictions: […] }

logger.info(pred) // ml::predict → { predictions: [0.91, 0.07, 0.02] }
Rust Worker
data transform
02
use iii_sdk::{
    register_worker, IIIError,
    Value,
};
use serde_json::json;

async fn transform(
    input: Value,
) -> Result<Value, IIIError> {
    let nums: Vec<f64> =
        serde_json::from_value(input)?;
    let result: Vec<f64> =
        nums.iter().map(|x| x * 2.0).collect();
    Ok(json!(result))
}

#[tokio::main]
async fn main() -> Result<(), IIIError> {
    let iii = register_worker(
        "ws://localhost:49134",
        InitOptions::default(),
    )?;
    iii.register_function(
        "data::transform",
        transform,
    );
    Ok(())
}
Python Worker
ML inference
03
import torch
from iii import register_worker

iii = register_worker("ws://localhost:49134")

async def predict(input):
    t = torch.tensor(input["data"])
    result = model(t)
    return {
        "predictions": result.tolist()
    }

iii.register_function(
    "ml::predict", predict
)
step 1 / 7 — node triggers data::transform
step 1/7

any service. one abstraction.
The answer to "we need X" stops being "evaluate, procure, integrate." It becomes: add a worker.

iii in a nutshell. every capability, every framework, and every tool become a pattern on the same core system.

execution model — how iii runs work. durable, interoperable, simple.

01 / 06

durable orchestration

coordinate long-running, failure-tolerant execution across workers and triggers.

02 / 06

interoperable execution

execute across languages natively, as if it were one runtime.

03 / 06

simple primitives

collapse distributed backend design into a paradigm humans and agents can reason about.

live system traits — what iii becomes once running. discoverable, extensible, observable.

04 / 06

live discovery

functions and triggers exposed by one worker become visible across the system in real time.

05 / 06

live extensibility

add new workers and capabilities to a live iii system without redesigning the architecture.

06 / 06

live observability

observe operations, traces, and behavior across the entire connected stack in real time.