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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@eddyq/wakeboard

v0.1.1

Published

eddyq-wakeboard — Svelte admin dashboard for eddyq, mountable as a NestJS module

Readme

@eddyq/wakeboard

Web dashboard for eddyq. Drop-in NestJS module + Svelte SPA — mount it under your app and stop writing one-off admin endpoints.

pnpm add @eddyq/wakeboard

What you get

  • Live stats — counts by (queue, state).
  • Job inspection — paginated listing with filters: state, queue, kind, group, tag.
  • Queue admin — pause / resume / set concurrency / set timeout.
  • Group admin — pause / resume / set concurrency cap / set token-bucket rate limit.
  • Schedule management — enable / disable / remove cron + interval schedules.
  • Cancel pending jobs — one click.
  • Backend selector — when both Postgres and Redis are wired into one app, every tab gets a ?provider= selector to scope the view.

Quick start

import { Module } from "@nestjs/common";
import { EddyqModule } from "@eddyq/nestjs";
import { EddyqWakeboardModule } from "@eddyq/wakeboard";

@Module({
  imports: [
    EddyqModule.forRoot({
      databaseUrl: process.env.DATABASE_URL!,
      // …or `redis: { url, line }`, or both with `queues` + `defaultProvider`.
    }),
    EddyqWakeboardModule.forRoot({
      mountPath: "/wakeboard",
      auth: { password: process.env.WAKEBOARD_PASSWORD! },
    }),
  ],
})
export class AppModule {}

Hit http://localhost:3000/wakeboard. Done.

Multi-backend support

Wakeboard auto-detects the backend shape from the EddyqModule.forRoot config:

  • Postgres only → one column of stats, one set of queues/groups/schedules.
  • Redis only → same shape, just sourced from Redis.
  • Both (EddyqApp) → a backend selector on every tab + a GET /wakeboard/api/providers endpoint listing the configured backends. The UI renders each backend's data scoped to its provider.

All admin actions accept ?provider=postgres|redis so the right backend handles each call. Queue / group keys don't bleed across backends — a tenant-acme group on Redis is a different bucket than the same name on Postgres, and the dashboard shows them as such.

REST API

Everything the UI does is also a clean REST surface — wire it into your own monitoring or CLI. All endpoints accept ?provider=postgres|redis in multi-backend setups.

| Endpoint | Purpose | |---|---| | GET /api/providers | Backends this app is wired to | | GET /api/stats | Counts by (queue, state) | | GET /api/jobs?queue=&state=&kind=&groupKey=&tag=&page= | Paginated listing (50/page) | | GET /api/queues | Named-queue admin meta | | GET /api/groups | Group meta (concurrency, paused, rate, tokens) | | GET /api/schedules | Cron + interval schedules | | POST /api/jobs/:id/cancel | Cancel pending | | POST /api/queues/:name/pause / :name/resume | | | POST /api/groups/:key/pause / :key/resume | | | POST /api/schedules/:name/enable / :name/disable / :name/remove | |

Security

The default password auth is intentionally simple — it's a session-cookie-gated middleware. Front it with your existing auth for production (a Nest middleware that checks your JWT, an ingress-level OIDC proxy, an IP allowlist, etc.) and the auth.password option becomes a fallback you can leave undefined.

Requirements

  • Node ≥ 20
  • @eddyq/nestjs same minor version (peer dep)
  • @eddyq/queue same minor version (peer dep)

License

MIT