Use Oxc for linting and formatting
Date: 2026-07-13
Author: Jason Tame
Status
Accepted
Context
EOS is expected to expand significantly as it becomes the home for shared engineering tooling, standards, skills, and applications. As the number of packages/apps and contributors grow, linting and formatting must remain fast enough to provide useful feedback locally and in CI without becoming a bottleneck.
Tillo’s frontend applications rely on Vue, Nuxt, and Vite. Tooling used by EOS should fit that wider ecosystem where practical, while remaining suitable for general JavaScript and TypeScript packages. Oxc is part of the broader VoidZero toolchain that also powers Rolldown, the bundler used by modern Vite. Its tools share compiler infrastructure for parsing, linting, formatting, transformation, module resolution, and minification.
Linting and formatting are separate concerns, but they operate on the same source code and are commonly run together during development and CI. A coherent toolchain can reduce duplicated configuration, dependencies, and maintenance compared with assembling unrelated tools and plugins.
Oxc is newer than the established alternatives. Some capabilities remain incomplete or less mature, particularly for framework-specific syntax. For example, Oxlint can inspect script blocks in Vue single-file components but does not currently lint their template sections.
Decision Drivers
- Fast local and CI feedback as the monorepo grows.
- Efficient parallel execution across Turborepo packages.
- A coherent linting and formatting toolchain with shared foundations.
- Strong JavaScript and TypeScript support with sensible defaults.
- Alignment with Tillo’s Vue, Nuxt, and Vite ecosystem.
- Fewer third-party plugins and configuration packages to maintain.
- A credible long-term roadmap covering more of the TypeScript toolchain.
- The ability to revisit the choice if framework support or project maturity becomes a constraint.
Considered Options
Oxc with Oxlint and Oxfmt
Oxlint and Oxfmt are high-performance Rust-based tools within the Oxc toolchain. They share compiler infrastructure with Oxc’s parser, transformer, resolver, and minifier. This provides a more integrated foundation than combining independently developed linting and formatting tools.
Oxc is closely aligned with the direction of the Vite ecosystem through VoidZero and Rolldown. This makes it a good strategic fit for Tillo’s existing use of Vue, Nuxt, and Vite, while still supporting the TypeScript packages currently held in EOS.
The main trade-off is maturity. Oxfmt and some broader Oxc capabilities are still evolving, and Oxlint’s framework-specific analysis does not yet cover all Vue template syntax.
ESLint and Prettier
ESLint and Prettier are mature, widely adopted, and supported by extensive ecosystems. They would provide broad editor integration, framework support, and established migration paths.
They are separate tools with separate configuration and plugin ecosystems. Achieving the desired TypeScript and framework behavior commonly requires additional plugins and shared configurations, increasing dependency count and exposing the repository to uneven third-party maintenance. Their performance is also less attractive for the scale EOS is expected to reach.
Biome
Biome provides an integrated, high-performance linter and formatter with a strong developer experience. It would have met the repository’s immediate linting and formatting requirements and would have been a sound choice.
Oxc was preferred because its broader toolchain includes shared parsing, transformation, resolution, and minification infrastructure, with further capabilities under active development. This gives Oxc greater potential to consolidate more of the TypeScript toolchain over time and makes it the stronger long-term strategic fit for EOS.
Decision Outcome
EOS will use Oxlint for linting and Oxfmt for formatting as part of the Oxc toolchain.
Both tools will be installed as shared development dependencies at the monorepo root. Individual packages will expose linting and formatting scripts, and Turborepo will coordinate those tasks across the workspace. CI will run lint and format checks independently from build, typecheck, and test jobs.
The initial configuration will remain close to the Oxc defaults. Rules and formatting options should be added only when they represent a deliberate repository standard. Framework-specific gaps may be covered by narrowly scoped additional tooling where necessary rather than replacing the whole toolchain immediately.
Consequences
Positive
- Linting and formatting should remain fast as the number and size of packages grows.
- Shared Oxc infrastructure provides greater coherence between source-analysis tools.
- The repository needs fewer third-party plugins and configuration packages.
- Oxlint and Oxfmt integrate cleanly with package-level Turborepo tasks.
- The tooling aligns with the broader direction of Tillo’s Vue, Nuxt, and Vite ecosystem.
- Future Oxc tools may allow EOS to consolidate more TypeScript tooling on the same foundations.
Negative
- Oxc’s tools and integrations are newer and less mature than ESLint and Prettier.
- Oxlint does not currently lint Vue template sections, so additional tooling may be required for complete Vue-specific analysis.
- Some ESLint rules or plugins may not have direct Oxlint equivalents.
- Rapid development may introduce configuration changes or migration work as the tools mature.
- Contributors may be less familiar with Oxlint and Oxfmt than with established alternatives.
Neutral
- This decision applies to EOS and does not require every Tillo repository to adopt Oxc.
- Linting and formatting remain distinct tasks even though they use one toolchain.
- Existing editor integrations and contributor workflows may need to be configured for Oxlint and Oxfmt.
- The decision should be revisited if Oxc’s maturity, compatibility, or framework support does not keep pace with EOS’s needs.