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

# Aspect Cloud: Hosted Bazel Remote Cache and Build Results UI

> A hosted Bazel remote cache shared by CI and every developer, with every build in the Build Results UI. Free for up to 10 users and 1 TB of cache egress a month.

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 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 SectionHeader = ({title, subtitle, centered = true, label}) => <div className={`mb-12 ${centered ? "text-center" : ""}`}>
    {label && <p className="text-xs font-semibold tracking-widest text-blue-600 dark:text-blue-400 uppercase mb-3">
        {label}
      </p>}
    <h2 className="text-3xl md:text-5xl font-semibold text-zinc-900 dark:text-white tracking-tight">{title}</h2>
    {subtitle && <div className={`subtitle-gap text-lg md:text-xl text-zinc-500 dark:text-zinc-300 leading-relaxed ${centered ? "mx-auto" : ""}`} style={{
  marginTop: "1rem",
  maxWidth: centered ? "700px" : "none"
}}>
        {subtitle}
      </div>}
  </div>;

export const Section = ({children, className = "", gray = false, dark = false, id}) => <section id={id} className={`w-full flex justify-center px-4 py-16 md:py-24 ${gray ? "bg-gray-50 dark:bg-zinc-900" : dark ? "bg-zinc-900 dark:bg-zinc-950" : ""} ${className}`}>
    <div className="w-full" style={{
  maxWidth: "1140px"
}}>
      {children}
    </div>
  </section>;

export const Hero = ({title, subtitle, badge, eyebrow, heroImageClassName = "", primaryCta, primaryHref = "#", secondaryCta, secondaryHref = "#", note, 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>}
          {note && <div className="mt-4 text-sm text-center text-zinc-500 dark:text-zinc-400">{note}</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>
            {note && <div className="mt-4 text-sm text-zinc-500 dark:text-zinc-400">{note}</div>}
          </div>
          {children && <div className={`flex-1 min-w-0 hero-image ${heroImageClassName}`}>
              {children}
            </div>}
        </div>}
    </div>
  </section>;

<MarketingPage />

<Hero eyebrow="Aspect Cloud" title={"Sign up this morning.\nFaster builds this afternoon."} subtitle="A hosted remote cache shared by CI and every developer, with every build in the Build Results UI." primaryCta="Get started for free" primaryHref="https://signup.aspect.build/" secondaryCta="Follow the quickstart →" secondaryHref="/quickstart" 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>

<Section>
  <SectionHeader label="How it works" title="Log in, add a flag, build" subtitle="The configuration is Bazel flags, not Terraform. There's no cloud account to open and nothing to deploy." />

  <div className="setup-steps">
    <div>
      <div className="ladder-step">1</div>

      <div className="setup-card p-6 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800">
        <div>
          <h3 className="text-lg font-semibold text-zinc-900 dark:text-white">Install the CLI</h3>

          <div className="mt-2 text-sm text-zinc-500 dark:text-zinc-400 leading-relaxed">
            macOS or Linux. Your existing <code>bazel</code> keeps working.
          </div>
        </div>

        <div className="setup-cmds">
          ```shell theme={null}
          curl -fsSL https://install.aspect.build | bash
          ```

          <div className="mt-2 text-xs text-zinc-500 dark:text-zinc-400">
            or <code>brew install aspect-build/aspect/aspect</code> on macOS
          </div>
        </div>
      </div>
    </div>

    <div>
      <div className="ladder-step">2</div>

      <div className="setup-card p-6 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800">
        <div>
          <h3 className="text-lg font-semibold text-zinc-900 dark:text-white">Sign up and log in</h3>

          <div className="mt-2 text-sm text-zinc-500 dark:text-zinc-400 leading-relaxed">
            Free at <a href="https://signup.aspect.build/" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">signup.aspect.build</a>, no sales call. Log in once; the credential stays in your OS keyring.
          </div>
        </div>

        <div className="setup-cmds">
          ```shell theme={null}
          aspect auth login
          ```
        </div>
      </div>
    </div>

    <div>
      <div className="ladder-step">3</div>

      <div className="setup-card p-6 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800">
        <div>
          <h3 className="text-lg font-semibold text-zinc-900 dark:text-white">Build</h3>

          <div className="mt-2 text-sm text-zinc-500 dark:text-zinc-400 leading-relaxed">
            Every build shares the cache and shows up in the Build Results UI. Use the Aspect CLI, or keep typing <code>bazel</code>.
          </div>

          <div className="mt-2 text-xs text-zinc-500 dark:text-zinc-400">
            <a href="/docs/aspect-workflows/cloud/local-setup" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">How it works →</a>
          </div>
        </div>

        <div className="setup-cmds">
          ```shell theme={null}
          aspect build //... --remote
          ```

          <div className="my-2 text-center text-xs font-semibold uppercase tracking-wide text-zinc-400 dark:text-zinc-500">or</div>

          ```shell theme={null}
          aspect setup bazelrc
          bazel build //... --config=aspect-cloud
          ```
        </div>
      </div>
    </div>
  </div>

  <div className="mt-10 text-center text-lg text-zinc-600 dark:text-zinc-300">
    You can be caching in the time it takes to read this page.
  </div>
</Section>

<Section gray>
  <SectionHeader label="Build Results UI" title="Every target, every build" subtitle="Target trends, flake rate and artifact size over a day to a year, then a verdict on any two builds. The same Build Results UI Aspect Enterprise customers get." />

  <FeatureShowcase label="Team build history" 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 src="https://mintcdn.com/aspectbuild/mPlChZw_LzKUv7Pq/images/marketing/web-ui/builds-overview.png?fit=max&auto=format&n=mPlChZw_LzKUv7Pq&q=85&s=4dad950d7cb6f8647a8881d70476ded6" alt="Builds list in the Build Results UI with pass rate and average build time" width="1285" height="700" data-path="images/marketing/web-ui/builds-overview.png" />
  </FeatureShowcase>

  <div className="flex flex-col md:flex-row gap-6 mt-4">
    <div className="flex-1 min-w-0">
      <div className="shot-frame">
        <img src="https://mintcdn.com/aspectbuild/mPlChZw_LzKUv7Pq/images/marketing/web-ui/build-tests.png?fit=max&auto=format&n=mPlChZw_LzKUv7Pq&q=85&s=de14a392d4a2bf3fcc22978ce8e85173" alt="Test results keeping every attempt of each test" width="1285" height="620" data-path="images/marketing/web-ui/build-tests.png" />
      </div>

      <div className="mt-3 text-sm text-zinc-500 dark:text-zinc-400">Every test attempt, kept</div>
    </div>

    <div className="flex-1 min-w-0">
      <div className="shot-frame">
        <img src="https://mintcdn.com/aspectbuild/mPlChZw_LzKUv7Pq/images/marketing/web-ui/build-timeline.png?fit=max&auto=format&n=mPlChZw_LzKUv7Pq&q=85&s=1ac2f5f8aa49aa7d30e884f4d3f94e7f" alt="Build timeline with the critical path on top" width="1285" height="680" data-path="images/marketing/web-ui/build-timeline.png" />
      </div>

      <div className="mt-3 text-sm text-zinc-500 dark:text-zinc-400">Critical path on the timeline</div>
    </div>

    <div className="flex-1 min-w-0">
      <div className="shot-frame">
        <img src="https://mintcdn.com/aspectbuild/mPlChZw_LzKUv7Pq/images/marketing/web-ui/target-trends.png?fit=max&auto=format&n=mPlChZw_LzKUv7Pq&q=85&s=a39e3372b301bcbd7b67645603dcd773" alt="Most-built targets with P90 wall time, cache hit, flake rate and pass-rate trends" width="2336" height="736" data-path="images/marketing/web-ui/target-trends.png" />
      </div>

      <div className="mt-3 text-sm text-zinc-500 dark:text-zinc-400">Every target, ranked and trended</div>
    </div>
  </div>

  <div className="mt-10 text-center">
    <a href="/platform/web-ui" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">See the Build Results UI →</a>
  </div>
</Section>

<Section>
  <SectionHeader title="Pricing you can read" />

  <div className="meter-panel rounded-xl border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800">
    <div className="p-6 text-center">
      <div className="compare-eyebrow mb-2">Free</div>
      <div className="text-4xl font-semibold tracking-tight tabular-nums text-zinc-900 dark:text-white">\$0</div>
      <div className="mt-1 text-sm text-zinc-500 dark:text-zinc-400">up to 10 users and 1 TB\* of cache egress a month free</div>
    </div>

    <div className="p-6 text-center">
      <div className="compare-eyebrow mb-2">Per user</div>
      <div className="text-4xl font-semibold tracking-tight tabular-nums text-zinc-900 dark:text-white">\$12</div>
      <div className="mt-1 text-sm text-zinc-500 dark:text-zinc-400">per user per month past 10 users</div>
    </div>

    <div className="p-6 text-center">
      <div className="compare-eyebrow mb-2">Cache egress</div>
      <div className="text-4xl font-semibold tracking-tight tabular-nums text-zinc-900 dark:text-white">\$0.15</div>
      <div className="mt-1 text-sm text-zinc-500 dark:text-zinc-400">per GB of cache egress past 1 TB a month</div>
    </div>
  </div>

  <div className="mt-4 text-center text-sm text-zinc-500 dark:text-zinc-400">
    Uploads are always free.
  </div>

  <div className="mt-2 text-center text-sm text-zinc-500 dark:text-zinc-400">
    \* Your first month includes the full free allowance, no credit card needed. After that, without a card, it's 100 GB of cache egress and 10 million build events a month; add a card to keep the full allowance. The card requirement is there to prevent abuse of the free allowance.
  </div>

  <div className="mt-8 text-center">
    <a href="/pricing" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">See pricing →</a>
  </div>
</Section>

<Section gray>
  <SectionHeader title="A way up when you outgrow it" subtitle="Need remote execution, CI runners, SSO or isolation today? Aspect Enterprise is the same platform, hosted by Aspect or in your own AWS or GCP account." />

  <div className="compare-wrap rounded-xl border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-900">
    <table className="compare-table w-full text-sm border-collapse" style={{ minWidth: "560px" }}>
      <thead>
        <tr><th className="text-left py-3 px-4 text-xs font-semibold uppercase tracking-widest text-zinc-500">Option</th><th className="text-left py-3 px-4 text-xs font-semibold uppercase tracking-widest text-zinc-500">Infrastructure</th><th className="text-left py-3 px-4 text-xs font-semibold uppercase tracking-widest text-zinc-500">Cloud account</th><th className="text-left py-3 px-4 text-xs font-semibold uppercase tracking-widest text-zinc-500">Operated by</th></tr>
      </thead>

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

  <div className="mt-10 max-w-3xl mx-auto">
    <h3 className="text-lg font-semibold text-zinc-900 dark:text-white">Safe to point your builds at</h3>

    <ul className="check-list mt-4 space-y-2 text-zinc-600 dark:text-zinc-300">
      <li>Every cache and build event request authenticated, and your data scoped to your organization</li>
      <li>Cache contents encrypted at rest, and TLS on every public endpoint</li>
      <li>SOC 2 Type 2</li>
      <li>The standard Remote Execution API, so any REv2 client works</li>
    </ul>
  </div>

  <div className="mt-10 p-5 rounded-xl border-2 border-dashed border-zinc-300 dark:border-zinc-600 text-center text-zinc-700 dark:text-zinc-300">
    Same <code>bazel</code>, same Aspect CLI, same BUILD files. Moving to Enterprise changes endpoints and credentials, not your build.
  </div>

  <div className="mt-8 text-center">
    <a href="/platform/aspect-enterprise" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Explore Aspect Enterprise →</a>
  </div>

  <div className="mt-4 text-center text-sm text-zinc-500 dark:text-zinc-400">
    Remote execution and CI runners come to Aspect Cloud in early 2027. <a href="/contact?topic=early-access" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Join the early access list →</a>
  </div>
</Section>

<CTA title="See it on your own builds" subtitle="Trends need history, so the first day tells you far less than the first week." primaryCta="Get started for free" primaryHref="https://signup.aspect.build/" secondaryCta="Follow the quickstart →" secondaryHref="/quickstart" />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.