Cam McHenry

Cam McHenry

@camchenry.com

dad | software engineer @github.com | core team member of oxc.rs | ✝️

565 followers321 following147 posts

Memory doesn't seem to be getting any cheaper, so I'm working on some tools for debugging allocations made by lint rules in oxlint (native rules only). Here's a sneak peek:

A brief update (since I realized I haven't posted an update on this in 3 months): I'm still working on this when I have time. It's gotten significantly better lately: on the ~8200 files the TS conformance suite has, it matches on 85.6% of types, and on 97.69% of assignability checks.

Finally got around to updating my personal website. I've migrated to Astro (took ~15 minutes with AI), and replaced my usage of Remix. Turns out I didn't need as much dynamic content as I thought and shipping less (or no JS) is something I like a lot.

Also converted all social media links from the other site to BlueSky now, which was a long time coming. I think I'd like to utilize more AT Protocol stuff in the future too 🤔

Against my better judgment, I have started a side project that is probably impossible to achieve practically. I'm gonna try anyway. Hopefully I will learn a lot 😅

we recently added rule timing support to oxlint to help triage performance issues. try running with `--debug=timings` to see the slowest built-in rules. support for type-aware/JS plugins will be supported in the future too.

*: we don't support the deprecated rules, so we haven't ported them over from the original plugin. please give them a try and report bug fixes, docs issues, or performance issues

We are working on bulk suppressions support in oxlint! Next release will have CLI support and we are working on LSP support now.

Cam McHenry reposted

I have now replaced ESLint with Oxlint in the DebtBook Rails/React codebase 🫡 ESLint ran in 20s with full cache, 230s without cache. And somewhere in between very randomly depending on the changes made. Oxlint - with type-aware, a JS Plugin, and more than 250 rules - runs in around 8 seconds :)

Really interesting research from auvred on type-aware linting: github.com/auvred/hybri... This is the next frontier for developer tooling: cross-language interoperability and finding the right tradeoffs to make for extensibility/performance.

github.comGitHub - auvred/hybrid-type-aware-linting-performance: Performance evaluation of different approaches for bridging tsgo with JSPerformance evaluation of different approaches for bridging tsgo with JS - auvred/hybrid-type-aware-linting-performance

Cam McHenry reposted

Fun story from today. I'm currently trying to get `--strict` on by default in TypeScript 6.0. Our test suite has many tests which are written with `--strict false`, so I am updating them by adding a special comment our test suite recognizes for options // @strict: false However...

Try it out!

VoidZero@voidzero.dev

Announcing Oxlint Type-Aware Linting Alpha 🎁 Just a few months after our technical preview, type-aware linting reaches the alpha milestone! ✨ Type-aware rules can now be configured 🙈 Inline comments to disable rules work for type-aware rules too ✔ Auto fixes for type-aware rules are now available

This has been in the works for a few months now! Excited for more people to try this out when it supports config options. A special thanks to the @typescript-eslint.io team who have set the standard for typed lint rules here. Much of this work is based on what has come before and on their rules.

Finally had time to put more effort into implementing oxlint<->tsgolint configuration for rules. Very soon, you'll be able to configure type-aware rules like any other rules. Should be as easy as just upgrading to the latest versions once it is available.

Cam McHenry reposted

Replying to @connorshea.bsky.social

So I started working on it in the evenings when I had time, and last week while I was off work for a week (recovering from eye surgery), in between naps I worked through most of the rule updates. So now almost all of them have documentation for their config options :) github.com/oxc-project/...

github.comlinter: various rules are missing `options` documentation on the Rules pages of the website · Issue #14743 · oxc-project/oxcI think this was covered slightly by #6050, but may have been missed as being within scope of the problem. no-unused-vars, for example, has various options available. But the page for the rule make...

Cam McHenry reposted

I had been exploring ESLint alternatives and was bothered by the lack of consistent documentation for rule configs in oxlint. So I opened an issue about it and talked with the maintainers about the right way to solve it, and found out there was a system for auto-generating documentation with types.

github.comlinter: various rules are missing `options` documentation on the Rules pages of the website · Issue #14743 · oxc-project/oxcI think this was covered slightly by #6050, but may have been missed as being within scope of the problem. no-unused-vars, for example, has various options available. But the page for the rule make...

Cam McHenry reposted

I am looking for a full-time job. Being independent in open source for 3.5+ years has been wonderful. I've gotten done most of the high-level goals I wanted to, and miss having people & structure around me. If you know of a role for a staff-level TypeScript+web developer, let me know! 🙂

On my laptop, oxlint 1.24 is 3% faster than 1.23 on the `vscode` repository, with even larger improvements for very large codebases. That means if you haven't updated to one of the latest versions in a few weeks, your linting step could be >10% slower than it should be!

Cam McHenry@camchenry.com

Oxlint 1.23.0 just got released, which includes the latest in some of the performance optimization work I've been doing. Running on the vscode repository on my M1 laptop, 1.23.0 is ~7-9% faster than previous versions of oxlint with no changes other than just bumping the dependency.

If you'd like to reproduce these results: Benchmark command: `hyperfine --ignore-failure --warmup 10 --runs 20 'pnpx oxlint@1.24 --silent' 'pnpx oxlint@1.23 --silent' 'pnpx oxlint@1.22 --silent' 'pnpx oxlint@1.21 --silent'` elastic/kibana@2169baef microsoft/vscode@fa994275

Cam McHenry reposted

Oxlint 1.23.0 just got released, which includes the latest in some of the performance optimization work I've been doing. Running on the vscode repository on my M1 laptop, 1.23.0 is ~7-9% faster than previous versions of oxlint with no changes other than just bumping the dependency.

Benchmark command, if you'd like to reproduce this (microsoft/vscode@fa99427534301606eb84c30cd8f7701ac2c35f90): hyperfine --ignore-failure --warmup 5 --runs 20 'pnpx oxlint@1.23 --silent' 'pnpx oxlint@1.22 --silent' 'pnpx oxlint@1.21 --silent' 'pnpx oxlint@1.20 --silent' 'pnpx oxlint@1.19 --silent'

I'm finally starting to pick up Go and try to formally learn it. It's got a lot of wild features! First language I've used in quite a while that natively supports complex numbers, seems like an interesting choice. The swapped type declaration order is gonna take a while to get used to.

First of these optimizations rolled out in v1.15.0 with a reduced scope. Next version of oxlint will be even faster: github.com/oxc-project/... On my laptop: ~15% faster on `oven-sh/bun`, ~9% faster on `microsoft/vscode`, ~11% faster on `posthog/posthog`, and ~8% faster on `elastic/kibana`

github.comperf(linter): detect node types from `let..else` statements by camchenry · Pull Request #13690 · oxc-project/oxcpart of linter: dynamically skip running rules that do not have the relevant node types #12223 Adds basic detection for syntax like let AstKind::Something(...) = node.kind() else { return }; in li...
Cam McHenry@camchenry.com

Trying some new oxlint optimizations. This PR has gone over several iterations in the last few months and the core idea is simple: don't run rules for files if they don't apply (using an AST node bitset lookup). The result: linting is around 15% faster in practice.

Cam McHenry reposted

VoidZero x SquiggleConf: Win a ticket! VoidZero is a proud sponsor of this year's @squiggleconf.com on September 18th and 19th in Boston. We've got an extra ticket for the event and want to give it away to one of you so you can join us there! Learn in this thread how you can enter the raffle 👇

Trying some new oxlint optimizations. This PR has gone over several iterations in the last few months and the core idea is simple: don't run rules for files if they don't apply (using an AST node bitset lookup). The result: linting is around 15% faster in practice.

Cool to see more tsgo-based linters! I think best practices here are not known yet, so it is great to see more teams innovating on this.

Rspack@rspack.dev

We have a new member in the Rstack family 🦀 Introducing Rslint - a TypeScript-first linter written in Go (powered by typescript-go, not Rust 🙃) Currently in experimental stage - check out the repo's README for more details: github.com/web-infra-de...

Great news for anyone linting large repositories! Hopefully this will be an easy performance win for teams using ESLint.

Just had a listen to this, it's well worth listening to catch up on the current state of JS linting, as Josh has lots of experience from working on ts-eslint. Lots of innovation happening in linting currently Overall, I think right now is a great time to learn more about linting, parsing, and ASTs.

Josh Ghoulberg 👻@joshuakgoldberg.com

This is one of my favorite podcast episodes I've ever been on. I love this conversation and the points covered: linting in 2025, performance vs. devX tradeoffs, and all sorts of interesting dives into architectures. If you never thought you should care about your linter, this will blow your mind! 🧠

First version is out! It's still pretty experimental, but we will keep improving performance and fixing bugs with each version. Most importantly though: you can use it now!

Boshen@boshen.github.io

`oxlint --type-aware`. Mic drop. It's incomplete and have numerous problems, including a noticeable performance issue. BUT, you can finally see your floating promises quickly! Example PR: github.com/rolldown/rol... Problems: t.co/K7ZVnPjOPL

It's been great to work on prototyping this! I'm really excited by typescript-go and looking forward to getting this released as soon as we can. The future is fast ⚡️

Boshen@boshen.github.io

oxlint + tsgolint = no slow down! no-floating-promises completes 4.4k files in 3.2 seconds, in the vscode repo. typescript-go is the future, all credits to the ts-go team! We just glued everything together 😀 github.com/microsoft/ty...