Skip to main content

TypeScript says a service is missing

The handler yielded a service that has not been provided by the builder, a request-scoped provider, or the runtime passed to makeEffectORPC.
fix.ts
const procedure = eos.provide(UsersRepo.Default).effect(function* () {
  return yield* UsersRepo.list();
});
If the service is request-scoped, provide it from context:
request-scoped-fix.ts
const procedure = eos
  .$context<{ user: User }>()
  .provide(CurrentUser, ({ context }) => Effect.succeed(context.user));

A tagged error is not typed on the client

Make sure the tagged error class is registered in .errors(...) or in the eoc.errors(...) contract definition.
error-registration.ts
const procedure = eos.errors({ UserNotFoundError });

Request-local logs or annotations disappear

If request-local FiberRef state is created outside the oRPC pipeline in Node, use the Node bridge.
node-bridge.ts
import { withFiberContext } from "effect-orpc/node";
See Node fiber context bridge.

Scoped resources are recreated too often

Use a caller-owned ManagedRuntime for long-lived scoped resources.
runtime.ts
const runtime = ManagedRuntime.make(AppLive);
const procedure = makeEffectORPC(runtime);
Dispose the runtime during application shutdown.

Native middleware split my Effect pipeline

Native oRPC middleware can split contiguous Effect steps into multiple runtime boundaries. Prefer Effect middleware when the middleware needs Effect context. If you must use native middleware and need FiberRef continuity in Node, import the Node bridge.

Where to look next

Mental model

Review the main runtime and builder concepts.

Runtime management

Choose between layers and caller-owned runtimes.
Last modified on June 15, 2026