Skip to main content
Effect procedures preserve oRPC’s decorated procedure helpers.

Callable procedures

Use .callable() to turn a procedure into a function while preserving the procedure surface.
callable.ts
const getUser = effectProcedure
  .input(z.object({ id: z.string() }))
  .effect(function* ({ input }) {
    return yield* UsersRepo.findById(input.id);
  });

const callGetUser = getUser.callable();

const user = await callGetUser({ id: "1" });
Useful cases:
  • examples
  • tests
  • scripts
  • internal invocation without HTTP

Actionable procedures

Use .actionable(...) where you already use oRPC’s server action integration.
actionable.ts
const createUserAction = effectProcedure
  .input(z.object({ name: z.string() }))
  .effect(function* ({ input }) {
    return yield* UsersRepo.create(input.name);
  })
  .actionable();
effect-orpc does not change the semantics of oRPC’s callable or actionable helpers. It preserves the Effect-aware procedure metadata while forwarding to oRPC behavior.

Next step

Compose routers with Router composition.
Last modified on June 15, 2026