Stepping Back from Open Source (Mostly)
Leaving most of my open source projects in security mode and/or with other maintainers.
A blog about open source, static analysis, and web dev.
Leaving most of my open source projects in security mode and/or with other maintainers.
Looking back at the accomplishments and goals from my fourth and final year as a full-time independent open source maintainer.
Breaking down the income streams and totals from my fourth and final year as a full-time independent open source maintainer.
Summarizing the last three posts of ideas for a new linter, along with next steps for its Flint prototype.
This is how I would steer a new ecosystem around a modern linter from scratch: emphasizing shared terminology, a plugin registry, and one-way compatibility layers.
This is how I would tailor the developer experience for a modern linter from scratch: focusing on end-to-end type safety, self-apparent configs, and native workspaces.
This is how I would architect a modern linter from scratch: focusing on built-in TypeScript support, a straightforward rule development experience, and deduplicating tooling.
Native speed for parsing and type checking is wonderful. I also want the huge benefits of writing lint rules in an ecosystem's primary language. Here's how I think we can have both.
This is my standard explainer for pull request reviews where changed lines aren't covered by unit tests.
How I'm going to make my 2025 impactful.
Looking back at the accomplishments and goals from my third year as a full-time independent open source maintainer.
Breaking down the income streams and totals from my third year as a full-time independent open source maintainer.
This is a general explainer for pull request reviews where I think unrelated changes should be split into a separate PR.
This is a general explainer for pull request reviews where a try...catch statement is used more than I think it needs to be.
Twitter has been a core part of my web development career for over a decade. But Twitter's been replaced by the vastly inferior X. Here's why I'm finally ready to commit to Bluesky.
From attending a few dozen conferences and co-organizing one of my own, this is how I make the most of in-person event.
Typed linting is powerful but requires a full type checker to function well. Today, that means TypeScript. This is why we haven't found a suitable replacement yet.
How we migrated the massive DefinitelyTyped repository from using a linter for formatting to the dprint formatter.
Explaining why deep work can be so difficult in open source.
Security is important. Overusing report mechanisms for non-actionable noise is counterproductive.
How I'm going to make my 2024 beautiful.
Looking back at my second year as a full-time independent open source maintainer.
Recapping the fantastic in-person conferences I attended in 2023.
Explaining two popular Prettier integrations for ESLint, and why I avoid both of them.
Explaining why the speed gains from Rust linters aren't comparable to the full feature set of typescript-eslint.
Removing type-land entries from import completions that can't be used in value-only-land.
FAQs for contributing to my create-typescript-app project or any repository scaffolded using it.
A thorough guide through contributing to create-typescript-app or any repository scaffolded using it.
Finding and eliminating thousands of calls to recreate a giant regular expression in a popular open source emoji plugin.
Using Knip to automatically detect unused files and dependencies in the Centered repository.
Automating changes to module imports to overcome the build system not correctly tree shaking barrel exports.
Finding and removing giant unused assets hidden in marketing page to speed up that page's performance.
Improving a page's performance by over-eager loading most of its embedded content.
Why separating responsibilities between your formatter and linter isn't always clear-cut.
How I recommend getting your formatter, linter, and type checker to play together nicely.
How I recommend getting your formatter, linter, and type checker to play together nicely.
While AI systems such as OpenAI and ChatGPT can be helpful in certain situations, there are also significant risks associated with their use.
Fixing a slight bug in how TypeScript resolves type elements of tuple types indexed by type parameters.
How I'm going to make 2023 awesome.
Using the common markdown linter and disabling any rules that would intersect with dedicated formatters such as Prettier.
Looking back at a pivotal year in my open source career.
Common questions and answers for my How I Apply To Conferences article.
From a hundred conference applications and thirty speaking roles, this is my process for submitting talks.
In trying to make ourselves relatable, we reinforce the negative perception of intelligence gaps.
What it's like to quit your job and try to work on open source tooling full time.
Corrects the missing function codefix to add type parameters when the function needs to be generic.
How to create an effective rickroll site with the Vimeo Player SDK despite modern web browser autoplay restrictions.
Maintenance and development costs run both ways. Open source contributors and maintainers alike have to balance their finite energy and time resources within many constraints.
More technical descriptions around allowing derived classes with properties to include code before `super()` call that doesn't touch `this`.
Allowing derived classes with properties to include code before `super()` call that doesn't touch `this`. A grand pull request three years in the making -- with cake!