56,966 blogs · [ { "id": "01a0875e-527c-7137-a344-19da3124fa8a", "title": "The Bun CVE Gap, Closed: Surgical Updates Land in Bun 1.4", "url": "https://charpeni.com/blog/the-bun-cve-gap-closed-surgical-updates-land-in-bun-1-4", "published_at": "2026-08-21T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da315514b7", "title": "Surgical Transitive Updates with pnpm: audit --fix", "url": "https://charpeni.com/blog/surgical-transitive-updates-with-pnpm-audit-fix", "published_at": "2026-08-06T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da323125f3", "title": "Visualizing Garmin Data and Building a Personal AI Training Assistant", "url": "https://charpeni.com/blog/visualizing-garmin-data-and-building-a-personal-ai-training-assistant", "published_at": "2026-08-04T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da32e50217", "title": "Speeding Up Checkout in a Fast-Growing Monorepo with Blacksmith", "url": "https://charpeni.com/blog/speeding-up-checkout-in-a-fast-growing-monorepo-with-blacksmith", "published_at": "2026-07-14T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da32e9e675", "title": "AI Turned Every Engineer Into a Tech Lead. Most Don't Know It Yet.", "url": "https://charpeni.com/blog/ai-turned-every-engineer-into-a-tech-lead-most-dont-know-it-yet", "published_at": "2026-06-08T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da33162b3b", "title": "The Bun CVE Gap: When Your Package Manager Can't Do Surgical Updates", "url": "https://charpeni.com/blog/the-bun-cve-gap-when-your-package-manager-cant-do-surgical-updates", "published_at": "2026-05-21T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da337390ea", "title": "Migrating from ESLint, Biome, and Prettier to Oxlint and Oxfmt", "url": "https://charpeni.com/blog/migrating-from-eslint-biome-prettier-to-oxlint-oxfmt", "published_at": "2026-05-13T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3398252d", "title": "Stop Using Yarn Classic", "url": "https://charpeni.com/blog/stop-using-yarn-classic", "published_at": "2026-05-07T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da341c72b5", "title": "Protecting Against Compromised Packages with Minimum Release Age", "url": "https://charpeni.com/blog/protecting-against-compromised-packages-with-minimum-release-age", "published_at": "2026-04-29T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da34931476", "title": "Access Your Homelab Services Without Memorizing IPs and Ports", "url": "https://charpeni.com/blog/access-homelab-services-without-memorizing-ips", "published_at": "2026-02-19T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3562731b", "title": "Bun Code Coverage Gap", "url": "https://charpeni.com/blog/bun-code-coverage-gap", "published_at": "2025-12-09T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da35ebf2ee", "title": "Configure \"Go to Definition\" to Open TypeScript Source", "url": "https://charpeni.com/blog/configure-go-to-definition-to-open-typescript-source", "published_at": "2025-11-19T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da36be2d85", "title": "Don't Blindly Use useTransition Everywhere", "url": "https://charpeni.com/blog/dont-blindly-use-usetransition-everywhere", "published_at": "2025-11-06T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3773afb5", "title": "How to Easily Reproduce a Flaky Test in Playwright", "url": "https://charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright", "published_at": "2025-03-28T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da37f7b3ca", "title": "Minimizing Risk: Properly and Safely Resolving CVEs in Your Dependencies", "url": "https://charpeni.com/blog/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies", "published_at": "2024-10-04T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da387421f8", "title": "TypeScript Tips: Safely Using includes With ReadonlyArrays", "url": "https://charpeni.com/blog/typescript-tips-safely-using-includes-with-readonlyarrays", "published_at": "2024-05-28T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3885f658", "title": "Speeding up ESLint—Even on CI", "url": "https://charpeni.com/blog/speeding-up-eslint-even-on-ci", "published_at": "2024-04-25T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da388f1f8f", "title": "Apollo Client's Hidden Gems: Interface-Based Type Policies", "url": "https://charpeni.com/blog/apollo-client-hidden-gems-interface-based-type-policies", "published_at": "2024-01-22T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da38922c66", "title": "UI Flickering With Apollo Client: Previous Data to the Rescue!", "url": "https://charpeni.com/blog/ui-flickering-with-apollo-client-previous-data-to-the-rescue", "published_at": "2023-10-10T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da38ec0d7a", "title": "GraphQL Enums Are Unsafe", "url": "https://charpeni.com/blog/graphql-enums-are-unsafe", "published_at": "2023-09-26T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da39e18588", "title": "Open-Ended Unions and Autocomplete With TypeScript", "url": "https://charpeni.com/blog/open-ended-unions-and-autocomplete-with-typescript", "published_at": "2023-09-26T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3a0fa9c8", "title": "Graphite: The End of Mammoth Pull Requests? My Experience", "url": "https://charpeni.com/blog/graphite-the-end-of-mammoth-pull-requests-my-experience", "published_at": "2023-09-25T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3a6b7dab", "title": "Testing TypeScript Types: Part 2 (Advanced Solutions)", "url": "https://charpeni.com/blog/testing-typescript-types-part-2", "published_at": "2023-08-09T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3ab8952e", "title": "Testing TypeScript Types: Part 1", "url": "https://charpeni.com/blog/testing-typescript-types-part-1", "published_at": "2023-08-08T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3b1610e9", "title": "Properly type Object.keys and Object.entries", "url": "https://charpeni.com/blog/properly-type-object-keys-and-object-entries", "published_at": "2023-08-07T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3bdd1cd9", "title": "Use Custom Merge Driver to Simplify Git Conflicts", "url": "https://charpeni.com/blog/use-custom-merge-driver-to-simplify-git-conflicts", "published_at": "2023-08-03T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3cd3d613", "title": "Enforce Best Practices Incrementally With Betterer", "url": "https://charpeni.com/blog/enforce-best-practices-incrementally-with-betterer", "published_at": "2023-08-02T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3d5cf3b2", "title": "Agile Rotisserie", "url": "https://charpeni.com/blog/agile-rotisserie", "published_at": "2022-12-20T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3d6a0b39", "title": "Be Careful With JavaScript Default Parameters!", "url": "https://charpeni.com/blog/be-careful-with-javascript-default-parameters", "published_at": "2022-11-03T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3de95a4e", "title": "Find What Commit Introduced a Bug With Git Bisect", "url": "https://charpeni.com/blog/find-what-commit-introduced-a-bug-with-git-bisect", "published_at": "2022-11-01T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3edb35e6", "title": "Array.prototype.groupBy to the rescue!", "url": "https://charpeni.com/blog/array-prototype-group-by-to-the-rescue", "published_at": "2021-12-15T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3f25c7df", "title": "Wrapping Gatsby's with TypeScript", "url": "https://charpeni.com/blog/wrapping-gatsbys-link-with-typescript", "published_at": "2021-11-30T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3f36d78f", "title": "Setting up an Example App for Your React Native Library", "url": "https://charpeni.com/blog/setting-up-an-example-app-for-your-react-native-library", "published_at": "2019-04-01T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da3f7a9308", "title": "React Native at Classcraft", "url": "https://charpeni.com/blog/react-native-at-classcraft", "published_at": "2018-07-23T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da40571d58", "title": "Arrow Functions in Class Properties Might Not Be As Great As We Think", "url": "https://charpeni.com/blog/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think", "published_at": "2017-11-16T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da4082cc65", "title": "5 Things You Should Know About ES8", "url": "https://charpeni.com/blog/5-things-you-should-know-about-es8", "published_at": "2017-07-14T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da4142f46d", "title": "Continuous Integration with Angular CLI", "url": "https://charpeni.com/blog/continuous-integration-with-angular-cli", "published_at": "2017-07-13T12:00:00+00:00" }, { "id": "01a0875e-527c-7137-a344-19da41864858", "title": "Reliable Continuous Integration in JavaScript", "url": "https://charpeni.com/blog/reliable-continuous-integration-in-javascript", "published_at": "2017-01-18T12:00:00+00:00" } ] posts Claim your blog
Back to charpeni.com
Blog · corpus.blog/blogs/charpeni.com/posts

charpeni.com

charpeni.com

2026

2025

2024

2023

2022

2021

2019

2018

2017