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

# Selective Delivery for Bazel

> Deliver only the targets whose Bazel-built outputs actually changed, on Aspect Enterprise. Digest-based change detection, correctly stamped artifacts, parallel pushes, and a delivery manifest.

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 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 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="Selective delivery" title={"Deliver what changed.\nSkip the rest."} subtitle="Decided by the content digest of each output, not the git SHA, so unchanged artifacts are never re-pushed." 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-delivery.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=cf41f5d900ae4230bf53b295c1693765" alt="Selective delivery: only changed targets ship" width="720" height="480" data-path="images/marketing/illustrations/aspect-delivery.svg" />
</Hero>

<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">Pushing every artifact on every green build is slow and risky. You overwrite known-good artifacts with identical but unverified rebuilds, and you burn CI time, registry storage, and network egress on uploads that change nothing.</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">Bazel already knows exactly what changed. Selective delivery applies that knowledge at release time, comparing output digests against the prior release and pushing only the difference.</div>
    </div>
  </div>
</Section>

<Section gray>
  <SectionHeader title="How selective delivery works" subtitle="A green build of your release branch triggers delivery. From there, change detection, stamping, and uploads are automatic." />

  <FeatureGrid3>
    <FeatureCard title="Digest-based change detection" description="Change is detected from the content hash of each build output, not the git SHA or a timestamp. If a target produces the same digest, it is not pushed, even when unrelated files changed in the same commit.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/filters.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=291b4db68d69e6a8e7cd83b45b61837f" alt="" width="48" height="49" data-path="images/marketing/icons/filters.svg" />
    </FeatureCard>

    <FeatureCard title="Resolution that costs almost nothing" description="With Build without the Bytes, the comparison works from hashes alone and never downloads an artifact, so determining what to deliver is nearly free, even across hundreds of deliverable targets.">
      <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="Correctly stamped artifacts" description="Unstamped outputs detect change; the changed targets are then rebuilt with version-control stamping for the push. Accurate change detection and artifacts that carry the right build metadata.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/Release-automation.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=fe6347df8f3a3ea7edf4ddff8d6716fc" alt="" width="48" height="48" data-path="images/marketing/icons/Release-automation.svg" />
    </FeatureCard>

    <FeatureCard title="Parallel pushes" description="Push logic runs in parallel across delivery targets, uploading each changed artifact to its configured destination: a container registry, an object store, or anywhere else you ship.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/rocket.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=aad2842e33767a3adfda39f90f336298" alt="" width="48" height="49" data-path="images/marketing/icons/rocket.svg" />
    </FeatureCard>

    <FeatureCard title="Delivery manifest" description="Every run produces a structured record of each target's outcome and CI metadata, uploaded as a CI artifact. Enrich it with AXL hooks, for example to attach OCI image digests or feed downstream deployment tooling.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/Coverage.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=306ae317088aaa2ae5630a60ec44bdba" alt="" width="48" height="48" data-path="images/marketing/icons/Coverage.svg" />
    </FeatureCard>

    <FeatureCard title="Simple configuration" description="Adding a delivery target is as easy as adding a Bazel target, so teams configure and maintain their own. You control which branches and tags trigger delivery in your CI configuration.">
      <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/icons/pazzle.svg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=438e34d517894f2984ec8774887a5f0b" alt="" width="56" height="56" data-path="images/marketing/icons/pazzle.svg" />
    </FeatureCard>
  </FeatureGrid3>

  <p className="mt-8 text-center text-sm text-zinc-500 dark:text-zinc-400">
    Selective mode needs Aspect Workflows CI runners; <code>aspect delivery</code> in the free <a href="/tools/cli" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Aspect CLI</a> runs everywhere.
  </p>
</Section>

<Section>
  <SectionHeader title="Why digests, not git SHAs" subtitle="Version stamping is the usual obstacle to selective releases: if every artifact embeds the commit SHA, every artifact differs on every commit and nothing can be skipped. Selective delivery sidesteps the trap by comparing unstamped outputs to detect change, then rebuilding only the changed targets with stamping for the actual push." />
</Section>

<Section gray>
  <SectionHeader title="The last mile of fast CI" subtitle="Selective delivery runs on the same Aspect Workflows deployment as your CI runners and remote cache, and is included in every deployment." />

  <div className="flex flex-wrap justify-center gap-x-8 gap-y-3">
    <a href="/platform/ci-runners" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">CI runners →</a>
    <a href="/platform/remote-cache" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Remote cache →</a>
    <a href="/docs/aspect-workflows/platform/features/selective-delivery" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Read the docs →</a>
    <a href="/platform/aspect-enterprise" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Aspect Enterprise →</a>
  </div>
</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 soon to Aspect Cloud. Start with the shared remote cache and Build Results UI today.</p>
      <div className="mt-2"><a href="https://signup.aspect.build/" className="text-blue-600 dark:text-blue-400 font-semibold hover:underline">Get started for free →</a></div>
    </div>
  </FeatureGrid2>
</Section>

<CTA title="Ship only what changed" subtitle="Change detection, stamping and pushes, from the graph you already trust." 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.