jetlint · pre-1.0

Type-aware TypeScript 7 linting.
Without the wait.

A fast, type-aware linter for the TypeScript 7 native (Go) toolchain. Drop-in compatible with typescript-eslint: the rules you already configure, reporting in a fraction of the time.

100%

10598 / 10598 upstream fixtures pass across 182 rules (61 typescript-eslint ports + 112 biome / oxlint ports), plus hand-written tests for 9 ESLint-core rules without upstream fixture data. Same diagnostics as the upstream tools, byte-for-byte against their published test suites.

Why jetlint

Type-aware linting at native speed.

Interactive speed

Re-lints reuse a warm TypeScript program. The first lint pays for the load; every lint after that returns in milliseconds, fast enough to sit inside an edit-feedback loop.

Native checker

Built on the TypeScript 7 native compiler. Real type queries, no AST heuristics. If TypeScript can answer it, jetlint can act on it.

Faithful compatibility

Every rule is verified against upstream fixtures: 6193 typescript-eslint cases and 4405 biome / oxlint cases, plus hand-written tests for 9 ESLint-core rules without upstream fixtures. 100% match across all 182 rules. Switch over without re-learning your config.

Predictable config

A single .jetlintrc.json. Unknown option keys exit with a structured error rather than being silently ignored, so misconfigurations fail loudly.

Built for editors and CI

JSON-RPC transport for editor integration; structured diagnostics for CI. Stable exit codes so build pipelines can rely on them.

Open and inspectable

Open source under MIT. The compatibility harness is in the repo; every rule's score is reproducible on your own machine.

182 rules, organized into 7 categories.

Five rules form the recommended preset and fire by default — chosen to match the consensus between typescript-eslint's recommendedTypeChecked and oxc's correctness category. Everything else is opt-in via .jetlintrc.json. See all rules →

Install

Drop it into your project.

From v0.1.0 onward, jetlint ships prebuilt binaries via npm under the @jetlint/cli wrapper. Until then, install from source with Go.

# v0.1.0 and later (also works with pnpm, yarn, bun)
npm install --save-dev @jetlint/cli

# while v0.1.0 is in progress, build from source (Go 1.26+)
go install github.com/jetlint/jetlint/cmd/jetlint@latest

# run on a project
npx jetlint --project ./tsconfig.json

See the install guide for pnpm/yarn/bun commands, editor integration, and CI setup, or the rules reference for the full rule list.

Background

Why jetlint exists.

AI coding tools work best when the loop around them is deterministic and fast. Types, lint, and tests are how a model knows whether the change it just made is good. The more of that signal you can produce in milliseconds rather than seconds, the tighter the loop gets and the better the outputs.

Type-aware lint is the slow link in that chain. typescript-eslint with type information is the right tool for the job, but on large codebases it's measured in seconds-to-minutes, which is too slow to sit inside an inner loop. With the TypeScript 7 native toolchain landing, the checker itself is finally fast enough that a thin linter on top can return type-aware diagnostics at interactive speed, especially when a daemon keeps the program warm between runs.

Standing on other peoples' shoulders.

jetlint is a thin layer over decisions made by much larger projects. The interesting problems (what the rules should mean, how the checker should answer type queries, how a linter should be structured) have already been solved well elsewhere. jetlint's contribution is wiring them together for the TS 7 native checker with a daemon in front.

How jetlint differs from tsgolint.

tsgolint and jetlint share the same foundation, the TypeScript 7 Go checker, and the same broad idea, so the obvious question is why both exist. The short answer: different goals, plus a personal one.

The project goal is byte-for-byte compatibility with typescript-eslint's published fixtures across as many type-aware rules as possible, so existing configurations move over unchanged. tsgolint targets a curated subset instead, which serves a different audience.

There's also a personal one. I wanted to learn what writing a linter against a real compiler actually feels like, even working at arm's length through AI tooling. tsgolint already existed and worked; jetlint exists in part because I wanted to understand the problem by building one.

Status

Pre-1.0. Diagnostics work today; the API may still change.

jetlint is currently a research-grade port of typescript-eslint's type-aware rules against the TypeScript 7 native checker. The diagnostics are real; the API surface (CLI flags, config schema, exit codes) may still change. Feedback on the issue tracker shapes what stabilizes first.