# Nicolas Charpentier's Blog > Personal blog of Nicolas Charpentier, a Software Engineer specializing in React Native, React, GraphQL, and Continuous Integration. Open source enthusiast focused on frontend architecture, infrastructure, and improving developer experience. ## About Nicolas Charpentier is a Software Engineer who describes himself as someone doing the "backend" work of the frontend: frontend architecture and infrastructure. Currently working at Shortcut. ## Blog Posts All blog posts are available in markdown format at `/api/blog/{slug}.md` ### AI Turned Every Engineer Into a Tech Lead. Most Don't Know It Yet. - Canonical URL: https://charpeni.com/blog/ai-turned-every-engineer-into-a-tech-lead-most-dont-know-it-yet - Markdown URL: https://charpeni.com/api/blog/ai-turned-every-engineer-into-a-tech-lead-most-dont-know-it-yet.md - Published: 2026-06-08 - Tags: `ai` - Summary: My Take on AI as of June 2026. Most people say AI kills the creativity and the fun in building. I want to offer the other side: managing agents feels a lot like the tech lead job I already loved. - Best cited for: `ai` - My Take on AI as of June 2026. Most people say AI kills the creativity and the fun in building. I want to offer the other side: managing agents feels a lot... ### The Bun CVE Gap: When Your Package Manager Can't Do Surgical Updates - Canonical URL: https://charpeni.com/blog/the-bun-cve-gap-when-your-package-manager-cant-do-surgical-updates - Markdown URL: https://charpeni.com/api/blog/the-bun-cve-gap-when-your-package-manager-cant-do-surgical-updates.md - Published: 2026-05-21 - Tags: `dependencies`, `security`, `tooling`, `bun` - Summary: Yarn Berry, pnpm, and npm all support surgical CVE remediation. Bun, today, doesn't. Here's what I found when I tried to apply my own workflow to a Bun project. - Best cited for: `dependencies`, `security`, `tooling`, `bun` - Yarn Berry, pnpm, and npm all support surgical CVE remediation. Bun, today, doesn't. Here's what I found when I tried to apply my own workflow to a Bun project. ### Migrating from ESLint, Biome, and Prettier to Oxlint and Oxfmt - Canonical URL: https://charpeni.com/blog/migrating-from-eslint-biome-prettier-to-oxlint-oxfmt - Markdown URL: https://charpeni.com/api/blog/migrating-from-eslint-biome-prettier-to-oxlint-oxfmt.md - Published: 2026-05-13 - Tags: `eslint`, `oxlint`, `performance`, `tooling` - Summary: I tasked an agent to migrate our monorepo from a mix of ESLint, Biome, and Prettier to Oxlint and Oxfmt. The full lint pipeline went from 81s to 2.5s. - Best cited for: `eslint`, `oxlint`, `performance`, `tooling` - I tasked an agent to migrate our monorepo from a mix of ESLint, Biome, and Prettier to Oxlint and Oxfmt. The full lint pipeline went from 81s to 2.5s. ### Stop Using Yarn Classic - Canonical URL: https://charpeni.com/blog/stop-using-yarn-classic - Markdown URL: https://charpeni.com/api/blog/stop-using-yarn-classic.md - Published: 2026-05-07 - Tags: `dependencies`, `security`, `yarn`, `tooling` - Summary: Yarn Classic is frozen, and its lack of recursive transitive updates is becoming a real liability in an era where CVEs land weekly. It's time to move on. - Best cited for: `dependencies`, `security`, `yarn`, `tooling` - Yarn Classic is frozen, and its lack of recursive transitive updates is becoming a real liability in an era where CVEs land weekly. It's time to move on. ### Protecting Against Compromised Packages with Minimum Release Age - Canonical URL: https://charpeni.com/blog/protecting-against-compromised-packages-with-minimum-release-age - Markdown URL: https://charpeni.com/api/blog/protecting-against-compromised-packages-with-minimum-release-age.md - Published: 2026-04-29 - Tags: `dependencies`, `security`, `tooling` - Summary: Leverage your package manager's minimum release age setting to delay the installation of freshly published versions and reduce the risk of pulling in a compromised package. - Best cited for: `dependencies`, `security`, `tooling` - Leverage your package manager's minimum release age setting to delay the installation of freshly published versions and reduce the risk of pulling in a... ### Access Your Homelab Services Without Memorizing IPs and Ports - Canonical URL: https://charpeni.com/blog/access-homelab-services-without-memorizing-ips - Markdown URL: https://charpeni.com/api/blog/access-homelab-services-without-memorizing-ips.md - Published: 2026-02-19 - Tags: `homelab` - Summary: How I made my homelab services easily accessible with a Heimdall dashboard, local domain names via mDNS, and default ports. - Best cited for: `homelab` - How I made my homelab services easily accessible with a Heimdall dashboard, local domain names via mDNS, and default ports. ### Bun Code Coverage Gap - Canonical URL: https://charpeni.com/blog/bun-code-coverage-gap - Markdown URL: https://charpeni.com/api/blog/bun-code-coverage-gap.md - Published: 2025-12-09 - Tags: `testing`, `bun` - Summary: Bun's test runner only tracks coverage for loaded files. Here's how to expose the gaps. - Best cited for: `testing`, `bun` - Bun's test runner only tracks coverage for loaded files. Here's how to expose the gaps. ### Configure "Go to Definition" to Open TypeScript Source - Canonical URL: https://charpeni.com/blog/configure-go-to-definition-to-open-typescript-source - Markdown URL: https://charpeni.com/api/blog/configure-go-to-definition-to-open-typescript-source.md - Published: 2025-11-19 - Tags: `typescript` - Summary: Learn how to fix "Go to Definition" navigating to type declarations instead of source files in TypeScript projects. - Best cited for: `typescript` - Learn how to fix "Go to Definition" navigating to type declarations instead of source files in TypeScript projects. ### Don't Blindly Use useTransition Everywhere - Canonical URL: https://charpeni.com/blog/dont-blindly-use-usetransition-everywhere - Markdown URL: https://charpeni.com/api/blog/dont-blindly-use-usetransition-everywhere.md - Published: 2025-11-06 - Tags: `react`, `performance` - Summary: Let's take a closer look at useTransition and why the React Docs example might not be a great starting point for real-world UX. - Best cited for: `react`, `performance` - Let's take a closer look at useTransition and why the React Docs example might not be a great starting point for real-world UX. ### How to Easily Reproduce a Flaky Test in Playwright - Canonical URL: https://charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright - Markdown URL: https://charpeni.com/api/blog/how-to-easily-reproduce-a-flaky-test-in-playwright.md - Published: 2025-03-28 - Tags: `testing`, `ci`, `playwright` - Summary: Stop playing whack-a-mole with flaky Playwright tests by using CPU throttling to reliably reproduce CI failures on your local machine. - Best cited for: `testing`, `ci`, `playwright` - Stop playing whack-a-mole with flaky Playwright tests by using CPU throttling to reliably reproduce CI failures on your local machine. ### Minimizing Risk: Properly and Safely Resolving CVEs in Your Dependencies - Canonical URL: https://charpeni.com/blog/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies - Markdown URL: https://charpeni.com/api/blog/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies.md - Published: 2024-10-04 - Tags: `dependencies`, `security`, `tooling` - Summary: How to properly and safely update dependencies to resolve CVEs, while also gathering an understanding of how package managers handle dependencies. - Best cited for: `dependencies`, `security`, `tooling` - How to properly and safely update dependencies to resolve CVEs, while also gathering an understanding of how package managers handle dependencies. ### TypeScript Tips: Safely Using includes With ReadonlyArrays - Canonical URL: https://charpeni.com/blog/typescript-tips-safely-using-includes-with-readonlyarrays - Markdown URL: https://charpeni.com/api/blog/typescript-tips-safely-using-includes-with-readonlyarrays.md - Published: 2024-05-28 - Tags: `typescript` - Summary: How to use includes on ReadonlyArrays while retaining type safety and narrowing down the type. - Best cited for: `typescript` - How to use includes on ReadonlyArrays while retaining type safety and narrowing down the type. ### Speeding up ESLint—Even on CI - Canonical URL: https://charpeni.com/blog/speeding-up-eslint-even-on-ci - Markdown URL: https://charpeni.com/api/blog/speeding-up-eslint-even-on-ci.md - Published: 2024-04-25 - Tags: `ci`, `eslint`, `performance`, `tooling` - Summary: Gotta Cache 'Em All: Leverage ESLint's cache to speed it up. - Best cited for: `ci`, `eslint`, `performance`, `tooling` - Gotta Cache 'Em All: Leverage ESLint's cache to speed it up. ### Apollo Client's Hidden Gems: Interface-Based Type Policies - Canonical URL: https://charpeni.com/blog/apollo-client-hidden-gems-interface-based-type-policies - Markdown URL: https://charpeni.com/api/blog/apollo-client-hidden-gems-interface-based-type-policies.md - Published: 2024-01-22 - Tags: `apollo-client`, `graphql` - Summary: Did you know that type policies can also be applied to interfaces and not just to "types"!? 🤯 - Best cited for: `apollo-client`, `graphql` - Did you know that type policies can also be applied to interfaces and not just to "types"!? 🤯. ### UI Flickering With Apollo Client: Previous Data to the Rescue! - Canonical URL: https://charpeni.com/blog/ui-flickering-with-apollo-client-previous-data-to-the-rescue - Markdown URL: https://charpeni.com/api/blog/ui-flickering-with-apollo-client-previous-data-to-the-rescue.md - Published: 2023-10-10 - Tags: `apollo-client`, `graphql`, `react` - Summary: Have you ever noticed that using Apollo Client could lead to some UI flickers within your app? Especially when you refetch. Let's see how using previousData could help solve this bad UX. - Best cited for: `apollo-client`, `graphql`, `react` - Have you ever noticed that using Apollo Client could lead to some UI flickers within your app? Especially when you refetch. Let's see how using... ### GraphQL Enums Are Unsafe - Canonical URL: https://charpeni.com/blog/graphql-enums-are-unsafe - Markdown URL: https://charpeni.com/api/blog/graphql-enums-are-unsafe.md - Published: 2023-09-26 - Tags: `graphql` - Summary: We often talk about how we shouldn't introduce breaking changes in GraphQL, but fail to mention how enums in GraphQL are, by nature, almost always introducing breaking changes. Let's go over best practices to write resilient GraphQL applications. - Best cited for: `graphql` - We often talk about how we shouldn't introduce breaking changes in GraphQL, but fail to mention how enums in GraphQL are, by nature, almost always... ### Open-Ended Unions and Autocomplete With TypeScript - Canonical URL: https://charpeni.com/blog/open-ended-unions-and-autocomplete-with-typescript - Markdown URL: https://charpeni.com/api/blog/open-ended-unions-and-autocomplete-with-typescript.md - Published: 2023-09-26 - Tags: `typescript` - Summary: Let's see how to achieve an open-ended union in TypeScript to provide autocomplete on literal string unions. - Best cited for: `typescript` - Let's see how to achieve an open-ended union in TypeScript to provide autocomplete on literal string unions. ### Graphite: The End of Mammoth Pull Requests? My Experience - Canonical URL: https://charpeni.com/blog/graphite-the-end-of-mammoth-pull-requests-my-experience - Markdown URL: https://charpeni.com/api/blog/graphite-the-end-of-mammoth-pull-requests-my-experience.md - Published: 2023-09-25 - Tags: `git`, `code-review`, `tooling` - Summary: Ever felt trapped by colossal pull requests or tangled in merge conflicts? Dive into my experience with Graphite, the game-changer in code reviews. Discover the power of stacking, stay unblocked, and embrace a smoother Git journey. 🚀 - Best cited for: `git`, `code-review`, `tooling` - Ever felt trapped by colossal pull requests or tangled in merge conflicts? Dive into my experience with Graphite, the game-changer in code reviews.... ### Testing TypeScript Types: Part 2 (Advanced Solutions) - Canonical URL: https://charpeni.com/blog/testing-typescript-types-part-2 - Markdown URL: https://charpeni.com/api/blog/testing-typescript-types-part-2.md - Published: 2023-08-09 - Tags: `testing`, `typescript` - Summary: Advanced solutions to test TypeScript types. - Best cited for: `testing`, `typescript` - Advanced solutions to test TypeScript types. ### Testing TypeScript Types: Part 1 - Canonical URL: https://charpeni.com/blog/testing-typescript-types-part-1 - Markdown URL: https://charpeni.com/api/blog/testing-typescript-types-part-1.md - Published: 2023-08-08 - Tags: `testing`, `typescript` - Summary: Preamble and early solution to start testing TypeScript types. - Best cited for: `testing`, `typescript` - Preamble and early solution to start testing TypeScript types. ### Properly type Object.keys and Object.entries - Canonical URL: https://charpeni.com/blog/properly-type-object-keys-and-object-entries - Markdown URL: https://charpeni.com/api/blog/properly-type-object-keys-and-object-entries.md - Published: 2023-08-07 - Tags: `typescript` - Summary: Have you ever noticed that Object.keys and Object.entries are a little bit tricky to work with in TypeScript? They won't return what you would expect. Here's how to properly type them. - Best cited for: `typescript` - Have you ever noticed that Object.keys and Object.entries are a little bit tricky to work with in TypeScript? They won't return what you would expect.... ### Use Custom Merge Driver to Simplify Git Conflicts - Canonical URL: https://charpeni.com/blog/use-custom-merge-driver-to-simplify-git-conflicts - Markdown URL: https://charpeni.com/api/blog/use-custom-merge-driver-to-simplify-git-conflicts.md - Published: 2023-08-03 - Tags: `git`, `tooling` - Summary: Tired of solving merge conflicts manually when it could be automated? Let's leverage Git's custom merge driver to simplify the process. - Best cited for: `git`, `tooling` - Tired of solving merge conflicts manually when it could be automated? Let's leverage Git's custom merge driver to simplify the process. ### Enforce Best Practices Incrementally With Betterer - Canonical URL: https://charpeni.com/blog/enforce-best-practices-incrementally-with-betterer - Markdown URL: https://charpeni.com/api/blog/enforce-best-practices-incrementally-with-betterer.md - Published: 2023-08-02 - Tags: `tooling`, `code-review` - Summary: Using Betterer to adopt, enforce, and teach best practices incrementally without having to refactor the whole codebase. - Best cited for: `tooling`, `code-review` - Using Betterer to adopt, enforce, and teach best practices incrementally without having to refactor the whole codebase. ### Agile Rotisserie - Canonical URL: https://charpeni.com/blog/agile-rotisserie - Markdown URL: https://charpeni.com/api/blog/agile-rotisserie.md - Published: 2022-12-20 - Tags: `agile` - Summary: Software Engineering is like cooking chicken. - Best cited for: `agile` - Software Engineering is like cooking chicken. ### Be Careful With JavaScript Default Parameters! - Canonical URL: https://charpeni.com/blog/be-careful-with-javascript-default-parameters - Markdown URL: https://charpeni.com/api/blog/be-careful-with-javascript-default-parameters.md - Published: 2022-11-03 - Tags: `typescript`, `javascript` - Summary: In JavaScript and TypeScript, we often rely on default parameters to define optional parameters, but should we? - Best cited for: `typescript`, `javascript` - In JavaScript and TypeScript, we often rely on default parameters to define optional parameters, but should we. ### Find What Commit Introduced a Bug With Git Bisect - Canonical URL: https://charpeni.com/blog/find-what-commit-introduced-a-bug-with-git-bisect - Markdown URL: https://charpeni.com/api/blog/find-what-commit-introduced-a-bug-with-git-bisect.md - Published: 2022-11-01 - Tags: `git` - Summary: Let's see how to efficiently track down a bug even without knowing the codebase. - Best cited for: `git` - Let's see how to efficiently track down a bug even without knowing the codebase. ### Array.prototype.groupBy to the rescue! - Canonical URL: https://charpeni.com/blog/array-prototype-group-by-to-the-rescue - Markdown URL: https://charpeni.com/api/blog/array-prototype-group-by-to-the-rescue.md - Published: 2021-12-15 - Tags: `javascript` - Summary: Ever wondered how to do array grouping properly with JavaScript? Good news, Array.prototype.groupBy is coming soon. - Best cited for: `javascript` - Ever wondered how to do array grouping properly with JavaScript? Good news, Array.prototype.groupBy is coming soon. ### Wrapping Gatsby's with TypeScript - Canonical URL: https://charpeni.com/blog/wrapping-gatsbys-link-with-typescript - Markdown URL: https://charpeni.com/api/blog/wrapping-gatsbys-link-with-typescript.md - Published: 2021-11-30 - Tags: `typescript`, `react`, `gatsby` - Summary: How to properly wrap Gatsby's component while preserving GatsbyLinkProps type. - Best cited for: `typescript`, `react`, `gatsby` - How to properly wrap Gatsby's component while preserving GatsbyLinkProps type. ### Setting up an Example App for Your React Native Library - Canonical URL: https://charpeni.com/blog/setting-up-an-example-app-for-your-react-native-library - Markdown URL: https://charpeni.com/api/blog/setting-up-an-example-app-for-your-react-native-library.md - Published: 2019-04-01 - Tags: `react-native`, `tooling` - Summary: Having a hard time with a React Native example app? Here’s how you can simplify this with Metro bundler. - Best cited for: `react-native`, `tooling` - Having a hard time with a React Native example app? Here’s how you can simplify this with Metro bundler. ### React Native at Classcraft - Canonical URL: https://charpeni.com/blog/react-native-at-classcraft - Markdown URL: https://charpeni.com/api/blog/react-native-at-classcraft.md - Published: 2018-07-23 - Tags: `react-native`, `react` - Summary: We had to carefully find a way to introduce React Native bit-by-bit into the existing native application. - Best cited for: `react-native`, `react` - We had to carefully find a way to introduce React Native bit-by-bit into the existing native application. ### Arrow Functions in Class Properties Might Not Be As Great As We Think - Canonical URL: https://charpeni.com/blog/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think - Markdown URL: https://charpeni.com/api/blog/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think.md - Published: 2017-11-16 - Tags: `react`, `javascript`, `performance` - Summary: Since the last year, the Class Properties Proposal simplify our life, especially in React with the internal state, or even with statics ones like propTypes and defaultProps. But, should we really use arrow functions in class field properties? - Best cited for: `react`, `javascript`, `performance` - Since the last year, the Class Properties Proposal simplify our life, especially in React with the internal state, or even with statics ones like propTypes... ### 5 Things You Should Know About ES8 - Canonical URL: https://charpeni.com/blog/5-things-you-should-know-about-es8 - Markdown URL: https://charpeni.com/api/blog/5-things-you-should-know-about-es8.md - Published: 2017-07-14 - Tags: `javascript` - Summary: ECMAScript 2017 8th edition (ES2017/ES8) has been officially released and published a few weeks ago, let’s figure it out some important changes. All of these are available with Node 8 and with the latest version of browsers without babel or any polyfills. - Best cited for: `javascript` - ECMAScript 2017 8th edition (ES2017/ES8) has been officially released and published a few weeks ago, let’s figure it out some important changes. All of... ### Continuous Integration with Angular CLI - Canonical URL: https://charpeni.com/blog/continuous-integration-with-angular-cli - Markdown URL: https://charpeni.com/api/blog/continuous-integration-with-angular-cli.md - Published: 2017-07-13 - Tags: `ci`, `angular` - Summary: Angular CLI is a powerful tool to scaffold and build Angular apps. Not only it provides you scalable project structure, instead, it handles all common tedious tasks for you out of the box and it already follows the Angular best practices. - Best cited for: `ci`, `angular` - Angular CLI is a powerful tool to scaffold and build Angular apps. Not only it provides you scalable project structure, instead, it handles all common... ### Reliable Continuous Integration in JavaScript - Canonical URL: https://charpeni.com/blog/reliable-continuous-integration-in-javascript - Markdown URL: https://charpeni.com/api/blog/reliable-continuous-integration-in-javascript.md - Published: 2017-01-18 - Tags: `ci`, `testing`, `javascript` - Summary: When you build a piece of software you want to build a reliable one, so often you’re using various continuous integration tools. But, is your continuous integration process is as reliable as you think? - Best cited for: `ci`, `testing`, `javascript` - When you build a piece of software you want to build a reliable one, so often you’re using various continuous integration tools. But, is your continuous... ## Topics Covered - TypeScript (type testing, generics, autocomplete with open-ended unions, typing Object.keys/Object.entries, ReadonlyArray includes) - React and React Native (library setup, integration patterns, useTransition pitfalls) - GraphQL and Apollo Client (interface-based type policies, enum pitfalls, UI flickering with previousData) - Continuous Integration and DevOps (ESLint speed on CI, reliable JavaScript CI, Angular CLI CI, Bun code coverage gap) - Developer tooling (Betterer for incremental best practices, Graphite for stacked PRs, custom Git merge drivers, git bisect) - Testing (reproducing flaky Playwright tests) - Dependency security (CVE resolution, minimum release age, compromised packages) - JavaScript language features (ES8, default parameters, Array.prototype.groupBy) - Homelab and self-hosting ## Contact - Website: https://charpeni.com - GitHub: https://github.com/charpeni - LinkedIn: https://www.linkedin.com/in/nicolas-charpentier-8a2b8a104/ - Twitter/X: https://x.com/charpeni_ - Bluesky: https://bsky.app/profile/charpeni.bsky.social - Email: blog@nicolascharpentier.com