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

# Warm Bazel CI Runners for GitHub Actions, Buildkite, GitLab and CircleCI

> Warm, auto-scaling CI runners tuned for Bazel on GitHub Actions, Buildkite, GitLab and CircleCI. Runner groups with x86, Arm, and GPU hardware, on Aspect Enterprise, hosted by Aspect or self-hosted in your own AWS or GCP account.

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 Testimonial = ({quote, author, role, company, caseStudyHref, elevated = false, children}) => <div className={`relative flex flex-col p-8 md:p-12 rounded-2xl border border-zinc-200 dark:border-zinc-700 overflow-hidden ${elevated ? "bg-white dark:bg-zinc-800 shadow-sm" : "bg-zinc-50 dark:bg-zinc-800/40"}`}>
    <svg className="absolute top-8 left-8 w-12 h-12 text-zinc-200 dark:text-zinc-700 opacity-80" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
      <path d="M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983z" />
    </svg>
    <div className="relative flex flex-col md:flex-row items-start gap-8">
      <div className="flex-1">
        <p className="text-xl md:text-2xl text-zinc-800 dark:text-zinc-100 leading-relaxed font-medium">
          "{quote}"
        </p>
        <div className="mt-8 flex items-center gap-4">
          <div>
            <div className="font-semibold text-zinc-900 dark:text-white text-base" style={{
  display: "block"
}}>{author}</div>
            {role && <div className="author-role-gap text-sm text-zinc-400 dark:text-zinc-500" style={{
  display: "block",
  marginTop: "0.625rem"
}}>{role}{company ? `, ${company}` : ""}</div>}
          </div>
        </div>
      </div>
      <div className="flex flex-col items-center gap-5 md:min-w-44 shrink-0">
        {children && <div className="testimonial-company-logo">{children}</div>}
        {caseStudyHref && <a href={caseStudyHref} className="inline-flex items-center px-4 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 text-sm font-semibold hover:bg-zinc-50 dark:hover:bg-zinc-800 transition whitespace-nowrap">
            Read case study
          </a>}
      </div>
    </div>
  </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 FeatureCard = ({title, description, href, children}) => {
  const Tag = href ? "a" : "div";
  const tagProps = href ? {
    href
  } : {};
  return <Tag {...tagProps} className={`group flex flex-col p-6 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800/50 ${href ? "hover:shadow-md hover:border-blue-200 dark:hover:border-blue-700 transition-all duration-200" : ""}`}>
      {children && <div className="feature-card-icon mb-5 flex items-center justify-center rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-800/30" style={{
    width: "4rem",
    height: "4rem"
  }}>
          {children}
        </div>}
      <h3 className={`text-lg font-semibold text-zinc-900 dark:text-white ${href ? "group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors" : ""}`}>
        {title}
      </h3>
      {description && <p className="feature-card-desc text-sm text-zinc-500 dark:text-zinc-400 leading-relaxed">{description}</p>}
    </Tag>;
};

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

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

export const StatsBar = ({stats = [], grid = false}) => <div className={grid ? "stats-grid py-4" : "flex flex-wrap justify-center gap-8 md:gap-16 py-4"}>
    {stats.map((stat, i) => {
  const Tag = stat.href ? "a" : "div";
  return <Tag key={i} {...stat.href ? {
    href: stat.href
  } : {}} className={`flex flex-col items-center text-center${stat.href ? " group" : ""}`}>
          <span className={`text-3xl md:text-4xl font-bold ${grid ? "text-blue-600 dark:text-blue-400" : "text-zinc-900 dark:text-white"}`}>{stat.value}</span>
          <span className={`text-sm text-zinc-500 dark:text-zinc-400 mt-1${grid ? " stats-grid-label" : ""}${stat.href ? " group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors" : ""}`}>{stat.label}</span>
        </Tag>;
})}
  </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="CI runners" title={"Warm Bazel runners,\non the CI you already use."} subtitle="Auto-scaling, Bazel-tuned runners registered with GitHub Actions, Buildkite, GitLab or CircleCI." primaryCta="Start a 30-day trial" primaryHref="/trial" secondaryCta="Request a demo" secondaryHref="/request-demo" centered={false}>
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-runner-groups.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=dc5d04362e5f04e3ad5b73835190250d" alt="Runner groups: x86, Arm, and GPU pools registered with your CI system" width="720" height="480" data-path="images/marketing/illustrations/aspect-runner-groups.svg" />
</Hero>

<Section gray>
  <StatsBar
    grid
    stats={[
{ value: "2.4x", label: "Faster median build & test at Sourcegraph", href: "/customers/sourcegraph" },
{ value: "40%", label: "Lower compute cost at Sourcegraph", href: "/customers/sourcegraph" },
{ value: "18x", label: "Faster deploys to robots at Physical Intelligence", href: "/customers/physical-intelligence" },
{ value: "60%", label: "Less CI wait time at AssemblyAI", href: "/customers/assemblyai" },
]}
  />

  <p className="mt-8 text-center text-sm text-zinc-500 dark:text-zinc-400">
    Real results from <a href="/customers" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">customer case studies</a>.
  </p>
</Section>

<Section>
  <div className="marketing-grid-2 max-w-5xl mx-auto" style={{ gap: "2.5rem 4rem" }}>
    <div>
      <div className="text-xs font-semibold tracking-widest uppercase text-zinc-500 mb-3">The problem</div>
      <div className="text-lg text-zinc-700 dark:text-zinc-300 leading-relaxed">Ephemeral CI runners start cold on every job: no local cache, no warm analysis, every dependency fetched again. Bazel can't show its strength on machines that forget everything between builds, and remote execution, the usual fix, is a serious engineering project to adopt.</div>
    </div>

    <div>
      <div className="text-xs font-semibold tracking-widest uppercase text-blue-600 dark:text-blue-400 mb-3">With Aspect</div>
      <div className="text-lg text-zinc-700 dark:text-zinc-300 leading-relaxed">A pool of warm, persistent runners tuned for Bazel, with persisted repository caches, preserved analysis state and pre-warmed instances, delivers most of the speedup and cost savings with none of the migration.</div>
    </div>
  </div>

  <p className="mt-10 text-center text-base text-zinc-500 dark:text-zinc-400">
    The <a href="/platform/remote-cache" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">remote cache</a> and <a href="/platform/remote-execution" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">remote execution</a> are in the platform from day one for when you're ready for them. Adopt at your own pace, on the same deployment.
  </p>
</Section>

<Section gray>
  <SectionHeader title="Warm, auto-scaling, and tuned for Bazel" subtitle="Setting up warm, persistent runners is hard to get right. Aspect Workflows operates the pool for you." />

  <FeatureGrid3>
    <FeatureCard title="Pre-warmed fetch phase" description="New machines restore from a warming archive with Bazel's fetch phase already done, so even a first job skips dependency downloads. Cached builds routinely finish in under a minute.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/fast.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=a631c8f2127105e4112db8e0a4ccc641" alt="" width="48" height="49" data-path="images/marketing/icons/fast.svg" />
    </FeatureCard>

    <FeatureCard title="Bazel state stays hot" description="Persistent VMs keep the Bazel JVM running between jobs, with the in-memory analysis cache intact and the output base on a RAID0 array of NVMe drives for maximum filesystem IOPS.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/powerful.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=6bd529786aea222f877c69824f1d0f83" alt="" width="48" height="48" data-path="images/marketing/icons/powerful.svg" />
    </FeatureCard>

    <FeatureCard title="Auto-scaling, down to zero" description="The pool scales on queue depth and back down to zero when there's no work, so you stop paying for always-on instances.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/Runners_1.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=d548de73f5e999a31a89a51da6112abf" alt="" width="32" height="32" data-path="images/marketing/icons/Runners_1.svg" />
    </FeatureCard>

    <FeatureCard title="Auto-registered with your CI" description="Runners register as standard self-hosted runners with GitHub Actions, Buildkite, GitLab or CircleCI. Your pipelines just target a runner label, like any other runner.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/integrations.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=773ccf480cdd92e597ae8aeb794d7a8d" alt="" width="32" height="32" data-path="images/marketing/icons/integrations.svg" />
    </FeatureCard>

    <FeatureCard title="Zero .bazelrc plumbing" description="On Workflows runners, the remote cache, remote execution, and build-event flags are wired into every bazel invocation automatically, whether you run vanilla bazel or the optional Aspect CLI. No copy-pasted flag soup.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/setting.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=87006d8dc92b68c74a1d8886c7d0c123" alt="" width="24" height="24" data-path="images/marketing/icons/setting.svg" />
    </FeatureCard>

    <FeatureCard title="Docker-in-Docker actions" description="Container-based tests run on the runners as they do locally. Self-hosted, they run in your own cloud account, with no provider sandbox surprises.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/cloud-server.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=6415fbbb2037813919f53478e83b9cbd" alt="" width="24" height="24" data-path="images/marketing/icons/cloud-server.svg" />
    </FeatureCard>
  </FeatureGrid3>
</Section>

<Section dark>
  <div className="text-center max-w-3xl mx-auto">
    <h2 className="text-3xl md:text-4xl font-semibold text-white">Hardware your CI provider doesn't offer</h2>

    <p className="mt-4 text-lg text-zinc-300">
      You choose the exact configuration: instance type, architecture, CPU, memory, GPUs, and NVMe storage. Runner groups put different jobs on different hardware, side by side, including the GPU instance types AI teams need that no provider-hosted runner offers.
    </p>

    <div className="mt-8 flex flex-wrap justify-center gap-3">
      <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">x86</span>
      <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">Arm</span>
      <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">GPU</span>
      <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">NVMe RAID0</span>
      <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">Any instance type</span>
    </div>
  </div>
</Section>

<Section>
  <SectionHeader title="AI teams run their hardest workloads here" subtitle="Physical Intelligence runs Aspect Workflows self-hosted on Google Cloud, with Workflows CI runner groups handling multi-arch and GPU testing for their AI stack." />

  <Testimonial quote="Aspect Workflows has made Bazel an order of magnitude easier to adopt and significantly more valuable for our team." author="Jimmy Tanner" role="Senior Software Engineer" company="Physical Intelligence" caseStudyHref="/customers/physical-intelligence">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/logos/Physical-Intelligence.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=ae844528db071dd2527c7a21bba709eb" alt="Physical Intelligence" className="h-7 brightness-0 opacity-70 dark:invert dark:opacity-80" width="244" height="36" data-path="images/marketing/logos/Physical-Intelligence.svg" />
  </Testimonial>
</Section>

<Section gray>
  <SectionHeader title="No migration necessary" subtitle="Keep the CI system your team already knows. Aspect Workflows configures Bazel-tuned self-hosted runners inside it, the same self-hosted runner mechanism your CI provider already supports." />

  <div className="customer-logos-grid flex flex-wrap justify-center items-center gap-x-14 gap-y-8 py-4">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/logos/github-actions.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=c303e0d7f2e8b819d197505cf6ab2ea0" alt="GitHub Actions" className="customer-logo" width="278" height="45" data-path="images/marketing/logos/github-actions.svg" />

    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/logos/buildkite.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=69cb71c758c95e895ab106888eb3986d" alt="Buildkite" className="customer-logo" width="238" height="49" data-path="images/marketing/logos/buildkite.svg" />

    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/logos/gitlab.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=5557fda3391720bdcf94533a59377b2b" alt="GitLab" className="customer-logo" width="177" height="49" data-path="images/marketing/logos/gitlab.svg" />

    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/logos/circleci.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=39540f50e69ffef89c94a484fa977bc9" alt="CircleCI" className="customer-logo" width="203" height="49" data-path="images/marketing/logos/circleci.svg" />
  </div>

  <p className="mt-6 text-center text-zinc-600 dark:text-zinc-300 max-w-2xl mx-auto">
    Runs on Aspect Enterprise, hosted by Aspect or self-hosted in your AWS or GCP account. On ephemeral runners today? The savings start with your first warm build. Already self-hosting runners? Ours are tuned for Bazel, so you still come out ahead.
  </p>

  <p className="mt-4 text-center text-zinc-600 dark:text-zinc-300 max-w-2xl mx-auto">
    Your pipelines keep calling <code>bazel</code> directly — the runner wires in the warm cache and remote execution automatically. The <a href="/tools/cli" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Aspect CLI</a> is an optional layer that adds status checks, PR comments, and selective delivery. It's never required to use the runners.
  </p>

  <p className="mt-4 text-center text-zinc-600 dark:text-zinc-300 max-w-2xl mx-auto">
    A 30-day trial runs your existing pipeline on a deployment next to your current CI, on the same commits, without blocking a merge, and the result is measured against your current CI. <a href="/docs/aspect-workflows/enterprise/trial" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">How the trial works →</a>
  </p>

  <div className="flex justify-center mt-8">
    <a href="/trial" 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">
      Start a 30-day trial
    </a>
  </div>

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

<Section>
  <FeatureShowcase title="Health checks, not babysitting" description="The classic foot-gun with persistent runners: a machine drifts into a bad state, stays in the pool, and fails every job it picks up until a human notices and drains it. Workflows runners take care of this themselves. Built-in health checks monitor every runner continuously, and one that hits an unrecoverable failure is pulled out of service before it can accept another job. The pool scales replacement capacity automatically, so one bad machine never turns into a string of red builds, and nobody gets paged to go find it." flipped>
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-health.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=943c82c7075099cbf0c8b3c56b958766" alt="An unhealthy runner is removed from the pool and automatically replaced by a fresh one" className="transparent-showcase" width="720" height="480" data-path="images/marketing/illustrations/aspect-health.svg" />
  </FeatureShowcase>
</Section>

<Section gray>
  <FeatureShowcase title="A fraction of provider-hosted cost" description="Provider-hosted runners charge per minute, and the bill grows with every build. Workflows runners scale to zero between runs. On self-hosted Aspect Enterprise, they live in your own AWS or GCP account and you pay your cloud provider for compute at your negotiated rates, so committed-use discounts and savings plans apply. Sourcegraph's Google Compute Engine cost fell 40% running side-by-side with its legacy build.">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/product/ci-img.avif?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=2a5d51dece056cdf6c64c8104a3d80d9" alt="CI compute use by day, back to zero between runs" width="1284" height="720" data-path="images/marketing/product/ci-img.avif" />
  </FeatureShowcase>
</Section>

<Section>
  <SectionHeader title="Where you can run it" />

  <FeatureGrid2>
    <div className="flex flex-col p-8 rounded-xl border-2 border-blue-600 bg-white dark:bg-zinc-800">
      <div className="avail-status">Available now</div>
      <h3 className="mt-2 text-xl font-bold text-zinc-900 dark:text-white">Aspect Enterprise</h3>
      <p className="mt-3 text-sm text-zinc-600 dark:text-zinc-400">Available today in every deployment, hosted by Aspect or in your own AWS or GCP account.</p>
    </div>

    <div className="flex flex-col p-8 rounded-xl border-2 border-dashed border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-800">
      <div><span className="coming-soon-chip">Coming soon</span></div>
      <h3 className="mt-2 text-xl font-bold text-zinc-900 dark:text-white">Aspect Cloud</h3>
      <p className="mt-3 text-sm text-zinc-600 dark:text-zinc-400">Coming to Aspect Cloud in early 2027, as Linux runners customized through an OCI image.</p>
      <div className="mt-2"><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>
    </div>
  </FeatureGrid2>
</Section>

<CTA title="Cut CI costs before the remote execution migration" subtitle="Warm, Bazel-tuned runners on the CI you already use, with Aspect Enterprise. Remote execution is included for when you're ready." primaryCta="Start a 30-day trial" primaryHref="/trial" secondaryCta="Request a demo" secondaryHref="/request-demo" />


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