Website

Build a fast dark SaaS site with a GSAP pinned, scroll-driven product story

Builds a multi-page product site on your hosting server with a ScrollTrigger pinned, scroll-scrubbed product story, a SplitText heading entrance and Lenis smooth scrolling. The motion libraries load only where needed and after the first paint, and mobile Lighthouse is measured and kept above 95.

When to use it

When you want a product site with strong motion for your software or digital product, without giving up speed, accessibility or search visibility.

What you get

A five-page site with a pinned product story, static menu and structured data, plus a per-page mobile and desktop Lighthouse table, the gates passed and the list of fixes applied.

Does it change anything in my account?

Only with your approval. The assistant first shows a preview of every change and waits for your go-ahead.

Works with

SEO Intelligence, Search Console

Fill in before sending

[server name][product name][what it does, who it is for][three steps][4 to 6 features][email][phone][WhatsApp number][address if any][domain][colour or "you choose"][links or "none"]
On my Opus Growth hosting server [server name], build a dark, multi-page product site for [product name] that tells its story as the visitor scrolls. Product: [what it does, who it is for]. The three steps a user follows in the product: [three steps]. Key features: [4 to 6 features]. Contact: [email], [phone], [WhatsApp number], [address if any]. Domain: [domain]. Colour preference: [colour or "you choose"]. Real product screenshots or photos: [links or "none"]. Pages: home (/), product (/urun/), about (/hakkimizda/), contact (/iletisim/), privacy (/gizlilik/) and 404.html. Home sections in order: hero (h1, two-sentence description, two buttons, product image), the product story as the signature element, features, who it is for, FAQ and a closing call to action. No form on the contact page; use email, phone and a WhatsApp link with a prefilled message, because the server only serves static files. Style: dark motion. Dark background, one restrained accent colour (not neon), a tight grotesk display from Fontshare (for example Cabinet Grotesk) and a calm body font (for example Switzer). No gradients and no WebGL; keep the boldness for the product story. Motion rules (the hardest part, follow them to the letter): 1. Libraries: GSAP 3.13 core, ScrollTrigger, SplitText and Lenis. Download them from jsdelivr into `assets/vendor/` with site_fetch and pin the version. Load them only on the home and product pages; the about, contact and privacy pages carry no script at all. Do not load Swiper. 2. Do not attach these with `<script defer>`. Put a small loader at the end of the page: after the load event it waits two requestAnimationFrame calls and then requestIdleCallback, appends the scripts in order with async=false, and downloads nothing if `<html>` has no `anim` class. In the demo, deferred libraries pushed mobile LCP to 3.2 s and left Performance at 92; with this loader it reached 99. 3. A one-line script in `<head>` adds the `js` class to `<html>`, and the `anim` class unless prefers-reduced-motion is "reduce". Define hidden starting states only under `.anim`, so content is visible from the start with JS off or for visitors who prefer less motion, and the libraries are never downloaded for them. As a safety net in case a library fails to load, add a CSS animation that makes every hidden element visible after 2.5 s. If JS arrives later than that, do not hide visible content again; only build the pinned story. 4. SplitText heading entrance: the first-screen h1 is the LCP element, never start it hidden. The h1 starts visible in a dimmed colour that still passes AA contrast, and SplitText brings its lines to full colour one after another (mask and aria options on). Keep the masked, rising line entrance for the h2 headings further down and play it on scroll with ScrollTrigger. 5. Signature element: in the product story, use ScrollTrigger pin and scrub through gsap.matchMedia only at 768 px and wider (scrub around 0.6, end "+=180%"). On the left the three steps become active one by one; on the right the product screen fills in step by step. Do not dim inactive steps with opacity; change only the heading colour and the border line. In the demo, steps dimmed with opacity failed contrast on desktop and dropped Accessibility to 95. On mobile there is no pin; steps appear in normal flow. Without JS, the product screen shows its finished state. 6. Turn Lenis on only for `(pointer: fine)` devices so touch devices keep native scrolling. Drive Lenis from gsap.ticker and move focus to the target after scrolling to an in-page link. 7. The product screen is a decorative figure with aria-hidden and a figcaption that says what it shows. Every interaction works with the keyboard and the focus ring stays visible. Setup and known traps (each one lowered a score in the demo measurements, do not skip): 1. If a site is already live on the server, tell me first, because the setup overwrites index.html and the assets folder. Preview scaffold_site with confirm=false and call it with confirm=true after my approval. Then read site_design_guide and site_seo_guide. Before writing code, put the design direction (typography, colour, grid, signature element, motion language and the libraries that will NOT be loaded) in a short ART.md outside assets and show it to me. 2. Compile Tailwind instead of loading it from the CDN. Install it with site_run_command and background=true: `npm i -D tailwindcss@3`, then follow it with site_command_status. The content paths in `tailwind.config.js` must cover every HTML file, the templates and any JS file that writes class names. `_src/tw.css` holds the line `@import "../assets/app.css";` and the three `@tailwind` lines; compile it into one file with `npx tailwindcss -c tailwind.config.js -i _src/tw.css -o assets/site.css --minify`. Remove the cdn.tailwindcss.com script and the inline tailwind.config from every page and link only `/assets/site.css`. Recompile after every HTML change. 3. Host the fonts yourself. Read the CSS of the Fontshare families you picked, download the woff2 file of each weight into `assets/fonts/` with site_fetch, and write the @font-face rules with `font-display: swap` into `assets/app.css`; design-check looks for a custom font there. Check the font-family name in the CSS you downloaded, because Fontshare can return a different family when a weight does not exist. Preload the font of the first-screen heading and the body font on every page with `<link rel="preload" as="font" type="font/woff2" crossorigin>`; in the demo this removed the layout shift caused by the font swap (CLS 0.024 to 0). Most Fontshare fonts have no ₺ glyph, so write "TL" for prices. 4. Make the menu and footer static HTML. Do not load chrome.js or site.config.js on the pages. Write a small `chrome-stamp.mjs` that reads the nav list in site.config.js and stamps `_src/header.tpl` and `_src/footer.tpl` between the `<!-- nav:start --><!-- nav:end -->` and `<!-- footer:start --><!-- footer:end -->` markers of every page, adding aria-current="page" to the current link. Do not give the templates an .html extension and use placeholders like `[[NAV]]` instead of `{{...}}`, otherwise design-check and seo-check read them as unfinished pages. Build the mobile menu without JS using `<details>`. Keep the business name, address and phone in the footer as plain text. 5. Convert images while downloading them with site_fetch: write the same photo to separate files with resize="480x", "800x" and "1200x", image_format="webp", quality=65. Give every `<img>` srcset, sizes, width and height. The main first-screen image gets fetchpriority="high" and is never lazy; the rest get loading="lazy" decoding="async". If the main image fills the phone screen, serve a wider, smaller crop on mobile with `<picture>` (in the demo the mobile hero went from 89 KB to 43 KB). 6. Create a 48 px PNG favicon from the logo with site_fetch and add `<link rel="icon">` to every page. Without it the browser logs a 404 and Best Practices drops to 96. 7. HTML validator rules: start every document with an uppercase `<!DOCTYPE html>` (the kit's starter files use lowercase), use `&nbsp;` for the spaces in the visible text of tel: links, never use a style="" attribute, and give every button type="button". SEO, AEO and GEO: 1. Use directory URLs with a trailing slash (/urun/, /hakkimizda/, /iletisim/, /gizlilik/). Fill in the seo block of site.config.js and run `node seo-stamp.mjs`. Write the page-specific schema (home WebPage and FAQPage; product SoftwareApplication and FAQPage; about AboutPage; contact ContactPage; BreadcrumbList on inner pages. For a software company without a physical shop set localBusiness:false in site.config.js) in separate `<script type="application/ld+json">` blocks and link it to the base graph with @id. Do not bury BreadcrumbList inside an @graph; give it its own block, because that is the only way seo-check sees it. 2. Titles 48 to 60 characters (seo-check flags anything over 65 as an error), descriptions 145 to 158 characters, one h1 per page. Every page needs at least 150 words of main content; contact and privacy pages tend to fall short. 3. The first paragraph of each page answers the page's question directly. Write a page-specific FAQ with `<details>` and mark it up as FAQPage. Show the publishing organisation and a "Last updated" date with `<time>`. 4. In robots.txt, write your decision with its reason for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot, Perplexity-User, Google-Extended, Applebot-Extended, Bingbot and CCBot, and point to the sitemap. sitemap.xml carries real lastmod dates. llms.txt holds an accurate two-sentence summary of the site and the list of key pages. 5. Do not invent anything: no reviews, ratings, awards, customer counts, certificates, opening hours, coordinates or prices unless I give them. Leave unknown fields out of the schema. Gates (in order; do not call it finished until all pass): 1. With site_run_command run `node chrome-stamp.mjs`, the Tailwind build, `node seo-stamp.mjs`, `node seo-check.mjs` (0 errors, 0 warnings), `node design-check.mjs` (0 errors; justify any remaining warning) and `npx html-validate "**/*.html"` (0 errors). 2. View every page with site_preview, view="mobile" and view="desktop". site_preview captures the page with motion turned off (reduced-motion), so if content is missing in that picture, the motionless state is broken. In full-page captures, lazy images further down may show as empty; that is not an error, but check their paths. 3. Run core_web_vitals for every page with strategy="mobile" and strategy="desktop". Pass: on mobile Performance at least 95 and Accessibility, Best Practices and SEO 100; on desktop all four at least 95. On a page that fails, use resources=true to find the file that holds it back, fix it and measure again. Then run seo_audit on the home page with strategy="mobile" and runs=2. The network request list must not contain any host other than your own domain. 4. No horizontal scrolling at 360, 390, 768 and 1440 px width, touch targets at least 44 px, no console errors. Motion check: site_preview cannot show motion, so describe the pinned section on the home page and tell me what to check in my own browser: on desktop the product story should stick to the top while the steps advance with scrolling, on a phone it should flow without sticking, and with reduce motion turned on in the operating system nothing should move and everything should be visible. After publishing: preview the rule `/assets/* Cache-Control: public, max-age=31536000, immutable` with site_headers and apply it after my approval; from then on, rename CSS or JS files when they change (site-v2.css and so on). Submit sitemap.xml with gsc_submit_sitemap and check the home page with gsc_url_inspect. Finish with a per-page score table (page, four mobile scores, four desktop scores, LCP, CLS), the gate results and the list of fixes you applied.

Example result

An example of the output this prompt produces. Its structure comes from the tools' real output; numbers and names are fictional.

Example output (on a fictional demo brand, not real customer data; the scores are the demo's real measurements)

This prompt was followed to the letter for "Vardiya Defteri", a fictional shift-planning product: dark background, a single amber accent, Cabinet Grotesk and Switzer, five pages. The product story on the home page pins and fills in with scrolling on desktop and flows normally on a phone. GSAP, ScrollTrigger, SplitText and Lenis load only on the home and product pages, after the first paint.

PageMobile (P/A/BP/SEO)Mobile LCPDesktop (P/A/BP/SEO)CLS
Home99/100/100/1002.04 s100/100/100/1000
Product100/100/100/1001.65 s100/100/100/1000
About100/100/100/1001.51 s100/100/100/1000
Contact100/100/100/1001.51 s100/100/100/1000
Privacy100/100/100/1001.51 s100/100/100/1000

Gates: seo-check 0 errors 0 warnings, design-check 0 errors 0 warnings, html-validate 0 errors, no overflow at 360/390/768/1440 px, clean console, no network request outside the site's own domain.

Fixes applied:
1. The same home page with the Tailwind CDN and external resources measured 89/94/100/100 on mobile (CLS 0.079); with compiled CSS and local fonts and scripts it measured 99/100/100/100.
2. With deferred libraries mobile LCP was 3.2 s and Performance 92; with the post-load idle loader, 99.
3. Hiding the h1 for SplitText delayed LCP; the h1 now starts visible and its lines enter by changing colour.
4. Steps dimmed with opacity dropped desktop Accessibility to 95; switching to a colour change brought it to 100.
5. A missing favicon logged a 404 and Best Practices fell to 96; adding it restored 100.

A sample site built with this prompt

Dark-motion SaaS: product storytelling with GSAP ScrollTrigger pin and scrub, SplitText headline entrance, Lenis (mouse only), libraries loaded on just 2 pages and only after first paint

Built for a fictional brand by following this prompt to the letter. Scores were measured with Lighthouse on every page.

Lighthouse scores (lowest page)
MobileDesktop
Performance99100
Accessibility100100
Best practices100100
SEO100100

Checks passed

  • seo check: 0 hata 0 uyarı
  • design check: 0 hata 0 uyarı
  • html validate: 0 hata
  • overflow: 360/390/768/1440 taşma yok, konsol temiz, JS kapalıyken ve reduced-motion'da gizli içerik yok, dış ağ isteği yok
  • tailwind before after: Ana sayfa Tailwind CDN + Fontshare + jsdelivr + JS menü ile mobil 89/94/100/100 (CLS 0,079), derlenmiş CSS + yerel font/betik + statik menü ile 99/100/100/100 (CLS 0)
Screenshots
Build a fast dark SaaS site with a GSAP pinned, scroll-driven product story: Mobile
Mobile
Build a fast dark SaaS site with a GSAP pinned, scroll-driven product story: Desktop
Desktop

Measured on: 2026-10-11

Related searches

These prompts work best when your AI assistant is connected to your accounts with Opus Growth.

Connect your accounts free

More prompts

WebsiteChanges after your approvalLive demo

Build an editorial expert site with a guides section and author schema

Has your assistant build an expert's site with a magazine-cover home page, long-form guides and an author profile. Serif typography, Article and Person schema and dated, sourced articles produce a publication people read and AI answers can cite.

When to use itWhen you are a consultant, specialist or one-person knowledge business and want your site to read like a publication that shows your expertise through writing, not like a brochure.

SEO Intelligence, Search Console
WebsiteChanges after your approvalLive demo

Build a heritage family business site with a classic look and modern standards

Has your assistant build a site in the spirit of an old label and shop sign for a producer in its third generation, framed and with a paper texture. The look is old, the build is new: mobile first, JavaScript-free, self-hosted fonts, WebP, Product and HowTo schema.

When to use itWhen you sell a craft passed down through generations, such as Turkish delight, olive oil, cheese or copperware, and want a classic look that carries that history without giving up speed or accessibility.

SEO Intelligence, Search Console
WebsiteChanges after your approvalLive demo

Build a Swiss-minimal law or accounting firm site with strong trust signals

Has your assistant build a still firm site on a strict grid, with hierarchy carried by a single type family. It puts the trust signals a YMYL field needs on the page: practitioner profiles, a dated and sourced guidance note, wording that respects professional advertising rules, and Person schema.

When to use itWhen a law, accounting or similar professional practice needs a site that looks serious and plain, stays within professional advertising rules and proves its expertise.

SEO Intelligence, Search Console
WebsiteChanges after your approvalLive demo

Build a JavaScript-free multi-page corporate site and deliver it at 100

Has your assistant build a still, fast and accessible site for corporate work such as architecture, engineering or consulting. Menu and footer are static HTML, fonts and CSS are self-hosted, and every page is measured before hand-over.

When to use itWhen a corporate business needs a multi-page site where speed and accessibility matter more than decoration, with no animation and no JavaScript.

SEO Intelligence, Search Console