> ## 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.

# Deploy Your Way: Self-Hosted or Aspect-Hosted

> Run Aspect Workflows self-hosted on your own AWS or GCP account, or Aspect-hosted single-tenant on ours. Control security, your data, and costs. GovCloud, air-gapped, and strict-security deployments welcome, with SSO and SCIM.

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, children}) => <div className="relative flex flex-col p-8 md:p-12 rounded-2xl bg-zinc-50 dark:bg-zinc-800/40 border border-zinc-200 dark:border-zinc-700 overflow-hidden">
    <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 bg-blue-600 text-white text-sm font-semibold hover:bg-blue-700 transition shadow-sm 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 FeatureGrid2 = ({children}) => <div className="marketing-grid-2">{children}</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-4xl 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, 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>}
          <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>}
          <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>}
            <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">
              {children}
            </div>}
        </div>}
    </div>
  </section>;

<MarketingPage />

<Hero title="Deploy Your Way" subtitle="Self-hosted on your own AWS or GCP account, or Aspect-hosted single-tenant on ours. Either way, our engineers deploy and operate it for you, and you keep control of security, your data, and costs." primaryCta="Start a Free Trial" primaryHref="/trial" secondaryCta="Request a Demo" secondaryHref="/request-demo" centered={false}>
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-self-hosted.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=1558704e078c96eebbff86e0051edda5" alt="Workflows services running in your cloud account, managed by Aspect" width="720" height="480" data-path="images/marketing/illustrations/aspect-self-hosted.svg" />
</Hero>

<Section gray>
  <div className="flex flex-col md:flex-row-reverse items-center gap-10 md:gap-16">
    <div className="flex-1 min-w-0">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Self-hosted, even when it's hard</h2>

      <p className="mt-4 text-lg text-zinc-600 dark:text-zinc-300 leading-relaxed">
        Run Aspect Workflows in your own AWS or GCP account, fully managed by our engineers. Control security, your data, and costs, even in environments with strict compliance and infrastructure requirements.
      </p>

      <div className="mt-6 space-y-4 border-l-2 border-blue-500/40 pl-5">
        <p className="text-base text-zinc-600 dark:text-zinc-300 italic leading-relaxed">
          Most build platforms ask you to ship your source, artifacts, and build metadata to their cloud. For a lot of teams that conversation ends right there.
        </p>

        <p className="text-base text-zinc-600 dark:text-zinc-300 italic leading-relaxed">
          Aspect Workflows deploys into your infrastructure and conforms to your requirements, rather than asking you to bend yours.
        </p>
      </div>
    </div>

    <div className="flex-1 min-w-0 feature-showcase-image">
      <img noZoom src="https://mintcdn.com/aspectbuild/FlMiA6BC59qG_Uuv/images/marketing/illustrations/aspect-your-cloud.svg?fit=max&auto=format&n=FlMiA6BC59qG_Uuv&q=85&s=b3ae44719d3b61e208fd5f3da6631273" alt="Aspect Workflows services running inside your own cloud account, managed by Aspect" width="720" height="480" data-path="images/marketing/illustrations/aspect-your-cloud.svg" />
    </div>
  </div>
</Section>

<Section>
  <FeatureGrid2>
    <FeatureCard title="Greater control and customization" description="Run in the same virtual network as the systems your builds touch, keep full visibility into logs and configuration, and walk into SOC 2, ISO 27001, or GDPR audits with everything in your own account. Your existing CI provider stays; no disruptive migration.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/customizable.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=1aa79204a9a6914dce58770845dd5de7" alt="" width="48" height="48" data-path="images/marketing/icons/customizable.svg" />
    </FeatureCard>

    <FeatureCard title="Predictable costs" description="Metered platforms make heavy testing a budgeting problem. Self-hosting puts resource billing under your control, at your negotiated cloud rates, so you can run as many tests as you need without watching a usage meter.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/cloud.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=acaa74dfc7233d60a896de1d6ec99de1" alt="" width="24" height="24" data-path="images/marketing/icons/cloud.svg" />
    </FeatureCard>
  </FeatureGrid2>
</Section>

<Section gray>
  <FeatureShowcase title="Self-Hosted or Aspect-Hosted" description="Self-hosting enables deeper customization and easier compliance with internal governance or data-residency requirements, while still preserving the fast iteration and automation that drive developer productivity. Run Aspect Workflows on your cloud, single region or multi-region. The result is a workflow platform that fits naturally into how your team already builds software.">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-hosting-choice.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=08985c0fd3e0c8b2c5c583ec6711029d" alt="Choosing between your cloud account and Aspect-hosted" width="720" height="480" data-path="images/marketing/illustrations/aspect-hosting-choice.svg" />
  </FeatureShowcase>
</Section>

<Section dark>
  <div className="flex flex-col md:flex-row-reverse items-center gap-12">
    <div className="flex-1">
      <h2 className="text-3xl md:text-4xl font-semibold text-white">High-compliance environments welcome</h2>

      <p className="mt-4 text-lg text-zinc-300">
        Some teams can't use a hosted build platform at all: security postures that dictate exactly how infrastructure must be deployed, and networks the public internet never touches. We deploy Aspect Workflows into these environments routinely. If your infrastructure rules out cloud-hosted platforms, we're built for you.
      </p>

      <div className="mt-8 flex flex-wrap gap-3">
        <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">GovCloud</span>
        <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">Air-gapped networks</span>
        <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">Single-tenant mandates</span>
        <span className="px-4 py-2 rounded-full border border-zinc-600 text-zinc-200 text-sm font-semibold">Strict security postures</span>
      </div>
    </div>

    <div className="flex-1">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-compliance.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=a364a561c996c3f96760fdd9caaf47c3" alt="Compliance checklist with GovCloud and air-gapped support" className="w-full" width="720" height="480" data-path="images/marketing/illustrations/aspect-compliance.svg" />
    </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 and also more valuable." author="Jimmy Tanner" role="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 id="enterprise-security">
  <FeatureShowcase title="Enterprise Security & Identity" description="Aspect Workflows plugs into the identity stack you already run. Single sign-on over OIDC or SAML gates every web surface, including the Build & Test UI, and SCIM keeps provisioning and deprovisioning in sync with your directory: offboard an engineer in your identity provider and their access is gone everywhere. Access is governed the same way as the rest of your engineering tooling, which keeps security review short.">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/illustrations/aspect-identity.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=dccee3ec64deca1d6d3deb653b7d5aac" alt="SSO over OIDC or SAML and SCIM provisioning from your identity provider into Aspect Workflows" width="720" height="480" data-path="images/marketing/illustrations/aspect-identity.svg" />
  </FeatureShowcase>
</Section>

<Section id="observability">
  <FeatureShowcase title="Observability & Operations" description="Every deployment ships with dashboards for the infrastructure underneath it: runner pool health, cache performance, and build activity over time. Aspect's infrastructure team is on call 24/7 behind them. Critical alerts, like runner pool saturation or disk pressure, route to us automatically and are acknowledged inside your SLA, so you don't need a Bazel infrastructure expert on your own rotation. When we act on an incident, access is scoped to the resources the Workflows Terraform module created, and every action lands in your own cloud audit log." flipped>
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/observability/runner-dashboards.png?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=4306a912832325f33f854fb4b6453108" alt="Runner pool dashboards: active runners, idle time, and workflow activity" width="1400" height="963" data-path="images/marketing/observability/runner-dashboards.png" />

    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/observability/action-metrics.png?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=235d56cf078f0c77917552bff5afa315" alt="Build action metrics over time" width="1400" height="937" data-path="images/marketing/observability/action-metrics.png" />
  </FeatureShowcase>
</Section>

<CTA title="Deploy on your terms" subtitle="Your cloud account or ours, single-tenant either way." primaryCta="Start a Free Trial" primaryHref="/trial" secondaryCta="Request a Demo" secondaryHref="/request-demo" />
