Sign in

Brad Zacher

@brad.zacher.com.au
811 followers 188 following 124 posts

Computer scientist. Cider drinker. Dungeon Master. Maintainer of @typescript-eslint.io Software Engineer @ Cursor (prev Canva, Meta). zacher.com.au

PostsRepliesMedia
Brad Zacher @brad.zacher.com.au · 04/09/2026
Today is my last day at Canva. It's been a blast and I've thoroughly enjoyed working there for the past 4 years. But it's time for the next adventure. Sunday I fly to SF and next week I'll be joining Cursor working on developer productivity. I couldn't be more excited!!!
3130
Reposted by Brad Zacher
TypeScript-ESLint @typescript-eslint.io · 10/03/2026
Thanks to @notion.com for the $6,000 donation! Amazing to see companies supporting their dependencies in such a big way 🎉
1393
Brad Zacher @brad.zacher.com.au · 04/02/2026
Used an agent for profiling for the first time today. It was pretty cool to let it just run some tools and try to find some potential improvements. It came up with some vague suggestions I was able to grow and iterate on for some decent wins!
110
Brad Zacher @brad.zacher.com.au · 13/01/2026
We added a fixer for unused imports to no-unused-vars! By default it's a suggestion fixer - but you can swap it to an autofixer (for autofix-on-save or --fix). Please try it out today!
0191
Reposted by Brad Zacher
TypeScript-ESLint @typescript-eslint.io · 05/01/2026
📝 New blog post: Revamping the `ban-types` rule. For many years, ban-types was one of our more prominent rules. We split it into targeted rules that better addressed common user needs. Read on for how it came to be & what those new rules do better! typescript-eslint.io/blog/revampi...
typescript-eslint.io
Revamping the `ban-types` rule | typescript-eslint
How the now-deprecated `ban-types` rule evolved over time to what is now several newer, targeted rules.
0132
Brad Zacher @brad.zacher.com.au · 27/12/2025
If you look closely and squint you can just barely make out which week I landed several hundred PRs to migrate some of Canva's codebase to isolatedDeclarations
Screenshot of github's contribution dot visualisation where almost every square is muted green meaning "less contributions" except for one week which is bright green meaning "more contributions".

The visualisation is meant to work like a heat map, but because the number of contributions in that week was many hundreds of times greater than the other weeks, it's colours ruined the scale making everything else the same, indistinguishable colour.
1260
Brad Zacher @brad.zacher.com.au · 23/12/2025
I have setup my first "home lab" with proxmox! For my first VM I setup a remote devbox! It took waaaay longer to get it working than I'd care to admit... But I can connect to it via vscode and everything! Now to spin up a few more VMs for things I've always wanted to run...
010
Brad Zacher @brad.zacher.com.au · 23/12/2025
Has anyone got a good guide to setting up a Ubuntu machine to accept (local) SSH connections? Configuring the base image from scratch is not super easy when you've never done it before :harold:
100
Brad Zacher @brad.zacher.com.au · 21/12/2025
Okay I just got a Beelink SER9 for use as my remote devbox and server host. Now to figure out how to install linux on it... boy it's been a long while since I've done this.
020
Brad Zacher @brad.zacher.com.au · 11/12/2025
If I ever see someone's comment and it says "you're absolutely right" I now automatically assume that they are either an LLM bot or that they're copy pasting from one. It's such a shame that we have to deal with this slop contribution in our opensource projects.
250
Brad Zacher @brad.zacher.com.au · 08/12/2025
One major issue I've found with package.json imports over tsconfig paths is usage across "boundaries". A package.json import spec cannot include a file outside the current dir -- eg it can't start with `../`! They also don't "bubble" through nested package.jsons!
110
Brad Zacher @brad.zacher.com.au · 14/11/2025
My #BazelCon 2025 talk about how Canva used isolatedDeclarations to greatly improve typecheck performance youtu.be/26CoMExb6FE
youtu.be
Improving Bazel TypeScript Type-Checks With IsolatedDeclarations - Brad Zacher, Canva
YouTube video by BazelCon
1157
Brad Zacher @brad.zacher.com.au · 13/11/2025
It's been a great few days in Atlanta for #BazelCon. Met lots of great people. Learned a bunch about bazel and the community around it. And (finally) gave my first conference talk!
Picture of my conference badge.
The badge reads:

BazelCon 2025
Brad Zacher
Canva
Speaker
040
Reposted by Brad Zacher
Josh Ghoulberg 👻 @joshuakgoldberg.com · 03/10/2025
Folks ask us in @typescript-eslint.io about typed linting perf optimizations often. There's a lot of work we *want* to do but can't - so we put our deep explainer in an issue. github.com/typescript-e... Enjoy!
github.com
Typed linting optimizations blocked by ESLint core · Issue #11677 · typescript-eslint/typescript-eslint
Suggestion tl;dr: We get asked pretty frequently about improving the state of cross-file linting, e.g. typed linting, in ESLint core. Most requests are around performance, with others around core E...
2162
Brad Zacher @brad.zacher.com.au · 11/09/2025
Today I learned that git and github support emojis in branch names. Do with that information what you will.
240
Brad Zacher @brad.zacher.com.au · 06/09/2025
We've had a few people ask about type-aware linting, eslint's new concurrent linting mode, and why they don't play well together. So we (the ts-eslint team) wrote a short post breaking down why and the design limitations we're constrained by. github.com/typescript-e...
github.com
Interaction with multithread linting · typescript-eslint typescript-eslint · Discussion #11568
Body ESlint v9.34.0 has added support for multithread linting: https://eslint.org/blog/2025/08/multithread-linting/ One word that isn't mentioned in that blog post is "TypeScript." If you use linti...
2405
Brad Zacher @brad.zacher.com.au · 02/09/2025
TypeScript-ESLint v8.42.0 has been released! This is our first release with npm provenance! Shoutout to @jameshenry.bsky.social for the hard work securing our release pipeline. github.com/typescript-e...
github.com
Release v8.42.0 · typescript-eslint/typescript-eslint
8.42.0 (2025-09-02) 🚀 Features deprecate tseslint.config() (#11531) 🩹 Fixes deps: update eslint monorepo to v9.33.0 (#11482) typescript-eslint: handle non-normalized windows paths produced by ji...
080
Brad Zacher @brad.zacher.com.au · 24/07/2025
Been seeing an uptick in what are clearly vibe-coded PRs. On the surface this seems great -- more contributors! But in the reality it's often AI slop that the person hasn't reviewed and instead the burden of review is on us, the maintainers -- which is a horrible trade.
Panel 1: Bus driver saying "Don't make me tap the sign"
Panel 2: The bus driver tapping a sign that says "Engineers must review all AI generated code"
57414
Brad Zacher @brad.zacher.com.au · 12/02/2025
I asked cursor's AI agent to try to create a small TUI form. It went HORRIBLY. After a while it declared the task as done despite numerous compiler errors. When I told it that it wasn't done. This was the agent's response:
220
Brad Zacher @brad.zacher.com.au · 28/12/2024
Without downloading any new pics what's your energy going into 2025
This is the worst code I've written
This is the worst code you've written so far
050
Brad Zacher @brad.zacher.com.au · 12/12/2024
I've been doing a bunch of work on a meta-linter of sorts and so I need to ingest results from many different linters. A really painful problem I've discovered recently is that nobody is consistent about how to define a "location" in text. It's a surprisingly complex space to try and reconcile!
482
Brad Zacher @brad.zacher.com.au · 26/11/2024
I finally started using copilot a few weeks ago. As a skeptic I didn't think that I'd like it so I was surprised to find I actually have found value in it. (Humble brag) I've met very few people who can pump out code as fast as I can. So I didn't think that copilot would really make me much faster.
110
Brad Zacher @brad.zacher.com.au · 25/11/2024
The most frustrating thing about providing support to someone is when they use words like "this / that / it". I tried that, but it errored Tried what? What error? Show what you tried! There's a good chance you did "it" wrong! After all that's why you're asking for help.
000
Reposted by Brad Zacher
TypeScript-ESLint @typescript-eslint.io · 18/11/2024
TypeScript-ESLint v8.15.0 has been released! This release includes: - a fix for the recent crash introduced with ESLint v9.15.0 - support for arrays in `tseslint.config` (no more spreads necessary!) - a new rule `no-unsafe-type-assertion` - and more...! github.com/typescript-e...
github.com
Release v8.15.0 · typescript-eslint/typescript-eslint
8.15.0 (2024-11-18) 🚀 Features eslint-plugin: added related-getter-setter-pairs rule (#10192) eslint-plugin: new rule no-unsafe-type-assertion (#10051) eslint-plugin: [prefer-nullish-coalescing] f...
0181
Brad Zacher @brad.zacher.com.au · 14/11/2024
It's good to know that AI is still a long way off taking my job
030
Brad Zacher @brad.zacher.com.au · 10/11/2024
I made/maintained a lot of the lint rules people have a love hate relationship with.
040
Reposted by Brad Zacher
Brad Zacher @brad.zacher.com.au · 10/11/2024
"cast"? Sir it's not a cast unless it's from the native region of programming languages. Otherwise it's a sparkling assertion.
171
Reposted by Brad Zacher
Cassidy @cassidoo.co · 07/11/2024
I want to CREATE something but all of my energy is being used to merely exist right now
4995493
Reposted by Brad Zacher
Ryan Cavanaugh @searyanc.dev · 07/11/2024
Thanks for filing this issue. We generally look at bug reports in order of most-succinct repro to most-complex repro. We have currently scheduled this one for three weeks after the heat death of the universe.
7936
Brad Zacher @brad.zacher.com.au · 05/11/2024
I made an eslint utility that allows finer control over no-restricted-syntax/globals/properties configurations. In a nutshell it generates a plugin that has one rule per selector -- allowing granular disable comments and better auditing! github.com/bradzacher/e...
github.com
GitHub - bradzacher/eslint-no-restricted: An eslint plugin for quickly and easily creating no-restricted-syntax rules
An eslint plugin for quickly and easily creating no-restricted-syntax rules - bradzacher/eslint-no-restricted
130
Reposted by Brad Zacher
Josh Ghoulberg 👻 @joshuakgoldberg.com · 05/11/2024
👋 Welcome to Bsky, everyone! I'm jumping on the starter pack bandwagon and making one for the static analysis folks around JavaScript/TypeScript. Projects like ESLint, TypeScript, and new fancy versions of them all. Who else should go on it? go.bsky.app/5hwBPTK
2312821
Reposted by Brad Zacher
Josh Ghoulberg 👻 @joshuakgoldberg.com · 06/03/2024
✨ @brad.zacher.com.au and I are going to hop onto a Twitch stream to talk about typescript-eslint intricacies. We'll deep dive into source parsing, ecosystem compatibility, and all sorts of great nuances. Fun! 4pm EST this Thursday the 7th / 7:30am AEST the 8th www.twitch.tv/joshuakgoldb...
twitch.tv
joshuakgoldberg Schedule - Twitch
Check out joshuakgoldberg stream schedule, and set reminders so you don’t miss out!
021