Skip to main content
effect-orpc supports oRPC router composition patterns.

Apply options to a router

router.ts
const usersRouter = effectProcedure.router({
  list: effectProcedure.effect(function* () {
    return yield* UsersRepo.list();
  }),

  get: effectProcedure.input(z.object({ id: z.string() })).effect(function* ({
    input,
  }) {
    return yield* UsersRepo.findById(input.id);
  }),
});

Prefix and tag a router

prefix-and-tag.ts
export const apiRouter = effectProcedure.prefix("/api").tag("Users").router({
  users: usersRouter,
});

Lazy routers

Use .lazy(...) for lazy-loaded routers.
lazy.ts
export const router = effectProcedure.lazy(async () => ({
  default: await import("./users-router").then((module) => module.usersRouter),
}));

Mix router leaves

Routers can contain standard oRPC procedures and Effect procedures.
mixed.ts
import { os } from "@orpc/server";

export const router = {
  health: os.handler(() => "ok"),
  users: usersRouter,
};

Next step

Mount a router in Hono guide when you are ready for HTTP integration.
Last modified on June 15, 2026