41554 blogs · [ { "id": "01a08791-4d48-700a-9791-e558e62474a7", "title": "Stepping Back from Open Source (Mostly)", "url": "https://joshuakgoldberg.com/blog/stepping-back-from-open-source-mostly/", "published_at": "2026-08-10T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42af39a2b", "title": "2025 In Review", "url": "https://joshuakgoldberg.com/blog/2025-in-review/", "published_at": "2026-03-08T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42d0f87f8", "title": "2025 Finances In Review", "url": "https://joshuakgoldberg.com/blog/2025-finances-in-review/", "published_at": "2026-02-12T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4373dcc80", "title": "If I Wrote a Linter, Part 4: Summary", "url": "https://joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-4-summary/", "published_at": "2025-06-10T10:02:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e437d80bce", "title": "If I Wrote a Linter, Part 3: Ecosystem", "url": "https://joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-3-ecosystem/", "published_at": "2025-05-16T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4360b615f", "title": "If I Wrote a Linter, Part 2: Developer Experience", "url": "https://joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-2-developer-experience/", "published_at": "2025-05-09T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4363e8677", "title": "If I Wrote a Linter, Part 1: Architecture", "url": "https://joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-1-architecture/", "published_at": "2025-05-04T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43592e900", "title": "Hybrid Linters: The Best of Both Worlds", "url": "https://joshuakgoldberg.com/blog/hybrid-linters-the-best-of-both-worlds/", "published_at": "2025-03-20T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e4400b74", "title": "So You've Got A Gap In Code Coverage", "url": "https://joshuakgoldberg.com/blog/so-youve-got-a-gap-in-code-coverage/", "published_at": "2025-03-05T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e25a059c", "title": "My Plans for 2025", "url": "https://joshuakgoldberg.com/blog/my-plans-for-2025/", "published_at": "2025-02-10T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42864d958", "title": "2024 In Review", "url": "https://joshuakgoldberg.com/blog/2024-in-review/", "published_at": "2025-02-03T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4294c6974", "title": "2024 Finances In Review", "url": "https://joshuakgoldberg.com/blog/2024-finances-in-review/", "published_at": "2025-01-27T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e9113125", "title": "Split Out Unrelated Changes", "url": "https://joshuakgoldberg.com/blog/split-out-unrelated-changes/", "published_at": "2025-01-13T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ea059eb1", "title": "Try...Catch As Little As Possible", "url": "https://joshuakgoldberg.com/blog/try-catch-as-little-as-possible/", "published_at": "2024-11-27T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f3ce8504", "title": "Why I'm Migrating from X to Bluesky", "url": "https://joshuakgoldberg.com/blog/why-im-migrating-from-x-to-bluesky/", "published_at": "2024-11-18T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43547b065", "title": "How I Attend a Conference", "url": "https://joshuakgoldberg.com/blog/how-i-attend-a-conference/", "published_at": "2024-10-01T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f5249f23", "title": "Why Typed Linting Needs TypeScript Today", "url": "https://joshuakgoldberg.com/blog/why-typed-linting-needs-typescript-today/", "published_at": "2024-09-23T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42ea4889e", "title": "Definitely Formatted", "url": "https://joshuakgoldberg.com/blog/definitelyformatted/", "published_at": "2024-04-30T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ed0f864c", "title": "The Cost of a Lint Rule", "url": "https://joshuakgoldberg.com/blog/the-cost-of-a-lint-rule/", "published_at": "2024-04-17T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e39c29b0", "title": "Please Stop Sending Me Nested Dependency Security Reports", "url": "https://joshuakgoldberg.com/blog/please-stop-sending-me-nested-dependency-security-reports/", "published_at": "2024-03-04T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e438b10b16", "title": "My Plans for 2024", "url": "https://joshuakgoldberg.com/blog/my-plans-for-2024/", "published_at": "2024-02-15T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e427421977", "title": "2023 In Review", "url": "https://joshuakgoldberg.com/blog/2023-in-review/", "published_at": "2024-01-31T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e427836ad6", "title": "2023 Conferences In Review", "url": "https://joshuakgoldberg.com/blog/2023-conferences-in-review/", "published_at": "2024-01-29T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f48d4db5", "title": "You Probably Don't Need `eslint-config-prettier` or `eslint-plugin-prettier`", "url": "https://joshuakgoldberg.com/blog/you-probably-dont-need-eslint-config-prettier-or-eslint-plugin-prettier/", "published_at": "2024-01-23T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e4f0d016", "title": "Rust-Based JavaScript Linters: Fast, But No Typed Linting Right Now", "url": "https://joshuakgoldberg.com/blog/rust-based-javascript-linters-fast-but-no-typed-linting-right-now/", "published_at": "2024-01-10T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e432eb29c8", "title": "TypeScript Contribution Diary: Filtering Out Types From JavaScript-Only Import Suggestions", "url": "https://joshuakgoldberg.com/blog/filter-out-types-from-js-only-import-suggestions/", "published_at": "2023-11-20T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42fa133da", "title": "Contributing to a create-typescript-app Repository", "url": "https://joshuakgoldberg.com/blog/contributing-to-a-create-typescript-app-repository/", "published_at": "2023-10-20T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43124c01f", "title": "Contributing to a create-typescript-app Repository: FAQs", "url": "https://joshuakgoldberg.com/blog/contributing-to-a-create-typescript-app-repository-faqs/", "published_at": "2023-10-20T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e6358294", "title": "Speeding Up Centered Part 5: Emoji Processing", "url": "https://joshuakgoldberg.com/blog/speeding-up-centered-part-5-emoji-processing/", "published_at": "2023-09-20T10:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e7af0073", "title": "Speeding Up Centered Part 4: Unused Code Bloat", "url": "https://joshuakgoldberg.com/blog/speeding-up-centered-part-4-unused-code-bloat/", "published_at": "2023-08-21T10:01:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e6e81809", "title": "Speeding Up Centered Part 3: Barrel Exports", "url": "https://joshuakgoldberg.com/blog/speeding-up-centered-part-3-barrel-exports/", "published_at": "2023-08-07T10:01:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e6a6e628", "title": "Speeding Up Centered Part 2: Hidden Embedded Images", "url": "https://joshuakgoldberg.com/blog/speeding-up-centered-part-2-hidden-embedded-images/", "published_at": "2023-08-07T10:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e56cd39f", "title": "Speeding Up Centered Part 1: 81 Embeds", "url": "https://joshuakgoldberg.com/blog/speeding-up-centered-part-1-81-iframe-embeds/", "published_at": "2023-07-19T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558eb05087f", "title": "The Blurry Line Between Formatting and Style", "url": "https://joshuakgoldberg.com/blog/the-blurry-line-between-formatting-and-style/", "published_at": "2023-06-19T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42c93369a", "title": "Configuring ESLint, Prettier, and TypeScript Together", "url": "https://joshuakgoldberg.com/blog/configuring-eslint-prettier-and-typescript-together/", "published_at": "2023-05-01T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4303f6775", "title": "Configuring ESLint, Prettier, and TypeScript Together: FAQs", "url": "https://joshuakgoldberg.com/blog/configuring-eslint-prettier-and-typescript-together-faqs/", "published_at": "2023-05-01T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e3d6af6f", "title": "Seven Reasons Why Conversational AI is Dangerous", "url": "https://joshuakgoldberg.com/blog/seven-reasons-why-conversational-ai-is-dangerous/", "published_at": "2023-04-01T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ed88ee6e", "title": "TypeScript Contribution Diary: Tuple Types Indexed by a Type Parameter", "url": "https://joshuakgoldberg.com/blog/tuple-types-indexed-by-type-parameter/", "published_at": "2023-03-30T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43ae360a4", "title": "My Plans for 2023", "url": "https://joshuakgoldberg.com/blog/my-plans-for-2023/", "published_at": "2023-03-23T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42db969b1", "title": "Configuring Markdownlint Alongside Prettier", "url": "https://joshuakgoldberg.com/blog/configuring-markdownlint-alongside-prettier/", "published_at": "2023-01-25T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e426d369f9", "title": "2022 In Review", "url": "https://joshuakgoldberg.com/blog/2022-in-review/", "published_at": "2023-01-07T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e434bfd402", "title": "How I Apply to Conferences", "url": "https://joshuakgoldberg.com/blog/how-i-apply-to-conferences/", "published_at": "2022-11-17T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e434fa4196", "title": "How I Apply to Conferences: FAQs", "url": "https://joshuakgoldberg.com/blog/how-i-apply-to-conferences-faqs/", "published_at": "2022-11-17T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e2e6c656", "title": "No Unattainable Intelligence", "url": "https://joshuakgoldberg.com/blog/no-unattainable-intelligence/", "published_at": "2022-09-28T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e44b49c2", "title": "Six Months of Full Time Open Source", "url": "https://joshuakgoldberg.com/blog/six-months-of-full-time-open-source/", "published_at": "2022-09-07T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558edeefcd4", "title": "Type Parameters in the \"Add Missing Function\" Codefix", "url": "https://joshuakgoldberg.com/blog/type-parameters-missing-function-codefix/", "published_at": "2022-08-09T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e874cc5a", "title": "Standards Compliant Rickrolling", "url": "https://joshuakgoldberg.com/blog/standards-compliant-rickrolling/", "published_at": "2022-04-01T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e332c385", "title": "Why Open Source Pull Requests Can Take A While", "url": "https://joshuakgoldberg.com/blog/open-source-pull-request-timing/", "published_at": "2022-03-07T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f0163280", "title": "TypeScript Contribution Diary: Allowing Code in Constructors Before `super()`", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-code-before-super/", "published_at": "2022-03-07T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f0717200", "title": "TypeScript Contribution Diary: Allowing Code in Constructors Before `super()` (Technical Overview)", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-code-before-super-technical-overview/", "published_at": "2022-03-07T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43a0c6d23", "title": "Switching a Jest Project from Babel to SWC", "url": "https://joshuakgoldberg.com/blog/jest-babel-to-swc/", "published_at": "2022-02-21T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e4349e0f94", "title": "Full Time Open Source", "url": "https://joshuakgoldberg.com/blog/full-time-open-source/", "published_at": "2022-01-22T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e439702fc7", "title": "Nature, Individuality, and Developer Empowerment", "url": "https://joshuakgoldberg.com/blog/nature-individuality-empowerment/", "published_at": "2022-01-18T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f3647930", "title": "useEffect Pet Peeve: Side Effects, Not Initialization", "url": "https://joshuakgoldberg.com/blog/use-effect-pet-peeve/", "published_at": "2021-09-08T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e431ef9434", "title": "Don't Write Bad Code", "url": "https://joshuakgoldberg.com/blog/dont-write-bad-code/", "published_at": "2021-08-19T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f1c2835f", "title": "TypeScript Contribution Diary: Improved errors for empty DOM interfaces", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-empty-dom-interfaces/", "published_at": "2021-06-22T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558e852ba93", "title": "Team Construction Pitfalls", "url": "https://joshuakgoldberg.com/blog/team-construction-pitfalls/", "published_at": "2021-01-23T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ef5483ac", "title": "Type System Game Engines", "url": "https://joshuakgoldberg.com/blog/type-system-game-engines/", "published_at": "2020-10-05T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f15a0538", "title": "TypeScript Contribution Diary: Improved Errors on Invalid Variable Names", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-invalid-name-errors/", "published_at": "2020-09-15T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f48e9d10", "title": "TypeScript Contribution Diary: // @ts-expect-error", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-ts-expect-error/", "published_at": "2020-07-12T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42bca39a0", "title": "Compassionate Onboardings as Developer Documentation", "url": "https://joshuakgoldberg.com/blog/compassionate-onboardings/", "published_at": "2020-06-11T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ebb75f8d", "title": "TSLint to ESLint Part 2: tslint-to-eslint-config", "url": "https://joshuakgoldberg.com/blog/tslint-to-eslint-config/", "published_at": "2019-11-19T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ec794e04", "title": "Thoughts as a TSLint Maintainer", "url": "https://joshuakgoldberg.com/blog/tslint-maintenance/", "published_at": "2019-11-19T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ed48f3c9", "title": "TSLint to ESLint Part 1: Historical Context", "url": "https://joshuakgoldberg.com/blog/tslint-to-eslint-history/", "published_at": "2019-11-19T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f1577fcf", "title": "TypeScript Contribution Diary: Improved Syntax Error for Enum Member Colons", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-enum-commas/", "published_at": "2019-10-21T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e42a3c79dd", "title": "Binary Arithmetic in the TypeScript Type System", "url": "https://joshuakgoldberg.com/blog/binary-arithmetic/", "published_at": "2019-10-11T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e433c8f87a", "title": "I'm Moving Blogs!", "url": "https://joshuakgoldberg.com/blog/hello-world/", "published_at": "2019-09-13T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558ee64d351", "title": "TypeScript Contribution Diary: Identifiers after Numeric Literals", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-errors-for-identifiers-after-numeric-literals/", "published_at": "2018-12-07T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e43857e0b8", "title": "Investigating Internet Explorer Exclusive Bugs in JavaScript", "url": "https://joshuakgoldberg.com/blog/investigating-internet-explorer-exclusive-bugs-in-javascript/", "published_at": "2018-10-12T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f2c06adf", "title": "TypeScript Contribution Diary: Pretty Error Counts", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-pretty-error-counts/", "published_at": "2018-04-06T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e437f6efcb", "title": "In Defense of 100% Unit Test Coverage", "url": "https://joshuakgoldberg.com/blog/in-defense-of-100-unit-test-coverage/", "published_at": "2018-03-15T00:00:00+00:00" }, { "id": "01a08791-4d48-700a-9791-e558f3250001", "title": "TypeScript Contribution Diary: Trailing Type Parameters", "url": "https://joshuakgoldberg.com/blog/typescript-contribution-diary-trailing-type-parameters/", "published_at": "2018-02-17T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e434f11bf8", "title": "How lazily instantiated classes reduced my game engines' reset times by half", "url": "https://joshuakgoldberg.com/blog/how-lazily-instantiated-classes-reduced-my-game-engines-reset-times-by-half/", "published_at": "2017-10-09T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e434be1f69", "title": "Hacking TypeScript's async/await __awaiter for jQuery 2's \"Promises\"", "url": "https://joshuakgoldberg.com/blog/hacking-typescript-async-await-awaiter-for-jquery-2-promises/", "published_at": "2017-07-02T00:00:00+00:00" }, { "id": "01a08791-4d47-701f-a08d-f6e437c0bbcc", "title": "How to show RequireJS progress with NProgress", "url": "https://joshuakgoldberg.com/blog/how-to-show-requirejs-progress-with-nprogress/", "published_at": "2016-12-28T00:00:00+00:00" } ] posts Claim your blog
Back to joshuakgoldberg.com
Blog · corpus.blog/blogs/joshuakgoldberg.com/posts

joshuakgoldberg.com

joshuakgoldberg.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016