Open-source NestJS libraries for authentication, permissions, notifications, file uploads, and more. Well-tested, fully typed, MIT-licensed.
Battle-tested packages used in real applications. Comprehensive test suites and TypeScript coverage.
Built with TypeScript from the ground up. Full type inference, autocompletion, and compile-time safety.
Intuitive decorator-based APIs that follow NestJS patterns. Minimal configuration, maximum productivity.
A growing ecosystem of packages that cover authentication, authorization, file management, internationalization, and more.
Complete auth backend with registration, login, 2FA, password reset, and email verification.
Role-based access control with guards, decorators, caching, and wildcard permissions.
Automatic entity change tracking with field-level diffs and actor resolution.
Multi-channel notifications via database, email, and custom channels.
File uploads with image conversions, collections, and S3 support.
JSON-based model translations with automatic locale resolution.
Supercharged Excel and CSV export/import with decorators and templates.
Block disposable email addresses with a single decorator. 72,000+ domains.
Clean, intuitive APIs that follow NestJS conventions. Drop in a module, add a decorator, and you're done.
Complete auth in minutes
Database-agnostic authentication with JWT sessions, 2FA, rate limiting, and AES-256-GCM encryption. Works with TypeORM, Prisma, Mongoose, or any database.
View documentationimport { AuthenticationModule, Feature } from '@nestbolt/authentication';@Module({ imports: [ AuthenticationModule.forRoot({ features: [ Feature.REGISTRATION, Feature.RESET_PASSWORDS, Feature.EMAIL_VERIFICATION, Feature.TWO_FACTOR_AUTHENTICATION, ], userRepository: TypeOrmUserRepository, jwtSecret: process.env.JWT_SECRET!, appName: 'MyApp', }), ],})export class AppModule {}Declarative access control
Protect routes with decorators. Supports role checks, permission checks, wildcard matching, guard scoping, and in-memory caching with automatic flush.
View documentationimport { RequireRoles, RequirePermissions } from '@nestbolt/permissions';@Controller('posts')@UseGuards(JwtAuthGuard, RolesGuard)export class PostsController { @RequireRoles('admin', 'editor') @Post() create(@Body() dto: CreatePostDto) { return this.postsService.create(dto); } @RequirePermissions('posts.publish') @Patch(':id/publish') publish(@Param('id') id: string) { return this.postsService.publish(id); }}Multi-channel delivery
Define once, deliver anywhere. Send notifications via database, email, Slack, SMS, or custom channels with a unified class-based API.
View documentationimport { Notification, MailMessage } from '@nestbolt/notifications';export class OrderShipped extends Notification { constructor(private order: Order) { super(); } via() { return ['database', 'mail']; } toDatabase() { return { message: `Order #${this.order.id} has shipped.`, trackingUrl: this.order.trackingUrl, }; } toMail() { return new MailMessage() .subject('Your order has shipped!') .greeting(`Hello ${this.order.customerName}`) .line(`Order #${this.order.id} is on its way.`) .action('Track Order', this.order.trackingUrl); }}Automatic change tracking
Track every entity change with field-level diffs, actor resolution, and configurable field filtering. Query audit history with pagination and date ranges.
View documentationimport { Auditable, AuditableMixin } from '@nestbolt/audit-log';@Entity('users')@Auditable({ except: ['password'] })export class User extends AuditableMixin(BaseEntity) { @PrimaryGeneratedColumn('uuid') id!: string; @Column() name!: string; @Column() email!: string; @Column() password!: string;}// Automatic tracking:user.name = 'Alice';await repo.save(user);// → Audit log: { name: "Bob" → "Alice" }Every package follows the same pattern. Install, import, configure.
npm install @nestbolt/authenticationimport { AuthenticationModule } from '@nestbolt/authentication';AuthenticationModule.forRoot({ features: [Feature.REGISTRATION, Feature.EMAIL_VERIFICATION], userRepository: MyUserRepository, jwtSecret: process.env.JWT_SECRET!,})All packages are MIT licensed. Use them in personal projects, startups, or enterprise applications. Contributions welcome.
import { AuthenticationModule, Feature } from '@nestbolt/authentication';
@Module({
imports: [
AuthenticationModule.forRoot({
features: [
Feature.REGISTRATION,
Feature.RESET_PASSWORDS,
Feature.EMAIL_VERIFICATION,
Feature.TWO_FACTOR_AUTHENTICATION,
],
userRepository: TypeOrmUserRepository,
jwtSecret: process.env.JWT_SECRET!,
appName: 'MyApp',
}),
],
})
export class AppModule {}import { RequireRoles, RequirePermissions } from '@nestbolt/permissions';
@Controller('posts')
@UseGuards(JwtAuthGuard, RolesGuard)
export class PostsController {
@RequireRoles('admin', 'editor')
@Post()
create(@Body() dto: CreatePostDto) {
return this.postsService.create(dto);
}
@RequirePermissions('posts.publish')
@Patch(':id/publish')
publish(@Param('id') id: string) {
return this.postsService.publish(id);
}
}import { Notification, MailMessage } from '@nestbolt/notifications';
export class OrderShipped extends Notification {
constructor(private order: Order) { super(); }
via() {
return ['database', 'mail'];
}
toDatabase() {
return {
message: `Order #${this.order.id} has shipped.`,
trackingUrl: this.order.trackingUrl,
};
}
toMail() {
return new MailMessage()
.subject('Your order has shipped!')
.greeting(`Hello ${this.order.customerName}`)
.line(`Order #${this.order.id} is on its way.`)
.action('Track Order', this.order.trackingUrl);
}
}import { Auditable, AuditableMixin } from '@nestbolt/audit-log';
@Entity('users')
@Auditable({ except: ['password'] })
export class User extends AuditableMixin(BaseEntity) {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column()
name!: string;
@Column()
email!: string;
@Column()
password!: string;
}
// Automatic tracking:
user.name = 'Alice';
await repo.save(user);
// → Audit log: { name: "Bob" → "Alice" }npm install @nestbolt/authenticationimport { AuthenticationModule } from '@nestbolt/authentication';AuthenticationModule.forRoot({
features: [Feature.REGISTRATION, Feature.EMAIL_VERIFICATION],
userRepository: MyUserRepository,
jwtSecret: process.env.JWT_SECRET!,
})