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

# What your build system isn't telling you

> Bazel already tells you almost everything. Almost nobody keeps it.

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 StatsBar = ({stats = []}) => <div className="flex flex-wrap justify-center gap-8 md:gap-16 py-4">
    {stats.map((stat, i) => <div key={i} className="flex flex-col items-center text-center">
        <span className="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-white">{stat.value}</span>
        <span className="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{stat.label}</span>
      </div>)}
  </div>;

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

export const FeatureGrid2 = ({children}) => <div className="marketing-grid-2">{children}</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 PlatformFeature = ({title, description, href, linkText = "Learn more"}) => <div className="flex flex-col p-5 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800/40 hover:border-blue-200 dark:hover:border-blue-700 hover:shadow-sm transition-all duration-200">
    <h3 className="text-sm font-semibold text-zinc-900 dark:text-white">{title}</h3>
    <p className="mt-1.5 text-xs text-zinc-500 dark:text-zinc-400 leading-relaxed">{description}</p>
    {href && <a href={href} className="inline-flex items-center mt-3 text-xs text-blue-600 dark:text-blue-400 font-semibold hover:underline underline-offset-2">
        {linkText} →
      </a>}
  </div>;

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>}
          {(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>}
        </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="What your build system isn't telling you" subtitle="Bazel already tells you almost everything. Almost nobody keeps it." primaryCta="Start a trial" primaryHref="/trial" secondaryCta="Back to BazelCon" secondaryHref="/bazelcon-2026" />

<div className="w-full flex justify-center px-4 pt-8">
  <p className="text-center text-sm text-zinc-500 dark:text-zinc-400">
    <strong className="text-zinc-900 dark:text-white">Written for</strong> Platform and developer-experience leads already running Bazel at scale.
  </p>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <p className="text-xs font-semibold tracking-widest text-blue-600 dark:text-blue-400 uppercase mb-2">The argument</p>
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">The gap is retention, not instrumentation</h2>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        Every Bazel invocation emits a structured stream describing each target it considered, each action it executed, every cache decision it made and every attempt of every test it ran. Almost nobody keeps it, and not out of negligence. Retaining it at monorepo volume has been expensive enough that most teams sample it, keep a few days, or skip it entirely.
      </p>

      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed mt-4">
        A single large build in our own monorepo covers 120,539 actions across roughly 2.07 million graph nodes. Our instance carries 37.6 million build actions per month across 10,151 tracked targets, all from one monorepo. Most organisations running Bazel at scale produce considerably more than that, and keep considerably less of it.
      </p>
    </div>

    <div className="mt-6 max-w-3xl">
      <ul className="space-y-3 text-zinc-600 dark:text-zinc-300 leading-relaxed" style={{ listStyle: "none", paddingLeft: 0 }}>
        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">You are already producing the signal.</strong> The only question is whether you keep it long enough for a trend to be visible.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Hand-wired reporting is a false economy.</strong> Every monorepo eventually builds its own build-metrics pipeline. It is undifferentiated work, it decays as soon as its author changes teams, and it answers fewer questions each year.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">A different class of question opens up.</strong> Not “how was this build?” but “how has this target behaved across every build for the last month, and what did it cost?”</span>
        </li>
      </ul>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Why every monorepo hand-wires this, and why it rots</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">The shape is predictable: a BEP consumer, an object store, a job that flattens events into summary tables, a dashboard, and a wiki page explaining which numbers to trust.</p>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        It works, for a while. Then it rots, for structural reasons rather than because anyone built it badly.
      </p>
    </div>

    <div className="mt-8">
      <FeatureGrid2>
        <PlatformFeature title="It has one author" description="The pipeline encodes that person’s mental model of what mattered in the quarter they built it. When they change teams it becomes infrastructure nobody owns and everybody depends on." />

        <PlatformFeature title="Its schema is a snapshot" description="Every new question means more schema work: a new rule type, remote execution, a different CI host, per-team cost. The backlog only grows." />

        <PlatformFeature title="It silently loses fidelity" description="Retention windows shrink under cost pressure and sampling gets introduced to control volume. Both are invisible in the dashboard, which keeps rendering a chart that now means something subtly different." />

        <PlatformFeature title="It is undifferentiated" description="No company’s competitive position improves because it wrote a good BEP ingester. It is work you must do and get no credit for." />
      </FeatureGrid2>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        The alternative isn’t a better in-house pipeline. It’s treating build-event retention as a platform capability you buy, rather than a project you staff and then quietly stop maintaining.
      </p>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Retention as a first-class decision</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">One design goal: make keeping everything the default, rather than the thing you trade away first.</p>
    </div>

    <div className="mt-6 max-w-3xl">
      <ul className="space-y-3 text-zinc-600 dark:text-zinc-300 leading-relaxed" style={{ listStyle: "none", paddingLeft: 0 }}>
        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Standard protocol, nothing to instrument.</strong> Events stream over gRPC; any Bazel client works, local or CI. No fork, no plugin, no wrapper script.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Local builds count.</strong> Most teams watch only CI, so they see about half their build activity. The half they miss is the half their engineers actually experience.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Ingest is isolated from the build path.</strong> Heavy event traffic and heavy build traffic don’t contend. Observability that slows down the thing it observes doesn’t survive contact with a platform team.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Retention measured in months, not days.</strong> Long enough that a trend is a trend.</span>
        </li>
      </ul>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        What that buys you: event volume stops being the thing that limits what you can ask. No sampling decisions, no retention window to negotiate down, no “we would have to add that field first.” The question you want to ask next week is already answerable, because the data is already there.
      </p>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <FeatureShowcase label="What becomes answerable" title="One build, completely" description="Duration, cache hit rate, targets, actions executed, output bytes and parallelism. Then where the time went, and the critical path you’d have to shorten to make the build faster. When the cache misses you get the reason, so input churn becomes a number to attack rather than a mystery.">
      <img noZoom src="https://mintcdn.com/aspectbuild/4wAijf_e0qg5Bve0/images/marketing/bazelcon-2026/build-overview.png?fit=max&auto=format&n=4wAijf_e0qg5Bve0&q=85&s=037c058fe889eaca5839bf47d9cb4096" alt="Build overview with the metric strip and where the time went" width="2332" height="736" data-path="images/marketing/bazelcon-2026/build-overview.png" />
    </FeatureShowcase>

    <p className="mt-4 text-sm text-zinc-500 dark:text-zinc-400">A 6,904-target test build in 4m 8s at a 95% local action cache hit rate, critical path 26s. Aspect’s own instance.</p>

    <div className="mt-6">
      <FeatureShowcase label="Across every build" title="Trends, attribution and cost" description="Rank thousands of targets by whatever matters this week, then flip to trend and read the gradient. Expand any target to see its dependencies with their own critical-path share. Compare any two builds and get the verdict first, then the deltas, the target transitions, the cache-miss blast radius, and the command-line flags diffed." flipped>
        <img noZoom src="https://mintcdn.com/aspectbuild/4wAijf_e0qg5Bve0/images/marketing/bazelcon-2026/target-trends.png?fit=max&auto=format&n=4wAijf_e0qg5Bve0&q=85&s=dde3ffe7834fa876b05bc37375cc66f8" alt="Targets page with month-long sparklines and a ranked target table" width="2336" height="736" data-path="images/marketing/bazelcon-2026/target-trends.png" />
      </FeatureShowcase>

      <p className="mt-4 text-sm text-zinc-500 dark:text-zinc-400">A month of retained build events: 37.6M actions, 10,151 targets ranked and trended.</p>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Where to start</h2>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        You don’t need to commit to a platform to find out whether this is worth anything to you.
      </p>
    </div>

    <div className="mt-6 max-w-3xl">
      <ul className="space-y-3 text-zinc-600 dark:text-zinc-300 leading-relaxed" style={{ listStyle: "none", paddingLeft: 0 }}>
        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Ask your own team the four questions.</strong> Is the build slower than last quarter? Which target is most responsible? Which test is flakiest, and by how much? What did last month’s builds cost? If the answers are estimates, the gap in this paper is your gap.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Check what you actually retain.</strong> Not what the pipeline was designed to retain, but what is queryable right now, and over what window. Teams are routinely surprised.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Point one repository at a hosted instance.</strong> Trends need history, so the first day tells you far less than the first week.</span>
        </li>
      </ul>
    </div>

    <div className="mt-10">
      <StatsBar
        stats={[
  { value: "37.6M", label: "build actions retained, one month" },
  { value: "10,151", label: "targets tracked with full history" },
  { value: "120,539", label: "actions in the largest single build" }
]}
      />
    </div>

    <p className="mt-6 text-sm text-zinc-500 dark:text-zinc-400 text-center">
      Every figure here comes from Aspect’s own production instance, running our own monorepo. A
      number without its workload attached isn’t evidence.
    </p>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Where it runs</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">Three ways to run this, and the axis that separates them is isolation, not hosting.</p>
    </div>

    <div className="mt-2 overflow-x-auto">
      <table className="w-full text-left border-collapse" style={{ minWidth: "560px" }}>
        <thead>
          <tr className="border-b border-zinc-300 dark:border-zinc-600"><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Option</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Infrastructure</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Cloud account</th><th className="py-3 pr-6 text-xs font-semibold uppercase tracking-widest text-zinc-500">Operated by</th></tr>
        </thead>

        <tbody className="text-sm">
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Cloud</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Shared, scoped to your organization</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect’s</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect</td></tr>
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Enterprise, hosted by Aspect</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Isolated, yours alone</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect’s</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect</td></tr>
          <tr className="border-b border-zinc-200 dark:border-zinc-700/60"><td className="py-3 pr-6 font-semibold text-zinc-900 dark:text-white">Aspect Enterprise, self-hosted</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Isolated, in your account</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Yours</td><td className="py-3 pr-6 text-zinc-600 dark:text-zinc-300">Aspect, or your team</td></tr>
        </tbody>
      </table>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        The last two are the same product, Aspect Enterprise. What differs is whose account it runs in and who holds operational control. <strong className="text-zinc-900 dark:text-white">Holding that control yourself is usually the point.</strong> Plenty of teams in finance, healthcare and government are not allowed to give a third party production access. For them we work over the shoulder: we guide and diagnose, their hands stay on the controls. It is what makes air-gapped and GovCloud deployments possible at all.
      </p>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 pt-12 pb-4">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <FeatureGrid2>
      <a href="/bazelcon-2026/verification-bottleneck" className="flex flex-col p-5 rounded-xl border border-zinc-200 dark:border-zinc-700/60 hover:border-blue-300 dark:hover:border-blue-700 transition md:text-right">
        <span className="text-xs font-semibold tracking-widest text-zinc-400 uppercase">Next →</span>
        <span className="mt-1 font-semibold text-zinc-900 dark:text-white">The verification bottleneck</span>
      </a>
    </FeatureGrid2>

    <div className="mt-6 text-center">
      <a href="/bazelcon-2026" className="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold hover:underline">
        All BazelCon materials →
      </a>
    </div>
  </div>
</div>

<CTA title="See it on your own builds" subtitle="Point a repository at a hosted instance and let a week of real builds accumulate." primaryCta="Start a trial" primaryHref="/trial" secondaryCta="Talk with us" secondaryHref="/contact" />
