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

# Aspect's rules_lint Reaches 2.0

> Explore rules_lint 2.0 featuring AXL, Python ty support, Rust Clippy integration, and full Bazel 9 compatibility for streamlined coding and review

export const BlogPost = ({title, date, authors, tags, image, children}) => {
  const tagList = tags ? tags.split(", ").filter(Boolean) : [];
  const tagSlug = t => t.toLowerCase().replace(/&/g, "").replace(/\+/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
  const formattedDate = date ? new Date(date + "T00:00:00").toLocaleDateString("en-US", {
    year: "numeric",
    month: "long",
    day: "numeric"
  }) : "";
  return <section className="w-full flex justify-center px-4 py-12 md:py-16">
      <div style={{
    maxWidth: "800px",
    width: "100%"
  }}>
        {image && (typeof image === "string" ? <img noZoom src={image} alt={title} className="w-full rounded-xl mb-8" style={{
    maxHeight: "400px",
    objectFit: "cover"
  }} /> : <div className="blog-post-hero-image">{image}</div>)}
        <h1 className="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-white">
          {title}
        </h1>
        <div className="flex flex-wrap items-center gap-3 mt-4 text-sm text-zinc-500 dark:text-zinc-400">
          {authors && <span>{authors}</span>}
          {authors && formattedDate && <span>·</span>}
          {formattedDate && <span>{formattedDate}</span>}
        </div>
        {tagList.length > 0 && <div className="flex flex-wrap gap-2 mt-3">
            {tagList.map(tag => <a key={tag} href={"/blog/tags/" + tagSlug(tag)} className="px-2 py-0.5 rounded-full text-xs bg-zinc-100 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 hover:bg-blue-100 dark:hover:bg-blue-900/40 hover:text-blue-700 dark:hover:text-blue-300 transition">
                {tag}
              </a>)}
          </div>}
        <hr className="my-8 border-zinc-200 dark:border-zinc-700" />
        <div className="prose dark:prose-invert max-w-none">{children}</div>
      </div>
    </section>;
};

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

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>;

<MarketingPage />

<BlogPost title="Aspect's rules_lint Reaches 2.0" date="2026-01-26" authors="Alex Eagle" tags="Linting, Releases, Bazel">
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/blog/hashnode/hn-6e91f8e777.jpeg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=9530ae35063d683f5663487beae18b6a" alt="" className="blog-post-cover" width="1600" height="1098" data-path="images/blog/hashnode/hn-6e91f8e777.jpeg" />

  You’ll find the project and examples at [https://github.com/aspect-build/rules\_lint](https://github.com/aspect-build/rules_lint).

  We’ve been incredibly gratified by the [more than 60 open-source contributors](https://github.com/aspect-build/rules_lint/graphs/contributors) who have improved the ruleset, and everyone who has filed or answered issues. Thank you! We support 30 languages now and continue to grow.

  ## Highlights of Aspect rules\_lint release version 2.0

  * The Aspect Extension Language (AXL) is now used to provide the `lint` and `format` tasks on your command-line. Just install the [Aspect CLI](https://aspect.build/docs/cli/overview) and run `aspect lint`.

  * Most of the [aspect-starters](https://github.com/aspect-starters) demonstrate rules\_lint 2.0, and give an easy playground to try it out.

  * The rules\_lint [examples folder](https://github.com/aspect-build/rules_lint/tree/main/examples) is now broken out into standalone Bazel modules per-language, making it much easier to find the bits you need for your own repo.

  * Pythonistas will love the new `ty` linter support. Ty is a fast Python type-checker written in Rust from [Astral](https://astral.sh) - and we’re working with them to add incremental type-check support to avoid quadratic runtime. Thank you to [https://github.com/whoahbot](https://github.com/whoahbot) for the contribution!

  * We’ve added Rust’s `clippy` tool so you can get auto-fixes like unused imports applied automatically during code review. We expect `rules_rust` to decrease scope, possibly removing their Clippy support. Thank you to [https://github.com/blorente](https://github.com/blorente) for adding this support!

  * Full Bazel 9 support, including Bzlmod `module_extension` support for fetching all tools, obviating the need for any `WORKSPACE` file or `http_archive` rules.

  ## About rules\_lint

  `aspect-build/rules_lint` is a Bazel ruleset that makes **linting** and **formatting** “first-class” in Bazel — so you can run common static analysis tools via Bazel without wrapping your existing BUILD targets or changing the rulesets you already use.

  As before, rules\_lint v2 is really two rulesets in one:

  ### Formatting

  * Typically *one formatter per language*; deterministic output; “just apply the changes.”

  * Formatting tools are run as side-effects outside of Bazel actions and wired with a `git` pre-commit hook.

  * That means it can **run on files not modeled in Bazel’s dependency graph**: formatting runs on the file tree (helpful for scripts, docs, etc.).

  Get started at [https://github.com/aspect-build/rules\_lint/blob/main/docs/formatting.md](https://github.com/aspect-build/rules_lint/blob/main/docs/formatting.md)

  ### Linting

  * Can run *multiple linters per language*; may propose fixes; results can be shown as terminal output, failing tests, or code-review feedback.

  * **No BUILD-file clutter**: you lint existing `*_library` targets rather than adding special wrapper macros.

  * **Incremental & cache-friendly**: lint runs as Bazel actions (works with remote execution/cache).

  * **Practical for legacy repos**: supports “lint only what changed” workflows so you can start without fixing all historic issues. We refer to the “Water Leak Principle” which says to stop the leak before mopping the spill.

  Get started at [https://github.com/aspect-build/rules\_lint/blob/main/docs/linting.md](https://github.com/aspect-build/rules_lint/blob/main/docs/linting.md)

  ## Wiring into code review

  Aspect’s platform includes Marvin, our mascot and helpful Bazel bot. Marvin comments on your pull requests, and includes lint results displayed as GitHub Checks. Even better, when the linter tool has a `—-fix` mode, Marvin will provide the Suggested Fixes in the GitHub code review so you can just accept the improvements to your code.

  ## Next steps

  To learn more about our [Aspect Workflows developer productivity platform](https://www.aspect.build/platform) and [expert Bazel support services](https://www.aspect.build/services), talk to us on Bazel Slack or email us at [hello@aspect.build](mailto:hello@aspect.build).
</BlogPost>
