[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSZ3ESFXDHJVMZJ20R0188":3,"skill-same:01M6CSZ3ESFXDHJVMZJ20R0188":110},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6CSZ3ESFXDHJVMZJ20R0188","email-systems",null,"Email has the highest ROI of any marketing channel. $36 for every $1 spent. Yet most startups treat it as an afterthought - bulk blasts, no personalization, landing in spam folders.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Femail-systems\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[24,25,26,27,28,29,30,31],"email","email systems","roi","apache","marketing","landing","channel","personalization","2026-11-10 10:12:30",false,"---\nname: email-systems\ndescription: Email has the highest ROI of any marketing channel. $36 for every\n  $1 spent. Yet most startups treat it as an afterthought - bulk blasts, no\n  personalization, landing in spam folders.\nrisk: none\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Email Systems\n\nEmail has the highest ROI of any marketing channel. $36 for every $1 spent.\nYet most startups treat it as an afterthought - bulk blasts, no personalization,\nlanding in spam folders.\n\nThis skill covers transactional email that works, marketing automation that\nconverts, deliverability that reaches inboxes, and the infrastructure decisions\nthat scale.\n\n## Principles\n\n- Transactional vs Marketing separation | Description: Transactional emails (password reset, receipts) need 100% delivery.\nMarketing emails (newsletters, promos) have lower priority. Use separate\nIP addresses and providers to protect transactional deliverability. | Examples: Good: Password resets via Postmark, marketing via ConvertKit | Bad: All emails through one SendGrid account\n- Permission is everything | Description: Only email people who asked to hear from you. Double opt-in for marketing.\nEasy unsubscribe. Clean your list ruthlessly. Bad lists destroy deliverability. | Examples: Good: Confirmed subscription + one-click unsubscribe | Bad: Scraped email list, hidden unsubscribe, bought contacts\n- Deliverability is infrastructure | Description: SPF, DKIM, DMARC are not optional. Warm up new IPs. Monitor bounce rates.\nDeliverability is earned through technical setup and good behavior. | Examples: Good: All DNS records configured, dedicated IP warmed for 4 weeks | Bad: Using free tier shared IP, no authentication records\n- One email, one goal | Description: Each email should have exactly one purpose and one CTA. Multiple asks\nmeans nothing gets clicked. Clear single action. | Examples: Good: \"Click here to verify your email\" (one button) | Bad: \"Verify email, check out our blog, follow us on Twitter, refer a friend...\"\n- Timing and frequency matter | Description: Wrong time = low open rates. Too frequent = unsubscribes. Let users\nset preferences. Test send times. Respect inbox fatigue. | Examples: Good: Weekly digest on Tuesday 10am user's timezone, preference center | Bad: Daily emails at random times, no way to reduce frequency\n\n## Patterns\n\n### Transactional Email Queue\n\nQueue all transactional emails with retry logic and monitoring\n\n**When to use**: Sending any critical email (password reset, receipts, confirmations)\n\n\u002F\u002F Don't block request on email send\nawait queue.add('email', {\n  template: 'password-reset',\n  to: user.email,\n  data: { resetToken, expiresAt }\n}, {\n  attempts: 3,\n  backoff: { type: 'exponential', delay: 2000 }\n});\n\n### Email Event Tracking\n\nTrack delivery, opens, clicks, bounces, and complaints\n\n**When to use**: Any email campaign or transactional flow\n\n# Track lifecycle:\n- Queued: Email entered system\n- Sent: Handed to provider\n- Delivered: Reached inbox\n- Opened: Recipient viewed\n- Clicked: Recipient engaged\n- Bounced: Permanent failure\n- Complained: Marked as spam\n\n### Template Versioning\n\nVersion email templates for rollback and A\u002FB testing\n\n**When to use**: Changing production email templates\n\ntemplates\u002F\n  password-reset\u002F\n    v1.tsx (current)\n    v2.tsx (testing 10%)\n    v1-deprecated.tsx (archived)\n\n# Deploy new version gradually\n# Monitor metrics before full rollout\n\n### Bounce Handling State Machine\n\nAutomatically handle bounces to protect sender reputation\n\n**When to use**: Processing bounce and complaint webhooks\n\nswitch (bounceType) {\n  case 'hard':\n    await markEmailInvalid(email);\n    break;\n  case 'soft':\n    await incrementBounceCount(email);\n    if (count >= 3) await markEmailInvalid(email);\n    break;\n  case 'complaint':\n    await unsubscribeImmediately(email);\n    break;\n}\n\n### React Email Components\n\nBuild emails with reusable React components\n\n**When to use**: Creating email templates\n\nimport { Button, Html } from '@react-email\u002Fcomponents';\n\nexport default function WelcomeEmail({ userName }) {\n  return (\n    \u003CHtml>\n      \u003Ch1>Welcome {userName}!\u003C\u002Fh1>\n      \u003CButton href=\"https:\u002F\u002Fapp.com\u002Fstart\">\n        Get Started\n      \u003C\u002FButton>\n    \u003C\u002FHtml>\n  );\n}\n\n### Preference Center\n\nLet users control email frequency and topics\n\n**When to use**: Building marketing or notification systems\n\nPreferences:\n☑ Product updates (weekly)\n☑ New features (monthly)\n☐ Marketing promotions\n☑ Account notifications (always)\n\n# Respect preferences in all sends\n# Required for GDPR compliance\n\n## Sharp Edges\n\n### Missing SPF, DKIM, or DMARC records\n\nSeverity: CRITICAL\n\nSituation: Sending emails without authentication. Emails going to spam folder.\nLow open rates. No idea why. Turns out DNS records were never set up.\n\nSymptoms:\n- Emails going to spam\n- Low deliverability rates\n- mail-tester.com score below 8\n- No DMARC reports received\n\nWhy this breaks:\nEmail authentication (SPF, DKIM, DMARC) tells receiving servers you're\nlegit. Without them, you look like a spammer. Modern email providers\nincreasingly require all three.\n\nRecommended fix:\n\n# Required DNS records:\n\n## SPF (Sender Policy Framework)\nTXT record: v=spf1 include:_spf.google.com include:sendgrid.net ~all\n\n## DKIM (DomainKeys Identified Mail)\nTXT record provided by your email provider\nAdds cryptographic signature to emails\n\n## DMARC (Domain-based Message Authentication)\nTXT record: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com\n\n# Verify setup:\n- Send test email to mail-tester.com\n- Check MXToolbox for record validation\n- Monitor DMARC reports\n\n### Using shared IP for transactional email\n\nSeverity: HIGH\n\nSituation: Password resets going to spam. Using free tier of email provider.\nSome other customer on your shared IP got flagged for spam.\nYour reputation is ruined by association.\n\nSymptoms:\n- Transactional emails in spam\n- Inconsistent delivery\n- Using same provider for marketing and transactional\n\nWhy this breaks:\nShared IPs share reputation. One bad actor affects everyone. For\ncritical transactional email, you need your own IP or a provider\nwith strict shared IP policies.\n\nRecommended fix:\n\n# Transactional email strategy:\n\n## Option 1: Dedicated IP (high volume)\n- Get dedicated IP from your provider\n- Warm it up slowly (start with 100\u002Fday)\n- Maintain consistent volume\n\n## Option 2: Transactional-only provider\n- Postmark (very strict, great reputation)\n- Includes shared pool with high standards\n\n## Separate concerns:\n- Transactional: Postmark or Resend\n- Marketing: ConvertKit or Customer.io\n- Never mix marketing and transactional\n\n### Not processing bounce notifications\n\nSeverity: HIGH\n\nSituation: Emailing same dead addresses over and over. Bounce rate climbing.\nEmail provider threatening to suspend account. List is 40% dead.\n\nSymptoms:\n- Bounce rate above 2%\n- No webhook handlers for bounces\n- Same emails failing repeatedly\n\nWhy this breaks:\nBounces damage sender reputation. Email providers track bounce rates.\nAbove 2% and you start looking like a spammer. Dead addresses must\nbe removed immediately.\n\nRecommended fix:\n\n# Bounce handling requirements:\n\n## Hard bounces:\nRemove immediately on first occurrence\nInvalid address, domain doesn't exist\n\n## Soft bounces:\nRetry 3 times over 72 hours\nAfter 3 failures, treat as hard bounce\n\n## Implementation:\n```typescript\n\u002F\u002F Webhook handler for bounces\napp.post('\u002Fwebhooks\u002Femail', (req, res) => {\n  const event = req.body;\n  if (event.type === 'bounce') {\n    await markEmailInvalid(event.email);\n    await removeFromAllLists(event.email);\n  }\n});\n```\n\n## Monitor:\nTrack bounce rate by campaign\nAlert if bounce rate exceeds 1%\n\n### Missing or hidden unsubscribe link\n\nSeverity: CRITICAL\n\nSituation: Users marking as spam because they cannot unsubscribe. Spam complaints\nrising. CAN-SPAM violation. Email provider suspends account.\n\nSymptoms:\n- Hidden unsubscribe links\n- Multi-step unsubscribe process\n- No List-Unsubscribe header\n- High spam complaint rate\n\nWhy this breaks:\nUsers who cannot unsubscribe will mark as spam. Spam complaints hurt\nreputation more than unsubscribes. Also it is literally illegal.\nCAN-SPAM, GDPR all require clear unsubscribe.\n\nRecommended fix:\n\n# Unsubscribe requirements:\n\n## Visible:\n- Above the fold in email footer\n- Clear text, not hidden\n- Not styled to be invisible\n\n## One-click:\n- Link directly unsubscribes\n- No login required\n- No \"are you sure\" hoops\n\n## List-Unsubscribe header:\n```\nList-Unsubscribe: \u003Cmailto:unsubscribe@example.com>,\n  \u003Chttps:\u002F\u002Fexample.com\u002Funsubscribe?token=xxx>\nList-Unsubscribe-Post: List-Unsubscribe=One-Click\n```\n\n## Preference center:\nOption to reduce frequency instead of full unsubscribe\n\n### Sending HTML without plain text alternative\n\nSeverity: MEDIUM\n\nSituation: Some users see blank emails. Spam filters flagging emails. Accessibility\nissues for screen readers. Email clients that strip HTML show nothing.\n\nSymptoms:\n- No text\u002Fplain part in emails\n- Blank emails for some users\n- Lower engagement in some segments\n\nWhy this breaks:\nNot everyone can render HTML. Screen readers work better with plain text.\nSpam filters are suspicious of HTML-only. Multipart is the standard.\n\nRecommended fix:\n\n# Always send multipart:\n```typescript\nawait resend.emails.send({\n  from: 'you@example.com',\n  to: 'user@example.com',\n  subject: 'Welcome!',\n  html: '\u003Ch1>Welcome!\u003C\u002Fh1>\u003Cp>Thanks for signing up.\u003C\u002Fp>',\n  text: 'Welcome!\\n\\nThanks for signing up.',\n});\n```\n\n# Auto-generate text from HTML:\nUse html-to-text library as fallback\nBut hand-crafted plain text is better\n\n# Plain text should be readable:\nNot just HTML stripped of tags\nActual formatted text content\n\n### Sending high volume from new IP immediately\n\nSeverity: HIGH\n\nSituation: Just switched providers. Started sending 50,000 emails\u002Fday immediately.\nMassive deliverability issues. New IP has no reputation. Looks like spam.\n\nSymptoms:\n- New IP\u002Fprovider\n- Sending high volume immediately\n- Sudden deliverability drop\n\nWhy this breaks:\nNew IPs have no reputation. Sending high volume immediately looks\nlike a spammer who just spun up. You need to gradually build trust.\n\nRecommended fix:\n\n# IP warm-up schedule:\n\nWeek 1: 50-100 emails\u002Fday\nWeek 2: 200-500 emails\u002Fday\nWeek 3: 500-1000 emails\u002Fday\nWeek 4: 1000-5000 emails\u002Fday\nContinue doubling until at volume\n\n# Best practices:\n- Start with most engaged users\n- Send to Gmail\u002FMicrosoft first (they set reputation)\n- Maintain consistent volume\n- Don't spike and drop\n\n# During warm-up:\n- Monitor deliverability closely\n- Check feedback loops\n- Adjust pace if issues arise\n\n### Emailing people who did not opt in\n\nSeverity: CRITICAL\n\nSituation: Bought an email list. Scraped emails from LinkedIn. Added conference\ncontacts. Spam complaints through the roof. Provider suspends account.\nMaybe a lawsuit.\n\nSymptoms:\n- Purchased email lists\n- Scraped contacts\n- High unsubscribe rate on first send\n- Spam complaints above 0.1%\n\nWhy this breaks:\nPermission-based email is not optional. It is the law (CAN-SPAM, GDPR).\nIt is also effective - unwilling recipients hurt your metrics and\nreputation more than they help.\n\nRecommended fix:\n\n# Permission requirements:\n\n## Explicit opt-in:\n- User actively chooses to receive email\n- Not pre-checked boxes\n- Clear what they are signing up for\n\n## Double opt-in:\n- Confirmation email with link\n- Only add to list after confirmation\n- Best practice for marketing lists\n\n## What you cannot do:\n- Buy email lists\n- Scrape emails from websites\n- Add conference contacts without consent\n- Use partner\u002Fcustomer lists without consent\n\n## Transactional exception:\nPassword resets, receipts, account alerts\ndo not need marketing opt-in\n\n### Emails that are mostly or entirely images\n\nSeverity: MEDIUM\n\nSituation: Beautiful designed email that is one big image. Users with images\nblocked see nothing. Spam filters flag it. Mobile loading is slow.\nNo one can copy text.\n\nSymptoms:\n- Single image emails\n- No text content visible\n- Missing or generic alt text\n- Low engagement when images blocked\n\nWhy this breaks:\nImages are blocked by default in many clients. Spam filters are\nsuspicious of image-only emails. Accessibility suffers. Load times\nincrease.\n\nRecommended fix:\n\n# Balance images and text:\n\n## 60\u002F40 rule:\n- At least 60% text content\n- Images for enhancement, not content\n\n## Always include:\n- Alt text on every image\n- Key message in text, not just image\n- Fallback for images-off view\n\n## Test:\n- Preview with images disabled\n- Should still be usable\n\n# Example:\n```html\n\u003Cimg\n  src=\"hero.jpg\"\n  alt=\"Save 50% this week - use code SAVE50\"\n  style=\"max-width: 100%\"\n\u002F>\n\u003Cp>Use code \u003Cstrong>SAVE50\u003C\u002Fstrong> to save 50% this week.\u003C\u002Fp>\n```\n\n### Missing or default preview text\n\nSeverity: MEDIUM\n\nSituation: Inbox shows \"View this email in browser\" or random HTML as preview.\nLower open rates. First impression wasted on boilerplate.\n\nSymptoms:\n- View in browser as preview\n- HTML code visible in preview\n- No preview component in template\n\nWhy this breaks:\nPreview text is prime real estate - appears right after subject line.\nDefault or missing preview text wastes this space. Good preview text\nincreases open rates 10-30%.\n\nRecommended fix:\n\n# Add explicit preview text:\n\n## In HTML:\n```html\n\u003Cdiv style=\"display:none;max-height:0;overflow:hidden;\">\n  Your preview text here. This appears in inbox preview.\n  \u003C!-- Add whitespace to push footer text out -->\n  &nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;\n\u003C\u002Fdiv>\n```\n\n## With React Email:\n```tsx\n\u003CPreview>\n  Your preview text here. This appears in inbox preview.\n\u003C\u002FPreview>\n```\n\n## Best practices:\n- Complement the subject line\n- 40-100 characters optimal\n- Create curiosity or value\n- Different from first line of email\n\n### Not handling partial send failures\n\nSeverity: HIGH\n\nSituation: Sending to 10,000 users. API fails at 3,000. No tracking of what sent.\nEither double-send or lose 7,000. No way to know who got the email.\n\nSymptoms:\n- No per-recipient send logging\n- Cannot tell who received email\n- Double-sending issues\n- No retry mechanism\n\nWhy this breaks:\nBulk sends fail partially. APIs timeout. Rate limits hit. Without\ntracking individual send status, you cannot recover gracefully.\n\nRecommended fix:\n\n# Track each send individually:\n\n```typescript\nasync function sendCampaign(emails: string[]) {\n  const results = await Promise.allSettled(\n    emails.map(async (email) => {\n      try {\n        const result = await resend.emails.send({ to: email, ... });\n        await db.emailLog.create({\n          email,\n          status: 'sent',\n          messageId: result.id,\n        });\n        return result;\n      } catch (error) {\n        await db.emailLog.create({\n          email,\n          status: 'failed',\n          error: error.message,\n        });\n        throw error;\n      }\n    })\n  );\n\n  const failed = results.filter(r => r.status === 'rejected');\n  \u002F\u002F Retry failed sends or alert\n}\n```\n\n# Best practices:\n- Log every send attempt\n- Include message ID for tracking\n- Build retry queue for failures\n- Monitor success rate per campaign\n\n## Validation Checks\n\n### Missing plain text email part\n\nSeverity: WARNING\n\nEmails should always include a plain text alternative\n\nMessage: Email being sent with HTML but no plain text part. Add 'text:' property for accessibility and deliverability.\n\n### Hardcoded from email address\n\nSeverity: WARNING\n\nFrom addresses should come from environment variables\n\nMessage: From email appears hardcoded. Use environment variable for flexibility.\n\n### Missing bounce webhook handler\n\nSeverity: WARNING\n\nEmail bounces should be handled to maintain list hygiene\n\nMessage: Email provider used but no bounce handling detected. Implement webhook handler for bounces.\n\n### Missing List-Unsubscribe header\n\nSeverity: INFO\n\nMarketing emails should include List-Unsubscribe header\n\nMessage: Marketing email detected without List-Unsubscribe header. Add header for better deliverability.\n\n### Synchronous email send in request handler\n\nSeverity: WARNING\n\nEmail sends should be queued, not blocking\n\nMessage: Email sent synchronously in request handler. Consider queuing for better reliability.\n\n### Email send without retry logic\n\nSeverity: INFO\n\nEmail sends should have retry mechanism for failures\n\nMessage: Email send without apparent retry logic. Add retry for transient failures.\n\n### Email API key in code\n\nSeverity: ERROR\n\nAPI keys should come from environment variables\n\nMessage: Email API key appears hardcoded in source code. Use environment variable.\n\n### Bulk email without rate limiting\n\nSeverity: WARNING\n\nBulk sends should respect provider rate limits\n\nMessage: Bulk email sending without apparent rate limiting. Add throttling to avoid hitting limits.\n\n### Email without preview text\n\nSeverity: INFO\n\nEmails should include preview\u002Fpreheader text\n\nMessage: Email template without preview text. Add hidden preheader for inbox preview.\n\n### Email send without logging\n\nSeverity: WARNING\n\nEmail sends should be logged for debugging and auditing\n\nMessage: Email being sent without apparent logging. Log sends for debugging and compliance.\n\n## Collaboration\n\n### Delegation Triggers\n\n- copy|subject|messaging|content -> copywriting (Email needs copy)\n- design|template|visual|layout -> ui-design (Email needs design)\n- track|analytics|measure|metrics -> analytics-architecture (Email needs tracking)\n- infrastructure|deploy|server|queue -> devops (Email needs infrastructure)\n\n### Email Marketing Stack\n\nSkills: email-systems, copywriting, marketing, analytics-architecture\n\nWorkflow:\n\n```\n1. Infrastructure setup (email-systems)\n2. Template creation (email-systems)\n3. Copy writing (copywriting)\n4. Campaign launch (marketing)\n5. Performance tracking (analytics-architecture)\n```\n\n### Transactional Email\n\nSkills: email-systems, backend, devops\n\nWorkflow:\n\n```\n1. Provider setup (email-systems)\n2. Template coding (email-systems)\n3. Queue integration (backend)\n4. Monitoring (devops)\n```\n\n## When to Use\n\nUse this skill when the request clearly matches the capabilities and patterns described above.\n","# Email Systems\n\nEmail has the highest ROI of any marketing channel. $36 for every $1 spent.\nYet most startups treat it as an afterthought - bulk blasts, no personalization,\nlanding in spam folders.\n\nThis skill covers transactional email that works, marketing automation that\nconverts, deliverability that reaches inboxes, and the infrastructure decisions\nthat scale.\n\n## Principles\n\n- Transactional vs Marketing separation | Description: Transactional emails (password reset, receipts) need 100% delivery.\nMarketing emails (newsletters, promos) have lower priority. Use separate\nIP addresses and providers to protect transactional deliverability. | Examples: Good: Password resets via Postmark, marketing via ConvertKit | Bad: All emails through one SendGrid account\n- Permission is everything | Description: Only email people who asked to hear from you. Double opt-in for marketing.\nEasy unsubscribe. Clean your list ruthlessly. Bad lists destroy deliverability. | Examples: Good: Confirmed subscription + one-click unsubscribe | Bad: Scraped email list, hidden unsubscribe, bought contacts\n- Deliverability is infrastructure | Description: SPF, DKIM, DMARC are not optional. Warm up new IPs. Monitor bounce rates.\nDeliverability is earned through technical setup and good behavior. | Examples: Good: All DNS records configured, dedicated IP warmed for 4 weeks | Bad: Using free tier shared IP, no authentication records\n- One email, one goal | Description: Each email should have exactly one purpose and one CTA. Multiple asks\nmeans nothing gets clicked. Clear single action. | Examples: Good: \"Click here to verify your email\" (one button) | Bad: \"Verify email, check out our blog, follow us on Twitter, refer a friend...\"\n- Timing and frequency matter | Description: Wrong time = low open rates. Too frequent = unsubscribes. Let users\nset preferences. Test send times. Respect inbox fatigue. | Examples: Good: Weekly digest on Tuesday 10am user's timezone, preference center | Bad: Daily emails at random times, no way to reduce frequency\n\n## Patterns\n\n### Transactional Email Queue\n\nQueue all transactional emails with retry logic and monitoring\n\n**When to use**: Sending any critical email (password reset, receipts, confirmations)\n\n\u002F\u002F Don't block request on email send\nawait queue.add('email', {\n  template: 'password-reset',\n  to: user.email,\n  data: { resetToken, expiresAt }\n}, {\n  attempts: 3,\n  backoff: { type: 'exponential', delay: 2000 }\n});\n\n### Email Event Tracking\n\nTrack delivery, opens, clicks, bounces, and complaints\n\n**When to use**: Any email campaign or transactional flow\n\n# Track lifecycle:\n- Queued: Email entered system\n- Sent: Handed to provider\n- Delivered: Reached inbox\n- Opened: Recipient viewed\n- Clicked: Recipient engaged\n- Bounced: Permanent failure\n- Complained: Marked as spam\n\n### Template Versioning\n\nVersion email templates for rollback and A\u002FB testing\n\n**When to use**: Changing production email templates\n\ntemplates\u002F\n  password-reset\u002F\n    v1.tsx (current)\n    v2.tsx (testing 10%)\n    v1-deprecated.tsx (archived)\n\n# Deploy new version gradually\n# Monitor metrics before full rollout\n\n### Bounce Handling State Machine\n\nAutomatically handle bounces to protect sender reputation\n\n**When to use**: Processing bounce and complaint webhooks\n\nswitch (bounceType) {\n  case 'hard':\n    await markEmailInvalid(email);\n    break;\n  case 'soft':\n    await incrementBounceCount(email);\n    if (count >= 3) await markEmailInvalid(email);\n    break;\n  case 'complaint':\n    await unsubscribeImmediately(email);\n    break;\n}\n\n### React Email Components\n\nBuild emails with reusable React components\n\n**When to use**: Creating email templates\n\nimport { Button, Html } from '@react-email\u002Fcomponents';\n\nexport default function WelcomeEmail({ userName }) {\n  return (\n    \u003CHtml>\n      \u003Ch1>Welcome {userName}!\u003C\u002Fh1>\n      \u003CButton href=\"https:\u002F\u002Fapp.com\u002Fstart\">\n        Get Started\n      \u003C\u002FButton>\n    \u003C\u002FHtml>\n  );\n}\n\n### Preference Center\n\nLet users control email frequency and topics\n\n**When to use**: Building marketing or notification systems\n\nPreferences:\n☑ Product updates (weekly)\n☑ New features (monthly)\n☐ Marketing promotions\n☑ Account notifications (always)\n\n# Respect preferences in all sends\n# Required for GDPR compliance\n\n## Sharp Edges\n\n### Missing SPF, DKIM, or DMARC records\n\nSeverity: CRITICAL\n\nSituation: Sending emails without authentication. Emails going to spam folder.\nLow open rates. No idea why. Turns out DNS records were never set up.\n\nSymptoms:\n- Emails going to spam\n- Low deliverability rates\n- mail-tester.com score below 8\n- No DMARC reports received\n\nWhy this breaks:\nEmail authentication (SPF, DKIM, DMARC) tells receiving servers you're\nlegit. Without them, you look like a spammer. Modern email providers\nincreasingly require all three.\n\nRecommended fix:\n\n# Required DNS records:\n\n## SPF (Sender Policy Framework)\nTXT record: v=spf1 include:_spf.google.com include:sendgrid.net ~all\n\n## DKIM (DomainKeys Identified Mail)\nTXT record provided by your email provider\nAdds cryptographic signature to emails\n\n## DMARC (Domain-based Message Authentication)\nTXT record: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com\n\n# Verify setup:\n- Send test email to mail-tester.com\n- Check MXToolbox for record validation\n- Monitor DMARC reports\n\n### Using shared IP for transactional email\n\nSeverity: HIGH\n\nSituation: Password resets going to spam. Using free tier of email provider.\nSome other customer on your shared IP got flagged for spam.\nYour reputation is ruined by association.\n\nSymptoms:\n- Transactional emails in spam\n- Inconsistent delivery\n- Using same provider for marketing and transactional\n\nWhy this breaks:\nShared IPs share reputation. One bad actor affects everyone. For\ncritical transactional email, you need your own IP or a provider\nwith strict shared IP policies.\n\nRecommended fix:\n\n# Transactional email strategy:\n\n## Option 1: Dedicated IP (high volume)\n- Get dedicated IP from your provider\n- Warm it up slowly (start with 100\u002Fday)\n- Maintain consistent volume\n\n## Option 2: Transactional-only provider\n- Postmark (very strict, great reputation)\n- Includes shared pool with high standards\n\n## Separate concerns:\n- Transactional: Postmark or Resend\n- Marketing: ConvertKit or Customer.io\n- Never mix marketing and transactional\n\n### Not processing bounce notifications\n\nSeverity: HIGH\n\nSituation: Emailing same dead addresses over and over. Bounce rate climbing.\nEmail provider threatening to suspend account. List is 40% dead.\n\nSymptoms:\n- Bounce rate above 2%\n- No webhook handlers for bounces\n- Same emails failing repeatedly\n\nWhy this breaks:\nBounces damage sender reputation. Email providers track bounce rates.\nAbove 2% and you start looking like a spammer. Dead addresses must\nbe removed immediately.\n\nRecommended fix:\n\n# Bounce handling requirements:\n\n## Hard bounces:\nRemove immediately on first occurrence\nInvalid address, domain doesn't exist\n\n## Soft bounces:\nRetry 3 times over 72 hours\nAfter 3 failures, treat as hard bounce\n\n## Implementation:\n```typescript\n\u002F\u002F Webhook handler for bounces\napp.post('\u002Fwebhooks\u002Femail', (req, res) => {\n  const event = req.body;\n  if (event.type === 'bounce') {\n    await markEmailInvalid(event.email);\n    await removeFromAllLists(event.email);\n  }\n});\n```\n\n## Monitor:\nTrack bounce rate by campaign\nAlert if bounce rate exceeds 1%\n\n### Missing or hidden unsubscribe link\n\nSeverity: CRITICAL\n\nSituation: Users marking as spam because they cannot unsubscribe. Spam complaints\nrising. CAN-SPAM violation. Email provider suspends account.\n\nSymptoms:\n- Hidden unsubscribe links\n- Multi-step unsubscribe process\n- No List-Unsubscribe header\n- High spam complaint rate\n\nWhy this breaks:\nUsers who cannot unsubscribe will mark as spam. Spam complaints hurt\nreputation more than unsubscribes. Also it is literally illegal.\nCAN-SPAM, GDPR all require clear unsubscribe.\n\nRecommended fix:\n\n# Unsubscribe requirements:\n\n## Visible:\n- Above the fold in email footer\n- Clear text, not hidden\n- Not styled to be invisible\n\n## One-click:\n- Link directly unsubscribes\n- No login required\n- No \"are you sure\" hoops\n\n## List-Unsubscribe header:\n```\nList-Unsubscribe: \u003Cmailto:unsubscribe@example.com>,\n  \u003Chttps:\u002F\u002Fexample.com\u002Funsubscribe?token=xxx>\nList-Unsubscribe-Post: List-Unsubscribe=One-Click\n```\n\n## Preference center:\nOption to reduce frequency instead of full unsubscribe\n\n### Sending HTML without plain text alternative\n\nSeverity: MEDIUM\n\nSituation: Some users see blank emails. Spam filters flagging emails. Accessibility\nissues for screen readers. Email clients that strip HTML show nothing.\n\nSymptoms:\n- No text\u002Fplain part in emails\n- Blank emails for some users\n- Lower engagement in some segments\n\nWhy this breaks:\nNot everyone can render HTML. Screen readers work better with plain text.\nSpam filters are suspicious of HTML-only. Multipart is the standard.\n\nRecommended fix:\n\n# Always send multipart:\n```typescript\nawait resend.emails.send({\n  from: 'you@example.com',\n  to: 'user@example.com',\n  subject: 'Welcome!',\n  html: '\u003Ch1>Welcome!\u003C\u002Fh1>\u003Cp>Thanks for signing up.\u003C\u002Fp>',\n  text: 'Welcome!\\n\\nThanks for signing up.',\n});\n```\n\n# Auto-generate text from HTML:\nUse html-to-text library as fallback\nBut hand-crafted plain text is better\n\n# Plain text should be readable:\nNot just HTML stripped of tags\nActual formatted text content\n\n### Sending high volume from new IP immediately\n\nSeverity: HIGH\n\nSituation: Just switched providers. Started sending 50,000 emails\u002Fday immediately.\nMassive deliverability issues. New IP has no reputation. Looks like spam.\n\nSymptoms:\n- New IP\u002Fprovider\n- Sending high volume immediately\n- Sudden deliverability drop\n\nWhy this breaks:\nNew IPs have no reputation. Sending high volume immediately looks\nlike a spammer who just spun up. You need to gradually build trust.\n\nRecommended fix:\n\n# IP warm-up schedule:\n\nWeek 1: 50-100 emails\u002Fday\nWeek 2: 200-500 emails\u002Fday\nWeek 3: 500-1000 emails\u002Fday\nWeek 4: 1000-5000 emails\u002Fday\nContinue doubling until at volume\n\n# Best practices:\n- Start with most engaged users\n- Send to Gmail\u002FMicrosoft first (they set reputation)\n- Maintain consistent volume\n- Don't spike and drop\n\n# During warm-up:\n- Monitor deliverability closely\n- Check feedback loops\n- Adjust pace if issues arise\n\n### Emailing people who did not opt in\n\nSeverity: CRITICAL\n\nSituation: Bought an email list. Scraped emails from LinkedIn. Added conference\ncontacts. Spam complaints through the roof. Provider suspends account.\nMaybe a lawsuit.\n\nSymptoms:\n- Purchased email lists\n- Scraped contacts\n- High unsubscribe rate on first send\n- Spam complaints above 0.1%\n\nWhy this breaks:\nPermission-based email is not optional. It is the law (CAN-SPAM, GDPR).\nIt is also effective - unwilling recipients hurt your metrics and\nreputation more than they help.\n\nRecommended fix:\n\n# Permission requirements:\n\n## Explicit opt-in:\n- User actively chooses to receive email\n- Not pre-checked boxes\n- Clear what they are signing up for\n\n## Double opt-in:\n- Confirmation email with link\n- Only add to list after confirmation\n- Best practice for marketing lists\n\n## What you cannot do:\n- Buy email lists\n- Scrape emails from websites\n- Add conference contacts without consent\n- Use partner\u002Fcustomer lists without consent\n\n## Transactional exception:\nPassword resets, receipts, account alerts\ndo not need marketing opt-in\n\n### Emails that are mostly or entirely images\n\nSeverity: MEDIUM\n\nSituation: Beautiful designed email that is one big image. Users with images\nblocked see nothing. Spam filters flag it. Mobile loading is slow.\nNo one can copy text.\n\nSymptoms:\n- Single image emails\n- No text content visible\n- Missing or generic alt text\n- Low engagement when images blocked\n\nWhy this breaks:\nImages are blocked by default in many clients. Spam filters are\nsuspicious of image-only emails. Accessibility suffers. Load times\nincrease.\n\nRecommended fix:\n\n# Balance images and text:\n\n## 60\u002F40 rule:\n- At least 60% text content\n- Images for enhancement, not content\n\n## Always include:\n- Alt text on every image\n- Key message in text, not just image\n- Fallback for images-off view\n\n## Test:\n- Preview with images disabled\n- Should still be usable\n\n# Example:\n```html\n\u003Cimg\n  src=\"hero.jpg\"\n  alt=\"Save 50% this week - use code SAVE50\"\n  style=\"max-width: 100%\"\n\u002F>\n\u003Cp>Use code \u003Cstrong>SAVE50\u003C\u002Fstrong> to save 50% this week.\u003C\u002Fp>\n```\n\n### Missing or default preview text\n\nSeverity: MEDIUM\n\nSituation: Inbox shows \"View this email in browser\" or random HTML as preview.\nLower open rates. First impression wasted on boilerplate.\n\nSymptoms:\n- View in browser as preview\n- HTML code visible in preview\n- No preview component in template\n\nWhy this breaks:\nPreview text is prime real estate - appears right after subject line.\nDefault or missing preview text wastes this space. Good preview text\nincreases open rates 10-30%.\n\nRecommended fix:\n\n# Add explicit preview text:\n\n## In HTML:\n```html\n\u003Cdiv style=\"display:none;max-height:0;overflow:hidden;\">\n  Your preview text here. This appears in inbox preview.\n  \u003C!-- Add whitespace to push footer text out -->\n  &nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;\n\u003C\u002Fdiv>\n```\n\n## With React Email:\n```tsx\n\u003CPreview>\n  Your preview text here. This appears in inbox preview.\n\u003C\u002FPreview>\n```\n\n## Best practices:\n- Complement the subject line\n- 40-100 characters optimal\n- Create curiosity or value\n- Different from first line of email\n\n### Not handling partial send failures\n\nSeverity: HIGH\n\nSituation: Sending to 10,000 users. API fails at 3,000. No tracking of what sent.\nEither double-send or lose 7,000. No way to know who got the email.\n\nSymptoms:\n- No per-recipient send logging\n- Cannot tell who received email\n- Double-sending issues\n- No retry mechanism\n\nWhy this breaks:\nBulk sends fail partially. APIs timeout. Rate limits hit. Without\ntracking individual send status, you cannot recover gracefully.\n\nRecommended fix:\n\n# Track each send individually:\n\n```typescript\nasync function sendCampaign(emails: string[]) {\n  const results = await Promise.allSettled(\n    emails.map(async (email) => {\n      try {\n        const result = await resend.emails.send({ to: email, ... });\n        await db.emailLog.create({\n          email,\n          status: 'sent',\n          messageId: result.id,\n        });\n        return result;\n      } catch (error) {\n        await db.emailLog.create({\n          email,\n          status: 'failed',\n          error: error.message,\n        });\n        throw error;\n      }\n    })\n  );\n\n  const failed = results.filter(r => r.status === 'rejected');\n  \u002F\u002F Retry failed sends or alert\n}\n```\n\n# Best practices:\n- Log every send attempt\n- Include message ID for tracking\n- Build retry queue for failures\n- Monitor success rate per campaign\n\n## Validation Checks\n\n### Missing plain text email part\n\nSeverity: WARNING\n\nEmails should always include a plain text alternative\n\nMessage: Email being sent with HTML but no plain text part. Add 'text:' property for accessibility and deliverability.\n\n### Hardcoded from email address\n\nSeverity: WARNING\n\nFrom addresses should come from environment variables\n\nMessage: From email appears hardcoded. Use environment variable for flexibility.\n\n### Missing bounce webhook handler\n\nSeverity: WARNING\n\nEmail bounces should be handled to maintain list hygiene\n\nMessage: Email provider used but no bounce handling detected. Implement webhook handler for bounces.\n\n### Missing List-Unsubscribe header\n\nSeverity: INFO\n\nMarketing emails should include List-Unsubscribe header\n\nMessage: Marketing email detected without List-Unsubscribe header. Add header for better deliverability.\n\n### Synchronous email send in request handler\n\nSeverity: WARNING\n\nEmail sends should be queued, not blocking\n\nMessage: Email sent synchronously in request handler. Consider queuing for better reliability.\n\n### Email send without retry logic\n\nSeverity: INFO\n\nEmail sends should have retry mechanism for failures\n\nMessage: Email send without apparent retry logic. Add retry for transient failures.\n\n### Email API key in code\n\nSeverity: ERROR\n\nAPI keys should come from environment variables\n\nMessage: Email API key appears hardcoded in source code. Use environment variable.\n\n### Bulk email without rate limiting\n\nSeverity: WARNING\n\nBulk sends should respect provider rate limits\n\nMessage: Bulk email sending without apparent rate limiting. Add throttling to avoid hitting limits.\n\n### Email without preview text\n\nSeverity: INFO\n\nEmails should include preview\u002Fpreheader text\n\nMessage: Email template without preview text. Add hidden preheader for inbox preview.\n\n### Email send without logging\n\nSeverity: WARNING\n\nEmail sends should be logged for debugging and auditing\n\nMessage: Email being sent without apparent logging. Log sends for debugging and compliance.\n\n## Collaboration\n\n### Delegation Triggers\n\n- copy|subject|messaging|content -> copywriting (Email needs copy)\n- design|template|visual|layout -> ui-design (Email needs design)\n- track|analytics|measure|metrics -> analytics-architecture (Email needs tracking)\n- infrastructure|deploy|server|queue -> devops (Email needs infrastructure)\n\n### Email Marketing Stack\n\nSkills: email-systems, copywriting, marketing, analytics-architecture\n\nWorkflow:\n\n```\n1. Infrastructure setup (email-systems)\n2. Template creation (email-systems)\n3. Copy writing (copywriting)\n4. Campaign launch (marketing)\n5. Performance tracking (analytics-architecture)\n```\n\n### Transactional Email\n\nSkills: email-systems, backend, devops\n\nWorkflow:\n\n```\n1. Provider setup (email-systems)\n2. Template coding (email-systems)\n3. Queue integration (backend)\n4. Monitoring (devops)\n```\n\n## When to Use\n\nUse this skill when the request clearly matches the capabilities and patterns described above.\n",{"name":5,"risk":37,"source":38,"date_added":39,"description":7},"none","vibeship-spawner-skills (Apache 2.0)",1772150400000,"main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Femail-systems",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill email-systems",{"tool":54,"command":55},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill email-systems",{"tool":57,"command":58},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill email-systems","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Femail-systems\u002FSKILL.md",true,[62,68,74,78,84,90,94,98,102,106],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"agents\u002Fopenai.yaml","REFERENCE","参考文档",274,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fagents\u002Fopenai.yaml",{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"assets\u002Fscreenshot-small.svg","ASSET","资产文件",1019,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fassets\u002Fscreenshot-small.svg",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"assets\u002Fscreenshot.png",860,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fassets\u002Fscreenshot.png",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"LICENSE.txt","LICENSE","许可证",10777,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002FLICENSE.txt",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fensure_macos_permissions.sh","SCRIPT","脚本",1703,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Fensure_macos_permissions.sh",{"path":91,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fmacos_display_info.swift",483,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Fmacos_display_info.swift",{"path":95,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":96,"sourceHtmlUrl":97},"scripts\u002Fmacos_permissions.swift",930,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Fmacos_permissions.swift",{"path":99,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Fmacos_window_info.swift",3596,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Fmacos_window_info.swift",{"path":103,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":104,"sourceHtmlUrl":105},"scripts\u002Ftake_screenshot.ps1",4948,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Ftake_screenshot.ps1",{"path":107,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":108,"sourceHtmlUrl":109},"scripts\u002Ftake_screenshot.py",19660,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fmedia\u002Fscreenshot\u002Fscripts\u002Ftake_screenshot.py",[111,122,139,166,185,212],{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":119,"publishedAt":32},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[120,121],"Test Skill","test",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":32},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[129,130,131,132,133,134,135,136,137,138],"zustand store ts","zustand","store","with","types","middleware","patterns","community","create","typescript",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":32},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[149,150,151,152,153,154,155,156,157,158,159,160,161,162,136,163,164,165],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":173,"publishedAt":32},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[172],{"categoryNo":146,"categoryName":147,"taxonomyType":21,"taxonomyTypeDesc":22},[174,149,175,176,177,178,179,136,154,180,162,181,159,158,153,182,137,183,155,184],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":194,"publishedAt":32},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[191],{"categoryNo":192,"categoryName":193,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[195,196,197,198,199,138,200,201,202,203,204,205,132,206,207,208,209,136,210,211],"expert","zod","zod validation expert","validation","react","safe","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":219,"publishedAt":32},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[218],{"categoryNo":146,"categoryName":147,"taxonomyType":21,"taxonomyTypeDesc":22},[220,221,222,223,224,225,226,227,136,228,229,230,231,232,233,234,235,236,237,155],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]