Replies: 10 comments 11 replies
|
#6246 made me realise that if we fix it, users do have a workaround for distributing plugins, albeit a contrived one. If users distribute plugins inside "extends packages", the consumer of the package cannot really determine which files the plugins should operate on anymore. That might be acceptable for some use cases, especially within organisations, but I wouldn't recommend it as a means for general distribution. |
|
I strongly agree with keeping custom rules internal and avoiding broad plugin distribution. ESLint’s history shows that plugin sprawl leads to fragmentation, config conflicts, and maintenance headaches. We should be cautious of any advocacy for pushing for plugins at all costs—often, this comes from a place of not having to have dealt with the real complexity this creates. Biome’s simplicity and cohesion are worth protecting; teams should keep their own rules private and not repeat past mistakes. |
|
What’s difficult, I think, is that there’s definitely an advantage to having software-specific linting rules—like for Storybook, Next, Turborepo, or React Testing Library, which helps you lint their own custom software. We just don’t want the custom distributions people would inevitably try to make. That's where all the complexity comes from. Maybe there’s a way to allow the former, but disallow the latter? |
|
Indeed it would be more interesting to have things builtin than just look how eslint does and try to plugin-ize the whole world with 2400 extra packages. That beeing said, as the existence of plugins says, there allways will be niche use cases, or internal policies that will not be covered by those. Maybe a good place to start is just having a place (discussion, repo, .. you name it) where users can share their patterns. |
|
We have a design-system repo with UI components, and we have some rules for the usage of those components, for now, we can use extends as a workaround, so the downstream projects will receive the plugins, but doesn't feel scalable. The plugins belong to the design system, the user is the downstream project, but the design-system shouldn't have any knowledge of the other biome settings the project uses. It also don't make sense to make our default config extends the ds settings, because not all projects use the design system, it's kinda messy right now to reuse enough, but not too much, it's a really thin line. If the design-system could provide it as an extra export on the components package, and just reference it as the package name, that would be perfect for our use case. |
|
I think, inability to distribute linting rules via npm will lead to distribution of just plugin files. With message like "As long as Biome doesn't support npm plugins, copy-paste those files in your codebase and include them in your biome.json file". This may lead to even bigger "fragmentation, config conflicts, and maintenance headaches". Earlier was already mentioned that software-specific linting rules exists — like for Storybook, Next, Turborepo, or React Testing Library. But those are all well known and quite popular libraries. There are less known libraries, which provides their linting rules, for example Effector — I bet maybe just few of Biome maintaners even knows about this state manager. Are you going to embrace all possible libraries' custom linting rules? Will every change in rules for some library, I don't even know and don't use, be a bump new Biome version (because all rules a baked-in)? Who will decide what library's rules are worth including into Biome binary? Will you establish some "barrier measures" for libraries, let's say, stars count? |
|
Although I agree with including framework rules into Biome, but there will probably be a line. Let's say there's this framework with only 1 user, does it get it's own domain? If yes, we could end up with a lot of rules specific to small software or frameworks in the binary. Also, within our company we use a package to distribute config presets (react, tailwind, etc) and up to the consumer app to extend from any of the presets. However, we would also like to create some gritql plugins that are related to the company, for internal use only. These somehow needs to be distributed over several repositories, which we do not want to copy & paste, but shared through this package. So, importing from a package would be nice to have; {
"plugins": [
"@netail/biome-plugins/noTestPlugin.grit"
]
}(Which currently does not resolve from node_modules, unlike |
|
I think it’s important to look beyond the idea that Biome’s appeal is only about “simple configuration” or “no dependency chains.” Those are great benefits, but what really differentiates Biome is the combination of speed, a unified execution model, and the absence of conflicts between separate tools like formatters and linters. That’s a much deeper value proposition than just avoiding extra packages. At the same time, there’s a whole category of rules that teams rely on which Biome currently can’t express. In the CSS world, I previously used Stylelint plugins like defensive CSS and logical CSS. These don’t flag invalid CSS — they flag valid CSS that can cause accessibility issues, layout instability, or usability problems and enforce modern and more sustainable solutions. These rules are extremely valuable, but also opinionated and not universally applicable. This raises the question of where such rules should live in the Biome ecosystem? One option would be to include them in Biome core, potentially grouped into a dedicated rule domain that is disabled by default and enabled with a single switch. That would keep Biome simple for users who don’t need these constraints, while still making them first‑class for teams who do. If Biome were to go in that direction, the open question becomes: what would the process and criteria be for creating these opt‑in rule groups? How do we decide which opinionated or higher‑level rules belong in an official domain? On the other hand, a plugin mechanism would allow these rules to evolve independently of Biome’s release cycle and might be a better fit for constraints that are highly opinionated or dependent on project context (like browser support targets). So I’m curious how the Biome team and its users envision this long‑term: |
Enterprise perspectiveFrom what I have seen in enterprise settings, Biome has been painful to adopt, and this decision is another serious blocker for us. Why “one ruleset per framework” is not enoughA lot of linting is not tied to a product or framework (Next, React, Storybook, etc.); it is team- or org-specific. You cannot ship a fixed set of rules per stack and assume you have covered real-world codebases. Most code is private. There is no public “companyFoo/productX” domain for you to model, so a one-size-fits-all story does not match how large organizations work. Inside one company, many teams often cannot align on one policy, let alone the whole ecosystem. The post does not really engage with the need for Biome to be extensible in the ways teams actually need. Where ESLint still wins (for us)###The gap with ESLint feels large:
Plugins and GritI was hopeful when you added some plugin story and thought AI could narrow the gap even if I did not want to learn another AST DSL. This update undercuts that. We have hundreds of no-restricted-syntax rules. AI could help port many of them, but Grit’s AST story (e.g. no comment support and other limits) gets in the way. Worse: custom .grit plugins cannot be distributed the way we need across hundreds of repositories. A thread comment suggesting it is fine to copy rules misses the point — copying hundreds of files into hundreds of repos is exactly the maintenance burden that blocks adoption. That is why I am skeptical about real uptake until this is solved. AskPlease reconsider this direction and how extensibility and shared, distributable custom rules fit into Biome’s story for large, private codebases. |
|
It's kinda wild that after a year, there's still no decision on this, something that should have been decided before v2 GA. I am considering switching to oxlint because this omission means in effect, Biome plugins do not exist. |
Uh oh!
There was an error while loading. Please reload this page.
Since v2, Biome now supports plugins via GritQL, however users can't distribute/share these plugins at the moment.
The initial idea behind this plugin system was to provide users the ability to create custom rules for their own projects. These rules would make sense only within an organisation or project, and shouldn't be shared or distributed to people outside the organisation or project.
If users need to share a plugin inside an org, nowadays, git submodules are a valid alternative. However, what if a user wants to use
npmto distribute their plugins? Is it a valid case for Biome? What about rules inside monorepos?Before jumping into discussions and saying "yes, plugins everywhere", I advise you forget for a moment the ESLint plugin model and take a step back.
One of the reasons users love Biome is that, unlike the ESLint plugin model, they don't need to install plugins to get their project up and running. What does this mean? Here are a few wins:
IMHO, language isn't a factor. While JavaScript (for future plugins) might be easier to learn and would get us easier contributions, I think language is just a medium, and eventually developers may/need to learn different languages.
Biome has recently started shipping rules that are framework-specific. While there's the argument that rules that belong a specific library/framework should belong to a plugin, we believe that native rules are faster, and offer a better DX overall.
All reactions