Nuxt Roost

A Nuxt module · no reflect-metadata

NestJS ergonomics for Nuxt & Nitro

A Nuxt module that gives you NestJS-looking decorated controller classes. A build-time codegen reads them as an AST and emits the Nitro route files + the awilix DI manifest — so at runtime there's nothing to reflect on.

One feature, fully wired

That's the whole feature — roost generates the route delegates and the DI container. You never hand-write either.
@Controller('projects')
@UseGuards(MemberGuard)
export class ProjectsController {
  constructor(private readonly projects: ProjectsService) {}

  @Get(':id')
  get(@Param() id: string) {
    return this.projects.get(id) // params injected as arguments, Nest-style
  }

  @Post()
  create(@Body(createProjectSchema) dto: CreateProjectDto) {
    return this.projects.create(dto.name) // @Body(schema) injects the validated body
  }
}

Explore the docs

Getting started
Install and write your first controller.
Core concepts
Decorators as build-time annotations, awilix DI, the two generated artifacts.
Cross-cutting concerns
Guards, interceptors, and filters — all DI'd providers.
Before / after
The same feature hand-wired in plain Nitro vs. with roost.
Tenancy & RLS
Tenant isolation by construction — no tenantId threading.
vs. NestJS
What's the same, what's deliberately different.
Copyright © 2026