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

@limonify/email-templates

v1.1.1

Published

Design-system-first email template suite for Go, Node, and Python backends — crafted with @limonify/ui tokens, OKLCH parser, and multi-language support

Readme


✨ Features

  • 🖤 Authentic Limonify UI Craft: Precision double-frame cards, segmented OTP inputs, quiet status dot badges, and monochrome aesthetics matching @limonify/ui web and native components.
  • 📧 Bulletproof Email Client Compatibility: Compiled down to table-based inline-styled HTML tested on Gmail, Apple Mail, Outlook (Word engine), and mobile email clients.
  • 🎨 Mathematical OKLCH CSS Color Parser: Automatically translates modern CSS custom properties (oklch(14.5% 0 0)) from your theme stylesheet into cross-client static #HEX colors.
  • Zero-Runtime Overhead in Production: Pre-compiled localized templates (/en/otp.html, /tr/otp.html) allow Go, Python, and Node.js backends to render in <1 ms without runtime template compilation.
  • 🌐 Built-in Multi-Language (i18n): Out-of-the-box translations for 5 languages (English, Turkish, German, Spanish, French) + 1-step custom language additions via ./locales/*.json.
  • 🖥️ Live Interactive Preview Studio: Built-in visual dashboard (bun run preview) with Dark/Light toggle, language switcher, mobile/desktop viewports, and 1-click HTML copy.

🚀 Quick Start

Run the interactive CLI generator without installing:

# Using Bun
bunx @limonify/email-templates

# Using NPM / NPX
npx @limonify/email-templates

# Using PNPM
pnpm dlx @limonify/email-templates

Or launch the Live Interactive Preview Studio at http://localhost:3000:

bunx @limonify/email-templates preview

📦 26 Production-Grade Templates

| Category | Template Name | Template ID | Description | | :----------------------------- | :------------------------- | :---------------------- | :-------------------------------------------------------------- | | Authentication & Security | OTP / 2FA Verification | otp | Segmented 6-digit PIN input with expiration notice | | | Password Reset | password-reset | Secure password reset request with action button | | | Magic Link Sign In | magic-link | One-click passwordless authentication link | | | Email Change Confirmation | email-change | Verification link to confirm new primary email address | | | Security / Session Alert | notification | Session details card with IP, device, and location | | | General Announcement | announcement | Broadcast notifications, policy updates, and general notices | | | API Key Created | api-key-created | New token alert with prefix and revocation action | | | 2FA Disabled Alert | two-factor-disabled | Critical security alert when 2FA is removed from account | | Developer & DevOps (CI/CD) | Deployment Succeeded | deploy-succeeded | Production release notice with branch, commit, and duration | | | Deployment Failed Alert | deploy-failed | CI/CD build failure alert with error terminal code block | | | Incident / Status Alert | incident-report | Operational incident update with impacted systems | | Newsletters & Content | Daily Tech Briefing | daily-newsletter | Morning curated tech newsletter with top story and reading time | | | Weekly Analytics Digest | weekly-digest | 7-day performance metrics and activity 2x2 grid | | | Product Update / Changelog | product-update | Release announcement with categorized feature tags | | Billing & Subscriptions | Payment Receipt / Invoice | payment-completed | Itemized invoice breakdown with PDF download action | | | Payment Failed / Dunning | payment-failed | Declined renewal payment notice with update billing action | | | Trial Ending Reminder | trial-ending | Free trial expiration countdown and upgrade notice | | | Subscription Canceled | subscription-canceled | Cancellation notice with access period and reactivation | | Team & Collaboration | Team / Workspace Invite | team-invite | Member invitation with role assignment and accept button | | | Comment / Mention Alert | comment-mention | Discussion mention with quote bubble and reply action | | | Account Deletion Scheduled | account-deletion | 30-day grace period notice with restore account button | | Product & Growth | Welcome & Onboarding | welcome | New account onboarding with setup checklist | | | Usage Quota Warning | usage-limit-warning | Monthly quota limit alert (80%/100%) with progress meter | | | Feedback / NPS Survey | feedback-request | Customer satisfaction feedback with 1-click survey | | E-Commerce & Orders | Order Shipped / Tracking | order-shipped | Delivery confirmation with tracking number and carrier | | | Abandoned Cart Reminder | cart-abandonment | Reserved items reminder with complete checkout button |


🐹 Go Backend Integration

package main

import (
	"bytes"
	"embed"
	"fmt"
	"html/template"
	"log"
)

//go:embed templates/emails/*/*.html
var emailTemplatesFS embed.FS

type MailService struct {
	tmpl *template.Template
}

func NewMailService() (*MailService, error) {
	t, err := template.ParseFS(emailTemplatesFS, "templates/emails/*/*.html")
	if err != nil {
		return nil, fmt.Errorf("failed to parse email templates: %w", err)
	}
	return &MailService{tmpl: t}, nil
}

func (s *MailService) RenderEmail(locale, templateName string, data any) (string, error) {
	var buf bytes.Buffer
	targetPath := fmt.Sprintf("%s/%s.html", locale, templateName)

	err := s.tmpl.ExecuteTemplate(&buf, targetPath, data)
	if err != nil {
		// Fallback to English if locale template is not found
		fallbackPath := fmt.Sprintf("en/%s.html", templateName)
		err = s.tmpl.ExecuteTemplate(&buf, fallbackPath, data)
		if err != nil {
			return "", err
		}
	}
	return buf.String(), nil
}

func main() {
	mailer, err := NewMailService()
	if err != nil {
		log.Fatal(err)
	}

	data := map[string]any{
		"AppName":   "Limonify",
		"Code":      "849201",
		"ExpiresIn": "10 minutes",
	}

	html, err := mailer.RenderEmail("en", "otp", data)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Rendered HTML length:", len(html), "bytes")
}

🟢 Node.js / TypeScript Integration

import {
  renderTemplateToHtml,
  defaultLimonifyDarkTheme,
  registerCustomLocale,
} from "@limonify/email-templates";

// Render localized template to static HTML
const html = await renderTemplateToHtml(
  "daily-newsletter",
  defaultLimonifyDarkTheme,
  "handlebars", // or 'go' | 'raw'
  {
    appName: "Limonify Daily",
    logoUrl:
      "https://raw.githubusercontent.com/limonify/email-templates/main/.github/assets/logo.png",
  },
  {
    issueNumber: "#142",
    date: "Monday, August 31, 2026",
  },
  "en", // locale
);

🌐 Multi-Language (i18n) & Custom Locales

Method 1: Adding JSON files to ./locales/ (Zero Config)

Create a locales/ directory in your project root and drop any {lang}.json file:

my-project/
├── locales/
│   ├── it.json    # Italian overrides
│   └── ja.json    # Japanese overrides
└── limonify-email.config.json

Example locales/it.json:

{
  "otp": {
    "badgeText": "Sicurezza",
    "heading": "Codice di verifica",
    "description": "Usa questo codice monouso per completare l'accesso:"
  }
}

Method 2: Via limonify-email.config.json

{
  "locales": ["en", "tr", "de", "es", "fr", "it"],
  "translations": {
    "it": {
      "welcome": {
        "heading": "Benvenuto in {{ .AppName }}"
      }
    }
  }
}

📄 License

MIT © limonify