Visualizing Garmin Data and Building a Personal AI Training Assistant
How I turned Garmin activity data into self-hosted Grafana dashboards and connected an AI agent through MCP to act as my personal training assistant.
Personal blog of Nicolas Charpentier, a Software Engineer specializing in React Native, React, GraphQL, and Continuous Integration.
How I turned Garmin activity data into self-hosted Grafana dashboards and connected an AI agent through MCP to act as my personal training assistant.
We swapped actions/checkout for Blacksmith's cached checkout across our GitHub Actions. Mean checkout time dropped from 69s to 20s, reclaiming ~33 hours of runner time each weekday.
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.
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.
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.
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.
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.
How I made my homelab services easily accessible with a Heimdall dashboard, local domain names via mDNS, and default ports.
Bun's test runner only tracks coverage for loaded files. Here's how to expose the gaps.
Learn how to fix "Go to Definition" navigating to type declarations instead of source files in TypeScript projects.
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.
Stop playing whack-a-mole with flaky Playwright tests by using CPU throttling to reliably reproduce CI failures on your local machine.
How to properly and safely update dependencies to resolve CVEs, while also gathering an understanding of how package managers handle dependencies.
How to use includes on ReadonlyArrays while retaining type safety and narrowing down the type.
Gotta Cache 'Em All: Leverage ESLint's cache to speed it up.
Did you know that type policies can also be applied to interfaces and not just to "types"!? 🤯
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.
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.
Let's see how to achieve an open-ended union in TypeScript to provide autocomplete on literal string unions.
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. 🚀
Advanced solutions to test TypeScript types.
Preamble and early solution to start testing TypeScript types.
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.
Tired of solving merge conflicts manually when it could be automated? Let's leverage Git's custom merge driver to simplify the process.
Using Betterer to adopt, enforce, and teach best practices incrementally without having to refactor the whole codebase.
Software Engineering is like cooking chicken.
In JavaScript and TypeScript, we often rely on default parameters to define optional parameters, but should we?
Let's see how to efficiently track down a bug even without knowing the codebase.
Ever wondered how to do array grouping properly with JavaScript? Good news, Array.prototype.groupBy is coming soon.
How to properly wrap Gatsby's component while preserving GatsbyLinkProps type.
Having a hard time with a React Native example app? Here’s how you can simplify this with Metro bundler.
We had to carefully find a way to introduce React Native bit-by-bit into the existing native application.
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?
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.
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.
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?