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

@braedonsaunders/appkit-jobs

v0.2.4

Published

Production BullMQ runtime and complete reusable queue profiles for email, notifications, PDF, reports, schedules, scripts, migration, capture, and outbound work.

Readme

@braedonsaunders/appkit-jobs

Production BullMQ infrastructure and reusable queue contracts for application work that must survive request boundaries.

The package is lazy by construction. Importing its root or any queue module does not open Redis, create a queue, or start a worker. Applications create one Jobs runtime, bind only the queue families they use, and inject their domain processors.

Queue families

| Entry | Production behavior | | --- | --- | | /email | Validated email payloads, case-insensitive recipient de-duplication, one private job per recipient, deterministic fan-out IDs, five-attempt exponential delivery, and bounded retention. | | /notifications | Bounded 250-recipient notification batches, 40-job bulk writes, push jobs, deterministic IDs, and the production dispatcher/push worker profiles. | | /pdf | Record summaries, tenant templates, document versions, working-master previews, books, multi-part bundles, durable artifact targets, email delivery, on-demand waits, payload ceilings, and deterministic in-flight de-duplication. | | /reports | Both production report contracts: durable schedule/run claims and definition-driven render-and-deliver jobs. Each keeps its original retry and worker profile. | | /scheduled | The complete eleven-job schedule registry, exact cron/repeat identities, stale-repeat reconciliation, sync-run exclusion, and maintenance de-duplication. | | /outbound | One isolated automation/event dispatch per job, tenant identity binding, flat scalar event records, and serialized payload limits. | | /scripts | Scheduled and bulk authored-script runs with no automatic retry for non-idempotent code. | | /sandbox | Create, refresh, reset, and delete lifecycle jobs with single-attempt safety for partially applied clones. | | /migration | Full migration, incremental mirror, and attachment passes with long-job retry/retention policy. | | /capture | Deterministic asynchronous document capture with application-owned queue naming and ID prefix. | | /web-push | Hardened subscription validation and Web Push delivery. | | /health, /rate-limit | Bounded Redis readiness and atomic fixed-window rate limiting. |

Every queue module exports its payload types, validation functions, exact queue profile, lazy factory, enqueue methods, and worker binding. Queue names and worker concurrency can be overridden when an existing application must retain an established deployment contract.

Usage

import { createJobs } from '@braedonsaunders/appkit-jobs'
import { createEmailQueue } from '@braedonsaunders/appkit-jobs/email'
import { createPdfQueue } from '@braedonsaunders/appkit-jobs/pdf'
import { createScheduledQueue } from '@braedonsaunders/appkit-jobs/scheduled'

const jobs = createJobs({ redisUrl: process.env.REDIS_URL! })

const email = createEmailQueue(jobs)
const pdf = createPdfQueue(jobs)
const scheduled = createScheduledQueue(jobs)

await email.enqueueEmail({
  to: ['[email protected]', '[email protected]'],
  subject: 'Report ready',
  html: '<p>Your report is ready.</p>',
  text: 'Your report is ready.',
}, { jobId: 'report-ready|run-42' })

const workers = [
  email.createWorker(async (job) => deliverEmail(job.data)),
  pdf.createWorker(async (job) => renderPdf(job.data)),
  scheduled.createWorker(async (job) => runScheduledTick(job.data)),
]

The package owns transport mechanics and safe queue boundaries. Applications still own Redis credentials, provider credentials, data access, authorization, and the processors that execute domain work.

Compatibility boundaries

  • Tenant-scoped job types accept tenantId; source-compatible organization-scoped contracts also accept orgId where that production contract used it.
  • The two report queue modes share the established reports queue name but are separate factories because their payloads and retry delays are intentionally different.
  • Capture queue naming and deterministic ID prefixes are injected so a consuming application can preserve an existing queue without placing domain-specific names in AppKit.
  • Worker factories preserve the source concurrency defaults and accept explicit overrides for deployments that already tuned them.