iii’s design collapses distributed software into three concepts: Worker, Trigger, Function. Something hosts work, something causes it, something does it.

Workers are processes that register with the iii engine and then register triggers and functions. A TypeScript API service is a worker. A Python data pipeline is a worker. A Rust microservice is a worker. Any functionality can be transformed into a worker with a few lines of code.

Triggers are anything that causes a function to run. A trigger can be a direct call to a function, an HTTP endpoint, a cron schedule, a queue subscription, a state change, a stream event, or anything else. Triggers are declarative: the Worker defines “this function runs when this thing happens,” and iii handles routing, serialization, and delivery.

Functions are units of work with a stable identifier (e.g., content::classify, orders::validate). It receives input, does work, and optionally returns output. Functions exist in workers.

By mapping everything a service can do to these three primitives iii creates a development process that is both effortlessly composable, and completely observable.

Source: iii-hq/iii: Effortlessly compose, extend, and observe every service in real-time for the first time ever.

I found them via an x-post: https://x.com/mfpiccolo/status/2049139067359568032

This is an interesting posit. Rethinking the backend for a world of agent assisted development is a worthwhile exercise and their abstraction is a very reasonable proposal. I like that it’s composable and agents are first-class citizens of the devenv. I love that they approached it from the pov of observability given that’s the problem that doesn’t scale well.