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

# The Workflows Bot: Bazel Results on GitHub and GitLab PRs

> Status checks, PR comments, code review annotations and suggested fixes on GitHub and GitLab, delivering live Bazel build and test results where your team works. Free to use.

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

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 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="Workflows bot" title={"Bazel results\nwhere review happens."} subtitle="Live build and test results, lint comments and suggested fixes on every pull and merge request." primaryCta="Set up on GitHub" primaryHref="/docs/cli/authentication-github" secondaryCta="Set up on GitLab" secondaryHref="/docs/cli/authentication-gitlab" centered={false}>
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/product/github-hero.avif?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=059c559ee8dd01387c51a73e4cdff4ac" alt="Bazel build results in a GitHub code review" width="1078" height="644" data-path="images/marketing/product/github-hero.avif" />
</Hero>

<Section>
  <FeatureGrid2>
    <div className="flex flex-col p-8 rounded-xl border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800">
      <h3 className="text-xl font-bold text-zinc-900 dark:text-white">Features</h3>

      <ul className="check-list mt-4 space-y-3 text-zinc-600 dark:text-zinc-300">
        <li>Stream failed test targets, build errors and reproduction steps to a review comment as soon as they occur.</li>
        <li>See which tests ran and how much time caching saved.</li>
        <li>Link straight to the underlying CI job on Buildkite, CircleCI or GitHub Actions.</li>
      </ul>
    </div>

    <div className="flex flex-col p-8 rounded-xl border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800">
      <h3 className="text-xl font-bold text-zinc-900 dark:text-white">Benefits</h3>

      <ul className="check-list mt-4 space-y-3 text-zinc-600 dark:text-zinc-300">
        <li>Errors show up in code review, where developers already look.</li>
        <li>Developers fix errors before the build finishes.</li>
        <li>Repro commands help developers who are new to Bazel.</li>
      </ul>
    </div>
  </FeatureGrid2>
</Section>

<Section gray>
  <FeatureShowcase title="Build events as comments" description="Failures appear on the PR as they happen, not when the job ends, so developers fix them without leaving review." href="/docs/cli/authentication-github#on-a-pull-request" linkText="What it posts on a pull request">
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/github/Build-Events.avif?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=fbb4f774e187f4194f7b1fa65e1bee2d" alt="Build events as comments in GitHub" width="1088" height="636" data-path="images/marketing/github/Build-Events.avif" />
  </FeatureShowcase>

  <FeatureShowcase title="Lint comments and suggested fixes" description="Lint findings land on the line that caused them, and any fix the linter suggests is ready to apply in one click." href="/docs/cli/tasks/lint" linkText="The aspect lint task" flipped>
    <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/marketing/github/Lint-comments.avif?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=3997d591cccf5d00cf8039bc0f4ca047" alt="Lint comments and suggested fixes in GitHub" width="1088" height="636" data-path="images/marketing/github/Lint-comments.avif" />
  </FeatureShowcase>
</Section>

<Section>
  <FeatureGrid3>
    <FeatureCard title="rules_lint: the foundation of linting in Bazel" description="Our open-source ruleset formats and lints code across languages, running linters over Bazel's dependency graph." href="/platform/rules" />

    <FeatureCard title="Aspect CLI: lint on your command line" description="aspect lint generates lint reports and applies suggested fixes from your terminal." href="/tools/cli" />

    <FeatureCard title="Lint in code review" description="The bot posts lint feedback as status checks on GitHub and GitLab, with fixes offered as suggestions on the pull request." href="/docs/cli/tasks/lint" />
  </FeatureGrid3>
</Section>

<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">Put the Workflows bot to work on your pull requests</h2>
      <div className="mt-3 text-blue-100 text-base">Free to use on GitHub and GitLab.</div>
    </div>

    <div className="flex flex-col items-center md:items-start gap-4 shrink-0">
      <div className="flex flex-wrap gap-3 justify-center">
        <a href="/docs/cli/authentication-github" 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">
          Set up on GitHub
        </a>

        <a href="/docs/cli/authentication-gitlab" 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">
          Set up on GitLab
        </a>
      </div>

      <a href="https://signup.aspect.build/" className="text-white font-semibold hover:underline underline-offset-2">
        Pair it with Aspect Cloud, free →
      </a>
    </div>
  </div>
</section>
