Mehr als nur
Swagger-Docs.
nestjs-docfy trennt Swagger-/OpenAPI-Dokumentation von der Controller-Logik über eine Companion-File-Namenskonvention, genauso wie Nest es schon macht mit *.controller.spec.ts.
npm install nestjs-docfy
# peer deps
npm install @nestjs/common @nestjs/swagger reflect-metadatadocfy-ui: ein AI-first Referenz-Viewer
Die OpenAPI-Spec, die nestjs-docfy zusammenstellt, ist dieselbe, die docfy-ui rendert, ohne separate Konfiguration und mit derselben Quelle der Wahrheit.
- Copy for AI: eine deterministische, LLM-fertige Zusammenfassung des Endpunkts, kein roher JSON-Dump mit $ref
- ⌘K-Suche über jeden Endpunkt, sofort
- Vollständige Request-/Response-Details pro Endpunkt, direkt aus der Spec erzeugt






So sieht es in der Praxis aus
Vorher: ein Controller, begraben unter Decorators. Nachher: nur Routen, mit der Dokumentation direkt daneben, in einer Companion-Datei.
@WithDocs()
@Controller('users')
export class UsersController {
constructor(private readonly users: UsersService) {}
@Get(':id')
findOne(@Param('id') id: string) {
return this.users.findOne(id);
}
}import { docs } from 'nestjs-docfy';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { UsersController } from './users.controller';
docs(UsersController, {
classDecorators: [ApiTags('users')],
methods: {
findOne: [
ApiOperation({ summary: 'Get user by id' }),
ApiResponse({ status: 200, description: 'OK', type: UserDto }),
ApiResponse({ status: 404, description: 'User not found' }),
],
},
});Kein Monkey-Patching, keine Runtime-Proxys
Nur das richtige Timing und Reflect-Metadaten.
Companion-Datei schreiben
users.controller.docs.ts ruft docs(UsersController, { ... }) auf, ganz normale Swagger-Decorators, nur in einer anderen Datei.
Beim Boot erkannt
DocfyModule.forRoot() findet sie über die Namenskonvention und schreibt Reflect-Metadaten auf die Methoden des Controllers, bevor SwaggerModule.createDocument() läuft.
Identische OpenAPI-Ausgabe
SwaggerModule sieht genau dieselben Metadaten, die es sähe, wären die Decorators direkt inline auf dem Controller geschrieben.