nest-profiler-config
Inspect a @nestjs/config snapshot grouped by namespace in the Config panel.
@eleven-labs/nest-profiler-config
@eleven-labs/nest-profiler-config takes a snapshot of the application configuration at startup and displays it in a Config panel. Secret values are automatically masked.

Installation
pnpm add -D @eleven-labs/nest-profiler-config
pnpm add @nestjs/configPeer dependencies: @nestjs/config ^4.0.0 || ^12.0.0
@nestjs/config is your application's own configuration library, so it stays a regular dependency; only the collector is profiler-only.
Setup
Your ConfigModule stays in the production AppModule, unchanged:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true })],
})
export class AppModule {}The collector goes in the dev-only profiling bundle:
import { Module } from '@nestjs/common';
import { ProfilerModule } from '@eleven-labs/nest-profiler';
import { ConfigCollectorModule } from '@eleven-labs/nest-profiler-config';
@Module({
imports: [
ProfilerModule.forRoot({ isGlobal: true }),
ConfigCollectorModule.forRoot({ maskKeys: ['DATABASE_URL', 'JWT_SECRET'] }),
],
})
export class ProfilingModule {}
ProfilingModuleis the dev-only bundle loaded bymain-dev.ts— see Enabling and disabling the profiler. If the profiler is installed as a production dependency behind the runtime gate, wrap the same call inConditionalModule.registerWhen(..., isProfilerEnabled).
What it collects
The full configuration object (from ConfigService's internal store), grouped by namespace. Each top-level namespace registered with registerAs — whether loaded via ConfigModule.forRoot({ load: [...] }) or ConfigModule.forFeature(...) — becomes its own collapsible section, with its keys shown relative to the namespace. Top-level scalar values are gathered under a synthetic General group:
▸ General
port = 3000
NODE_ENV = development
▸ database
host = localhost
port = 5432
password = ***Within a group, nested objects are flattened with . separators (e.g. pool.max). Grouping is purely structural: @nestjs/config merges forRoot and forFeature configuration into the same store, so their origin is not distinguished — a namespace is identified by its shape (a nested object at the top level), not by how it was loaded.
Automatic masking
Keys matching the pattern /password|secret|key|token|credential|api_key|apikey/i are automatically replaced with ***. Additional keys can be specified via maskKeys.
Toolbar badge
Number of configuration keys loaded (e.g., 12).
How it works
At OnApplicationBootstrap, the collector accesses ConfigService's internal configuration store via configService.internalConfig (an internal property, not part of the public API). The snapshot is captured once at startup and returned for every profile — it does not re-read config on each execution.