npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

bootifyjs

v2.1.2

Published

**BootifyJS** is a powerful, modern, and developer-friendly web framework for Node.js, built on the high-performance foundations of **Fastify**. Inspired by the productivity and robust architecture of Spring Boot, BootifyJS brings declarative programming,

Readme

BootifyJS: A Modern, Declarative Node.js Framework

BootifyJS is a powerful, modern, and developer-friendly web framework for Node.js, built on the high-performance foundations of Fastify. Inspired by the productivity and robust architecture of Spring Boot, BootifyJS brings declarative programming, a powerful Dependency Injection system, and an enterprise-grade feature set to the TypeScript ecosystem.

Our goal is to make building complex, scalable, and maintainable backend applications not just possible, but elegant and enjoyable.

Core Features

  • Declarative & Decorator-Driven: Write clean, readable, and self-documenting code using a rich set of decorators for controllers, services, dependency injection, and more.
  • Powerful Dependency Injection: A full-featured DI container that supports constructor and property injection, interface binding, scopes, and eager loading.
  • Event-Driven Architecture: A built-in, asynchronous event bus with automatic retries and a dead-letter queue, plus high-performance buffered event processing with worker threads, priority queues, and advanced monitoring.
  • Pluggable Caching: A decorator-driven caching system that works out-of-the-box with an in-memory store and can be seamlessly extended to use Redis or other backends.
  • Type-Safe Configuration: A schema-driven configuration system that validates your environment at startup, catching errors early and providing fully typed config objects.
  • Flexible Logging: A builder-pattern logging system with no external dependencies - bring your own logger (Pino, Winston, etc.) or use the built-in BaseLogger.
  • Built on Fastify: Leverage the incredible performance and rich plugin ecosystem of one of the fastest web frameworks for Node.js.

Getting Started

Installation

To create a new BootifyJS project, you can use our upcoming CLI or set it up manually.

# (Coming Soon)
# npx bootifyjs-cli new my-project

# Manual Installation
npm install bootifyjs fastify reflect-metadata

Your First Application

Here's a simple "Hello World" application to show you how easy it is to get started.

1. Create your main server file:

// src/server.ts
import "reflect-metadata";
import { createBootify, Controller, Get } from "bootifyjs";

@Controller("/hello")
export class HelloController {
  @Get("/")
  sayHello() {
    return { message: "Hello from BootifyJS!" };
  }
}

async function main() {
  await createBootify()
    .setServiceName("my-app")
    .setPort(3000)
    .useControllers([HelloController])
    .start();
}

main();

2. Run your application:

npx ts-node src/server.ts

You can now visit http://localhost:3000/hello in your browser or with curl to see your application running!

Builder Pattern API

BootifyJS uses a fluent builder pattern for configuration:

import { createBootify } from "bootifyjs";
import { z } from "zod";

const configSchema = z.object({
  DATABASE_URL: z.string(),
  REDIS_HOST: z.string().default("localhost"),
});

async function main() {
  const { app, start, logger } = await createBootify()
    .setServiceName("my-api")
    .setPort(3000)
    .setHostname("0.0.0.0")
    .useConfig(configSchema)
    .useControllers([UserController, ProductController])
    .useMiddleware(authMiddleware)
    .useErrorHandler((error, request, reply) => {
      logger.error("Request failed", error);
      reply.status(500).send({ error: "Internal Server Error" });
    })
    .useLogger((builder) =>
      builder
        .setLevel("debug")
        .configureConsole({ colorize: true, prettyPrint: true })
    )
    .beforeStart(async (app) => {
      // Run migrations, connect to databases, etc.
    })
    .afterStart(async (app) => {
      // Post-startup tasks
    })
    .build();

  await start();
}

Available Builder Methods

| Method | Description | | ------------------------- | ---------------------------------------------------- | | setServiceName(name) | Set the application name (used in logs) | | setPort(port) | Set the server port | | setHostname(host) | Set the server hostname | | setFastifyOptions(opts) | Pass custom Fastify options | | useConfig(schema) | Initialize type-safe config with Zod schema | | useControllers([...]) | Register controller classes | | usePlugin(fn) | Register a Fastify plugin | | useMiddleware(fn) | Add request middleware | | useMiddlewares([...]) | Add multiple middlewares | | useErrorHandler(fn) | Set custom error handler | | useLogger(fn) | Configure the logging system | | useScheduler(enabled) | Enable/disable the job scheduler | | beforeStart(fn) | Hook to run before server starts | | afterStart(fn) | Hook to run after server starts | | build() | Build and return { app, start, logger, scheduler } | | start() | Build and start the server immediately |

Logging

BootifyJS provides a flexible logging system with no external dependencies:

import { createLogger, getLogger } from "bootifyjs/logging";

// Option 1: Use built-in BaseLogger
const logger = createLogger()
  .setLevel("debug")
  .setServiceName("my-api")
  .configureConsole({ colorize: true, prettyPrint: true })
  .build();

logger.info("Server started", { port: 3000 });
logger.error("Something went wrong", new Error("Oops"), { userId: 123 });

Bring Your Own Logger

Create an adapter that implements ILogger:

// adapters/pino-adapter.ts
import pino from "pino";
import { ILogger, LogContext } from "bootifyjs/logging";

export class PinoAdapter implements ILogger {
  private logger: pino.Logger;

  constructor(options: { level?: string; prettyPrint?: boolean } = {}) {
    this.logger = pino({
      level: options.level ?? "info",
      transport: options.prettyPrint
        ? { target: "pino-pretty", options: { colorize: true } }
        : undefined,
    });
  }

  info(message: string, context?: LogContext): void {
    this.logger.info(context ?? {}, message);
  }

  error(message: string, error?: Error, context?: LogContext): void {
    this.logger.error({ ...context, err: error }, message);
  }

  // ... implement other methods: trace, debug, warn, fatal, child
}

Then use it with BootifyApp:

import { createBootify } from "bootifyjs";
import { PinoAdapter } from "./adapters/pino-adapter";

createBootify()
  .useLogger((builder) =>
    builder.use(new PinoAdapter({ level: "info", prettyPrint: true }))
  )
  .start();

Philosophy

BootifyJS is built on a few core principles:

  • Developer Experience First: Frameworks should reduce boilerplate and complexity, not add to it. Our primary goal is to make development fast, intuitive, and enjoyable.
  • Convention Over Configuration: We provide sensible defaults and automatic wiring so you can focus on writing business logic.
  • Robustness by Default: Features like startup validation, graceful shutdown, and resilient event handling are built-in, helping you write production-ready code from day one.
  • Extensibility: While the framework works out-of-the-box, it's designed to be pluggable and extensible. You can easily bring your own implementations for caching, authentication, logging, and more.

Documentation

Dive deeper into the features of BootifyJS:

  • Core Module: Learn about the Dependency Injection system, decorators, and component lifecycle.
  • Configuration: Master the type-safe, schema-driven configuration system.
  • Events Module: Master the event bus for building decoupled, event-driven services.
  • Cache Module: Speed up your application with our decorator-driven caching system.
  • Logging: Understand the structured, context-aware logging system.
  • Scheduling: Set up cron jobs and scheduled tasks.