Guides
Bundle size
Keep imports focused on the channel and transport your app actually uses.
sently is split into subpaths so a receipt mailer does not pull SMS, SMTP pooling, or unused providers.
Measure stacks with bun run measure:size in the library repo when you change imports.
The one rule
Import channel senders and provider transports from subpaths — never from a convenience barrel when a focused path exists.
Quick start
Prefer mailer + one transport
import { createMailer } from "sently/mailer";
import { SndrTransport } from "sently/transports/sndr";
const mailer = await createMailer({
transport: new SndrTransport({ apiKey: process.env.SNDR_API_KEY! }),
});Prefer one webhook parser
import { parse, verifySignature } from "sently/webhooks/sndr";Avoid import { … } from "sently/webhooks" in Node/Deno without a bundler — that barrel evaluates every provider module.
Typical stacks
| Stack | Imports | Notes |
|---|---|---|
| HTTP email (SNDR) | sently/mailer + sently/transports/sndr | Small HTTP path. |
| HTTP email (Resend) | sently/mailer + sently/transports/resend | Includes attachment helpers. |
| SMS | sently/sms + sently/transports/twilio-sms | Channel + one SMS transport. |
| SMTP | sently/smtp | Separate from sently/mailer. |
Troubleshooting
With a bundler and sideEffects: false, unused re-exports usually shake out. Without a bundler, the main barrel still evaluates its static imports (SMTP factory, Fallback, Cloudflare Email, …). Prefer sently/mailer for HTTP-only apps.
Learn more
- Entrypoints — which path to import
- Exports — full map