Targets
A counterparty is named once — credential, policy and all
Because targets are declared, an application’s entire outbound surface is a list rather than an audit. Useful in review, and to anyone self-hosting who wants to know what the process can reach.
Replaces
scattered fetch callsa per-vendor HTTP client each
Receivers
The route a Provider calls you on, declared beside its Target
A connector exports how the vendor signs, the app says which key verifies and what to do, conduit runs the order and keeps the receipt — so a redelivery is a duplicate only once the first was applied, and a throw hands the sender a clean retry.
Replaces
a raw webhook route per vendoran inbound-events table per app
Policy
Seven numbers per target, falling back field by field
One conduit carries a card processor, a mail sink and a health probe. One set of timeouts and retries fits none of them, so each target states its own and inherits the rest.
Replaces
one global axios instance
Encoding
json or form, decided in the transport
The raw body is the same string the auth headers are built over, so an encoder living in a caller or a connector signs bytes that were never sent.
Replaces
hand-built form bodies beside a signer
Signing
Method, path, timestamp, nonce and a hash of the body
A captured signature cannot be replayed, moved to another endpoint, or kept while the body is swapped underneath it. The same module verifies on the far side.
Replaces
a bespoke HMAC helper per integration
Strictness
An unknown field on a descriptor is refused by name
Dropped silently is how a mistyped timeout becomes a production default that nobody can find.
Replaces
config objects with loose shapes
Observers
Callbacks that receive and cannot act
A throw in one is swallowed, so the word on the option says the tier: these observe. The management pipeline keeps the word hook, because that one can refuse the call.
Replaces
event emitters whose failures vanish
Not a wall
Conduit is where an outbound call belongs — not a boundary around the process
Nothing here blocks a raw fetch, and two batteries dial out directly on purpose. A contract with a working default is what keeps this package optional.
Replaces
Nothing — there is no common equivalent to swap out.