effect-orpc supports oRPC router composition patterns.
Apply options to a router
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
export const apiRouter = effectProcedure.prefix("/api").tag("Users").router({
users: usersRouter,
});
Lazy routers
Use .lazy(...) for lazy-loaded routers.
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.
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