
Og Image
- 41 installs
- 33 repo stars
- Updated July 27, 2026
- dirnbauer/webconsulting-skills
Generates 1200x630 Open Graph preview images from the project's design system and configures social sharing meta tags.
About
Generates Open Graph social preview images matched to the project's design system and configures the sharing meta tags. A developer uses it when setting up social previews for a site.
- Generates a 1200x630 OG image page from the design system
- Configures social sharing meta tags
Og Image by the numbers
- 41 all-time installs (skills.sh)
- Ranked #1,363 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dirnbauer/webconsulting-skills --skill og-imageAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 41 |
|---|---|
| repo stars | ★ 33 |
| Last updated | July 27, 2026 |
| Repository | dirnbauer/webconsulting-skills ↗ |
What it does
Generates 1200x630 Open Graph preview images from the project's design system and configures social sharing meta tags.
Files
This skill creates professional Open Graph images for social media sharing. It analyzes the existing codebase to match the project's design system, generates a dedicated OG image page, screenshots it, and configures all necessary meta tags.
Workflow
Phase 1: Codebase Analysis
Explore the project to understand:
1. Framework Detection
- Check
package.jsonfor Next.js, Vite, Astro, Remix, etc. - Identify the routing pattern (file-based, config-based)
- Find where to create the
/og-imageroute
2. Design System Discovery
- Look for Tailwind config (
tailwind.config.js/ts) for color palette - Check for CSS variables in global styles (
:rootdefinitions) - Find existing color tokens, font families, spacing scales
- Look for a theme or design tokens file
3. Branding Assets
- Find logo files in
/public,/assets,/src/assets - Check for favicon, app icons
- Look for existing hero sections or landing pages with branding
4. Product Information
- Extract product name from
package.json, landing page, or meta tags - Find tagline/description from existing pages
- Look for existing OG/meta configuration to understand current setup
5. Existing Components
- Find reusable UI components that could be leveraged
- Check for glass effects, gradients, or distinctive visual patterns
- Identify the overall aesthetic (dark mode, light mode, etc.)
Phase 2: OG Image Page Creation
Create a dedicated route at /og-image (or equivalent for the framework):
Page Requirements:
- Fixed dimensions: exactly 1200px wide × 630px tall
- Self-contained styling (no external dependencies that might not render)
- Hide any dev tool indicators with CSS:
[data-nextjs-dialog-overlay],
[data-nextjs-dialog],
nextjs-portal,
#__next-build-indicator {
display: none !important;
}Content Structure:
- Product logo/icon (prominent placement)
- Product name with distinctive typography
- Tagline or value proposition
- Visual representation of the product (mockup, illustration, or abstract design)
- URL/domain at the bottom
- Background that matches the project aesthetic (gradients, patterns, etc.)
Design Principles:
- Use the project's existing color palette
- Match the typography from the main site
- Include visual elements that represent the product
- Ensure high contrast for readability at small sizes (social previews are often small)
- Test that text is readable when the image is scaled down to ~400px wide
Phase 3: Screenshot Capture
Use Playwright to capture the OG image:
1. Navigate to the OG image page (typically http://localhost:3000/og-image or similar) 2. Resize viewport to exactly 1200×630 3. Wait for any animations to complete or fonts to load 4. Take a PNG screenshot 5. Save to the project's public folder as og-image.png
Playwright Commands:
browser_navigate: http://localhost:{port}/og-image
browser_resize: width=1200, height=630
browser_take_screenshot: og-image.png (then copy to /public)Phase 4: Meta Tag Configuration
Audit and update the project's meta tag configuration. For Next.js App Router, update layout.tsx. For other frameworks, update the appropriate location.
Required Meta Tags:
// Open Graph
openGraph: {
title: "Product Name - Short Description",
description: "Compelling description for social sharing",
url: "https://yourdomain.com",
siteName: "Product Name",
locale: "en_US",
type: "website",
images: [{
url: "/og-image.png", // or absolute URL
width: 1200,
height: 630,
alt: "Descriptive alt text for accessibility",
type: "image/png",
}],
},
// Twitter/X
twitter: {
card: "summary_large_image",
title: "Product Name - Short Description",
description: "Compelling description for Twitter",
creator: "@handle", // if provided
images: [{
url: "/og-image.png",
width: 1200,
height: 630,
alt: "Descriptive alt text",
}],
},
// Additional
other: {
"theme-color": "#000000", // match brand color
"msapplication-TileColor": "#000000",
},
appleWebApp: {
title: "Product Name",
statusBarStyle: "black-translucent",
capable: true,
},Ensure `metadataBase` is set for relative URLs to resolve correctly:
metadataBase: new URL("https://yourdomain.com"),Phase 5: Verification & Output
1. Verify the image exists at the public path 2. Check meta tags are correctly rendered in the HTML 3. Provide cache-busting instructions:
- Facebook/LinkedIn: https://developers.facebook.com/tools/debug/
- Twitter/X: https://cards-dev.twitter.com/validator
- LinkedIn: https://www.linkedin.com/post-inspector/
4. Summary output:
- Path to generated OG image
- URL to preview the OG image page locally
- List of meta tags added/updated
- Links to social preview debuggers
Prompting for Missing Information
Only ask the user if these cannot be determined from the codebase:
1. Domain/URL - If not found in existing config, ask: "What's your production domain? (e.g., https://example.com)"
2. Twitter/X handle - If adding twitter:creator, ask: "What's your Twitter/X handle for attribution? (optional)"
3. Tagline - If no clear tagline found, ask: "What's a short tagline for social previews? (1 sentence)"
Framework-Specific Notes
Next.js App Router:
- Create
/app/og-image/page.tsx - Update metadata in
/app/layout.tsx - Use
'use client'directive for the OG page
Next.js Pages Router:
- Create
/pages/og-image.tsx - Update
_app.tsxor usenext-seo
Vite/React:
- Create route via router config
- Update
index.htmlmeta tags or usereact-helmet
Astro:
- Create
/src/pages/og-image.astro - Update layout with meta tags
Quality Checklist
Before completing, verify:
- [ ] OG image renders correctly at 1200×630
- [ ] No dev tool indicators visible in screenshot
- [ ] Image saved to public folder
- [ ] Meta tags include og:image with absolute URL capability
- [ ] Meta tags include twitter:card as summary_large_image
- [ ] Meta tags include dimensions (width/height)
- [ ] Meta tags include alt text for accessibility
- [ ] theme-color is set to match brand
- [ ] User informed of cache-busting URLs
---
Credits & Attribution
This skill is based on the excellent work by [Stevy Smith](https://github.com/stevysmith/og-image-skill).
Original repository: https://github.com/stevysmith/og-image-skill
Special thanks to Stevy Smith for their generous open-source contributions, which helped shape this skill collection. Adapted by webconsulting.at for this skill collection
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200, height=630">
<title>OG Image Example - Neo-Brutalist</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg: #f0efe9;
--black: #0a0a0a;
--accent-1: #ff3d00;
--accent-2: #0055ff;
--accent-3: #aaff00;
--text-muted: #666;
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
font-family: 'Space Mono', monospace;
background: var(--bg);
-webkit-font-smoothing: antialiased;
}
.og-container {
width: 1200px;
height: 630px;
position: relative;
overflow: hidden;
}
/* Chaotic grid background */
.grid-chaos {
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 79px,
rgba(0,0,0,0.03) 79px,
rgba(0,0,0,0.03) 80px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 79px,
rgba(0,0,0,0.03) 79px,
rgba(0,0,0,0.03) 80px
);
}
/* Diagonal slash */
.slash {
position: absolute;
width: 800px;
height: 200%;
background: var(--accent-1);
top: -50%;
right: 200px;
transform: rotate(-15deg);
z-index: 1;
}
.slash::before {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
90deg,
var(--accent-1),
var(--accent-1) 20px,
transparent 20px,
transparent 40px
);
opacity: 0.3;
}
/* Blue block */
.block-blue {
position: absolute;
width: 300px;
height: 300px;
background: var(--accent-2);
bottom: -60px;
right: 100px;
z-index: 2;
transform: rotate(5deg);
box-shadow: 12px 12px 0 var(--black);
}
/* Green accent */
.block-green {
position: absolute;
width: 150px;
height: 80px;
background: var(--accent-3);
top: 80px;
right: 350px;
z-index: 3;
transform: rotate(-3deg);
}
/* Main content */
.content {
position: relative;
z-index: 10;
padding: 60px 70px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
/* Top bar */
.top-bar {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
.logo-brutal {
display: flex;
align-items: center;
gap: 12px;
}
.logo-box {
width: 48px;
height: 48px;
background: var(--black);
display: flex;
align-items: center;
justify-content: center;
}
.logo-box span {
color: var(--accent-3);
font-family: 'Bebas Neue', sans-serif;
font-size: 28px;
}
.logo-text {
font-size: 14px;
font-weight: 700;
color: var(--black);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.version-tag {
font-size: 11px;
font-weight: 400;
color: var(--black);
background: var(--accent-3);
padding: 6px 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Giant headline */
.headline-container {
position: relative;
margin-top: -20px;
}
.headline {
font-family: 'Bebas Neue', Impact, sans-serif;
font-size: 180px;
font-weight: 400;
color: var(--black);
line-height: 0.85;
letter-spacing: -0.02em;
text-transform: uppercase;
position: relative;
}
.headline-row {
display: block;
position: relative;
}
.headline-row:nth-child(2) {
margin-left: 80px;
color: transparent;
-webkit-text-stroke: 3px var(--black);
}
/* Strikethrough decoration */
.strike {
position: absolute;
height: 8px;
background: var(--accent-1);
top: 50%;
left: 0;
right: -20px;
transform: translateY(-50%) rotate(-1deg);
}
/* Offset text effect */
.headline-shadow {
position: absolute;
top: 6px;
left: 6px;
color: var(--accent-2);
opacity: 0.4;
z-index: -1;
}
/* Bottom section */
.bottom-bar {
display: flex;
align-items: flex-end;
justify-content: space-between;
}
.tagline {
font-size: 14px;
color: var(--text-muted);
max-width: 350px;
line-height: 1.6;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.tagline strong {
color: var(--black);
font-weight: 700;
}
.coords {
font-size: 12px;
color: var(--text-muted);
text-align: right;
line-height: 1.8;
}
.coords span {
display: block;
}
/* Decorative elements */
.corner-box {
position: absolute;
width: 40px;
height: 40px;
border: 3px solid var(--black);
}
.corner-box.tl {
top: 30px;
left: 30px;
}
.corner-box.br {
bottom: 30px;
right: 30px;
background: var(--black);
}
/* Asterisk decoration */
.asterisk {
position: absolute;
font-family: 'Bebas Neue', sans-serif;
font-size: 200px;
color: var(--black);
opacity: 0.06;
top: 150px;
right: 500px;
z-index: 0;
}
/* Scan lines effect */
.scanlines {
position: absolute;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0,0,0,0.015) 2px,
rgba(0,0,0,0.015) 4px
);
pointer-events: none;
z-index: 100;
}
/* Marker annotation */
.annotation {
position: absolute;
top: 180px;
right: 620px;
z-index: 20;
}
.annotation-line {
width: 60px;
height: 2px;
background: var(--accent-1);
transform: rotate(-45deg);
transform-origin: left;
}
.annotation-text {
font-size: 10px;
color: var(--accent-1);
text-transform: uppercase;
letter-spacing: 0.1em;
margin-top: 8px;
margin-left: 40px;
}
</style>
</head>
<body>
<div class="og-container">
<!-- Background elements -->
<div class="grid-chaos"></div>
<div class="slash"></div>
<div class="block-blue"></div>
<div class="block-green"></div>
<div class="asterisk">*</div>
<!-- Content -->
<div class="content">
<!-- Top bar -->
<div class="top-bar">
<div class="logo-brutal">
<div class="logo-box">
<span>B</span>
</div>
<span class="logo-text">Brutalist Systems</span>
</div>
<div class="version-tag">V 3.0.0</div>
</div>
<!-- Headline -->
<div class="headline-container">
<h1 class="headline">
<span class="headline-row">Break</span>
<span class="headline-row">Rules</span>
</h1>
<h1 class="headline headline-shadow" aria-hidden="true">
<span class="headline-row">Break</span>
<span class="headline-row">Rules</span>
</h1>
</div>
<!-- Bottom bar -->
<div class="bottom-bar">
<p class="tagline">
<strong>Design systems</strong> for teams who refuse to blend in. Raw. Intentional. Unforgettable.
</p>
<div class="coords">
<span>brutalist.systems</span>
<span>52.5200° N, 13.4050° E</span>
</div>
</div>
</div>
<!-- Scan lines overlay -->
<div class="scanlines"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200, height=630">
<title>OG Image Example - Cosmic</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Outfit:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg-deep: #08090d;
--bg-mid: #0f1219;
--accent-aurora-1: #7c3aed;
--accent-aurora-2: #06b6d4;
--accent-aurora-3: #f472b6;
--text-primary: #f8fafc;
--text-secondary: #94a3b8;
--text-muted: #64748b;
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
font-family: 'Outfit', sans-serif;
background: var(--bg-deep);
-webkit-font-smoothing: antialiased;
}
.og-container {
width: 1200px;
height: 630px;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 80px;
}
/* Deep space background with multiple gradient layers */
.bg-base {
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 120% 80% at 20% 100%, rgba(124, 58, 237, 0.15) 0%, transparent 50%),
radial-gradient(ellipse 100% 100% at 80% 0%, rgba(6, 182, 212, 0.12) 0%, transparent 40%),
radial-gradient(ellipse 80% 60% at 60% 80%, rgba(244, 114, 182, 0.08) 0%, transparent 40%),
linear-gradient(165deg, var(--bg-deep) 0%, var(--bg-mid) 100%);
}
/* Subtle noise texture overlay */
.noise {
position: absolute;
inset: 0;
opacity: 0.4;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
mix-blend-mode: overlay;
pointer-events: none;
}
/* Floating orbs for depth */
.orb {
position: absolute;
border-radius: 50%;
filter: blur(60px);
opacity: 0.6;
}
.orb-1 {
width: 300px;
height: 300px;
background: var(--accent-aurora-1);
top: -80px;
right: 100px;
opacity: 0.25;
}
.orb-2 {
width: 200px;
height: 200px;
background: var(--accent-aurora-2);
bottom: -40px;
left: 200px;
opacity: 0.2;
}
.orb-3 {
width: 150px;
height: 150px;
background: var(--accent-aurora-3);
top: 50%;
right: 300px;
opacity: 0.15;
}
/* Grid lines for structure */
.grid-lines {
position: absolute;
inset: 0;
background-image:
linear-gradient(90deg, rgba(148, 163, 184, 0.03) 1px, transparent 1px),
linear-gradient(rgba(148, 163, 184, 0.03) 1px, transparent 1px);
background-size: 60px 60px;
}
/* Diagonal accent line */
.accent-line {
position: absolute;
width: 400px;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent-aurora-2), transparent);
top: 180px;
left: -50px;
transform: rotate(-25deg);
opacity: 0.4;
}
.accent-line-2 {
position: absolute;
width: 300px;
height: 1px;
background: linear-gradient(90deg, transparent, var(--accent-aurora-1), transparent);
bottom: 120px;
right: -30px;
transform: rotate(-25deg);
opacity: 0.3;
}
/* Content area */
.content {
position: relative;
z-index: 10;
max-width: 650px;
}
/* Logo mark */
.logo-mark {
width: 56px;
height: 56px;
background: linear-gradient(135deg, var(--accent-aurora-1), var(--accent-aurora-2));
border-radius: 14px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 32px;
position: relative;
box-shadow:
0 0 40px rgba(124, 58, 237, 0.3),
0 4px 20px rgba(0, 0, 0, 0.4);
}
.logo-mark::before {
content: '';
position: absolute;
inset: 1px;
background: linear-gradient(135deg, rgba(255,255,255,0.2), transparent);
border-radius: 13px;
}
.logo-mark svg {
width: 28px;
height: 28px;
color: white;
}
/* Typography */
.headline {
font-family: 'Instrument Serif', Georgia, serif;
font-size: 76px;
font-weight: 400;
color: var(--text-primary);
line-height: 1.05;
letter-spacing: -0.02em;
margin-bottom: 24px;
}
.headline em {
font-style: italic;
background: linear-gradient(135deg, var(--accent-aurora-2), var(--accent-aurora-3));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.tagline {
font-size: 22px;
font-weight: 400;
color: var(--text-secondary);
line-height: 1.5;
max-width: 480px;
}
/* Domain badge */
.domain {
margin-top: 40px;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 18px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 100px;
font-size: 15px;
font-weight: 500;
color: var(--text-muted);
letter-spacing: 0.02em;
}
.domain-dot {
width: 6px;
height: 6px;
background: var(--accent-aurora-2);
border-radius: 50%;
box-shadow: 0 0 10px var(--accent-aurora-2);
}
/* Right side visual */
.visual {
position: relative;
z-index: 10;
width: 380px;
height: 380px;
display: flex;
align-items: center;
justify-content: center;
}
/* Abstract geometric composition */
.geo-container {
position: relative;
width: 280px;
height: 280px;
}
.geo-ring {
position: absolute;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 50%;
}
.geo-ring-1 {
inset: 0;
}
.geo-ring-2 {
inset: 30px;
border-color: rgba(124, 58, 237, 0.3);
}
.geo-ring-3 {
inset: 60px;
border-color: rgba(6, 182, 212, 0.25);
}
/* Central element */
.geo-center {
position: absolute;
inset: 90px;
background: linear-gradient(135deg, var(--accent-aurora-1), var(--accent-aurora-2));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow:
0 0 80px rgba(124, 58, 237, 0.4),
0 0 40px rgba(6, 182, 212, 0.3),
inset 0 -10px 30px rgba(0, 0, 0, 0.3);
}
.geo-center::after {
content: '';
position: absolute;
inset: 2px;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255,255,255,0.25), transparent 60%);
}
/* Orbiting dots */
.orbit-dot {
position: absolute;
width: 8px;
height: 8px;
background: var(--accent-aurora-2);
border-radius: 50%;
box-shadow: 0 0 15px var(--accent-aurora-2);
}
.orbit-dot-1 {
top: 0;
left: 50%;
transform: translateX(-50%);
}
.orbit-dot-2 {
bottom: 30px;
right: 10px;
background: var(--accent-aurora-3);
box-shadow: 0 0 15px var(--accent-aurora-3);
width: 6px;
height: 6px;
}
.orbit-dot-3 {
top: 60px;
left: 5px;
background: var(--accent-aurora-1);
box-shadow: 0 0 15px var(--accent-aurora-1);
width: 10px;
height: 10px;
}
/* Floating elements around visual */
.float-element {
position: absolute;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
backdrop-filter: blur(4px);
}
.float-1 {
width: 60px;
height: 60px;
border-radius: 12px;
top: 20px;
right: 0;
transform: rotate(15deg);
}
.float-2 {
width: 40px;
height: 40px;
border-radius: 8px;
bottom: 40px;
left: 20px;
transform: rotate(-10deg);
}
/* Corner accent */
.corner-accent {
position: absolute;
bottom: 40px;
right: 60px;
display: flex;
align-items: center;
gap: 12px;
z-index: 10;
}
.corner-line {
width: 40px;
height: 1px;
background: rgba(255, 255, 255, 0.2);
}
.corner-text {
font-size: 11px;
font-weight: 500;
color: var(--text-muted);
letter-spacing: 0.15em;
text-transform: uppercase;
}
</style>
</head>
<body>
<div class="og-container">
<!-- Background layers -->
<div class="bg-base"></div>
<div class="noise"></div>
<div class="grid-lines"></div>
<!-- Floating orbs -->
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="orb orb-3"></div>
<!-- Accent lines -->
<div class="accent-line"></div>
<div class="accent-line-2"></div>
<!-- Main content -->
<div class="content">
<div class="logo-mark">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M12 2L2 7l10 5 10-5-10-5z"/>
<path d="M2 17l10 5 10-5"/>
<path d="M2 12l10 5 10-5"/>
</svg>
</div>
<h1 class="headline">Build something <em>remarkable</em></h1>
<p class="tagline">The modern platform for teams who ship fast and think different. No compromises.</p>
<div class="domain">
<span class="domain-dot"></span>
yourproduct.com
</div>
</div>
<!-- Visual element -->
<div class="visual">
<div class="geo-container">
<div class="geo-ring geo-ring-1"></div>
<div class="geo-ring geo-ring-2"></div>
<div class="geo-ring geo-ring-3"></div>
<div class="geo-center"></div>
<div class="orbit-dot orbit-dot-1"></div>
<div class="orbit-dot orbit-dot-2"></div>
<div class="orbit-dot orbit-dot-3"></div>
</div>
<div class="float-element float-1"></div>
<div class="float-element float-2"></div>
</div>
<!-- Corner accent -->
<div class="corner-accent">
<div class="corner-line"></div>
<span class="corner-text">Preview</span>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200, height=630">
<title>OG Image Example - Editorial</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;1,9..144,400&family=Instrument+Sans:wght@400;500&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg: #faf9f7;
--text-primary: #1a1a1a;
--text-secondary: #6b6b6b;
--accent: #c44d34;
--accent-soft: #f4e4df;
--border: #e5e3df;
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
font-family: 'Instrument Sans', -apple-system, sans-serif;
background: var(--bg);
-webkit-font-smoothing: antialiased;
}
.og-container {
width: 1200px;
height: 630px;
position: relative;
display: grid;
grid-template-columns: 1fr 1fr;
}
/* Left side - content */
.content-side {
padding: 70px 60px;
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
}
/* Decorative border */
.content-side::after {
content: '';
position: absolute;
top: 40px;
bottom: 40px;
right: 0;
width: 1px;
background: var(--border);
}
/* Top section with logo */
.top-section {
display: flex;
align-items: center;
gap: 14px;
}
.logo-wordmark {
font-family: 'Fraunces', Georgia, serif;
font-size: 22px;
font-weight: 600;
color: var(--text-primary);
letter-spacing: -0.02em;
}
.logo-badge {
padding: 4px 10px;
background: var(--accent-soft);
color: var(--accent);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.06em;
text-transform: uppercase;
border-radius: 4px;
}
/* Main headline */
.main-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
padding-right: 40px;
}
.headline {
font-family: 'Fraunces', Georgia, serif;
font-size: 58px;
font-weight: 400;
color: var(--text-primary);
line-height: 1.1;
letter-spacing: -0.03em;
margin-bottom: 28px;
}
.headline em {
font-style: italic;
}
.description {
font-size: 18px;
font-weight: 400;
color: var(--text-secondary);
line-height: 1.6;
max-width: 420px;
}
/* Bottom section */
.bottom-section {
display: flex;
align-items: center;
justify-content: space-between;
}
.domain-text {
font-size: 14px;
font-weight: 500;
color: var(--text-secondary);
letter-spacing: 0.02em;
}
.cta-hint {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: var(--accent);
font-weight: 500;
}
.cta-hint svg {
width: 16px;
height: 16px;
}
/* Right side - visual */
.visual-side {
position: relative;
background: linear-gradient(135deg, #f5f3f0 0%, #ebe8e4 100%);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
/* Abstract shapes composition */
.shapes-container {
position: relative;
width: 400px;
height: 400px;
}
.shape {
position: absolute;
border-radius: 50%;
}
.shape-1 {
width: 280px;
height: 280px;
background: var(--accent);
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.shape-2 {
width: 180px;
height: 180px;
background: var(--bg);
top: 20px;
right: 40px;
box-shadow: 0 20px 60px rgba(0,0,0,0.08);
}
.shape-3 {
width: 120px;
height: 120px;
background: var(--text-primary);
bottom: 40px;
left: 30px;
}
.shape-4 {
width: 60px;
height: 60px;
background: var(--accent-soft);
top: 80px;
left: 80px;
}
/* Lines */
.line {
position: absolute;
background: var(--border);
}
.line-h {
width: 100%;
height: 1px;
top: 50%;
left: 0;
}
.line-v {
width: 1px;
height: 100%;
top: 0;
left: 50%;
}
/* Corner markers */
.corner-marker {
position: absolute;
width: 20px;
height: 20px;
border: 1px solid var(--border);
}
.corner-marker.tl {
top: 40px;
left: 40px;
border-right: none;
border-bottom: none;
}
.corner-marker.br {
bottom: 40px;
right: 40px;
border-left: none;
border-top: none;
}
/* Texture overlay */
.texture {
position: absolute;
inset: 0;
opacity: 0.5;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
mix-blend-mode: multiply;
pointer-events: none;
}
/* Issue number decoration */
.issue-number {
position: absolute;
bottom: 50px;
right: 50px;
font-family: 'Fraunces', Georgia, serif;
font-size: 120px;
font-weight: 400;
color: rgba(0,0,0,0.04);
line-height: 1;
letter-spacing: -0.05em;
}
</style>
</head>
<body>
<div class="og-container">
<!-- Left side - Content -->
<div class="content-side">
<div class="top-section">
<span class="logo-wordmark">Acme Studio</span>
<span class="logo-badge">2026</span>
</div>
<div class="main-content">
<h1 class="headline">Design tools for <em>thoughtful</em> teams</h1>
<p class="description">Where craft meets clarity. Build interfaces that respect your users and reflect your vision.</p>
</div>
<div class="bottom-section">
<span class="domain-text">acmestudio.design</span>
<div class="cta-hint">
Learn more
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M5 12h14M12 5l7 7-7 7"/>
</svg>
</div>
</div>
</div>
<!-- Right side - Visual -->
<div class="visual-side">
<!-- Lines -->
<div class="line line-h"></div>
<div class="line line-v"></div>
<!-- Corner markers -->
<div class="corner-marker tl"></div>
<div class="corner-marker br"></div>
<!-- Abstract shapes -->
<div class="shapes-container">
<div class="shape shape-1"></div>
<div class="shape shape-2"></div>
<div class="shape shape-3"></div>
<div class="shape shape-4"></div>
</div>
<!-- Issue number -->
<div class="issue-number">01</div>
<!-- Texture -->
<div class="texture"></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200, height=630">
<title>OG Image Example - Ethereal</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=Sora:wght@300;400;500&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg: #0c0a14;
--text-light: #faf8ff;
--text-muted: rgba(250, 248, 255, 0.5);
--glow-pink: #ff6bce;
--glow-blue: #6bb3ff;
--glow-purple: #a855f7;
--glow-peach: #ffb86b;
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
font-family: 'Sora', sans-serif;
background: var(--bg);
-webkit-font-smoothing: antialiased;
}
.og-container {
width: 1200px;
height: 630px;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
padding: 0 100px;
}
/* Mesh gradient background */
.mesh-bg {
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 80% 50% at 10% 90%, rgba(255, 107, 206, 0.25) 0%, transparent 50%),
radial-gradient(ellipse 60% 80% at 90% 20%, rgba(107, 179, 255, 0.2) 0%, transparent 50%),
radial-gradient(ellipse 50% 50% at 50% 50%, rgba(168, 85, 247, 0.15) 0%, transparent 50%),
radial-gradient(ellipse 100% 100% at 70% 80%, rgba(255, 184, 107, 0.1) 0%, transparent 40%),
linear-gradient(180deg, #0c0a14 0%, #1a1525 100%);
}
/* Animated aurora effect */
.aurora {
position: absolute;
width: 200%;
height: 200%;
top: -50%;
left: -50%;
background:
conic-gradient(
from 180deg at 50% 50%,
transparent 0deg,
rgba(255, 107, 206, 0.08) 60deg,
transparent 120deg,
rgba(107, 179, 255, 0.06) 180deg,
transparent 240deg,
rgba(168, 85, 247, 0.08) 300deg,
transparent 360deg
);
animation: aurora-spin 30s linear infinite;
opacity: 0.8;
}
@keyframes aurora-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Floating orbs */
.orb {
position: absolute;
border-radius: 50%;
filter: blur(80px);
}
.orb-1 {
width: 400px;
height: 400px;
background: linear-gradient(135deg, var(--glow-pink), var(--glow-purple));
top: -100px;
left: -100px;
opacity: 0.4;
animation: float-1 8s ease-in-out infinite;
}
.orb-2 {
width: 350px;
height: 350px;
background: linear-gradient(135deg, var(--glow-blue), var(--glow-purple));
bottom: -80px;
right: 100px;
opacity: 0.35;
animation: float-2 10s ease-in-out infinite;
}
.orb-3 {
width: 200px;
height: 200px;
background: var(--glow-peach);
top: 50%;
right: 300px;
opacity: 0.2;
animation: float-3 6s ease-in-out infinite;
}
@keyframes float-1 {
0%, 100% { transform: translate(0, 0) scale(1); }
50% { transform: translate(30px, 20px) scale(1.05); }
}
@keyframes float-2 {
0%, 100% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-20px, -30px) scale(1.08); }
}
@keyframes float-3 {
0%, 100% { transform: translate(0, 0); }
50% { transform: translate(15px, -15px); }
}
/* Glass panel */
.glass-panel {
position: absolute;
width: 500px;
height: 350px;
right: 80px;
top: 50%;
transform: translateY(-50%) perspective(1000px) rotateY(-8deg) rotateX(2deg);
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.08) 0%,
rgba(255, 255, 255, 0.02) 100%
);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 24px;
box-shadow:
0 32px 64px rgba(0, 0, 0, 0.4),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
overflow: hidden;
}
.glass-panel::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.05) 0%,
transparent 40%
);
border-radius: 24px;
}
/* Glass panel content */
.glass-content {
position: relative;
padding: 40px;
height: 100%;
display: flex;
flex-direction: column;
}
.glass-header {
display: flex;
gap: 8px;
margin-bottom: 30px;
}
.glass-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.2);
}
.glass-dot:nth-child(1) { background: rgba(255, 107, 206, 0.6); }
.glass-dot:nth-child(2) { background: rgba(168, 85, 247, 0.6); }
.glass-dot:nth-child(3) { background: rgba(107, 179, 255, 0.6); }
.glass-lines {
flex: 1;
display: flex;
flex-direction: column;
gap: 12px;
}
.glass-line {
height: 10px;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.15),
rgba(255, 255, 255, 0.05)
);
border-radius: 5px;
}
.glass-line:nth-child(1) { width: 80%; }
.glass-line:nth-child(2) { width: 60%; }
.glass-line:nth-child(3) { width: 90%; }
.glass-line:nth-child(4) { width: 45%; }
.glass-line:nth-child(5) { width: 70%; }
.glass-shimmer {
position: absolute;
width: 200%;
height: 100%;
top: 0;
left: -100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.03) 50%,
transparent 100%
);
animation: shimmer 4s ease-in-out infinite;
}
@keyframes shimmer {
0%, 100% { transform: translateX(0); }
50% { transform: translateX(50%); }
}
/* Main content */
.content {
position: relative;
z-index: 10;
max-width: 520px;
}
/* Logo */
.logo {
display: flex;
align-items: center;
gap: 14px;
margin-bottom: 50px;
}
.logo-icon {
width: 44px;
height: 44px;
position: relative;
}
.logo-ring {
position: absolute;
inset: 0;
border: 2px solid transparent;
border-radius: 50%;
background: linear-gradient(135deg, var(--glow-pink), var(--glow-blue)) border-box;
-webkit-mask:
linear-gradient(#fff 0 0) padding-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
}
.logo-core {
position: absolute;
inset: 10px;
background: linear-gradient(135deg, var(--glow-pink), var(--glow-purple));
border-radius: 50%;
box-shadow: 0 0 20px rgba(255, 107, 206, 0.4);
}
.logo-name {
font-family: 'Cormorant Garamond', Georgia, serif;
font-size: 24px;
font-weight: 500;
color: var(--text-light);
letter-spacing: 0.08em;
}
/* Headline */
.headline {
font-family: 'Cormorant Garamond', Georgia, serif;
font-size: 68px;
font-weight: 400;
color: var(--text-light);
line-height: 1.1;
letter-spacing: -0.01em;
margin-bottom: 28px;
}
.headline em {
font-style: italic;
background: linear-gradient(135deg, var(--glow-pink), var(--glow-blue));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.headline .line-2 {
display: block;
margin-left: 40px;
}
/* Description */
.description {
font-size: 17px;
font-weight: 300;
color: var(--text-muted);
line-height: 1.7;
max-width: 400px;
margin-bottom: 40px;
}
/* CTA area */
.cta-area {
display: flex;
align-items: center;
gap: 24px;
}
.cta-button {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 28px;
background: linear-gradient(135deg, var(--glow-pink), var(--glow-purple));
border-radius: 100px;
font-size: 14px;
font-weight: 500;
color: white;
letter-spacing: 0.02em;
box-shadow:
0 8px 32px rgba(255, 107, 206, 0.3),
0 2px 8px rgba(0, 0, 0, 0.2);
}
.cta-button svg {
width: 16px;
height: 16px;
}
.domain {
font-size: 14px;
color: var(--text-muted);
letter-spacing: 0.03em;
}
/* Decorative particles */
.particle {
position: absolute;
width: 4px;
height: 4px;
background: white;
border-radius: 50%;
opacity: 0.3;
}
.particle-1 { top: 15%; left: 20%; animation: twinkle 3s ease-in-out infinite; }
.particle-2 { top: 25%; right: 25%; animation: twinkle 4s ease-in-out infinite 1s; }
.particle-3 { bottom: 30%; left: 35%; animation: twinkle 3.5s ease-in-out infinite 0.5s; }
.particle-4 { top: 40%; left: 55%; animation: twinkle 4.5s ease-in-out infinite 2s; width: 3px; height: 3px; }
.particle-5 { bottom: 20%; right: 40%; animation: twinkle 3s ease-in-out infinite 1.5s; width: 5px; height: 5px; }
.particle-6 { top: 60%; left: 10%; animation: twinkle 5s ease-in-out infinite 0.8s; width: 2px; height: 2px; }
@keyframes twinkle {
0%, 100% { opacity: 0.2; transform: scale(1); }
50% { opacity: 0.6; transform: scale(1.5); }
}
/* Noise overlay */
.noise {
position: absolute;
inset: 0;
opacity: 0.35;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
mix-blend-mode: overlay;
pointer-events: none;
}
/* Vignette */
.vignette {
position: absolute;
inset: 0;
background: radial-gradient(ellipse at center, transparent 40%, rgba(12, 10, 20, 0.6) 100%);
pointer-events: none;
}
</style>
</head>
<body>
<div class="og-container">
<!-- Background -->
<div class="mesh-bg"></div>
<div class="aurora"></div>
<!-- Floating orbs -->
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="orb orb-3"></div>
<!-- Particles -->
<div class="particle particle-1"></div>
<div class="particle particle-2"></div>
<div class="particle particle-3"></div>
<div class="particle particle-4"></div>
<div class="particle particle-5"></div>
<div class="particle particle-6"></div>
<!-- Glass panel -->
<div class="glass-panel">
<div class="glass-content">
<div class="glass-header">
<div class="glass-dot"></div>
<div class="glass-dot"></div>
<div class="glass-dot"></div>
</div>
<div class="glass-lines">
<div class="glass-line"></div>
<div class="glass-line"></div>
<div class="glass-line"></div>
<div class="glass-line"></div>
<div class="glass-line"></div>
</div>
</div>
<div class="glass-shimmer"></div>
</div>
<!-- Main content -->
<div class="content">
<div class="logo">
<div class="logo-icon">
<div class="logo-ring"></div>
<div class="logo-core"></div>
</div>
<span class="logo-name">LUMINA</span>
</div>
<h1 class="headline">
Where ideas
<span class="line-2">become <em>reality</em></span>
</h1>
<p class="description">
The creative platform that transforms how teams imagine, design, and build together.
</p>
<div class="cta-area">
<div class="cta-button">
Start creating
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M5 12h14M12 5l7 7-7 7"/>
</svg>
</div>
<span class="domain">lumina.design</span>
</div>
</div>
<!-- Overlays -->
<div class="noise"></div>
<div class="vignette"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200, height=630">
<title>OG Image Example - webconsulting</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
/* webconsulting Design Tokens v2 */
--webcon-primary: #1b7a95;
--webcon-primary-light: #66c4e1;
--webcon-primary-50: #e8f4f8;
--webcon-primary-100: #c5e4ed;
--webcon-primary-200: #9dd2e2;
--webcon-primary-700: #1b7a95;
--webcon-primary-800: #155d73;
--webcon-primary-900: #0f4555;
--webcon-warning: #d97706;
--webcon-success: #16a34a;
--neutral-dark: #404040;
--neutral-950: #0a0a0a;
--text-light: #ffffff;
--text-muted: rgba(255, 255, 255, 0.7);
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
font-family: 'Hanken Grotesk', ui-sans-serif, system-ui, sans-serif;
background: var(--neutral-950);
-webkit-font-smoothing: antialiased;
}
.og-container {
width: 1200px;
height: 630px;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
padding: 0 80px;
}
/* Gradient background using primary colors */
.bg-gradient {
position: absolute;
inset: 0;
background: linear-gradient(135deg, var(--webcon-primary-900) 0%, var(--neutral-950) 50%, var(--webcon-primary-800) 100%);
}
/* Overlay pattern */
.bg-pattern {
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 80% 60% at 100% 0%, rgba(102, 196, 225, 0.2) 0%, transparent 50%),
radial-gradient(ellipse 60% 80% at 0% 100%, rgba(27, 122, 149, 0.25) 0%, transparent 50%);
}
/* Grid overlay */
.grid-lines {
position: absolute;
inset: 0;
background-image:
linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px),
linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px);
background-size: 80px 80px;
}
/* Floating orbs - primary colors */
.orb {
position: absolute;
border-radius: 50%;
filter: blur(80px);
}
.orb-primary {
width: 350px;
height: 350px;
background: var(--webcon-primary);
top: -100px;
right: 100px;
opacity: 0.25;
}
.orb-light {
width: 300px;
height: 300px;
background: var(--webcon-primary-light);
bottom: -80px;
left: 50px;
opacity: 0.2;
}
.orb-warning {
width: 150px;
height: 150px;
background: var(--webcon-warning);
top: 60%;
right: 350px;
opacity: 0.15;
}
/* Geometric decoration */
.geo-ring {
position: absolute;
right: 80px;
top: 50%;
transform: translateY(-50%);
width: 380px;
height: 380px;
}
.ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.ring-1 { inset: 0; }
.ring-2 { inset: 40px; border-color: rgba(27, 122, 149, 0.3); }
.ring-3 { inset: 80px; border-color: rgba(102, 196, 225, 0.25); }
.ring-4 { inset: 120px; border-color: rgba(217, 119, 6, 0.2); }
.ring-center {
position: absolute;
inset: 140px;
background: linear-gradient(135deg, var(--webcon-primary), var(--webcon-primary-light));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow:
0 0 80px rgba(27, 122, 149, 0.4),
0 0 40px rgba(102, 196, 225, 0.3),
inset 0 -10px 30px rgba(0, 0, 0, 0.3);
}
.ring-center::after {
content: '';
position: absolute;
inset: 2px;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.25), transparent 60%);
}
/* Orbiting dots */
.orbit-dot {
position: absolute;
width: 10px;
height: 10px;
border-radius: 50%;
box-shadow: 0 0 15px currentColor;
}
.orbit-dot-1 {
top: 0;
left: 50%;
transform: translateX(-50%);
background: var(--webcon-primary-light);
color: var(--webcon-primary-light);
}
.orbit-dot-2 {
bottom: 40px;
right: 20px;
background: var(--webcon-warning);
color: var(--webcon-warning);
width: 8px;
height: 8px;
}
.orbit-dot-3 {
top: 80px;
left: 10px;
background: var(--webcon-primary);
color: var(--webcon-primary);
width: 12px;
height: 12px;
}
/* Main content */
.content {
position: relative;
z-index: 10;
max-width: 620px;
}
/* Logo */
.logo {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 40px;
}
.logo-mark {
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.logo-mark svg {
width: 360px;
height: 48px;
}
/* Headline */
.headline {
font-size: 72px;
font-weight: 700;
color: var(--text-light);
line-height: 1.05;
letter-spacing: -0.02em;
margin-bottom: 24px;
font-stretch: 125%;
}
.headline em {
font-style: normal;
background: linear-gradient(135deg, var(--webcon-primary-light), var(--webcon-primary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Tagline */
.tagline {
font-size: 22px;
font-weight: 400;
color: var(--text-muted);
line-height: 1.5;
max-width: 520px;
}
/* Domain badge */
.domain {
margin-top: 40px;
display: inline-flex;
align-items: center;
gap: 10px;
padding: 12px 20px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 100px;
font-size: 15px;
font-weight: 500;
color: var(--text-muted);
letter-spacing: 0.02em;
}
.domain-dot {
width: 8px;
height: 8px;
background: var(--webcon-primary-light);
border-radius: 50%;
box-shadow: 0 0 10px var(--webcon-primary-light);
}
/* Corner accent - warning highlight */
.corner-accent {
position: absolute;
bottom: 40px;
right: 60px;
display: flex;
align-items: center;
gap: 12px;
z-index: 10;
}
.corner-line {
width: 40px;
height: 2px;
background: var(--webcon-warning);
}
.corner-text {
font-size: 12px;
font-weight: 600;
color: var(--webcon-warning);
letter-spacing: 0.1em;
text-transform: uppercase;
}
/* Code snippet decoration */
.code-decoration {
position: absolute;
top: 40px;
right: 60px;
font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
text-align: right;
line-height: 1.8;
}
.code-decoration .highlight {
color: var(--webcon-primary-light);
}
.code-decoration .warning {
color: var(--webcon-warning);
}
/* Noise overlay */
.noise {
position: absolute;
inset: 0;
opacity: 0.35;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
mix-blend-mode: overlay;
pointer-events: none;
}
</style>
</head>
<body>
<div class="og-container">
<!-- Background layers -->
<div class="bg-gradient"></div>
<div class="bg-pattern"></div>
<div class="grid-lines"></div>
<div class="noise"></div>
<!-- Floating orbs -->
<div class="orb orb-primary"></div>
<div class="orb orb-light"></div>
<div class="orb orb-warning"></div>
<!-- Geometric ring -->
<div class="geo-ring">
<div class="ring ring-1"></div>
<div class="ring ring-2"></div>
<div class="ring ring-3"></div>
<div class="ring ring-4"></div>
<div class="ring-center"></div>
<div class="orbit-dot orbit-dot-1"></div>
<div class="orbit-dot orbit-dot-2"></div>
<div class="orbit-dot orbit-dot-3"></div>
</div>
<!-- Code decoration -->
<div class="code-decoration">
<span class="highlight">declare</span>(strict_types=<span class="warning">1</span>);<br>
<span class="highlight">namespace</span> Webconsulting\Skills;
</div>
<!-- Main content -->
<div class="content">
<div class="logo">
<div class="logo-mark">
<!-- Full webconsulting logo from https://www.webconsulting.at/logo-light.svg -->
<svg viewBox="0 0 237.06 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Wordmark "webconsulting" in white for dark background -->
<g>
<polygon fill="#ffffff" points="67.51 16.92 65.33 9.27 62.13 9.27 59.95 16.97 57.85 9.27 53.86 9.27 58.07 22.73 61.45 22.73 63.75 14.63 66.09 22.73 69.42 22.73 73.66 9.27 69.64 9.27 67.51 16.92"/>
<path fill="#ffffff" d="M86.02,11.01c-.53-.63-1.19-1.12-1.98-1.47-.79-.35-1.71-.53-2.74-.53-1.16,0-2.17.2-3,.61-.84.41-1.51.96-2.02,1.64-.51.68-.89,1.44-1.13,2.28-.25.84-.37,1.68-.37,2.54s.12,1.75.37,2.58.64,1.57,1.17,2.22,1.24,1.17,2.1,1.56c.86.38,1.9.57,3.1.57.78,0,1.48-.06,2.09-.19.61-.13,1.2-.34,1.77-.63.57-.29,1.2-.67,1.87-1.15l-1.72-2.62c-.51.44-1.1.77-1.77,1.01-.67.24-1.35.35-2.02.35-.84,0-1.56-.2-2.16-.61-.6-.41-.96-1.03-1.06-1.87h9.01c.04-.27.06-.52.07-.74,0-.22.01-.41.01-.57,0-.98-.13-1.9-.4-2.76-.26-.86-.66-1.6-1.19-2.22ZM78.46,14.52c.05-.38.19-.76.4-1.12.21-.36.52-.67.93-.91.41-.25.93-.37,1.57-.37.4,0,.76.06,1.09.18s.61.29.85.5c.24.22.42.48.56.78.13.28.2.6.2.94h-5.59Z"/>
<path fill="#ffffff" d="M100.45,9.82c-.85-.55-1.79-.82-2.83-.82-.67,0-1.32.14-1.94.42-.62.28-1.15.73-1.58,1.34-.07.1-.13.21-.19.31V3.7h-3.71v19.03h3.71v-1.77c.08.14.17.27.26.39.48.63,1.03,1.06,1.64,1.3.61.24,1.22.35,1.82.35,1.18,0,2.19-.3,3.03-.91.84-.61,1.48-1.44,1.92-2.5.45-1.06.67-2.26.67-3.6,0-1.49-.25-2.76-.76-3.79-.51-1.04-1.19-1.83-2.03-2.38ZM99.13,17.92c-.24.54-.58.95-1.02,1.23-.45.28-.97.42-1.57.42s-1.12-.15-1.57-.44c-.45-.29-.79-.7-1.02-1.24-.24-.54-.35-1.17-.35-1.9s.12-1.36.35-1.88c.24-.53.58-.94,1.02-1.24.45-.3.97-.45,1.57-.45s1.12.15,1.57.44c.45.29.79.7,1.02,1.23.24.53.35,1.17.35,1.91s-.12,1.39-.35,1.92Z"/>
<path fill="#ffffff" d="M110.12,12.8c.43-.36.99-.55,1.68-.55.73,0,1.3.19,1.71.57.41.38.71.88.91,1.5l3.28-1.31c-.51-1.37-1.27-2.37-2.29-3.03-1.02-.66-2.22-.98-3.6-.98-1.13,0-2.11.2-2.93.59-.83.39-1.52.91-2.07,1.57-.56.66-.97,1.4-1.24,2.24-.27.84-.41,1.7-.41,2.59s.14,1.76.41,2.59c.27.84.69,1.59,1.24,2.25.55.66,1.25,1.19,2.07,1.58.83.39,1.81.59,2.93.59,1.38,0,2.58-.33,3.6-1,1.02-.66,1.78-1.67,2.29-3.02l-3.28-1.31c-.2.62-.51,1.12-.91,1.5s-.98.57-1.71.57-1.25-.18-1.68-.55c-.43-.36-.74-.84-.94-1.42s-.3-1.18-.3-1.8.1-1.22.3-1.79.51-1.04.94-1.41Z"/>
<path fill="#ffffff" d="M129.41,9.9c-1.03-.6-2.2-.9-3.51-.9s-2.51.3-3.54.89c-1.03.59-1.84,1.42-2.43,2.47-.59,1.06-.89,2.27-.89,3.63s.3,2.55.89,3.62c.59,1.06,1.41,1.9,2.44,2.5,1.04.6,2.21.9,3.52.9s2.48-.3,3.51-.91c1.03-.61,1.84-1.44,2.43-2.5.59-1.06.89-2.26.89-3.6s-.3-2.57-.89-3.62c-.59-1.05-1.4-1.87-2.43-2.47ZM128.6,18.01c-.24.56-.58.99-1.04,1.28-.46.29-1.01.44-1.67.44s-1.21-.15-1.68-.44c-.46-.29-.82-.72-1.06-1.28-.25-.56-.37-1.24-.37-2.02s.12-1.47.37-2.02.6-.96,1.06-1.26c.46-.29,1.02-.44,1.68-.44s1.21.15,1.67.44c.45.29.8.71,1.04,1.26.24.55.35,1.22.35,2.02s-.12,1.46-.35,2.02Z"/>
<path fill="#ffffff" d="M142.52,9c-.6,0-1.2.1-1.8.31-.6.21-1.13.56-1.6,1.06-.19.2-.35.44-.51.71v-1.81h-3.74v13.46h3.74v-6.36c0-.96.1-1.75.3-2.35.2-.6.51-1.05.91-1.34.41-.29.91-.44,1.52-.44.8,0,1.39.24,1.76.72.37.48.56,1.24.56,2.28v7.48h3.77v-8.87c0-1.51-.43-2.7-1.3-3.56-.86-.86-2.07-1.3-3.62-1.3Z"/>
<path fill="#ffffff" d="M159.05,15.19c-.52-.32-1.07-.57-1.65-.75-.58-.18-1.14-.34-1.67-.46-.56-.15-1.01-.27-1.34-.38-.33-.11-.56-.23-.71-.37-.15-.14-.22-.3-.22-.51,0-.27.15-.5.45-.67s.69-.26,1.16-.26c.56,0,1.1.13,1.61.4.51.26.93.63,1.26,1.11l2.32-1.83c-.53-.8-1.24-1.41-2.13-1.83-.89-.42-1.88-.63-2.98-.63-1.55,0-2.8.37-3.75,1.12-.96.75-1.43,1.73-1.43,2.95,0,.73.15,1.33.44,1.82.29.48.67.88,1.15,1.19.47.31.98.56,1.53.75s1.07.35,1.58.48c.45.13.86.26,1.23.38.36.13.66.28.87.45.22.17.33.41.33.7,0,.31-.17.58-.51.82-.34.24-.81.35-1.41.35-.82,0-1.5-.21-2.03-.63-.54-.42-.96-.86-1.27-1.31l-2.57,2.24c.33.36.75.76,1.26,1.19.51.43,1.15.79,1.91,1.08.76.29,1.66.44,2.68.44,1.13,0,2.12-.19,2.96-.57.85-.38,1.5-.92,1.97-1.62.46-.7.7-1.51.7-2.42,0-.78-.16-1.43-.48-1.95-.32-.52-.74-.94-1.26-1.26Z"/>
<path fill="#ffffff" d="M171.95,14.16c0,1.07-.05,2.03-.16,2.88-.11.85-.35,1.51-.72,1.99-.37.48-.97.72-1.79.72-.67,0-1.18-.14-1.52-.41-.34-.27-.56-.63-.68-1.08-.12-.45-.18-.93-.18-1.46v-7.53h-3.74v8.35c0,1.07.17,2.02.52,2.83.35.81.89,1.44,1.62,1.88.74.45,1.68.67,2.83.67.91,0,1.74-.21,2.5-.63.52-.29.96-.74,1.32-1.33v1.69h3.77v-13.46h-3.77v4.89Z"/>
<path fill="#ffffff" d="M183.41,19.57c-.25,0-.46-.07-.63-.2-.16-.14-.25-.37-.25-.7V3.7h-3.74v15.7c0,1.26.32,2.17.96,2.74.64.57,1.43.86,2.37.86.31,0,.66-.03,1.04-.1.38-.06.77-.17,1.17-.31v-3.19c-.16.04-.32.07-.46.11-.15.04-.3.05-.46.05Z"/>
<path fill="#ffffff" d="M191.36,4.28l-3.79,2.02v2.98h-2.35v2.92h2.35v6.42c0,1.09.2,1.96.6,2.59.4.64.93,1.1,1.58,1.38.66.28,1.36.42,2.1.42.42,0,.82-.03,1.22-.1.39-.06.78-.17,1.16-.31v-2.87c-.26.07-.5.13-.72.16-.23.04-.43.05-.61.05-.6,0-1.01-.2-1.22-.6-.21-.4-.31-1-.31-1.8v-5.35h2.87v-2.92h-2.87v-5Z"/>
<rect fill="#ffffff" x="197.49" y="9.27" width="3.74" height="13.46"/>
<rect fill="#ffffff" x="197.44" y="3.7" width="3.9" height="3.6"/>
<path fill="#ffffff" d="M212.04,9c-.6,0-1.2.1-1.8.31-.6.21-1.13.56-1.6,1.06-.19.2-.35.44-.51.71v-1.81h-3.74v13.46h3.74v-6.36c0-.96.1-1.75.3-2.35.2-.6.51-1.05.91-1.34.41-.29.91-.44,1.52-.44.8,0,1.39.24,1.76.72.37.48.56,1.24.56,2.28v7.48h3.77v-8.87c0-1.51-.43-2.7-1.3-3.56s-2.07-1.3-3.62-1.3Z"/>
<path fill="#ffffff" d="M229.75,21.52c-.58-.26-1.27-.47-2.07-.61-.8-.15-1.68-.27-2.65-.38-.58-.07-1.09-.15-1.52-.23-.43-.08-.76-.2-.98-.37-.23-.16-.34-.38-.34-.66,0-.23.07-.44.21-.64.79.33,1.67.5,2.66.5,1.11,0,2.08-.2,2.92-.61.84-.41,1.49-.98,1.95-1.72.46-.74.7-1.6.7-2.58,0-.87-.18-1.64-.53-2.32l2.03-1.64-1.94-2.32-2.25,1.81c-.07-.04-.13-.08-.21-.12-.86-.42-1.79-.63-2.81-.63s-1.93.21-2.8.63c-.86.42-1.56,1.01-2.07,1.77-.52.76-.78,1.67-.78,2.7,0,.96.24,1.82.72,2.58.17.27.37.5.59.73-.25.21-.48.42-.67.66-.5.61-.75,1.29-.75,2.03,0,.82.27,1.47.81,1.97.23.21.48.39.76.55l-1.84,1.09c-.04.15-.06.3-.08.45-.02.15-.03.3-.03.42,0,1.24.58,2.22,1.75,2.93,1.16.72,2.77,1.08,4.8,1.08s3.54-.36,4.63-1.08c1.08-.72,1.62-1.75,1.62-3.1,0-.75-.16-1.35-.48-1.82-.32-.46-.77-.83-1.35-1.09ZM223.55,12.65c.35-.37.82-.56,1.42-.56s1.07.19,1.41.56c.34.37.51.85.51,1.43s-.15,1.05-.45,1.46c-.3.41-.79.61-1.46.61s-1.16-.2-1.47-.61c-.31-.41-.46-.9-.46-1.46s.17-1.06.52-1.43ZM227.21,25.75c-.42.21-1.05.31-1.88.31-1.04,0-1.85-.12-2.44-.37-.59-.25-.89-.58-.89-1v-.11s0-.07.03-.11l.86-1.06c.51.12,1.03.21,1.54.27.66.07,1.21.15,1.65.22.45.07.8.15,1.05.23.25.08.44.18.55.3.11.12.16.28.16.48,0,.35-.21.62-.63.83Z"/>
</g>
<!-- Icon -->
<g>
<path fill="#66c4e1" d="M49.82,3.89c.6-.26,1.08-.06,1.07.47l-.2,6.88c-.02.52-.52,1.16-1.12,1.43l-18.32,8.02c-.61.27-1.08.06-1.07-.47l.21-6.88c.02-.52.52-1.16,1.12-1.43L49.82,3.89Z"/>
<path fill="#1b7a95" d="M22.39,20.12c.28.6.08,1.08-.44,1.08l-6.89-.04c-.52,0-1.17-.49-1.45-1.09L5.15,1.95c-.28-.6-.08-1.08.44-1.08l6.89.04c.52,0,1.17.49,1.45,1.09l8.46,18.12Z"/>
<path fill="#66c4e1" d="M49.5,14.66c.6-.26,1.08-.06,1.07.47l-.2,6.88c-.02.52-.52,1.16-1.12,1.43l-18.32,8.02c-.61.27-1.08.06-1.07-.47l.21-6.88c.02-.52.52-1.16,1.12-1.43l18.32-8.02Z"/>
<path fill="#1b7a95" d="M28.7,19.9l.04-6.89c0-.71.32-1.44.84-2.02L25.38,2c-.28-.6-.93-1.08-1.45-1.09l-6.89-.04c-.52,0-.72.48-.44,1.08l8.46,18.12c.28.6.93,1.09,1.45,1.09h2.56c-.24-.35-.38-.79-.37-1.25Z"/>
<path fill="#1b7a95" d="M37.74,6.83l1.11-.52-2.02-4.32c-.28-.6-.93-1.09-1.45-1.09l-6.89-.04c-.52,0-.72.48-.44,1.08l3.61,7.73,6.08-2.84Z"/>
</g>
</svg>
</div>
</div>
<h1 class="headline">Agent Skills for <em>TYPO3</em></h1>
<p class="tagline">AI-augmented development with expert knowledge for web development, security, and enterprise software.</p>
<div class="domain">
<span class="domain-dot"></span>
webconsulting.at
</div>
</div>
<!-- Corner accent -->
<div class="corner-accent">
<div class="corner-line"></div>
<span class="corner-text">Skills</span>
</div>
</div>
</body>
</html>