gpt-taste
gpt taste
creating-share-images
Create OpenGraph and Twitter share images for Next.js applications using next/og ImageResponse. Generates dynamic social preview cards with gradients, SVG icons, and proper dimensions. Use when building OG images, Twitter cards, social previews, meta images, or share images for webapps.
Full skill instructions
Generate dynamic OpenGraph (1200x630) and Twitter (1200x600) images using next/og ImageResponse.
Create app/opengraph-image.tsx:
import { ImageResponse } from "next/og";
export const runtime = "edge";
export const alt = "Page Title - Site Description";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
export default async function Image() {
return new ImageResponse(
(
<div style={{
height: "100%",
width: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
background: "linear-gradient(145deg, #0a0a12 0%, #0f1218 50%, #0a0a12 100%)",
fontFamily: "system-ui, -apple-system, sans-serif",
}}>
<h1 style={{ fontSize: 64, color: "#ffffff", margin: 0 }}>
Page Title
</h1>
</div>
),
{ ...size }
);
}
| File | Purpose | Dimensions |
|---|---|---|
opengraph-image.tsx | Facebook, LinkedIn, iMessage | 1200×630 |
twitter-image.tsx | Twitter/X cards | 1200×600 |
Place in route directory (e.g., app/about/opengraph-image.tsx for /about).
background: "linear-gradient(145deg, #0a0a12 0%, #0f1218 35%, #121620 65%, #0a0a12 100%)"
<div style={{
position: "absolute",
top: -150,
left: -100,
width: 500,
height: 500,
borderRadius: "50%",
background: "radial-gradient(circle, rgba(34,211,238,0.15) 0%, transparent 60%)",
display: "flex",
}} />
<h1 style={{
fontSize: 62,
fontWeight: 800,
background: "linear-gradient(135deg, #ffffff 0%, #e2e8f0 50%, #94a3b8 100%)",
backgroundClip: "text",
color: "transparent",
display: "flex",
}}>Title</h1>
<svg width="200" height="200" viewBox="0 0 100 100" fill="none"
style={{ filter: "drop-shadow(0 0 24px rgba(34,211,238,0.35))" }}>
<defs>
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="#22d3ee" />
<stop offset="100%" stopColor="#a855f7" />
</linearGradient>
</defs>
<circle cx="50" cy="50" r="45" stroke="url(#grad)" strokeWidth="2" fill="none" />
</svg>
display: "flex" on every element (Satori requirement)gap on containers without display: "flex"viewBox and explicit dimensions| Section | Primary | Secondary | Accent |
|---|---|---|---|
| Homepage | #3b82f6 blue | #8b5cf6 purple | #06b6d4 cyan |
| About | #10b981 emerald | #14b8a6 teal | #22c55e green |
| Projects | #f97316 orange | #f59e0b amber | #f43f5e rose |
| Writing | #ec4899 pink | #f472b6 rose | #6366f1 indigo |
| Tools/TLDR | #22d3ee cyan | #a855f7 purple | #f472b6 pink |
<div style={{
display: "flex",
padding: "7px 14px",
borderRadius: 8,
background: "rgba(34,211,238,0.15)",
border: "1px solid rgba(34,211,238,0.3)",
}}>
<span style={{ color: "#22d3ee", fontWeight: 600, display: "flex" }}>
Label
</span>
</div>
<div style={{
position: "absolute",
bottom: 0,
left: 0,
right: 0,
height: 4,
background: "linear-gradient(90deg, transparent 0%, #22d3ee 25%, #a855f7 50%, #f472b6 75%, transparent 100%)",
display: "flex",
}} />
After creating images, run bun run build (or npm run build) to verify routes register as dynamic:
Route (app) Size First Load JS
├ ƒ /opengraph-image 0 B 0 B
├ ƒ /twitter-image 0 B 0 B
The ƒ indicates dynamic (edge) functions.
| Issue | Solution |
|---|---|
| Text not rendering | Add display: "flex" to text wrapper |
| Layout broken | Ensure all containers have display: "flex" |
| Colors wrong | Use hex colors, not CSS variables |
| SVG not showing | Add explicit width/height attributes |
| Gradient text invisible | Need both backgroundClip: "text" AND color: "transparent" |
See patterns.md for complete examples including:
gpt taste
Premium brand-kit image generation for high-end identity systems, logo concepts, and visual-world presentations.
Premium website design-to-code skill that generates visual references first, then builds faithful frontend implementations.
Premium frontend image direction for landing pages and marketing sites, generating one distinct horizontal image per section.
Premium mobile app screen concepts and flows with clean hierarchy, strong imagery, and distinctive art direction.
Emil Kowalski's philosophy on UI polish, component design, and the invisible details that make software feel good.
Frontend design and iteration for production-grade interfaces, from concept to ship.
Reverse-engineer design tokens from public websites into starter token files for your project.
Builds an animation from scratch by making the decisions in the order that determines whether it feels right.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
Chat-to-edit AI studio for product photos, portraits, branding, and video.
Generate your dream room in seconds.
Redesign your interior in seconds using AI
Transform rooms with AI-generated designs.
Transform Your Space with AI-Powered Japanese Interior Designs by Jife
AI-powered wireframes for non-designers.
Revolutionize Property Viewing with AI-Generated Floor Plans and Virtual Tours
Transform sketches into stunning architectural renders with AI.