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

# Marvin: The Bazel Bot for GitHub and GitLab

> Marvin adds status checks, posts PR comments, annotates code reviews, and offers suggested fixes on GitHub and GitLab, delivering live Bazel build and test results where your team works. Free for developers to try.

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 FeatureGrid3 = ({children}) => <div className="marketing-grid-3">{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, eyebrow, heroImageClassName = "", 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>}
          {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>}
          <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>}
            {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>
          </div>
          {children && <div className={`flex-1 min-w-0 hero-image ${heroImageClassName}`}>
              {children}
            </div>}
        </div>}
    </div>
  </section>;

<MarketingPage />

<Hero title="Meet Marvin: the Bazel bot for GitHub and GitLab" subtitle="Marvin adds status checks, posts PR comments, annotates code reviews, and offers suggested fixes, delivering live build and test results right where your team works. Free for developers to try." 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="Marvin GitHub Code Review" width="1078" height="644" data-path="images/marketing/product/github-hero.avif" />
</Hero>

<Section>
  <div className="grid gap-12" style={{ gridTemplateColumns: "repeat(2, 1fr)" }}>
    <div>
      <h2 className="text-2xl font-semibold text-zinc-900 dark:text-white mb-6">Features</h2>

      <div className="space-y-4">
        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 text-sm font-bold">✓</span>
          <p className="text-zinc-600 dark:text-zinc-300">Dynamically stream failed test targets, build errors, and reproduction steps to a GitHub comment as soon as they occur.</p>
        </div>

        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 text-sm font-bold">✓</span>
          <p className="text-zinc-600 dark:text-zinc-300">Gain visibility into cache performance -- see which tests were executed and how much time was saved via caching.</p>
        </div>

        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 text-sm font-bold">✓</span>
          <p className="text-zinc-600 dark:text-zinc-300">Link directly to the underlying CI host tasks on Buildkite, CircleCI, or GitHub Actions.</p>
        </div>
      </div>
    </div>

    <div>
      <h2 className="text-2xl font-semibold text-zinc-900 dark:text-white mb-6">Benefits</h2>

      <div className="space-y-4">
        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-yellow-100 dark:bg-yellow-900/30 flex items-center justify-center text-yellow-600 text-sm font-bold">★</span>
          <p className="text-zinc-600 dark:text-zinc-300">Improve visibility of errors by bringing them directly into code review.</p>
        </div>

        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-yellow-100 dark:bg-yellow-900/30 flex items-center justify-center text-yellow-600 text-sm font-bold">★</span>
          <p className="text-zinc-600 dark:text-zinc-300">Reduce time to action by fixing errors before a build finishes.</p>
        </div>

        <div className="flex items-start gap-3">
          <span className="flex-shrink-0 w-6 h-6 rounded-full bg-yellow-100 dark:bg-yellow-900/30 flex items-center justify-center text-yellow-600 text-sm font-bold">★</span>
          <p className="text-zinc-600 dark:text-zinc-300">Assist new Bazel developers by providing repro commands.</p>
        </div>
      </div>
    </div>
  </div>
</Section>

<Section gray>
  <FeatureShowcase title="Build Events as Comments" description="Reduced time-to-failure (TTF) keeps developers in the flow. When developers are waiting for CI, sometimes we context switch to another task, but losing flow makes engineers less productive! Marvin processes Bazel's build event stream, showing any test failures in real-time as a comment on the code review thread, so you can't miss it." href="/contact" linkText="Get started">
    <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 & suggested fixes" description="Marvin also posts lint results on your code review, and offers to apply any suggested fixes the tool produced." href="/docs/aspect-workflows/features/code-review" linkText="Learn more" 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>
  <div className="space-y-12">
    <div className="flex items-start gap-6 p-6 rounded-xl border border-zinc-200 dark:border-zinc-700">
      <div>
        <h3 className="text-xl font-bold text-zinc-900 dark:text-white">rules\_lint: The Foundation of Linting in Bazel</h3>
        <p className="mt-3 text-zinc-600 dark:text-zinc-300"><strong>rules\_lint</strong> is our open-source ruleset that integrates seamlessly with Bazel, automating code formatting and linting across multiple languages. With rules\_lint, you can:</p>

        <div className="mt-4 space-y-3">
          <div className="flex items-start gap-3">
            <span className="flex-shrink-0 w-5 h-5 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center text-green-600 text-xs font-bold">✓</span>
            <p className="text-zinc-600 dark:text-zinc-300"><strong>Automate Formatting:</strong> Quickly format files on pre-commit hooks with format\_multirun, ensuring consistent code across your repository.</p>
          </div>

          <div className="flex items-start gap-3">
            <span className="flex-shrink-0 w-5 h-5 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center text-green-600 text-xs font-bold">✓</span>
            <p className="text-zinc-600 dark:text-zinc-300"><strong>Comprehensive Linting:</strong> Run linters across entire programs using Bazel's dependency graph, with numerous tool integrations available out-of-the-box.</p>
          </div>
        </div>
      </div>
    </div>

    <div className="flex items-start gap-6 p-6 rounded-xl border border-zinc-200 dark:border-zinc-700">
      <div>
        <h3 className="text-xl font-bold text-zinc-900 dark:text-white">Aspect CLI: Bringing Lint to Your Command Line</h3>
        <p className="mt-3 text-zinc-600 dark:text-zinc-300">The Aspect CLI introduces the missing lint command to Bazel's ecosystem, offering a user-friendly interface. With Aspect CLI you can easily generate lint reports and apply suggested fixes directly from your terminal.</p>

        <div className="mt-4 space-y-3">
          <div className="flex items-start gap-3">
            <span className="flex-shrink-0 w-5 h-5 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center text-green-600 text-xs font-bold">✓</span>
            <p className="text-zinc-600 dark:text-zinc-300"><strong>Interactive Fixes:</strong> Review and apply linter-suggested fixes with ease, whether manually or automatically.</p>
          </div>

          <div className="flex items-start gap-3">
            <span className="flex-shrink-0 w-5 h-5 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center text-green-600 text-xs font-bold">✓</span>
            <p className="text-zinc-600 dark:text-zinc-300"><strong>Seamless Integration:</strong> Transition effortlessly, enhancing your team's productivity without disrupting existing workflows.</p>
          </div>
        </div>
      </div>
    </div>

    <div className="flex items-start gap-6 p-6 rounded-xl border border-zinc-200 dark:border-zinc-700">
      <div>
        <h3 className="text-xl font-bold text-zinc-900 dark:text-white">Lint in Code Review with Marvin</h3>
        <p className="mt-3 text-zinc-600 dark:text-zinc-300">Integrate linting directly into your review process with Marvin. He presents lint feedback as status checks on GitHub and GitLab, and auto-fixes as suggested fixes on your pull requests, helping you and your reviewers quickly address issues without disrupting your workflow.</p>
      </div>
    </div>
  </div>
</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 Marvin to work on your pull requests</h2>
      <div className="mt-3 text-blue-100 text-base">Free for developers on GitHub and GitLab.</div>
    </div>

    <div className="flex flex-wrap gap-3 shrink-0 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 bg-white text-blue-700 font-semibold hover:bg-blue-50 transition whitespace-nowrap shadow-sm">
        Set up on GitLab
      </a>

      <a href="/contact" 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">
        Talk with Us
      </a>
    </div>
  </div>
</section>
