A blog about open source, static analysis, and web dev.
New posts are shared online and posted to an RSS feed at /rss.xml .
Nov 2020 minute readRemoving type-land entries from import completions that can't be used in value-only-land.
- Contributing to a create-typescript-app Repository: FAQs
Oct 2015 minute readFAQs for contributing to my create-typescript-app project or any repository scaffolded using it.
- Contributing to a create-typescript-app Repository
Oct 2020 minute readA thorough guide through contributing to create-typescript-app or any repository scaffolded using it.
- Speeding Up Centered Part 5: Emoji Processing
Sep 2015 minute readFinding 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 Bloat
Aug 2110 minute readUsing Knip to automatically detect unused files and dependencies in the Centered repository.
- Speeding Up Centered Part 3: Barrel Exports
Aug 715 minute readAutomating changes to module imports to overcome the build system not correctly tree shaking barrel exports.
- Speeding Up Centered Part 2: Hidden Embedded Images
Aug 710 minute readFinding and removing giant unused assets hidden in marketing page to speed up that page's performance.
- Speeding Up Centered Part 1: 81 <iframe> Embeds
Jul 1915 minute readImproving a page's performance by over-eager loading most of its embedded content.
- The Blurry Line Between Formatting and Style
Jun 1910 minute readWhy separating responsibilities between your formatter and linter isn't always clear-cut.
- Configuring ESLint, Prettier, and TypeScript Together: FAQs
May 15 minute readHow I recommend getting your formatter, linter, and type checker to play together nicely.
- Configuring ESLint, Prettier, and TypeScript Together
May 130 minute readHow I recommend getting your formatter, linter, and type checker to play together nicely.
- Seven Reasons Why Conversational AI is Dangerous
Apr 110 minute readWhile 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 Parameter
Mar 3010 minute readFixing a slight bug in how TypeScript resolves type elements of tuple types indexed by type parameters.
- My Plans for 2023
Mar 2330 minute readHow I'm going to make 2023 awesome.
- Configuring Markdownlint Alongside Prettier
Jan 255 minute readUsing the common markdown linter and disabling any rules that would intersect with dedicated formatters such as Prettier.
- 2022 In Review
Jan 715 minute readLooking back at a pivotal year in my open source career.
- How I Apply to Conferences: FAQs
Nov 1720 minute readCommon questions and answers for my How I Apply To Conferences article.
- How I Apply to Conferences
Nov 1715 minute readFrom a hundred conference applications and thirty speaking roles, this is my process for submitting talks.
- No Unattainable Intelligence
Sep 285 minute readIn trying to make ourselves relatable, we reinforce the negative perception of intelligence gaps.
- Six Months of Full Time Open Source
Sep 710 minute readWhat it's like to quit your job and try to work on open source tooling full time.
- TypeScript Contribution Diary: Type Parameters in the "Add Missing Function" Codefix
Aug 925 minute readCorrects the missing function codefix to add type parameters when the function needs to be generic.
- Standards Compliant Rickrolling
Apr 110 minute readHow to create an effective rickroll site with the Vimeo Player SDK despite modern web browser autoplay restrictions.
- TypeScript Contribution Diary: Allowing Code in Constructors Before super() (Technical Overview)
Mar 725 minute readMore technical descriptions around allowing derived classes with properties to include code before `super()` call that doesn't touch `this`.
- TypeScript Contribution Diary: Allowing Code in Constructors Before super()
Mar 710 minute readAllowing 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!
- Why Open Source Pull Requests Can Take A While
Mar 710 minute readMaintenance and development costs run both ways. Open source contributors and maintainers alike have to balance their finite energy and time resources within many constraints.
- Switching a Jest Project from Babel to SWC
Feb 2115 minute readSpeeding up and simplifying the transpiler configuration for a Jest project with Speedy Web Compiler (SWC).
- Full Time Open Source
Jan 2215 minute readI'm quitting my job to become a full time open source maintainer
- Nature, Individuality, and Developer Empowerment
Jan 1815 minute readApplying learnings about how humans perceive forces of nature to how we understand code and organizations.
- useEffect Pet Peeve: Side Effects, Not Initialization
Sep 810 minute readExplaining why using useEffect to initialize values is dangerous.
- Don't Write Bad Code
Aug 1915 minute readA mantra for constantly learning to keep myself writing at my best.
- TypeScript Contribution Diary: Improved errors for empty DOM interfaces
Jun 2215 minute readGlorious hardcoding of a better error message if someone forgets to include the 'dom' lib option.
- Team Construction Pitfalls
Jan 2315 minute readHow misbalanced or poorly positioned teams restrict their developers in both the short and long term.
- Type System Game Engines
Oct 535 minute readJust for fun, what if we crafted a board game purely within TypeScript's logical type system?
- TypeScript Contribution Diary: Improved Errors on Invalid Variable Names
Sep 1515 minute readImproving the first error message emitted for invalid variable identifiers.
- TypeScript Contribution Diary: // @ts-expect-error
Jul 1225 minute readAdding a new comment directive to the TypeScript compiler.
- Compassionate Onboardings as Developer Documentation
Jun 1110 minute readHow to use the energy of new employees to keep documentation up-to-date and useful.
- Thoughts as a TSLint Maintainer
Nov 1915 minute readMaintaining TSLint was a wonderful mixed bag of shenanigans. Let's talk about it.
- TSLint to ESLint Part 2: tslint-to-eslint-config
Nov 1915 minute readNow 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 Context
- TypeScript Contribution Diary: Improved Syntax Error for Enum Member Colons
Oct 2110 minute readA quick syntax parsing improvement for incorrectly formatted enums.
- Binary Arithmetic in the TypeScript Type System
Oct 1120 minute readJust for fun, what if we represented binary values purely within TypeScript's logical type system?
- I'm Moving Blogs!
Sep 135 minute readMedium can eat it. I'm going open source with Gatsby!
- TypeScript Contribution Diary: Identifiers after Numeric Literals
Dec 720 minute readHow I made TypeScript's parsing of name characters after numbers conform to the ECMAScript specification just a bit more strictly.
Oct 1220 minute readIE users are users too!
- TypeScript Contribution Diary: Pretty Error Counts
Apr 615 minute readHow I helped add an 'errors summary' to TypeScript's command-line --pretty --watch mode.
- In Defense of 100% Unit Test Coverage
Mar 1520 minute readOr: How to suddenly anger everybody, everywhere!
- TypeScript Contribution Diary: Trailing Type Parameters
Feb 1710 minute readHow I contributed a change to TypeScript that allowed trailing commas in type parameter/argument lists.
- How lazily instantiated classes reduced my game engines' reset times by half
Oct 95 minute readUsing 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 215 minute readManipulating the details of TypeScript's emitted code to wrestle jQuery 2's older asynchronous constructs to work with modern `async`/`await`.
- How to show RequireJS progress with NProgress
Dec 2810 minute readUsing the popular NProgress library to visualize load progress on sites built on the AMD RequireJS loader