| name | marketing-pages |
| description | Use when creating, updating, editing, or deleting marketing/public pages in the Resend codebase. Covers page structure, component reuse rules, and the distinction between public and product design systems. |
| metadata | {"author":"resend","version":"1.0.1"} |
Scope
Marketing pages live in src/app/(website)/. Product pages live in src/app/(dashboard)/. This skill covers the (website) route group only.
Critical Rule: Always Reuse, Never Create
Before writing any component, search for an existing one. The codebase has two separate component systems — never mix them.
| System | Path | Use for |
|---|
| Product UI | src/ui/ | Dashboard/authenticated pages only |
| Public primitives | src/website/ | Marketing pages typography, buttons |
| Public compositions | src/components/website/ | Marketing feature sections |
| Page structure | src/components/public-page.tsx | Every marketing page layout |
Page Structure (required pattern)
Every marketing page must follow this composition:
import * as PublicPage from '@/components/public-page';
export default function MyPage() {
return (
<>
<script type="application/ld+json" ... /> {/* SEO JSON-LD */}
<PublicPage.Root>
<PublicPage.Header />
<MyPageHero /> {/* or PublicPage.Hero */}
<PublicPage.Container>
{/* feature sections */}
<CallToAction />
</PublicPage.Container>
<PublicPage.Footer />
</PublicPage.Root>
</>
);
}
Public Primitives (src/website/)
Use these instead of src/ui/ equivalents on marketing pages:
PublicHeading — sizes 1–6, colors: white | gradient
PublicText — sizes 1–5, colors: white | gray | gradient, weights: normal | medium | semibold | bold
PublicButton — appearances: white (default) | black | black-fade | fade | red; sizes: 2 | 3 | 4; supports asChild, iconLeft, iconRight
PublicPage.accordion — accordion sections
PublicPage.avatar — avatar components
See references/components.md for full APIs and src/components/website/ inventory.
Metadata & SEO (required for new pages)
export const metadata: Metadata = {
alternates: { canonical: '/your-path' },
title: 'Page Title · Resend',
description: '...',
openGraph: { images: [{ url: '/static/cover-image.jpg' }] },
};
Always add JSON-LD structured data using getCompanyJsonLd() from @/utils/json-ld and getBaseUrl() from @/utils/base-url.
Adding a New Marketing Page
- Create
src/app/(website)/your-page/page.tsx
- Use
PublicPage.Root/Header/Container/Footer structure
- Create page-specific sections in
src/components/product-pages/your-page/ or reuse from src/components/website/
- Add
metadata export and JSON-LD script
- Update footer links in
src/components/public-page.tsx if needed
Deleting a Marketing Page
- Remove
src/app/(website)/your-page/ directory
- Remove related components in
src/components/product-pages/your-page/ if page-specific
- Remove footer/nav links referencing the page
- Add redirect in
next.config.ts if the URL was public
Styling Notes
- Marketing pages use
src/styles/website.css (loaded via (website)/layout.tsx)
- Theme is forced dark — do not use light-mode-only classes
- Use Tailwind v4 utilities; avoid inline styles
src/ui/ classes may conflict — always prefer src/website/ primitives
References
references/components.md — Full component inventory with props and import paths