
Iii Pubsub
- 43 installs
- 18.6k repo stars
- Updated August 5, 2026
- iii-hq/iii
Fire-and-forget topic pub/sub: publish an event and every matching subscribe trigger receives it, for real-time notifications where missed events are acceptable.
About
The iii-pubsub worker provides topic-based publish/subscribe messaging with no persistence, ordering, or retries. A developer uses it for ephemeral real-time notifications and loose coupling, with a redis adapter for cross-instance fan-out.
- Exact-string topic matching with true fan-out to every subscriber
- local (in-memory) or redis adapters; no retries or persistence
Iii Pubsub by the numbers
- 43 all-time installs (skills.sh)
- Ranked #3,266 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/iii-hq/iii --skill iii-pubsubAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 43 |
|---|---|
| repo stars | ★ 18.6k |
| Last updated | August 5, 2026 |
| Repository | iii-hq/iii ↗ |
What it does
Fire-and-forget topic pub/sub: publish an event and every matching subscribe trigger receives it, for real-time notifications where missed events are acceptable.
Files
iii-pubsub
The iii-pubsub worker is topic-based publish/subscribe messaging. Publish an event to a named topic with the publish function and every registered subscribe trigger whose topic matches is invoked with the raw payload — no envelope, no persistence, no retries. It is fire-and-forget broadcast: subscribers receive each event as it arrives, and a subscriber that is offline simply misses it.
The worker exposes one callable function (publish, registered with the bare function id "publish" — no namespace prefix) and one trigger type (subscribe). Two adapters: local (default; in-memory broadcast channels; only delivers to subscribers in this engine process; no external dependency) and redis (redis_url: ${REDIS_URL:redis://localhost:6379}; uses Redis Pub/Sub so events propagate across multiple engine instances).
When to Use
- Real-time notifications consumers may miss without consequence — UI live updates, ephemeral signals, telemetry mirroring.
- Loose coupling where an event source should not know about its consumers.
- Cross-instance fan-out of ephemeral events (configure the
redisadapter).
Boundaries
- No persistence, ordering, or retries — a subscriber that is down misses events permanently. Use
iii-queue(topic mode,durable:subscriber) when every consumer must process every event. - Topic matching is exact string equality; there are no wildcards or hierarchical patterns. Register one trigger per topic.
- An empty topic is rejected:
publishreturnstopic_not_set, and asubscribetrigger registered with an empty topic never fires. - For key/value or stream change reactivity, use
iii-stateoriii-streaminstead —iii-pubsubcarries discrete events, not state.
Functions
publish— broadcast an event to a topic; everysubscribetrigger on that exact topic receives the rawdata. Empty topic returnstopic_not_set.
Reactive triggers
Bind a subscribe trigger when a function should run every time publish broadcasts to a configured topic. The handler receives the raw data value from the publish call directly — no envelope. Multiple triggers can subscribe to the same topic; each gets an independent copy (true fan-out).
Reach for it when:
- A domain event from one part of the system should kick off side effects elsewhere without the publisher knowing the consumers.
- You want cross-instance fan-out via the
redisadapter.
If subscribers must reliably process every event with retries and dead-letter handling, use iii-queue's durable:subscriber instead — subscribe is fire-and-forget.
How to bind
1. Register a handler: iii.registerFunction('notifications::on-order-shipped', handler). 2. Register the trigger:
iii.registerTrigger({
type: 'subscribe',
function_id: 'notifications::on-order-shipped',
config: {
topic: 'orders.shipped', // required, non-empty. Exact match only — no wildcards.
},
})The handler receives the published data unchanged, with no topic field; if one handler serves multiple topics, embed the topic inside data at publish time. The handler's return value is ignored and there is no retry.
For the published payload shape, call iii get function info on publish or the handler function id.