Minimal pre-launch landing with email capture, brand logo, and optional decorative layer. Reads DESIGN.md for colors, typography, and layout rules. Best for: product launches, beta signups, early access programs, indie projects.
68
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Pre-launch pages are your first handshake with future users. This skill builds a focused, honest entrance: your brand identity, what you're making, one clear path to join the early list. No artificial scarcity, no fake countdown, no inflation tactics—just a clean, mobile-first vessel for genuine interest.
DESIGN.md for the color system, font pairing, and spatial rules. This is your foundation. A waitlist page lives or dies by consistency with the brand it represents. If DESIGN.md is missing, ask the user to provide one before you proceed.assets/template.html. This template is the hardened seed for all outputs. Copy it to index.html as your base. Do not write HTML from scratch or deviate from this structure. The template has all required layout, form structure, decorations, focus styles, and accessibility scaffolding baked in.{{PRODUCT_NAME}}, {{BG_EXPRESSION}}, {{BORDER_EXPRESSION}}, {{LOGO_MARK}}), follow the replacement rules below:
{{PRODUCT_NAME}}, {{TAGLINE}}): HTML-escape <, >, &, ", ' before insertion into HTML text nodes or attribute values.{{LOGO_MARK}}): If using text initials, HTML-escape them by default. If using inline SVG, you must strictly sanitize it using an allowlist: strip <script> tags, event handlers (on*), <foreignObject>, external refs (href, xlink:href, url()), and any disallowed attributes/elements before insertion. If the SVG cannot be safely sanitized, fallback to escaped text initials. Never emit raw, unsanitized arbitrary HTML. Ensure any SVG scales cleanly within its container.{{BG_EXPRESSION}}, {{FG_EXPRESSION}}, {{ACCENT_EXPRESSION}}, {{DECO_EXPRESSION}}, {{STRIPE_EXPRESSION}}, {{SUCCESS_EXPRESSION}}, {{BORDER_EXPRESSION}}, {{BTN_LABEL_EXPRESSION}}, {{TICKER_BG_EXPRESSION}}, {{TICKER_FG_EXPRESSION}}, {{DECO_STROKE_EXPRESSION}}, {{LOGO_SHADOW_EXPRESSION}}, {{LOGO_FG_EXPRESSION}}): Must strictly adhere to an explicit color grammar (#hex, rgb/rgba, hsl/hsla, oklch, or color-mix() using only local variables). Hard reject any input containing ;, {}, <, >, comments (/*), @, url(, or external refs to prevent CSS injection. Do not wrap in # or add extra quotes. Examples: rgba(196, 169, 154, 0.38), color-mix(in srgb, var(--fg) 38%, transparent), #FDE8DF. Insert as-is into :root CSS variables. Derive --success from DESIGN.md if present; otherwise use the allowed fallback #2D6A4F only.{{DISPLAY_FONT_CSS}}, {{BODY_FONT_CSS}}): These are CSS font-family values, already quoted if they contain spaces (e.g., 'DM Sans', Syne). Insert as-is into --font-display and --font-body declarations; do NOT add extra quotes.{{DISPLAY_FONT_URL}}, {{BODY_FONT_URL}}): Spaces must be encoded as + for the Google Fonts URL (e.g., DM+Sans, IBM+Plex+Serif). Validate the URL is well-formed before insertion.--bg = {{BG_EXPRESSION}} (e.g., #FDE8DF)--fg = {{FG_EXPRESSION}} (e.g., #1A1410)--accent = {{ACCENT_EXPRESSION}} (brand badge)--deco = {{DECO_EXPRESSION}} (decoration primary)--deco-stripe = {{STRIPE_EXPRESSION}} (accent stripe)--input-border = {{BORDER_EXPRESSION}} (full CSS expression with opacity)--success = {{SUCCESS_EXPRESSION}} or #2D6A4F fallback--btn-label = {{BTN_LABEL_EXPRESSION}} (button text color for contrast)--ticker-bg = {{TICKER_BG_EXPRESSION}} (animated ticker background)--ticker-fg = {{TICKER_FG_EXPRESSION}} (animated ticker text)--deco-stroke = {{DECO_STROKE_EXPRESSION}} (SVG strokes, typically muted with 12–15% opacity)--logo-shadow = {{LOGO_SHADOW_EXPRESSION}} (logo container shadow, subtle foreground shade)--logo-fg = {{LOGO_FG_EXPRESSION}} (contrasting text color for logo initials)references/checklist.md. Validate every P0 gate before emitting:
type="email" and required; first name has no requirednovalidate; JS uses checkValidity() guardrole="status" or aria-live="polite"prefers-reduced-motion: reduceoutline)aria-hidden="true"<html lang=""> is setdata-od-id (headline, form, logo, ticker, grid, etc.) so agents can customize without parsing.This skill enforces a hardened, template-based workflow to ensure compliance. You must follow this execution path; deviating from the template disqualifies the output.
Mandatory template-based execution:
assets/template.html as your base; do not write HTML from scratch.index.html and replace only the {{PLACEHOLDER}} tokens with validated/escaped values.references/checklist.md before emitting; if any fail, fix and re-validate.P0 gates (must pass):
#2D6A4F for --success.product_name and tagline inputs—no filler copy.checkValidity() guard, success message with role="status".;, {}, <, >, /*, @, url(); font names are URL-encoded; {{LOGO_MARK}} is escaped text initials or strictly sanitized inline SVG (no scripts, no event handlers, no foreignObject, no external hrefs).P1 gates (should pass for quality submission):
prefers-reduced-motion: reduce.aria-hidden="true".<html lang=""> set to correct language code.Decoration restraint:
Only emit after all P0 gates in references/checklist.md pass.
Emit the artifact between tags:
<artifact identifier="waitlist-id" type="text/html" title="Coming Soon — {{PRODUCT_NAME}}">
<!doctype html>
<html lang="en">
...
</html>
</artifact>One line of description above the artifact; nothing below.
Post-emission: If the user asks for changes, update the index.html in-place and re-run the P0 checklist gates before emitting the next version. Do not skip validation on iterations.
1a7a23d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.