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

@starchive/starplex-sdk

v0.5.0

Published

The SDK for Starplex.

Readme

Starplex SDK

Send email

import { Starplex } from '@starchive/starplex-sdk';

const starplex = new Starplex({ secretKey: process.env.STARPLEX_SECRET_KEY! });

const { actionId } = await starplex.actions.sendEmail({
  from: '[email protected]',
  recipients: ['[email protected]'],
  subject: 'Welcome',
  text: 'Welcome aboard.',
  html: '<p>Welcome aboard.</p>',
  replyTo: '[email protected]',
});
  • 1–100 unique recipients, each receiving a private copy.
  • text is required. html and replyTo are optional.
  • from is required and must be verified for your organization.

Options

Pass options as the second argument: sendEmail(message, options).

| Option | Use | | --- | --- | | idempotencyKey | Recover the same submission across calls. Keep recipients, order, and content unchanged. | | orgId | Required for global accounts only. | | signal | Abort the request, without cancelling the queued action. |

Automatic retries reuse the submission. A new call without a key starts a new action.

Verify a sender

await starplex.emailIdentities.verify('[email protected]'); // Sends the confirmation email.
// After clicking its link:
await starplex.emailIdentities.get('[email protected]'); // status: 'verified'

await starplex.actions.sendEmail({
  from: '[email protected]',
  recipients: ['[email protected]'],
  subject: 'Welcome',
  text: 'Welcome aboard.',
});
  • Status: pending, verified, or failed; get returns null when absent.
  • Call verify again to resend confirmation. Links expire after 24 hours.
  • remove(address) disables sending; verify(address) restores access. Verified addresses need no new confirmation.
  • Each address remains assigned to one organization, including after removal. Existing unmanaged SES identities cannot be claimed.
  • Options: { orgId, signal }. Rights: resource.email-identity.create, .read, .delete.

Read results

const action = await starplex.actions.get(actionId);

if (action?.output?.kind === 'email') {
  console.table(action.output.recipients);
}

| Recipient status | Meaning | Details | | --- | --- | --- | | accepted | Provider accepted it; delivery unconfirmed. | providerMessageId | | rejected | Not sent. | code | | uncertain | May have been sent. A new key risks a duplicate. | code |

Results appear after completion. Failed actions expose action.error; request failures reject with StarplexError.

Subscribe to email.send.completed for a notification with actionId, orgId, and completedAt, then read the results using actions.get(actionId).

Required permissions: action.email.send to send, resource.action-run.read to read results.

import { Effect } from 'effect';
import { Starplex } from '@starchive/starplex-sdk/effect';

const starplex = new Starplex({ secretKey: process.env.STARPLEX_SECRET_KEY! });
const submission = starplex.actions.sendEmail({
  from: '[email protected]',
  recipients: ['[email protected]'],
  subject: 'Welcome',
  text: 'Welcome aboard.',
});

const { actionId } = await Effect.runPromise(submission);

Rerunning the same Effect reuses its submission. Use Effect interruption instead of signal.