pricing-page-saas
the brief, redacted

Build a complete three-tier pricing page as one self-contained HTML document. Tests layout, typographic hierarchy, and restraint under a familiar brief.

504 chars · 76 words · fingerprint a8a380793653

raw output — byte exact

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tandem — Pricing</title>
<meta name="description" content="Tandem pricing: preview environments for every pull request. Free for hobby projects, $20/mo for pros, $60/seat/mo for teams.">
<style>
  :root{
    --bg:#07090d;
    --card:#0e1219;
    --card-hi:#10151f;
    --line:rgba(148,163,184,.14);
    --line-strong:rgba(148,163,184,.28);
    --text:#e7ebf2;
    --muted:#8b94a7;
    --accent:#34d399;
    --accent-soft:rgba(52,211,153,.10);
    --accent-line:rgba(52,211,153,.45);
    --accent-ink:#05241a;
    --sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
    --mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
  }
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
  html{background:var(--bg)}
  body{
    font-family:var(--sans);
    color:var(--text);
    line-height:1.5;
    -webkit-font-smoothing:antialiased;
    text-rendering:optimizeLegibility;
  }
  ::selection{background:var(--accent);color:var(--accent-ink)}

  /* ---------- backdrop ---------- */
  body::before{
    content:"";position:fixed;inset:0;z-index:-2;pointer-events:none;
    background-image:
      linear-gradient(rgba(148,163,184,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(148,163,184,.05) 1px,transparent 1px);
    background-size:44px 44px;
    -webkit-mask-image:radial-gradient(ellipse 90% 60% at 50% 0%,#000 20%,transparent 75%);
            mask-image:radial-gradient(ellipse 90% 60% at 50% 0%,#000 20%,transparent 75%);
  }
  body::after{
    content:"";position:fixed;inset:0;z-index:-3;pointer-events:none;
    background:
      radial-gradient(640px 320px at 50% -100px,rgba(52,211,153,.13),transparent 70%),
      radial-gradient(900px 500px at 85% 110%,rgba(52,211,153,.05),transparent 70%);
  }

  .wrap{width:min(1120px,100% - 40px);margin-inline:auto}

  /* ---------- header ---------- */
  .site-header{padding:20px 0}
  .site-header .wrap{display:flex;align-items:center;gap:28px}
  .brand{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--text)}
  .mark{
    font-family:var(--mono);font-size:13px;font-weight:700;
    width:28px;height:28px;display:grid;place-items:center;
    background:linear-gradient(135deg,#34d399,#10b981);
    color:var(--accent-ink);border-radius:8px;letter-spacing:-1px;
  }
  .wordmark{font-weight:650;letter-spacing:-.01em;font-size:17px}
  .wordmark span{color:var(--muted);font-weight:500}
  .nav{display:flex;gap:22px;margin-left:8px}
  .nav a{color:var(--muted);text-decoration:none;font-size:14px;transition:color .2s}
  .nav a:hover{color:var(--text)}
  .nav a[aria-current]{color:var(--text)}
  .signin{
    margin-left:auto;font-size:13.5px;font-weight:600;text-decoration:none;color:var(--text);
    border:1px solid var(--line);border-radius:8px;padding:8px 14px;
    transition:border-color .2s,background .2s;
  }
  .signin:hover{border-color:var(--line-strong);background:rgba(255,255,255,.03)}

  /* ---------- hero ---------- */
  .hero{text-align:center;padding:76px 0 52px}
  .kicker{
    font-family:var(--mono);font-size:12px;letter-spacing:.22em;text-transform:uppercase;
    color:var(--accent);
  }
  .hero h1{
    margin-top:14px;font-size:clamp(2.1rem,4.6vw,3.3rem);
    font-weight:680;letter-spacing:-.032em;line-height:1.08;
  }
  .hero p{
    margin:16px auto 0;max-width:560px;color:var(--muted);font-size:16.5px;
  }
  .hero .annual{
    margin-top:18px;font-family:var(--mono);font-size:12.5px;color:var(--muted);
  }
  .hero .annual b{color:var(--accent);font-weight:600}

  /* ---------- plans ---------- */
  .plans{
    display:grid;grid-template-columns:repeat(3,1fr);gap:20px;
    align-items:stretch;
  }
  .plan{
    position:relative;display:flex;flex-direction:column;
    background:var(--card);
    border:1px solid var(--line);
    border-radius:16px;
    padding:28px 26px 24px;
    transition:transform .25s ease,border-color .25s ease,box-shadow .25s ease;
  }
  .plan:hover{border-color:var(--line-strong);transform:translateY(-4px)}

  .plan.featured{
    background:linear-gradient(180deg,rgba(52,211,153,.07),rgba(52,211,153,0) 42%),var(--card-hi);
    border-color:var(--accent-line);
    box-shadow:0 0 0 1px rgba(52,211,153,.12),0 28px 70px -28px rgba(52,211,153,.35);
    transform:translateY(-10px);
    z-index:1;
  }
  .plan.featured:hover{transform:translateY(-14px)}
  .plan.featured::before{
    content:"";position:absolute;top:-1px;left:26px;right:26px;height:1px;
    background:linear-gradient(90deg,transparent,rgba(52,211,153,.85),transparent);
  }

  .plan-name{
    font-family:var(--mono);font-size:12.5px;letter-spacing:.18em;text-transform:uppercase;
    color:var(--muted);
  }
  .featured .plan-name{color:var(--accent)}

  .price{display:flex;align-items:baseline;gap:5px;margin-top:14px}
  .price .cur{font-size:20px;color:var(--muted);transform:translateY(-4px)}
  .price .amt{font-size:46px;font-weight:700;letter-spacing:-.03em;line-height:1}
  .price .per{font-family:var(--mono);font-size:13px;color:var(--muted)}

  .blurb{margin-top:12px;min-height:2.75em;color:var(--muted);font-size:14.5px}

  .rule{border:0;border-top:1px solid var(--line);margin:6px 0 20px}

  .features{list-style:none;flex:1;display:grid;gap:12px;align-content:start;margin-bottom:26px}
  .features li{position:relative;padding-left:26px;font-size:14.5px;color:#c3cad6}
  .features li::before{
    content:"";position:absolute;left:5px;top:4px;width:5px;height:10px;
    border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);
    transform:rotate(42deg);
  }
  .features li.lead{padding-left:0;color:var(--muted);font-size:13.5px}
  .features li.lead::before{display:none}

  .btn{
    display:block;text-align:center;text-decoration:none;
    font-weight:600;font-size:15px;padding:13px 18px;border-radius:10px;
    border:1px solid rgba(255,255,255,.14);
    color:var(--text);background:rgba(255,255,255,.03);
    transition:border-color .2s,background .2s,transform .2s,filter .2s;
  }
  .btn:hover{border-color:var(--accent-line);background:var(--accent-soft);transform:translateY(-1px)}
  .btn.primary{
    background:var(--accent);border-color:transparent;color:var(--accent-ink);
  }
  .btn.primary:hover{filter:brightness(1.08);background:var(--accent)}

  .cta-note{
    margin-top:12px;text-align:center;font-family:var(--mono);
    font-size:12px;color:var(--muted);
  }

  /* ---------- assurance strip ---------- */
  .assurance{
    margin-top:58px;display:flex;flex-wrap:wrap;gap:10px;justify-content:center;
  }
  .chip{
    font-family:var(--mono);font-size:12px;color:var(--muted);
    border:1px solid var(--line);border-radius:999px;padding:8px 15px;
    background:rgba(255,255,255,.02);
  }

  /* ---------- FAQ ---------- */
  .faq{max-width:720px;margin:84px auto 0}
  .faq h2{
    font-size:13px;font-family:var(--mono);letter-spacing:.22em;text-transform:uppercase;
    color:var(--muted);font-weight:500;margin-bottom:8px;
  }
  details{border-bottom:1px solid var(--line)}
  details:first-of-type{border-top:1px solid var(--line)}
  summary{
    list-style:none;cursor:pointer;padding:18px 4px;
    font-weight:600;font-size:15.5px;
    display:flex;justify-content:space-between;align-items:center;gap:16px;
    transition:color .2s;
  }
  summary::-webkit-details-marker{display:none}
  summary:hover{color:var(--accent)}
  summary::after{
    content:"+";font-family:var(--mono);font-size:18px;color:var(--accent);
    transition:transform .2s;flex-shrink:0;
  }
  details[open] summary::after{transform:rotate(45deg)}
  details p{padding:0 4px 20px;color:var(--muted);font-size:14.5px;max-width:60ch}

  /* ---------- footer ---------- */
  footer{margin-top:88px;border-top:1px solid var(--line)}
  footer .wrap{
    display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;
    padding:26px 0 44px;color:var(--muted);font-size:13px;
  }
  footer a{color:var(--muted);text-decoration:none;margin-left:18px;transition:color .2s}
  footer a:hover{color:var(--text)}

  /* ---------- focus ---------- */
  a:focus-visible,summary:focus-visible{
    outline:2px solid var(--accent);outline-offset:3px;border-radius:6px;
  }

  /* ---------- responsive ---------- */
  @media (max-width:960px){
    .plans{grid-template-columns:1fr;max-width:520px;margin-inline:auto}
    .plan.featured{transform:none}
    .plan.featured:hover{transform:translateY(-4px)}
    .hero{padding:56px 0 44px}
  }
  @media (max-width:640px){
    .nav{display:none}
    .price .amt{font-size:42px}
  }

  @media (prefers-reduced-motion:reduce){
    *,*::before,*::after{transition:none !important}
  }
</style>
</head>
<body>

<header class="site-header">
  <div class="wrap">
    <a class="brand" href="#">
      <span class="mark" aria-hidden="true">&gt;_</span>
      <span class="wordmark">tandem<span>.run</span></span>
    </a>
    <nav class="nav" aria-label="Primary">
      <a href="#">Docs</a>
      <a href="#" aria-current="page">Pricing</a>
      <a href="#">Changelog</a>
    </nav>
    <a class="signin" href="#">Sign in</a>
  </div>
</header>

<main>
  <!-- hero -->
  <section class="hero wrap">
    <p class="kicker">Pricing</p>
    <h1>Preview environments for<br>every pull request.</h1>
    <p>Spin up a full-stack preview for every branch, share it with a link, and merge with confidence. Start free — upgrade when your side project becomes your main project.</p>
    <p class="annual">// <b>save two months</b> with annual billing on any paid plan</p>
  </section>

  <!-- plans -->
  <section class="plans wrap" aria-label="Pricing plans">

    <!-- Hobby -->
    <article class="plan">
      <h2 class="plan-name">Hobby</h2>
      <div class="price">
        <span class="cur">$</span><span class="amt">0</span><span class="per">/mo</span>
      </div>
      <p class="blurb">For side projects, experiments, and learning in public.</p>
      <hr class="rule">
      <ul class="features">
        <li>3 concurrent preview environments</li>
        <li>100 build minutes / month</li>
        <li>*.tandem.run subdomains</li>
        <li>7-day log retention</li>
        <li>Community Discord support</li>
      </ul>
      <a class="btn" href="#">Start for free</a>
      <p class="cta-note">no credit card required</p>
    </article>

    <!-- Pro -->
    <article class="plan featured">
      <h2 class="plan-name">Pro</h2>
      <div class="price">
        <span class="cur">$</span><span class="amt">20</span><span class="per">/mo</span>
      </div>
      <p class="blurb">For solo devs and freelancers shipping production work.</p>
      <hr class="rule">
      <ul class="features">
        <li>Unlimited preview environments</li>
        <li>1,000 build minutes / month</li>
        <li>Custom domains with auto SSL</li>
        <li>Priority build queue</li>
        <li>30-day log retention</li>
        <li>Same-day email support</li>
      </ul>
      <a class="btn primary" href="#">Start 14-day trial</a>
      <p class="cta-note">then $20/mo · cancel anytime</p>
    </article>

    <!-- Team -->
    <article class="plan">
      <h2 class="plan-name">Team</h2>
      <div class="price">
        <span class="cur">$</span><span class="amt">60</span><span class="per">/seat/mo</span>
      </div>
      <p class="blurb">For product teams that review and ship together.</p>
      <hr class="rule">
      <ul class="features">
        <li class="lead">Everything in Pro, plus:</li>
        <li>SSO / SAML &amp; SCIM provisioning</li>
        <li>Shared environment templates</li>
        <li>Audit logs &amp; role-based access</li>
        <li>Slack, Linear &amp; webhook alerts</li>
        <li>99.9% uptime SLA</li>
      </ul>
      <a class="btn" href="#">Talk to sales</a>
      <p class="cta-note">min. 3 seats · volume pricing</p>
    </article>

  </section>

  <!-- assurance -->
  <section class="assurance wrap" aria-label="Included on all plans">
    <span class="chip">SOC 2 Type II</span>
    <span class="chip">99.9% uptime</span>
    <span class="chip">Cancel anytime</span>
    <span class="chip">Prices in USD</span>
  </section>

  <!-- FAQ -->
  <section class="faq wrap">
    <h2>Questions</h2>
    <details>
      <summary>What counts as a build minute?</summary>
      <p>Only wall-clock time while a build is actually running. Queue time, sleeping environments, and serving traffic are always free. Runners are isolated per build and torn down afterwards.</p>
    </details>
    <details>
      <summary>What happens if I hit my Hobby limits?</summary>
      <p>New builds pause gracefully — existing previews keep serving and nothing is deleted. Limits reset on the first of each month, or you can upgrade and resume instantly.</p>
    </details>
    <details>
      <summary>Can I change plans later?</summary>
      <p>Yes. Upgrade, downgrade, or add seats at any time from the dashboard. Changes are prorated to the day, and downgrades take effect at the end of your billing cycle.</p>
    </details>
    <details>
      <summary>Do you offer discounts?</summary>
      <p>Tandem is free for public open-source repositories and for students. Annual billing on Pro and Team includes two months free. Nonprofits get 50% off — just ask.</p>
    </details>
  </section>
</main>

<footer>
  <div class="wrap">
    <span>© 2025 Tandem Systems, Inc.</span>
    <span>
      <a href="#">Terms</a><a href="#">Privacy</a><a href="#">Status</a>
    </span>
  </div>
</footer>

</body>
</html>

request envelope — prompt redacted

{
  "model": "moonshotai/kimi-k3",
  "system": "Respond with a single complete, self-contained HTML document and nothing else. No markdown fences, no explanation. Inline all CSS and JavaScript. Do not reference any external resource — no CDN scripts, no external stylesheets, no remote fonts or images. The document must render correctly offline.",
  "messages": [
    {
      "role": "user",
      "content": "«REDACTED — 81 words, 504 chars»"
    }
  ],
  "maxOutputTokens": 32000,
  "gatewayStringId": "1bfbb92f-8faa-4d8c-820a-3bc9a9aa46b6"
}