> ## Documentation Index
> Fetch the complete documentation index at: https://site.aspect.build/llms.txt
> Use this file to discover all available pages before exploring further.

# Sign up this morning. Faster builds this afternoon.

> A hosted remote cache and the Build Results UI, with a free tier. Sign up, point your repo at it, done.

export const MarketingPage = () => <div className="marketing-page-marker" style={{
  display: "none"
}} />;

export const CTA = ({title, subtitle, primaryCta, primaryHref = "#", secondaryCta, secondaryHref = "#"}) => <section className="w-full flex justify-center px-4 py-16 md:py-20">
    <div className="w-full rounded-2xl text-white flex flex-col md:flex-row items-center justify-center gap-10 md:gap-16 p-8 md:p-12 text-center md:text-left" style={{
  maxWidth: "1140px",
  background: "linear-gradient(135deg, #1a3a5c 0%, #176ACC 100%)"
}}>
      <div>
        <h2 className="text-2xl md:text-3xl font-semibold tracking-tight">{title}</h2>
        {subtitle && <div className="mt-3 text-blue-100 text-base">{subtitle}</div>}
      </div>
      <div className="flex flex-wrap gap-3 shrink-0 justify-center">
        {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-white text-blue-700 font-semibold hover:bg-blue-50 transition whitespace-nowrap shadow-sm">
            {primaryCta}
          </a>}
        {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-blue-300/50 text-white font-semibold hover:bg-blue-700/30 transition whitespace-nowrap ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
            {secondaryCta}
          </a>}
      </div>
    </div>
  </section>;

export const StatsBar = ({stats = []}) => <div className="flex flex-wrap justify-center gap-8 md:gap-16 py-4">
    {stats.map((stat, i) => <div key={i} className="flex flex-col items-center text-center">
        <span className="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-white">{stat.value}</span>
        <span className="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{stat.label}</span>
      </div>)}
  </div>;

export const FeatureGrid3 = ({children}) => <div className="marketing-grid-3">{children}</div>;

export const FeatureGrid2 = ({children}) => <div className="marketing-grid-2">{children}</div>;

export const FeatureShowcase = ({title, description, href, linkText = "Learn more", flipped = false, label, children}) => <div className={`flex flex-col ${flipped ? "md:flex-row-reverse" : "md:flex-row"} items-center gap-10 md:gap-16 py-10`}>
    <div className="flex-1 min-w-0">
      {label && <p className="text-xs font-semibold tracking-widest text-blue-600 dark:text-blue-400 uppercase mb-3">{label}</p>}
      <h3 className="text-2xl md:text-3xl font-bold text-zinc-900 dark:text-white tracking-tight">{title}</h3>
      <p className="mt-4 text-zinc-500 dark:text-zinc-300 leading-relaxed text-base">{description}</p>
      {href && <div className="mt-6">
          <a href={href} className="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold text-sm hover:underline underline-offset-2">
            {linkText} →
          </a>
        </div>}
    </div>
    <div className="flex-1 min-w-0 feature-showcase-image">
      {children}
    </div>
  </div>;

export const PlatformFeature = ({title, description, href, linkText = "Learn more"}) => <div className="flex flex-col p-5 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800/40 hover:border-blue-200 dark:hover:border-blue-700 hover:shadow-sm transition-all duration-200">
    <h3 className="text-sm font-semibold text-zinc-900 dark:text-white">{title}</h3>
    <p className="mt-1.5 text-xs text-zinc-500 dark:text-zinc-400 leading-relaxed">{description}</p>
    {href && <a href={href} className="inline-flex items-center mt-3 text-xs text-blue-600 dark:text-blue-400 font-semibold hover:underline underline-offset-2">
        {linkText} →
      </a>}
  </div>;

export const Hero = ({title, subtitle, badge, eyebrow, heroImageClassName = "", primaryCta, primaryHref = "#", secondaryCta, secondaryHref = "#", centered = true, children}) => <section className="w-full flex justify-center px-4 pt-16 pb-16 md:pt-24 md:pb-24" style={{
  background: "linear-gradient(180deg, var(--hero-gradient-start, #f8fafc) 0%, var(--hero-gradient-end, #ffffff) 100%)"
}}>
    <div className="w-full" style={{
  maxWidth: "1140px"
}}>
      {centered && !children ? <div className="flex flex-col items-center text-center">
          {badge && <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-700 text-blue-700 dark:text-blue-300 text-sm font-medium mb-6">
              {badge}
            </div>}
          {eyebrow && <div className="text-xs font-semibold tracking-widest uppercase text-blue-600 dark:text-blue-400 mb-4">
              {eyebrow}
            </div>}
          <h1 className="text-4xl md:text-5xl font-semibold text-zinc-900 dark:text-white leading-tight tracking-tight" style={{
  maxWidth: "820px"
}}>
            {String(title).split(/\\n|\n/).map((line, i) => i ? [<br key={i} />, line] : line)}
          </h1>
          {subtitle && <div className="subtitle-gap text-lg md:text-xl text-zinc-500 dark:text-zinc-300 leading-relaxed" style={{
  marginTop: "1rem",
  maxWidth: "600px"
}}>
              {subtitle}
            </div>}
          {(primaryCta || secondaryCta) && <div className="flex flex-wrap gap-3 mt-10 justify-center">
            {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-blue-600 text-white font-semibold hover:bg-blue-700 transition shadow-sm">
                {primaryCta}
              </a>}
            {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 font-semibold hover:bg-zinc-50 dark:hover:bg-zinc-800 transition ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
                {secondaryCta}
              </a>}
          </div>}
        </div> : <div className="flex flex-col md:flex-row items-center gap-10 md:gap-16">
          <div className="flex-1 min-w-0">
            {badge && <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-700 text-blue-700 dark:text-blue-300 text-sm font-medium mb-6">
                {badge}
              </div>}
            {eyebrow && <div className="text-xs font-semibold tracking-widest uppercase text-blue-600 dark:text-blue-400 mb-4">
                {eyebrow}
              </div>}
            <h1 className="text-4xl md:text-5xl font-semibold text-zinc-900 dark:text-white leading-tight tracking-tight">
            {String(title).split(/\\n|\n/).map((line, i) => i ? [<br key={i} />, line] : line)}
          </h1>
            {subtitle && <div className="subtitle-gap text-lg md:text-xl text-zinc-500 dark:text-zinc-300 leading-relaxed" style={{
  marginTop: "1rem"
}}>
                {subtitle}
              </div>}
            <div className="flex flex-wrap gap-3 mt-8">
              {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-blue-600 text-white font-semibold hover:bg-blue-700 transition shadow-sm">
                  {primaryCta}
                </a>}
              {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 font-semibold hover:bg-zinc-50 dark:hover:bg-zinc-800 transition ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
                  {secondaryCta}
                </a>}
            </div>
          </div>
          {children && <div className={`flex-1 min-w-0 hero-image ${heroImageClassName}`}>
              {children}
            </div>}
        </div>}
    </div>
  </section>;

<MarketingPage />

<Hero title="Sign up this morning. Faster builds this afternoon." subtitle="A hosted remote cache and the Build Results UI, with a free tier. Sign up, point your repo at it, done." primaryCta="Sign up free" primaryHref="https://signup.aspect.build/" secondaryCta="Talk with us" secondaryHref="/contact" centered={false}>
  <video className="hero-video" muted playsInline preload="auto" poster="/images/marketing/hero-video/cloud-tour-poster.jpg" aria-label="A tour of getting started on Aspect Cloud: sign up, add a few Bazel flags, run a build, and see the results">
    <source src="https://cdn.aspect.build/videos/cloud-tour-2026-09-26d.mp4" type="video/mp4" />

    <source src="https://cdn.aspect.build/videos/cloud-tour-2026-09-26d.webm" type="video/webm" />
  </video>
</Hero>

<div className="w-full flex justify-center px-4 pt-8">
  <p className="text-center text-sm text-zinc-500 dark:text-zinc-400">
    <strong className="text-zinc-900 dark:text-white">Written for</strong> Teams who want a real remote cache without an infrastructure project.
  </p>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">What problem it solves</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">Everything Aspect does well has, until now, required a deployment.</p>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        Even when we own the cloud, there is still an account, a provisioning conversation and a contract before anyone gets a cache hit. That is correct for a large platform organisation, and a wall for everyone else.
      </p>

      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed mt-4">
        So the teams with the most to gain get nothing. Their builds hurt and their platform headcount is zero, so either they go without, or they stand up open-source Buildbarn themselves and inherit an operational job nobody was hired for. Multi-tenancy removes the provisioning step altogether. Time-to-value goes from a project to a login.
      </p>
    </div>

    <div className="mt-8">
      <FeatureGrid3>
        <PlatformFeature title="See everything" description="Every build your team runs, local or CI, lands in one place and gets explained." />

        <PlatformFeature title="Prove anything" description="Compare any two builds and get the verdict first: what changed, what it cost, which flag did it." />

        <PlatformFeature title="Waste nothing" description="Never rebuild the same thing twice. CI and every developer share one cache." />
      </FeatureGrid3>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <FeatureShowcase label="How it works" title="Sign up, add a few flags, build" description="Laptops and CI share one hosted remote cache and stream every build to the Build Results UI. The configuration is Bazel flags, not Terraform. There’s no cloud account to open, no cluster to size, nothing to deploy.">
      <img noZoom src="https://mintcdn.com/aspectbuild/4wAijf_e0qg5Bve0/images/marketing/illustrations/aspect-cloud-architecture-v2.svg?fit=max&auto=format&n=4wAijf_e0qg5Bve0&q=85&s=673d6e2447200ebcd9eb83425ba93211" alt="Developer laptops and CI connecting to Aspect Cloud, which runs a shared remote cache and the Build Results UI" width="720" height="480" data-path="images/marketing/illustrations/aspect-cloud-architecture-v2.svg" />
    </FeatureShowcase>

    <div className="mt-8">
      <FeatureGrid2>
        <PlatformFeature title="Self-serve signup" description="No sales gate, no waitlist, no provisioning call, no credit card. You can be caching in the time it takes to read this page." />

        <PlatformFeature title="Free and Team tiers" description="Start free, move to Team when your usage grows. Pricing is public." />

        <PlatformFeature title="Scoped to your organization" description="Every request is authenticated to your organization, and cache contents are encrypted at rest." />

        <PlatformFeature title="Cache and results" description="The same Build Results UI Aspect Enterprise customers get. Remote execution and CI runners are coming soon." />
      </FeatureGrid2>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">And a way up when you outgrow it</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">You don't pick a tier and hope. You start where you are and move when you need to.</p>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        If you need isolation, or remote execution and CI runners today, you move to Aspect Enterprise: hosted by Aspect, or in your own account, including air-gapped and GovCloud. Same platform, same tooling, no new vendor; moving changes endpoints and credentials, not your build. The answer to “what happens when we get big?” is a path rather than an apology.
      </p>
    </div>

    <div className="mt-8">
      <FeatureShowcase label="Day one" title="Every build your team runs, in one list" description="Local and CI builds side by side from the first login, with pass rate and build-time trend on top. Shift-click any two to compare them." flipped>
        <img noZoom src="https://mintcdn.com/aspectbuild/4wAijf_e0qg5Bve0/images/marketing/bazelcon-2026/builds-overview.png?fit=max&auto=format&n=4wAijf_e0qg5Bve0&q=85&s=9720d499bbae923956ce45853e976a9d" alt="Builds list in the Build Results UI with pass rate and average build time" width="1285" height="700" data-path="images/marketing/bazelcon-2026/builds-overview.png" />
      </FeatureShowcase>

      <p className="mt-4 text-sm text-zinc-500 dark:text-zinc-400">Test runs across languages from Aspect’s public workflows template, on Aspect Cloud.</p>
    </div>

    <div className="mt-6 max-w-3xl">
      <ul className="space-y-3 text-zinc-600 dark:text-zinc-300 leading-relaxed" style={{ listStyle: "none", paddingLeft: 0 }}>
        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Not a reduced-visibility tier.</strong> You get the same Build Results UI as Aspect Enterprise customers, scoped to your organization.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Not a replacement for Aspect Enterprise.</strong> Air-gapped, GovCloud and regulated customers who need isolation route to Aspect Enterprise, and that stays first-class.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Your CI stays.</strong> Your pipelines keep running on the CI you already use, with the cache in front of them. Aspect Cloud CI runners are coming soon.</span>
        </li>
      </ul>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Where it runs</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">Three ways to run this, and the axis that separates them is isolation, not hosting.</p>
    </div>

    <div className="mt-2 overflow-x-auto">
      <table className="w-full text-left border-collapse" style={{ minWidth: "560px" }}>
        <thead>
          <tr className="border-b border-zinc-300 dark:border-zinc-600"><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Option</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Infrastructure</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Cloud account</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Operated by</th></tr>
        </thead>

        <tbody className="text-sm">
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Cloud</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Shared, scoped to your organization</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect’s</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect</td></tr>
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Enterprise, hosted by Aspect</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Isolated, yours alone</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect’s</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect</td></tr>
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Enterprise, self-hosted</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Isolated, in your account</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Yours</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect, or your team</td></tr>
        </tbody>
      </table>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        The last two are the same product, Aspect Enterprise. What differs is whose account it runs in and who holds operational control. <strong className="text-zinc-900 dark:text-white">Holding that control yourself is usually the point.</strong> Plenty of teams in finance, healthcare and government are not allowed to give a third party production access. For them we work over the shoulder: we guide and diagnose, their hands stay on the controls. It is what makes air-gapped and GovCloud deployments possible at all.
      </p>
    </div>
  </div>
</div>

<CTA title="See it on your own builds" subtitle="Point a repository at a hosted instance and let a week of real builds accumulate." primaryCta="Start a trial" primaryHref="/trial" secondaryCta="Talk with us" secondaryHref="/contact" />
