# Iii Stream

Durable real-time streams with a CRUD function surface plus reactive triggers that fire...

- Repository: https://github.com/iii-hq/iii (18876 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add iii-hq/iii --skill iii-stream -g -a claude-code -y`
Codex: `npx skills add iii-hq/iii --skill iii-stream -g -a codex -y`
Cursor: `npx skills add iii-hq/iii --skill iii-stream -g -a cursor -y`
Gemini CLI: `npx skills add iii-hq/iii --skill iii-stream -g -a gemini-cli -y`

## Description

Durable real-time streams with a CRUD function surface plus reactive triggers that fire on item changes and WebSocket subscriber lifecycle, reach for it to build live backends without polling. iii-stream is deprecated (iii-stream) and will be removed in an upcoming release. Behavior is unchanged for now. Migration guide: https://iii.dev/docs/upgrading/migrate-from-streams

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# iii-stream

> **Deprecated.** iii-stream is deprecated (iii-stream) and will be removed in an upcoming release.
> Behavior is unchanged for now. Migration guide:
> https://iii.dev/docs/upgrading/migrate-from-streams

The `iii-stream` worker stores real-time data as a three-level hierarchy (`stream_name` -> `group_id` -> `item_id`) in the configured adapter and exposes two surfaces: a CRUD-shaped `stream::*` function namespace for reading and writing items, and reactive trigger types (`stream`, `stream:join`, `stream:leave`) that fire on data changes and on WebSocket subscriber connect/disconnect. Reactive backends are built by binding handlers to those triggers rather than by polling.

A write persists the new value, dispatches matching `stream` triggers on a spawned task (fire-and-forget, so the originating call returns before handlers finish), and broadcasts the change to every WebSocket client subscribed to that `(stream_name, group_id)`. The `stream:join` trigger doubles as an authorization gate: returning `{ unauthorized: true }` from its handler rejects the subscription before any data flows. Pair it with the worker's `auth_function` config, which runs once per WebSocket handshake and stamps a `context` value into every join/leave event.

Adapters: `kv` (default; in-memory or file-backed; single-instance only, no cross-process fan-out) or `redis` (required for multi-instance fleets that need real-time fan-out). Browser and client subscriptions use the Browser SDK (`iii-browser-sdk`), which subscribes to `stream` changes over a single engine WebSocket. Connecting directly to the stream port (`ws://host:{port}/stream/{stream_name}/{group_id}`) is deprecated in favor of the Browser SDK.

## When to Use

The rest: https://github.com/iii-hq/iii/blob/HEAD/engine/src/workers/stream/skills/SKILL.md
