Sently is an open-source TypeScript notification and messaging infrastructure library. One npm package (`sently`) with tree-shakeable subpaths for Email, SMS, WhatsApp, and Push. Apps use channel senders; providers are transports under those senders — not a message queue or hosted orchestration platform. ## For agents - Channels — email, SMS, WhatsApp, push (see /docs/channels) - Providers — pluggable transports under senders (see /docs/transports) - Concepts — sender, transport, hooks, retry, webhooks - Architecture — App → channel sender → transport (provider) → vendor API - Examples — /docs/get-started - Entrypoints — /docs/reference/entrypoints - Common tasks — /docs/guides - FAQ / compare — /docs/guides/compare --- # Documentation - [sently handbook](/docs): Channel-delivery for email, SMS, WhatsApp, and push — one sender shape as channels grow. - Get started - [Get started](/docs/get-started): Install sently and send your first message. - [Introduction](/docs/get-started/introduction): Choose a sender for the channel and a transport for the provider. - [Installation](/docs/get-started/installation): Install sently with Bun or use its published ESM package. - [Entrypoints](/docs/get-started/entrypoints): Use focused subpaths to import only the channel or integration you need. - [Runtimes](/docs/get-started/runtimes): sently supports Node.js, Bun, Deno, and Cloudflare Workers through focused integrations. - [Migrate from Nodemailer](/docs/get-started/migrate-nodemailer): Move SMTP configuration and message fields to sently incrementally. - [Stability policy](/docs/get-started/stability): What is frozen at 1.0 and what may grow under semver. - [Support matrix](/docs/get-started/support-matrix): Supported vs Available transports and runtimes for production use. - [Non-goals](/docs/get-started/non-goals): What sently intentionally does not ship — and what belongs on top. - Channels - [Channels](/docs/channels): Send through a stable channel API while transports handle providers. - [Email](/docs/channels/email): Compose and deliver email through a mailer and a transport. - [SMS](/docs/channels/sms): Send SMS through a sender and an SMS transport. - [WhatsApp](/docs/channels/whatsapp): Send template or session text messages through a WhatsApp transport. - [Push](/docs/channels/push): Send Web Push or FCM notifications through a push transport. - [Lifecycle hooks](/docs/channels/hooks): Observe sender activity without putting message bodies in hook context. - Transports - [Transports](/docs/transports): Choose a provider transport for a channel sender. - **Multi-channel** - [Taqnyat](/docs/transports/taqnyat): Send email, SMS, and WhatsApp through Taqnyat — one provider, three channel transports. - **Email** - [SMTP](/docs/transports/smtp): Connect to an SMTP relay with host, port, and auth. - [Resend](/docs/transports/resend): Send email through the Resend HTTP API. - [SendGrid](/docs/transports/sendgrid): Send email through the SendGrid v3 API. - [Postmark](/docs/transports/postmark): Send email through the Postmark API. - [Mailgun](/docs/transports/mailgun): Send email through the Mailgun Messages API. - [Amazon SES](/docs/transports/ses): Send email through the AWS SES v2 API. - [Brevo](/docs/transports/brevo): Send email through the Brevo HTTP API. - [MailerSend](/docs/transports/mailersend): Send email through the MailerSend HTTP API. - [Plunk](/docs/transports/plunk): Send email through the Plunk HTTP API. - [SparkPost](/docs/transports/sparkpost): Send email through the SparkPost transmissions API. - [Mailtrap](/docs/transports/mailtrap): Send email through Mailtrap delivery or sandbox mode. - [Loops](/docs/transports/loops): Send template-based transactional email through Loops. - [Cloudflare Email](/docs/transports/cloudflare-email): Use a Cloudflare Workers send_email binding. - [SNDR](/docs/transports/sndr): Send transactional email through the SNDR HTTP API with createMailer. - [Hostinger](/docs/transports/hostinger): Send email from a Hostinger mailbox through the Mail API or ready SMTP config. - **Email Dev** - [Mailpit](/docs/transports/mailpit): Catch outbound email in a local Mailpit instance during development. - [Inbucket](/docs/transports/inbucket): Catch outbound email in a local Inbucket instance during development. - **SMS** - [Twilio SMS](/docs/transports/twilio-sms): Send SMS through the Twilio Messages API with createSmsSender. - [Msegat](/docs/transports/msegat): Send SMS through Msegat and use its concrete OTP helpers. - [Unifonic](/docs/transports/unifonic): Send SMS through the Unifonic el.cloud REST API. - **WhatsApp** - [WhatsApp Cloud](/docs/transports/whatsapp-cloud): Send WhatsApp templates and session text through Meta Cloud API. - **Push** - [Web Push](/docs/transports/webpush): Encrypt and send browser notifications with VAPID. - [FCM](/docs/transports/fcm): Send mobile push through Firebase Cloud Messaging (current HTTP API). - Decorators - [Decorators](/docs/decorators): Wrap any channel transport with retry, fallback, preview, or idempotency. - [Preview](/docs/decorators/preview): Write email previews to disk instead of delivering them. - [Retry](/docs/decorators/retry): Retry failed sends with configurable backoff on any channel transport. - [Fallback](/docs/decorators/fallback): Fail over through an ordered list of channel transports. - [Weighted fallback](/docs/decorators/weighted-fallback): Choose a weighted primary transport and fail over on errors. - [Idempotency](/docs/decorators/idempotency): Deduplicate replayed email sends with an idempotency key. - Guides - [Guides](/docs/guides): Configure sently features around your delivery workflow. - [Compare](/docs/guides/compare): How sently fits next to vendor SDKs, Nodemailer, and orchestration platforms. - [Failover](/docs/guides/failover): Retry inside a provider, then fail over across providers on any channel. - [Adapters](/docs/guides/adapters): Configure an explicit SMTP socket adapter for a supported runtime. - [DKIM](/docs/guides/dkim): Sign outgoing messages with RSA-SHA256 or Ed25519-SHA256. - [OAuth2](/docs/guides/oauth2): Refresh OAuth2 tokens and use them for SMTP XOAUTH2 authentication. - [SMTP pooling](/docs/guides/pool): Reuse SMTP connections and apply shared rate limits. - [Template plugin](/docs/guides/plugins-template): Render named HTML email templates before delivery. - [React Email](/docs/guides/react-email): Render a React email element through the optional sently React plugin. - [Webhooks](/docs/guides/webhooks): Parse provider delivery events into EmailEvent or DeliveryEvent shapes, with optional signature checks. - [Observability](/docs/guides/observability): Attach lifecycle hooks or use the console observer for delivery diagnostics. - [Vendor OTP helpers](/docs/guides/vendor-extras-otp): Use OTP helpers only on concrete SMS transport instances. - [Security](/docs/guides/security): Protect credentials, delivery endpoints, webhook integrity, and publish trust. - [Attachments](/docs/guides/attachments): Attach bytes, strings, or runtime-supported file paths to email. - [Bulk sending](/docs/guides/send-bulk): Send multiple email messages with concurrency and batch-aware transports. - [Web Push interoperability](/docs/guides/webpush-interop): Use subscriptions from the browser Push API with the Web Push transport. - [Bundle size](/docs/guides/bundle-size): Keep imports focused on the channel and transport your app actually uses. - Reference - [Reference](/docs/reference): Public types, exports, and normalized events. - [Exports](/docs/reference/exports): Public package entrypoints and what each one is for. - [Mail options](/docs/reference/mail-options): Fields accepted by `mailer.send` and `mailer.sendBulk`. - [SMS options](/docs/reference/sms-options): Fields accepted by `SmsSender.send`. - [WhatsApp options](/docs/reference/whatsapp-options): Template and session text shapes accepted by `WhatsAppSender.send`. - [Push options](/docs/reference/push-options): Fields accepted by `PushSender.send` for Web Push and FCM. - [Transport contracts](/docs/reference/transport-contracts): Implement a channel transport to integrate a provider not shipped by sently. - [Channel send result](/docs/reference/channel-result): Map email, SMS, WhatsApp, and push results to a shared accepted shape. - [Errors](/docs/reference/errors): Handle stable sently error codes and provider-specific error instances. - [Webhook events](/docs/reference/webhook-events): Normalized EmailEvent and DeliveryEvent fields from provider webhook parsers. - AI - [AI integration](/docs/ai): Machine-readable documentation and the local MCP server. - [llms.txt](/docs/ai/llms-txt): Use the docs site machine-readable indexes for agent context. - [MCP](/docs/ai/mcp): Run the local Model Context Protocol server for sently tooling.