
customware-email
Implement customer email in a Customware-generated React Router and Hono app, including durable Postmark inbound receipt and direct Postmark outbound sending. Use when a Builder task names the customware-email skill, provides a Postmark virtual inbound address, or asks to add customer-facing email to an existing Customware app.
- Installs
- 175
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/customware-ai/skills --skill customware-email- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads customware-email automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Customer Email
<purpose>Implement one coherent Customware email capability for a Customware-generated app. The capability receives customer replies through the provisioned Postmark inbound webhook and sends customer-facing messages through the same development Postmark server's HTTPS API.
The task provides the project-specific addresses. The two managed server ENV values provide the credentials. This skill provides the implementation method, durable behavior, and verification contract.
</purpose>Build toward the existing app. Reuse its Hono routes, Drizzle schema, SQLite database, logging, error, and
Resultpatterns. A small, native integration is easier to reason about and safer than a second email framework.
Read first
Read these references before editing source files:
- references/common-architecture.md — task inputs, platform boundaries, credentials, stack, and shared integration shape.
- references/inbound.md — the fixed webhook, authentication, durable receipt, deduplication, and recovery contract.
- references/outbound.md — direct Postmark API sending, message shape, sender/reply routing, and failure handling.
- references/common-quality.md — validation, safe logging, migration, tests, and final verification.
Read the inbound and outbound references even when the task initially sounds one-sided. Replies make the two directions one feature: inbound mail must be able to reach the app, and outbound mail must route replies back to the same virtual address.
<read_order>
Before implementation, also read the target repository's AGENTS.md, the complete Builder task, relevant project docs, and the existing database/route/service contracts. Treat the target repository as authoritative when a framework detail differs from an example here.
</read_order>
Fixed platform contract
| Concern | Required decision |
|---|---|
| Postmark server | Use the one development server already provisioned for this project. The app does not create, delete, or configure it. |
| Inbound route | POST /api/email/inbound |
| Inbound authentication | HTTP Basic Auth, username customware, password from POSTMARK_INBOUND_WEBHOOK_SECRET |
| Server credentials | Read POSTMARK_INBOUND_WEBHOOK_SECRET and POSTMARK_SERVER_TOKEN only on the server. |
| Inbound address | Use the exact virtual address supplied in the task. Do not create an ENV for it. |
| Outbound sender | Use the exact task-provided sender, currently messages@customware.ai. Do not create an ENV for it. |
| Outbound stream | Postmark's existing Default Transactional stream (outbound). |
| Transport | Direct HTTPS requests to Postmark's Email API from server code. |
| SMTP | Do not enable or use SMTP. |
| Customware gateway | Do not add a Customware send endpoint, proxy, or email gateway. |
| Production | Implement the development capability described by the task. Do not add production-server, publish, or environment-branching behavior. |
<address_source_of_truth>
The task description is the source of truth for the virtual inbound address and outbound From address. Keep each value in one server-owned constant/module so it cannot drift between the sender, reply routing, and reviewer-visible code. Never replace either value with a placeholder, a guessed address, or a new ENV.
</address_source_of_truth>
Non-negotiables
- Keep both Postmark credentials server-only. Never place them in browser code,
VITE_*, HTML, JSON responses, task output, logs, or client state. - Treat
.envand.env.*as inaccessible. Do not inspect them with file commands. A runtime check may usenode --env-file=.env ...without printing environment values. - Register the inbound route before static serving and the SPA fallback.
- Persist an inbound delivery before acknowledging it. The 200 response means the raw delivery is safe to recover, not that application processing finished.
- Enforce
MessageIDuniqueness in the database. Do not implement deduplication as read-then-insert. - Make inbound processing recoverable after a crash or restart; an in-memory callback cannot be the only record of work.
- Return the contract statuses in the inbound reference. Never return
403to Postmark for this receiver. - Send outbound mail only from server code with
X-Postmark-Server-TokenandMessageStream: "outbound". - Use the task's virtual inbound address as
ReplyTo, so a customer reply comes back through the existing webhook. - Keep message content and credentials out of logs. Log only safe operational identifiers and error categories.
- Reuse existing contracts and error/result conventions. Avoid duplicate validation, speculative abstractions, compatibility branches, or a second persistence framework.
Implementation workflow
1. Establish the task contract
- Read the task completely.
- Extract the exact virtual inbound address and outbound From address.
- Confirm the task names
customware-emailand that the Postmark server has already been provisioned. - Stop with a clear
action_requiredresult if either address or either managed credential contract is unavailable. Do not invent values.
2. Inspect the generated app
Locate the Hono entrypoint, route registration order, static/fallback handlers, Drizzle schema and migrations, query/service conventions, environment helper, logging boundary, and existing Result/Zod patterns. Identify where the app's customer workflows should consume an accepted email and where its existing business actions produce outbound messages.
3. Build the shared server foundation
Create one small server-owned email configuration module for the task-provided addresses and the two managed ENV reads. Keep provider calls behind a focused Postmark client/adapter that follows the app's existing result and error patterns. Do not let browser requests choose the server token, From address, ReplyTo address, stream, or Postmark URL.
4. Implement inbound and outbound
Follow references/inbound.md for the receiver and durable worker. Follow references/outbound.md for the Postmark Email API adapter and the app-facing send helper. Integrate both with existing domain flows instead of creating a parallel email subsystem.
5. Verify progressively
Run focused contract checks while implementing, then the repository's normal format, lint, typecheck, build, unit, and interactive checks. Use the test matrix in references/common-quality.md. If an external send is requested, use only an explicitly approved safe recipient; otherwise prove the exact request with a stubbed Postmark client and route-level tests.
6. Perform the final audit
Search the final diff for credential names, hardcoded secrets, SMTP usage, POSTMARK_ACCOUNT_TOKEN, production branches, direct browser-to-Postmark calls, raw email logging, and a second gateway. Confirm the task addresses are the only email values embedded in generated application code and that the database migration is included and applied through the app's normal command.
Completion checklist
- The task's exact inbound and outbound addresses are used in one server-owned configuration module.
-
POSTMARK_INBOUND_WEBHOOK_SECRETprotects the inbound route andPOSTMARK_SERVER_TOKENauthorizes outbound HTTPS calls. - The inbound route captures raw JSON, validates
MessageID, persists before 200, deduplicates by a database constraint, and recovers pending/stale work. - Outbound requests use
POST /email,X-Postmark-Server-Token,MessageStream: "outbound", the task's From, and the task's inbound ReplyTo. - SMTP, raw email, account-level provisioning, production behavior, and a Customware send gateway are absent.
- Sensitive values and message content are absent from browser bundles, responses, and logs.
- Migrations, focused tests, repository checks, build, and relevant browser verification pass.
- The final diff and reviewer requirements are read back before sign-off.
Boundaries
Use this skill for the generated app's Customware email implementation. The Customware control plane owns Postmark server provisioning, encryption, hidden ENV materialization, webhook URL reconciliation on sandbox restart, cleanup, and publish protection. Do not duplicate those responsibilities in the generated app.
Use customware-ai for AI gateway or AI Elements work, customware-support-widget for the support widget, and task-workflow when the Builder task requires its full gated execution protocol. Those skills complement this one; they do not replace the email contracts here.
FAQ
What does the customware-email skill do?
Implement customer email in a Customware-generated React Router and Hono app, including durable Postmark inbound receipt and direct Postmark outbound sending. Use when a Builder task names the customware-email skill, provides a Postmark virtual inbound address, or asks to add customer-facing email to an existing Customware app.
How do I install customware-email?
Run npx skills add https://github.com/customware-ai/skills --skill customware-email in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/customware-email/ (personal) or .claude/skills/customware-email/ (project).
Which AI agents can use customware-email?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is customware-email safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains customware-email?
It is published by customware-ai in customware-ai/skills. It has 175 recorded installs.
More from customware-ai/skills
domain-context
customware-ai/skills
Progressive Domain Crystallization (PDC) — a skill for building and maintaining a living domain knowledge base for any custom business application. Use this skill whenever the user is developing a business application and wants the AI to accumulate understanding of internal terminology, entities, relationships, and business rules over time — especially when that knowledge is not fully defined upfront and grows across sessions. Trigger on any of: "remember how our system works", "learn our domain", "track business entities", "build domain knowledge", "understand our terminology", "grow AI context over time", "domain model", "business rules documentation", or whenever a user says the AI doesn't understand their business-specific language or data model. Also use at the start of any session where a .tasks/domain.md file exists in the project — always read it before doing any work.
customware-support-widget
customware-ai/skills
Use this skill when adding, placing, configuring, or fixing the Customware support chat widget in the Customware React Router client-only SPA template. It covers root.tsx/root document script loading, route/layout placement, required org/project ids, bubble versus full mode, optional metadata and style options, page-operation support, and constraints for MITB-style code generation.
task-workflow
customware-ai/skills
Canonical workflow for a task. Read and follow strictly end to end while working on the task.
frontend-design
customware-ai/skills
Strict frontend design guardrails for building modern, minimal-visual-noise, airy, non-generic app UIs. Use whenever creating or changing frontend UI, React components, shadcn/ui themes, Tailwind styles, app layouts, or first-version product screens. This skill complements vertical/domain skills like CPQ, CRM, and similar app builders: follow the selected domain skill's workflow and layout requirements, then enforce this skill's shared visual rules for brand-aware theming, generous spacing, typography, contrast, roundedness, shadows, surface hierarchy, cardless defaults, no-sidebar defaults, and anti-pattern avoidance.
crm-builder
customware-ai/skills
Customer Relationship Management (CRM) vertical skill for the Customware SPA. Defines the section layout, entity views, and mapping rules for transforming a DOMAIN.md into a CRM tool. Use this skill when the Builder Agent classifies a customer's domain as contact management, sales pipeline, deal tracking, or customer relationship workflows. Trigger signals: contacts, leads, deals, pipeline, follow-ups, opportunities, accounts, customer data everywhere, can't track who talked to whom, sales process, referrals.
cpq-builder
customware-ai/skills
Configure-Price-Quote (CPQ) vertical skill for the Customware SPA. Defines patterns, minimum standards, layout patterns, lifecycle indicators, product configurator patterns, business rule templates, and mapping rules for transforming a DOMAIN.md into a CPQ-shaped application. Targeted at SMB customers (5-50 employees) migrating from spreadsheets and email-based quoting workflows. The prototype must feel dramatically better than Excel without feeling enterprise-overcomplicated. Patterns are defaults, not mandates — adapt them when the actual workflow deviates. Trigger signals: quoting, pricing, product configuration, calculators, guided intake forms, assessment tools, estimate builders, proposal workflows, eligibility checkers, any "fill in fields → calculate → produce a deliverable" pattern.
Popular productivity & automation skills
agent-browser
vercel-labs/agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
lark-doc
open.feishu.cn
飞书云文档(Docx / Wiki)内容操作:读取、创建、编辑文档,插入或下载图片附件,以及操作思维笔记。用户提供文档 URL/token(包括 doubao.com 的 /docx/、/wiki/)时使用;按 URL 路径/token 而非域名路由;/page/ 是妙搭应用,非飞书云文档。文档内嵌资源按读取参考中的统一规则分流。独立评论操作走 lark-drive;随正文读取评论使用 docs +fetch。表格或 Base 内部数据操作不在本 skill。
lark-base
open.feishu.cn
飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限、模板中心(多维表格模板分类/列表/搜索);遇到 Base/多维表格/bitable、BaseApp/AppMode、/base/ 或 /app/ 链接时使用。BaseApp 不走 lark-apps;文件导入/导出转 lark-drive,认证/授权转 lark-shared。
lark-drive
open.feishu.cn
飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、查询权限设置、评论/权限/订阅、标题、版本、飞书文档密级标签(secure labels)和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。
lark-shared
open.feishu.cn
Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling notice JSON.
lark-im
open.feishu.cn
飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。