Goldblog
A blog about open source, static analysis, and web dev.
New posts are shared online and posted to an RSS feed at /rss.xml .
2025
If I Wrote a Linter, Part 4: SummaryJun 105 minute read
Summarizing the last three posts of ideas for a new linter, along with next steps for its Flint prototype.
If I Wrote a Linter, Part 3: EcosystemMay 1615 minute read
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.
If I Wrote a Linter, Part 2: Developer ExperienceMay 930 minute read
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.
If I Wrote a Linter, Part 1: ArchitectureMay 415 minute read
This how I would architect a modern linter from scratch: focusing on built-in TypeScript support, a straightforward rule development experience, and deduplicating tooling.
Hybrid Linters: The Best of Both WorldsMar 2015 minute read
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.
So You've Got A Gap In Code CoverageMar 510 minute read
This is my standard explainer for pull request reviews where changed lines aren't covered by unit tests.
2024 In ReviewFeb 320 minute read
Looking back at the accomplishments and goals from my third year as a full-time independent open source maintainer.
2024 Finances In ReviewJan 2710 minute read
Breaking down the income streams and totals from my third year as a full-time independent open source maintainer.
Split Out Unrelated ChangesJan 1310 minute read
This is a general explainer for pull request reviews where I think unrelated changes should be split into a separate PR.
2024
Try...Catch As Little As PossibleNov 2710 minute read
This is a general explainer for pull request reviews where a try...catch statement is used more than I think it needs to be.
Why I'm Migrating from X to BlueskyNov 1810 minute read
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.
How I Attend a ConferenceOct 120 minute read
From attending a few dozen conferences and co-organizing one of my own, this is how I make the most of in-person event.
Why Typed Linting Needs TypeScript TodaySep 2310 minute read
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.
Definitely FormattedApr 3020 minute read
How we migrated the massive DefinitelyTyped repository from using a linter for formatting to the dprint formatter.
The Cost of a Lint RuleApr 175 minute read
Explaining why deep work can be so difficult in open source.
Please Stop Sending Me Nested Dependency Security ReportsMar 45 minute read
Security is important. Overusing report mechanisms for non-actionable noise is counterproductive.
2023 In ReviewJan 3120 minute read
Looking back at my second year as a full-time independent open source maintainer.
2023 Conferences In ReviewJan 2920 minute read
Recapping the fantastic in-person conferences I attended in 2023.
You Probably Don't Need eslint-config-prettier or eslint-plugin-prettierJan 2310 minute read
Explaining two popular Prettier integrations for ESLint, and why I avoid both of them.
Rust-Based JavaScript Linters: Fast, But No Typed Linting Right NowJan 1015 minute read
Explaining why the speed gains from Rust linters aren't comparable to the full feature set of typescript-eslint.
2023
TypeScript Contribution Diary: Filtering Out Types From JavaScript-Only Import SuggestionsNov 2015 minute read
Removing type-land entries from import completions that can't be used in value-only-land.
Contributing to a create-typescript-app RepositoryOct 2015 minute read
A thorough guide through contributing to create-typescript-app or any repository scaffolded using it.
Contributing to a create-typescript-app Repository: FAQsOct 2010 minute read
FAQs for contributing to my create-typescript-app project or any repository scaffolded using it.
Speeding Up Centered Part 5: Emoji ProcessingSep 2010 minute read
Finding and eliminating thousands of calls to recreate a giant regular expression in a popular open source emoji plugin.
Speeding Up Centered Part 4: Unused Code BloatAug 215 minute read
Using Knip to automatically detect unused files and dependencies in the Centered repository.
Speeding Up Centered Part 3: Barrel ExportsAug 710 minute read
Automating changes to module imports to overcome the build system not correctly tree shaking barrel exports.
Speeding Up Centered Part 2: Hidden Embedded ImagesAug 710 minute read
Finding and removing giant unused assets hidden in marketing page to speed up that page's performance.
Speeding Up Centered Part 1: 81 <iframe> EmbedsJul 1910 minute read
Improving a page's performance by over-eager loading most of its embedded content.
The Blurry Line Between Formatting and StyleJun 1910 minute read
Why separating responsibilities between your formatter and linter isn't always clear-cut.
Configuring ESLint, Prettier, and TypeScript TogetherMay 120 minute read
How I recommend getting your formatter, linter, and type checker to play together nicely.
Configuring ESLint, Prettier, and TypeScript Together: FAQsMay 15 minute read
How I recommend getting your formatter, linter, and type checker to play together nicely.
Seven Reasons Why Conversational AI is DangerousApr 15 minute read
While AI systems such as OpenAI and ChatGPT can be helpful in certain situations, there are also significant risks associated with their use.
TypeScript Contribution Diary: Tuple Types Indexed by a Type ParameterMar 3010 minute read
Fixing a slight bug in how TypeScript resolves type elements of tuple types indexed by type parameters.
Configuring Markdownlint Alongside PrettierJan 255 minute read
Using the common markdown linter and disabling any rules that would intersect with dedicated formatters such as Prettier.
2022
How I Apply to Conferences: FAQsNov 1715 minute read
Common questions and answers for my How I Apply To Conferences article.
How I Apply to ConferencesNov 1710 minute read
From a hundred conference applications and thirty speaking roles, this is my process for submitting talks.
No Unattainable IntelligenceSep 285 minute read
In trying to make ourselves relatable, we reinforce the negative perception of intelligence gaps.
Six Months of Full Time Open SourceSep 710 minute read
What it's like to quit your job and try to work on open source tooling full time.
Type Parameters in the "Add Missing Function" CodefixAug 920 minute read
Corrects the missing function codefix to add type parameters when the function needs to be generic.
Standards Compliant RickrollingApr 110 minute read
How to create an effective rickroll site with the Vimeo Player SDK despite modern web browser autoplay restrictions.
Why Open Source Pull Requests Can Take A WhileMar 75 minute read
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.
TypeScript Contribution Diary: Allowing Code in Constructors Before super()Mar 710 minute read
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!
TypeScript Contribution Diary: Allowing Code in Constructors Before super() (Technical Overview)Mar 715 minute read
More technical descriptions around allowing derived classes with properties to include code before `super()` call that doesn't touch `this`.
Switching a Jest Project from Babel to SWCFeb 2110 minute read
Speeding up and simplifying the transpiler configuration for a Jest project with Speedy Web Compiler (SWC).
Full Time Open SourceJan 2210 minute read
I'm quitting my job to become a full time open source maintainer
Nature, Individuality, and Developer EmpowermentJan 1810 minute read
Applying learnings about how humans perceive forces of nature to how we understand code and organizations.
2021
useEffect Pet Peeve: Side Effects, Not InitializationSep 810 minute read
Explaining why using useEffect to initialize values is dangerous.
Don't Write Bad CodeAug 1910 minute read
A mantra for constantly learning to keep myself writing at my best.
TypeScript Contribution Diary: Improved errors for empty DOM interfacesJun 2210 minute read
Glorious hardcoding of a better error message if someone forgets to include the 'dom' lib option.
Team Construction PitfallsJan 2310 minute read
How misbalanced or poorly positioned teams restrict their developers in both the short and long term.
2020
Type System Game EnginesOct 525 minute read
Just for fun, what if we crafted a board game purely within TypeScript's logical type system?
TypeScript Contribution Diary: Improved Errors on Invalid Variable NamesSep 1510 minute read
Improving the first error message emitted for invalid variable identifiers.
TypeScript Contribution Diary: // @ts-expect-errorJul 1220 minute read
Adding a new comment directive to the TypeScript compiler.
Compassionate Onboardings as Developer DocumentationJun 1110 minute read
How to use the energy of new employees to keep documentation up-to-date and useful.
2019
Thoughts as a TSLint MaintainerNov 1910 minute read
Maintaining TSLint was a wonderful mixed bag of shenanigans. Let's talk about it.
TSLint to ESLint Part 2: tslint-to-eslint-configNov 1910 minute read
Now that TSLint is being deprecated, let's look at how tslint-to-eslint-config converts your TSLint configuration to ESLint.
TSLint to ESLint Part 1: Historical ContextNov 1910 minute read
Now that TSLint is being deprecated, let's look at the history of JavaScript and TypeScript linting.
TypeScript Contribution Diary: Improved Syntax Error for Enum Member ColonsOct 2110 minute read
A quick syntax parsing improvement for incorrectly formatted enums.
Binary Arithmetic in the TypeScript Type SystemOct 1115 minute read
Just for fun, what if we represented binary values purely within TypeScript's logical type system?
2018
TypeScript Contribution Diary: Identifiers after Numeric LiteralsDec 715 minute read
How I made TypeScript's parsing of name characters after numbers conform to the ECMAScript specification just a bit more strictly.
Investigating Internet Explorer Exclusive Bugs in JavaScriptOct 1215 minute read
IE users are users too!
TypeScript Contribution Diary: Pretty Error CountsApr 610 minute read
How I helped add an 'errors summary' to TypeScript's command-line --pretty --watch mode.
In Defense of 100% Unit Test CoverageMar 1515 minute read
Or: How to suddenly anger everybody, everywhere!
TypeScript Contribution Diary: Trailing Type ParametersFeb 175 minute read
How I contributed a change to TypeScript that allowed trailing commas in type parameter/argument lists.
2017
How lazily instantiated classes reduced my game engines' reset times by halfOct 95 minute read
Using lazily instantiated, dynamic classes instead of hand-written functions to reduce unnecessary work during loads.
Hacking TypeScript's async/await __awaiter for jQuery 2's "Promises"Jul 210 minute read
Manipulating the details of TypeScript's emitted code to wrestle jQuery 2's older asynchronous constructs to work with modern `async`/`await`.
2016
How to show RequireJS progress with NProgressDec 285 minute read
Using the popular NProgress library to visualize load progress on sites built on the AMD RequireJS loader