<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nicolas Charpentier's Blog</title>
    <link>https://charpeni.com</link>
    <description>Personal blog of Nicolas Charpentier, a Software Engineer specializing in React Native, React, GraphQL, and Continuous Integration.</description>
    <language>en</language>
    <lastBuildDate>Sat, 28 Feb 2026 22:02:08 GMT</lastBuildDate>
    <atom:link href="https://charpeni.com/blog/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Access Your Homelab Services Without Memorizing IPs and Ports</title>
      <link>https://charpeni.com/blog/access-homelab-services-without-memorizing-ips</link>
      <guid>https://charpeni.com/blog/access-homelab-services-without-memorizing-ips</guid>
      <pubDate>Thu, 19 Feb 2026 12:00:00 GMT</pubDate>
      <description>How I made my homelab services easily accessible with a Heimdall dashboard, local domain names via mDNS, and default ports.</description>
      <enclosure url="https://charpeni.com/static/images/access-homelab-services-without-memorizing-ips/banner.png" length="1993332" type="image/png" />
    </item>
    <item>
      <title>Bun Code Coverage Gap</title>
      <link>https://charpeni.com/blog/bun-code-coverage-gap</link>
      <guid>https://charpeni.com/blog/bun-code-coverage-gap</guid>
      <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
      <description>Bun&apos;s test runner only tracks coverage for loaded files. Here&apos;s how to expose the gaps.</description>
      <enclosure url="https://charpeni.com/static/images/bun-code-coverage-gap/banner.png" length="52004" type="image/png" />
    </item>
    <item>
      <title>Configure &quot;Go to Definition&quot; to Open TypeScript Source</title>
      <link>https://charpeni.com/blog/configure-go-to-definition-to-open-typescript-source</link>
      <guid>https://charpeni.com/blog/configure-go-to-definition-to-open-typescript-source</guid>
      <pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate>
      <description>Learn how to fix &quot;Go to Definition&quot; navigating to type declarations instead of source files in TypeScript projects.</description>
      <enclosure url="https://charpeni.com/static/images/configure-go-to-definition-to-open-typescript-source/banner.png" length="16485" type="image/png" />
    </item>
    <item>
      <title>Don&apos;t Blindly Use useTransition Everywhere</title>
      <link>https://charpeni.com/blog/dont-blindly-use-usetransition-everywhere</link>
      <guid>https://charpeni.com/blog/dont-blindly-use-usetransition-everywhere</guid>
      <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
      <description>Let&apos;s take a closer look at useTransition and why the React Docs example might not be a great starting point for real-world UX.</description>
      <enclosure url="https://charpeni.com/static/images/dont-blindly-use-usetransition-everywhere/banner.png" length="23647" type="image/png" />
    </item>
    <item>
      <title>How to Easily Reproduce a Flaky Test in Playwright</title>
      <link>https://charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright</link>
      <guid>https://charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright</guid>
      <pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate>
      <description>Stop playing whack-a-mole with flaky Playwright tests by using CPU throttling to reliably reproduce CI failures on your local machine.</description>
      <enclosure url="https://charpeni.com/static/images/how-to-easily-reproduce-a-flaky-test-in-playwright/banner.jpg" length="154204" type="image/jpeg" />
    </item>
    <item>
      <title>Minimizing Risk: Properly and Safely Resolving CVEs in Your Dependencies</title>
      <link>https://charpeni.com/blog/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies</link>
      <guid>https://charpeni.com/blog/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies</guid>
      <pubDate>Fri, 04 Oct 2024 00:00:00 GMT</pubDate>
      <description>How to properly and safely update dependencies to resolve CVEs, while also gathering an understanding of how package managers handle dependencies.</description>
      <enclosure url="https://charpeni.com/static/images/minimizing-risk-properly-and-safely-resolving-cves-in-your-dependencies/banner.jpg" length="163853" type="image/jpeg" />
    </item>
    <item>
      <title>TypeScript Tips: Safely Using includes With ReadonlyArrays</title>
      <link>https://charpeni.com/blog/typescript-tips-safely-using-includes-with-readonlyarrays</link>
      <guid>https://charpeni.com/blog/typescript-tips-safely-using-includes-with-readonlyarrays</guid>
      <pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate>
      <description>How to use includes on ReadonlyArrays while retaining type safety and narrowing down the type.</description>
      <enclosure url="https://charpeni.com/static/images/typescript-tips-safely-using-includes-with-readonlyarrays/banner.png" length="26347" type="image/png" />
    </item>
    <item>
      <title>Speeding up ESLint—Even on CI</title>
      <link>https://charpeni.com/blog/speeding-up-eslint-even-on-ci</link>
      <guid>https://charpeni.com/blog/speeding-up-eslint-even-on-ci</guid>
      <pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate>
      <description>Gotta Cache &apos;Em All: Leverage ESLint&apos;s cache to speed it up.</description>
      <enclosure url="https://charpeni.com/static/images/speeding-up-eslint-even-on-ci/banner.png" length="16588" type="image/png" />
    </item>
    <item>
      <title>Apollo Client&apos;s Hidden Gems: Interface-Based Type Policies</title>
      <link>https://charpeni.com/blog/apollo-client-hidden-gems-interface-based-type-policies</link>
      <guid>https://charpeni.com/blog/apollo-client-hidden-gems-interface-based-type-policies</guid>
      <pubDate>Mon, 22 Jan 2024 00:00:00 GMT</pubDate>
      <description>Did you know that type policies can also be applied to interfaces and not just to &quot;types&quot;!? 🤯</description>
      <enclosure url="https://charpeni.com/static/images/apollo-client-hidden-gems-interface-based-type-policies/banner.png" length="26606" type="image/png" />
    </item>
    <item>
      <title>UI Flickering With Apollo Client: Previous Data to the Rescue!</title>
      <link>https://charpeni.com/blog/ui-flickering-with-apollo-client-previous-data-to-the-rescue</link>
      <guid>https://charpeni.com/blog/ui-flickering-with-apollo-client-previous-data-to-the-rescue</guid>
      <pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate>
      <description>Have you ever noticed that using Apollo Client could lead to some UI flickers within your app? Especially when you refetch. Let&apos;s see how using previousData could help solve this bad UX.</description>
      <enclosure url="https://charpeni.com/static/images/ui-flickering-with-apollo-client-previous-data-to-the-rescue/banner.gif" length="21516" type="image/gif" />
    </item>
    <item>
      <title>GraphQL Enums Are Unsafe</title>
      <link>https://charpeni.com/blog/graphql-enums-are-unsafe</link>
      <guid>https://charpeni.com/blog/graphql-enums-are-unsafe</guid>
      <pubDate>Tue, 26 Sep 2023 12:00:00 GMT</pubDate>
      <description>We often talk about how we shouldn&apos;t introduce breaking changes in GraphQL, but fail to mention how enums in GraphQL are, by nature, almost always introducing breaking changes. Let&apos;s go over best practices to write resilient GraphQL applications.</description>
      <enclosure url="https://charpeni.com/static/images/graphql-enums-are-unsafe/banner.png" length="19165" type="image/png" />
    </item>
    <item>
      <title>Open-Ended Unions and Autocomplete With TypeScript</title>
      <link>https://charpeni.com/blog/open-ended-unions-and-autocomplete-with-typescript</link>
      <guid>https://charpeni.com/blog/open-ended-unions-and-autocomplete-with-typescript</guid>
      <pubDate>Tue, 26 Sep 2023 00:00:00 GMT</pubDate>
      <description>Let&apos;s see how to achieve an open-ended union in TypeScript to provide autocomplete on literal string unions.</description>
      <enclosure url="https://charpeni.com/static/images/open-ended-unions-and-autocomplete-with-typescript/banner.png" length="22480" type="image/png" />
    </item>
    <item>
      <title>Graphite: The End of Mammoth Pull Requests? My Experience</title>
      <link>https://charpeni.com/blog/graphite-the-end-of-mammoth-pull-requests-my-experience</link>
      <guid>https://charpeni.com/blog/graphite-the-end-of-mammoth-pull-requests-my-experience</guid>
      <pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate>
      <description>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. 🚀</description>
      <enclosure url="https://charpeni.com/static/images/graphite-the-end-of-mammoth-pull-requests-my-experience/banner.png" length="13342" type="image/png" />
    </item>
    <item>
      <title>Testing TypeScript Types: Part 2 (Advanced Solutions)</title>
      <link>https://charpeni.com/blog/testing-typescript-types-part-2</link>
      <guid>https://charpeni.com/blog/testing-typescript-types-part-2</guid>
      <pubDate>Wed, 09 Aug 2023 00:00:00 GMT</pubDate>
      <description>Advanced solutions to test TypeScript types.</description>
      <enclosure url="https://charpeni.com/static/images/testing-typescript-types-part-2/banner.png" length="10410" type="image/png" />
    </item>
    <item>
      <title>Testing TypeScript Types: Part 1</title>
      <link>https://charpeni.com/blog/testing-typescript-types-part-1</link>
      <guid>https://charpeni.com/blog/testing-typescript-types-part-1</guid>
      <pubDate>Tue, 08 Aug 2023 00:00:00 GMT</pubDate>
      <description>Preamble and early solution to start testing TypeScript types.</description>
      <enclosure url="https://charpeni.com/static/images/testing-typescript-types-part-1/banner.png" length="10167" type="image/png" />
    </item>
    <item>
      <title>Properly type Object.keys and Object.entries</title>
      <link>https://charpeni.com/blog/properly-type-object-keys-and-object-entries</link>
      <guid>https://charpeni.com/blog/properly-type-object-keys-and-object-entries</guid>
      <pubDate>Mon, 07 Aug 2023 00:00:00 GMT</pubDate>
      <description>Have you ever noticed that Object.keys and Object.entries are a little bit tricky to work with in TypeScript? They won&apos;t return what you would expect. Here&apos;s how to properly type them.</description>
      <enclosure url="https://charpeni.com/static/images/properly-type-object-keys-and-object-entries/banner.png" length="12510" type="image/png" />
    </item>
    <item>
      <title>Use Custom Merge Driver to Simplify Git Conflicts</title>
      <link>https://charpeni.com/blog/use-custom-merge-driver-to-simplify-git-conflicts</link>
      <guid>https://charpeni.com/blog/use-custom-merge-driver-to-simplify-git-conflicts</guid>
      <pubDate>Thu, 03 Aug 2023 00:00:00 GMT</pubDate>
      <description>Tired of solving merge conflicts manually when it could be automated? Let&apos;s leverage Git&apos;s custom merge driver to simplify the process.</description>
      <enclosure url="https://charpeni.com/static/images/use-custom-merge-driver-to-simplify-git-conflicts/banner.gif" length="3446139" type="image/gif" />
    </item>
    <item>
      <title>Enforce Best Practices Incrementally With Betterer</title>
      <link>https://charpeni.com/blog/enforce-best-practices-incrementally-with-betterer</link>
      <guid>https://charpeni.com/blog/enforce-best-practices-incrementally-with-betterer</guid>
      <pubDate>Wed, 02 Aug 2023 00:00:00 GMT</pubDate>
      <description>Using Betterer to adopt, enforce, and teach best practices incrementally without having to refactor the whole codebase.</description>
      <enclosure url="https://charpeni.com/static/images/enforce-best-practices-incrementally-with-betterer/banner.png" length="102055" type="image/png" />
    </item>
    <item>
      <title>Agile Rotisserie</title>
      <link>https://charpeni.com/blog/agile-rotisserie</link>
      <guid>https://charpeni.com/blog/agile-rotisserie</guid>
      <pubDate>Tue, 20 Dec 2022 00:00:00 GMT</pubDate>
      <description>Software Engineering is like cooking chicken.</description>
      <enclosure url="https://charpeni.com/static/images/agile-rotisserie/banner.jpg" length="110145" type="image/jpeg" />
    </item>
    <item>
      <title>Be Careful With JavaScript Default Parameters!</title>
      <link>https://charpeni.com/blog/be-careful-with-javascript-default-parameters</link>
      <guid>https://charpeni.com/blog/be-careful-with-javascript-default-parameters</guid>
      <pubDate>Thu, 03 Nov 2022 00:00:00 GMT</pubDate>
      <description>In JavaScript and TypeScript, we often rely on default parameters to define optional parameters, but should we?</description>
      <enclosure url="https://charpeni.com/static/images/be-careful-with-javascript-default-parameters/banner.png" length="53615" type="image/png" />
    </item>
    <item>
      <title>Find What Commit Introduced a Bug With Git Bisect</title>
      <link>https://charpeni.com/blog/find-what-commit-introduced-a-bug-with-git-bisect</link>
      <guid>https://charpeni.com/blog/find-what-commit-introduced-a-bug-with-git-bisect</guid>
      <pubDate>Tue, 01 Nov 2022 00:00:00 GMT</pubDate>
      <description>Let&apos;s see how to efficiently track down a bug even without knowing the codebase.</description>
      <enclosure url="https://charpeni.com/static/images/find-what-commit-introduced-a-bug-with-git-bisect/banner.png" length="29696" type="image/png" />
    </item>
    <item>
      <title>Array.prototype.groupBy to the rescue!</title>
      <link>https://charpeni.com/blog/array-prototype-group-by-to-the-rescue</link>
      <guid>https://charpeni.com/blog/array-prototype-group-by-to-the-rescue</guid>
      <pubDate>Wed, 15 Dec 2021 00:00:00 GMT</pubDate>
      <description>Ever wondered how to do array grouping properly with JavaScript? Good news, Array.prototype.groupBy is coming soon.</description>
      <enclosure url="https://charpeni.com/static/images/array-prototype-group-by-to-the-rescue/banner.webp" length="24410" type="image/webp" />
    </item>
    <item>
      <title>Wrapping Gatsby&apos;s &lt;Link&gt; with TypeScript</title>
      <link>https://charpeni.com/blog/wrapping-gatsbys-link-with-typescript</link>
      <guid>https://charpeni.com/blog/wrapping-gatsbys-link-with-typescript</guid>
      <pubDate>Tue, 30 Nov 2021 00:00:00 GMT</pubDate>
      <description>How to properly wrap Gatsby&apos;s &lt;Link&gt; component while preserving GatsbyLinkProps type.</description>
      <enclosure url="https://charpeni.com/static/images/wrapping-gatsbys-link-with-typescript/banner.webp" length="192750" type="image/webp" />
    </item>
    <item>
      <title>Setting up an Example App for Your React Native Library</title>
      <link>https://charpeni.com/blog/setting-up-an-example-app-for-your-react-native-library</link>
      <guid>https://charpeni.com/blog/setting-up-an-example-app-for-your-react-native-library</guid>
      <pubDate>Mon, 01 Apr 2019 00:00:00 GMT</pubDate>
      <description>Having a hard time with a React Native example app? Here’s how you can simplify this with Metro bundler.</description>
      <enclosure url="https://charpeni.com/static/images/setting-up-an-example-app-for-your-react-native-library/banner.png" length="281416" type="image/png" />
    </item>
    <item>
      <title>React Native at Classcraft</title>
      <link>https://charpeni.com/blog/react-native-at-classcraft</link>
      <guid>https://charpeni.com/blog/react-native-at-classcraft</guid>
      <pubDate>Mon, 23 Jul 2018 00:00:00 GMT</pubDate>
      <description>We had to carefully find a way to introduce React Native bit-by-bit into the existing native application.</description>
      <enclosure url="https://charpeni.com/static/images/react-native-at-classcraft/banner.jpeg" length="159358" type="image/jpeg" />
    </item>
    <item>
      <title>Arrow Functions in Class Properties Might Not Be As Great As We Think</title>
      <link>https://charpeni.com/blog/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think</link>
      <guid>https://charpeni.com/blog/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think</guid>
      <pubDate>Thu, 16 Nov 2017 00:00:00 GMT</pubDate>
      <description>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?</description>
      <enclosure url="https://charpeni.com/static/images/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think/banner.gif" length="1045891" type="image/gif" />
    </item>
    <item>
      <title>5 Things You Should Know About ES8</title>
      <link>https://charpeni.com/blog/5-things-you-should-know-about-es8</link>
      <guid>https://charpeni.com/blog/5-things-you-should-know-about-es8</guid>
      <pubDate>Fri, 14 Jul 2017 00:00:00 GMT</pubDate>
      <description>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.</description>
      <enclosure url="https://charpeni.com/static/images/5-things-you-should-know-about-es8/banner.jpeg" length="9277" type="image/jpeg" />
    </item>
    <item>
      <title>Continuous Integration with Angular CLI</title>
      <link>https://charpeni.com/blog/continuous-integration-with-angular-cli</link>
      <guid>https://charpeni.com/blog/continuous-integration-with-angular-cli</guid>
      <pubDate>Thu, 13 Jul 2017 00:00:00 GMT</pubDate>
      <description>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.</description>
      <enclosure url="https://charpeni.com/static/images/continuous-integration-with-angular-cli/banner.jpeg" length="62413" type="image/jpeg" />
    </item>
    <item>
      <title>Reliable Continuous Integration in JavaScript</title>
      <link>https://charpeni.com/blog/reliable-continuous-integration-in-javascript</link>
      <guid>https://charpeni.com/blog/reliable-continuous-integration-in-javascript</guid>
      <pubDate>Wed, 18 Jan 2017 00:00:00 GMT</pubDate>
      <description>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?</description>
      <enclosure url="https://charpeni.com/static/images/reliable-continuous-integration-in-javascript/banner.png" length="17039" type="image/png" />
    </item>
  </channel>
</rss>
