Sign in

Brad Zacher

@brad.zacher.com.au
811 followers 188 following 135 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/10/2026
Yeah for sure - I think as something to truly measure performance on they're completely useless. An engineer could spend weeks on a 1 line PR and have more impact than one that shipped 1000. Which is why I say "proxy metric". It can share *some* insights but it isn't an authoritative metric
000
Brad Zacher @brad.zacher.com.au · 03/10/2026
I'm still a bit of a skeptix - the slop is real and a lot of the code in the cursor repo works but it's 🤮 Buuuuuut it is hard to understate the force multiplier that agents can be. Used right you can get a lot of shit done without sacrificing quality!! bsky.app/profile/brad...
000
Brad Zacher @brad.zacher.com.au · 03/10/2026
The most complex (and slowest) pipeline has taken about 30 builds to uncover all the edge cases and get green. Each run was 1h long! The agent did and I did other work whilst it worked. It also worked overnight and had it ready a day later and I reviewed the changes when it was done.
000
Brad Zacher @brad.zacher.com.au · 03/10/2026
Working with agents has allowed me to get more things done because a lot of the high-effort, low-difficulty work I deal with the agent can do For example for the pnpm migration I didnt have to sit there iterating on CI long runs till they went green - the agent did it and I just reviewed the result
210
Brad Zacher @brad.zacher.com.au · 03/10/2026
Number of PRs landed is an interesting proxy metric for productivity, IMO. I.e. At Canva I was landing maybe 5-10 PRs a week (so 20-40/month). Landing 250 in a month is an indication I *likely* "got more done". And indeed I feel like I did get a lot more done!
210
Brad Zacher @brad.zacher.com.au · 03/10/2026
Npm downloads are a good proxy metric for adoption - there's value in it as a relative comparator. I.e. A package with 100m/w downloads is obviously more used than one with 10m/w. Is it used 10x more? No. Is it 90m more users? No. It's a fuzzy comparator. The exact number is mostly e-peen though.
100
Brad Zacher @brad.zacher.com.au · 03/10/2026
You're not wrong that I didn't review all the lines yeah. Even a tenth of that would have been hard to review. But I've found that with stacks, /thermos reviews and bugbot you can gain a lot of confidence without reviewing every single line yourself.
111
Brad Zacher @brad.zacher.com.au · 03/10/2026
*Most* of the LOC was: Removing now defunct lockfiles from migrating of bun, yarn and npm onto pnpm. Most of the deps were duplicated so deleted more than added. And there was a lot of collapsing of lines from the formatter changes. I standardised the fmt config for the entire repo.
130
Brad Zacher @brad.zacher.com.au · 03/10/2026
This month was a lot of standardisation work - 3 FE formatters down to 1 (oxfmt), 3 FE linters down to 2 (on the way to 1, oxlint). 4 package managers down to 1 (pnpm). Next month the focus will be CI - bazel across the frontend to help standardise infra and improve build times.
030
Brad Zacher @brad.zacher.com.au · 03/10/2026
15.5B tokens. 266 pull requests. 3,878,930 lines added. 5,278,449 lines removed. First month at Cursor and it was big, to say the least. It's the first time I've really leant into agents and needless to say you really can get a lot done. I landed a LOT of build infra clean ups.
250
Brad Zacher @brad.zacher.com.au · 02/10/2026
noyaml.com
noyaml.com
🚨🚨 That's a lot of YAML 🚨🚨
No body wants to write YAML. A lovingly curated list of YAML pain.
010
Brad Zacher @brad.zacher.com.au · 04/09/2026
I do this pretty much every time I build a moderately complex codebase that uses a file system. For me it usually ends up as a relative path and an absolute path type.
091
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
Brad Zacher @brad.zacher.com.au · 25/08/2026
If you're importing from a library in your repro then it mightn't be a nice, isolated repro. Whilst you can import packages into the playground - manually reconstructing the types outside the library helps to shrink down and clearly show the problem. We'll need to isolate it to create a test case.
110
Brad Zacher @brad.zacher.com.au · 25/08/2026
Please create a reproduction in our playground and file an issue in the repo.
120
Brad Zacher @brad.zacher.com.au · 26/06/2026
Same on Android
020
Brad Zacher @brad.zacher.com.au · 20/04/2026
So you're just doing the standard weekly release of @typescript-eslint.io ? :P
120
Brad Zacher @brad.zacher.com.au · 13/03/2026
If you're using the newer node versions you can even use the much more aesthetically pleasing `#/src/...`!!
130
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 · 01/03/2026
The other day I asked cursor to check my code for memory improvements and it told me that process.memoryUsage.rss() did not exist so the entire code would crash. I told it it was wrong and to its credit it did download the API docs and corrected itself.
020
Brad Zacher @brad.zacher.com.au · 08/02/2026
I have taken to call these people "agentic middlemen". They are an absolute pain but usually pretty easy to spot when either their iteration on your comment is slop, or they respond to your comment with obvious LLM written text.
010
Brad Zacher @brad.zacher.com.au · 04/02/2026
I guess if I was one of the vibers I'd have just gone "full ralph" and fired off agents on each task and then only really wasted tokens, rather than time on the useless leads... There's definite value here as a tool in the toolchain, but I still think human-first is hard to beat
010
Brad Zacher @brad.zacher.com.au · 04/02/2026
Pro: I got some (okay) recommendations for work, quickly. The good leads mostly just confirmed suspicions I had, but it felt good to get a 2nd opinion. Con: Many of the recommendations were obviously flat-out wrong -- if I wasn't as experienced I might have wasted a lot of time!
100
Brad Zacher @brad.zacher.com.au · 04/02/2026
Pro: I didn't have to learn the profiling tools or analyse the data Con: I didn't learn anything about the tools I know I can read the history to see what it did -- but it doesn't help me learn the steps. EG It wrote a python script to analyse the dump from the tools... but why?
100
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 · 24/01/2026
You can do now! It's doe "properly" as a first class option in the rule! When I have time I plan on adding some more fixers (eg unused catch variables)
010
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 · 30/12/2025
github.com/tmikov/imgui... Tzvetan had already done it as part of this toy example!
github.com
GitHub - tmikov/imgui-react-runtime: React + Dear ImGui + Static Hermes
React + Dear ImGui + Static Hermes. Contribute to tmikov/imgui-react-runtime development by creating an account on GitHub.
160
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
So I needed to generate an SSH key and add it for my local user and then it let me connect. Then I had a doozy of a time getting my remote ssh key uploaded cos I didn't have any file upload or ssh connection. I had to upload it via CURL 😱 But it's uploaded now and I have vscode connected!
010
Brad Zacher @brad.zacher.com.au · 23/12/2025
I wish it were that simple - I was getting public key errors even when doing `ssh localhost` 😭 So there's some other stuff with keys I need to setup.
100
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 · 22/12/2025
But we have the same amount of types (possibly more...?) in the estree union and I haven't noticed the bad perf. But maybe our codebases are just small enough that the cost at scale hasn't hit us bad enough to notice.
000
Brad Zacher @brad.zacher.com.au · 22/12/2025
That's not to say megamporphism wouldn't come into play in, say, an ESTree codebase - but I feel like things would probably trend towards each kind having its own hidden classes? I dunno would require some investigation to analyse and understand of course.
100
Brad Zacher @brad.zacher.com.au · 22/12/2025
I also feel like the TS codebase was a bit weird with how it did disjoint unions given it mostly passed around `ts.Node` which was not a union type and then relied on type guard fns and type assertions to change the type. It wasn't really a "standard" disjoint union usecase.
110
Brad Zacher @brad.zacher.com.au · 22/12/2025
I can't find anything specifically citing alcoholism and a number - that was an incorrect extrapolation on my part.
000
Brad Zacher @brad.zacher.com.au · 22/12/2025
On researching it appears I have misremembered numbers. At least in the US "heavy drinking" is categorised as 7 or 8 or more per week for women and 14 or 15 for men (depending on source). And those classed as heavy drinkers have a "marked increased" likelihood of "alcohol related harms".
100
Brad Zacher @brad.zacher.com.au · 22/12/2025
Which is why you don't be a silly billy and you use a switch instead ;) then it gets optimised into a jump table by e engine for fast perf!
240
Brad Zacher @brad.zacher.com.au · 22/12/2025
It is my understanding that hidden classes and megamorphism shouldn't apply to tagged unions so long as you're not actively mutating the objects to add properties to them. AIUI the HC can still be created so long as the object shape per tag is consistent and unchanging.
220
Brad Zacher @brad.zacher.com.au · 22/12/2025
6 pints a week isn't "that much" for a lot of people. Many people will have eg a glass of wine each night with dinner without batting an eye or realising that's technically alcoholisim. So the average isn't that surprising to me.
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 · 16/12/2025
I remapped it to "option+tab" on macos and my life has been so much better since. No more fighting between (correct) IDE autocomplete and (incorrect) AI autocomplete.
010
Brad Zacher @brad.zacher.com.au · 11/12/2025
We don't want your contribution if you're just a middleman! We could tag copilot on issues and let it run and create a PR without you in the middle pretending to be part of the process. Don't pretend you're contributing. Do the work (with the AI sure) and learn and contribute!
000
Brad Zacher @brad.zacher.com.au · 11/12/2025
This isn't just limited to PR either - we've seen the same behaviour with issues. I recently saw one user file a few issues that were clear and obvious output from asking the agent to plan out a piece of work. They filed an issue with well over 1000 words! And the responses...
110
Brad Zacher @brad.zacher.com.au · 11/12/2025
We've seen a number of people that are literally just acting as an agent middleman. They're asking an LLM to file a PR and then when we leave review comments they're copy pasting our comments into a chat window and copy pasting the responses. It's disappointing, honestly.
110
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 · 10/12/2025
The thing both tools have is perf - which directly translates to saved $$$ (both CI time and dev productivity). It's easy to justify investing in doing a linter migration that wins huge perf and features. It's hard to justify investing in doing the v8-v9 migration which "only" wins more features.
030
Brad Zacher @brad.zacher.com.au · 10/12/2025
Yes eslint added 25m to the download count - but that was "only" 50% growth. But Biome grew by 300% and oxlint by 600%. If more companies take the leap and migrate next year then I'd expect to see sponsorship migrate too.
120