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

nodebb-plugin-announcement-mailer

v1.0.5

Published

Send targeted bulk emails to user groups from the NodeBB Admin Panel

Readme

Announcement Mailer

NodeBB plugin to send bulk announcement emails to user groups from the admin panel.

What it does

  • ACP page where you pick groups, write an HTML template, hit send
  • Send now or schedule for later
  • Auto-create a draft email when a topic is posted in a configured category (sent after admin approval)
  • Test send to a single address before blasting the list
  • Unsubscribe link + List-Unsubscribe header
  • Tracking pixel for open rate
  • Hard bounces are added to a bounce list and skipped on subsequent sends
  • Retry failed deliveries
  • Template library (save and reuse)
  • History view with per-job progress, success/fail counts, remaining queue size

Install

In your NodeBB directory:

npm install nodebb-plugin-announcement-mailer
./nodebb activate nodebb-plugin-announcement-mailer
./nodebb build
./nodebb restart

For local development, npm link inside the plugin folder, then npm link nodebb-plugin-announcement-mailer from NodeBB.

Tested on NodeBB v4.x.

SMTP settings

ACP > Plugins > Announcement Mailer:

  • smtpHost, smtpPort (587 or 465), smtpUser, smtpPass
  • smtpFrom (falls back to smtpUser)
  • batchSize (default 10), batchDelay ms (default 2000), emailDelay ms (default 200)
  • maxRetries (default 3)

Tune the batch values to your provider's rate limit. Don't try to push thousands of emails through Gmail or Outlook — your account will get throttled or your mail will end up in spam. Use a transactional provider (SendGrid, Mailgun, SES, Postmark, etc).

Send a /test email to yourself first and check the rendered output before running a real campaign.

Auto announcements

If you set announcementCategoryId, a draft email is created whenever a new topic is posted in that category. Admins get a notification and the mail won't go out until someone approves it from the ACP. You can also cancel it from there.

Related settings:

  • autoEmailGroups — recipient groups
  • autoEmailSubject — defaults to Yeni Duyuru: {topicTitle}
  • autoEmailTemplate — body HTML

Placeholders available in templates: {topicTitle}, {topicUrl}, {topicContent}, {authorName}, {username}, {email}, {unsubscribeUrl}.

Topic content is HTML-escaped before being injected, so user-supplied markup won't break the template.

Things to know

  • If NodeBB restarts mid-send, the job is marked interrupted. The queue still lives in the DB but it isn't auto-resumed. Retry only re-sends the failures list, not addresses still sitting in the queue. Worth keeping in mind for 8k+ sends.
  • Transporter pool size is 3, connections recycle every 50 messages.
  • The tracking pixel is a plain GIF — image proxies and blockers will hide it, so the open rate underreports.
  • Jobs are guarded by a jobLock mutex; two admins can't retry/cancel/approve the same job at the same time.

License

MIT