<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brice</title>
    <description>The latest articles on DEV Community by Brice (@boly38).</description>
    <link>https://dev.to/boly38</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F484758%2F631f5416-51b1-4c52-863f-67280c0aac6b.png</url>
      <title>DEV Community: Brice</title>
      <link>https://dev.to/boly38</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boly38"/>
    <language>en</language>
    <item>
      <title>Node.js - Security Audit via Github Action to augment PR's</title>
      <dc:creator>Brice</dc:creator>
      <pubDate>Thu, 09 Oct 2025 09:09:19 +0000</pubDate>
      <link>https://dev.to/boly38/a-nodejs-audit-via-github-action-to-augment-prs-3l2g</link>
      <guid>https://dev.to/boly38/a-nodejs-audit-via-github-action-to-augment-prs-3l2g</guid>
      <description>&lt;p&gt;🎯 &lt;a href="https://github.com/JamesRobertWiseman/pnpm-audit/releases/tag/v3.1.0" rel="noopener noreferrer"&gt;pnpm-audit v3 (v3.1.0)&lt;/a&gt;: A Thoughtful Step Forward in Open Source Security&lt;/p&gt;

&lt;p&gt;As a developer who cares deeply about dependency security and CI/CD efficiency, I’ve always looked for tools that strike the right balance between simplicity and usefulness.&lt;br&gt;
The pnpm-audit project by @JamesRobertWiseman does exactly that — and with version 3.1.0, it takes a big step forward, addressing community feedback without overcomplicating its mission.&lt;/p&gt;

&lt;p&gt;🏗️ Three community requests turned into features&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Updated documentation and GitHub Action setup tips (&lt;a href="https://github.com/JamesRobertWiseman/pnpm-audit/issues/2" rel="noopener noreferrer"&gt;Issue #2&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Community feedback highlighted the need for clearer documentation — examples, explanations of each parameter, and best practices for configuring pnpm-audit within GitHub Actions.&lt;br&gt;
Version 3.1.0 now includes improved docs and practical setup guidance, making it easier than ever to integrate the audit step in modern CI/CD pipelines.&lt;br&gt;
👉 A welcome enhancement for teams adopting the action for the first time.&lt;/p&gt;

&lt;p&gt;(main Readme)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakghr2hbkxojn1gq1x25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakghr2hbkxojn1gq1x25.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inline annotations in workflow logs (&lt;a href="https://github.com/JamesRobertWiseman/pnpm-audit/issues/3" rel="noopener noreferrer"&gt;Issue #3&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Another great addition: the inline flag now enables inline audit findings directly in GitHub’s workflow logs using annotation syntax.&lt;br&gt;
👉 This makes audit results visible where developers already work — the CI output.&lt;/p&gt;

&lt;p&gt;Here is a quick overview of an inline result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ohbfuyxuvjrzvmr880t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ohbfuyxuvjrzvmr880t.png" alt=" " width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduced noise having a single comment in pull requests (&lt;a href="https://github.com/JamesRobertWiseman/pnpm-audit/issues/4" rel="noopener noreferrer"&gt;Issue #4&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No one likes PRs cluttered with repeated audit comments after every push.&lt;br&gt;
The new single_comment option ensures only one comment is maintained and updated, and it’s automatically removed when all vulnerabilities are resolved.&lt;br&gt;
👉 A small but powerful change that makes PRs much cleaner and easier to follow.&lt;/p&gt;

&lt;p&gt;Here is a quick overview of a PR comment:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchqe69is5odx00kzfmaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchqe69is5odx00kzfmaf.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Why v3 stands out&lt;/p&gt;

&lt;p&gt;This release shows what makes pnpm-audit great:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Community-driven — user feedback quickly turned into real improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Practical — every feature adds real value for day-to-day development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple — easy to adopt, even easier to maintain.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kudos to @JamesRobertWiseman for this thoughtful release — a great example of open source responsiveness done right.&lt;/p&gt;

&lt;p&gt;🧩 Example GitHub Actions workflow&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# continuous integration&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="c1"&gt;# Controls when the action will run. &lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Allows you to run this workflow manually from the Actions tab&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="c1"&gt;# A workflow run is made up of one or more jobs that can run sequentially or in parallel&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# This workflow contains a single job called "build"&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# The type of runner that the job will run on&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# See supported Node.js release schedule at https://nodejs.org/en/about/releases/&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;18.x&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v5&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup pnpm&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm/action-setup@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# version from package.json&lt;/span&gt;
          &lt;span class="na"&gt;run_install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js ${{ matrix.node-version }}&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.node-version }}&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pnpm'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo ::group::Install dependencies&lt;/span&gt;
          &lt;span class="s"&gt;echo "install"&lt;/span&gt;
          &lt;span class="s"&gt;pnpm i --frozen-lockfile&lt;/span&gt;
          &lt;span class="s"&gt;echo ::endgroup::&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CHECK - pnpm audit and comment on PR&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.pull_request }}&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;JamesRobertWiseman/pnpm-audit@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;github_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;moderate&lt;/span&gt;   &lt;span class="c1"&gt;# 'low'|'moderate'|'high'|'critical'&lt;/span&gt;
          &lt;span class="na"&gt;fails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# true to fail the build if vulnerabilities are found&lt;/span&gt;
          &lt;span class="na"&gt;single_comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# true to only post one comment&lt;/span&gt;
          &lt;span class="na"&gt;inline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# true to emit audit findings directly in the workflow logs using GitHub annotation syntax&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm ci-test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;COVERAGE - Report coverage on pull request&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.event_name == 'pull_request'&lt;/span&gt;
        &lt;span class="na"&gt;continue-on-error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;andybelltree/lcov-reporter-action@v1.7.0&lt;/span&gt; &lt;span class="c1"&gt;# https://github.com/andybelltree/lcov-reporter-action/releases&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;lcov-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./coverage/lcov.info&lt;/span&gt;
          &lt;span class="na"&gt;filter-changed-files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;JamesRobertWiseman/pnpm-audit@v3&lt;/code&gt; step :&lt;br&gt;
✅ single_comment: true → keeps the PR clean&lt;br&gt;
✅ inline: true → annotations inside logs&lt;br&gt;
✅ fails: true → breaks the build on critical issues&lt;/p&gt;

&lt;p&gt;✨ Huge thanks to @JamesRobertWiseman for this outstanding update 🙌&lt;/p&gt;

</description>
      <category>node</category>
      <category>security</category>
      <category>githubactions</category>
      <category>npm</category>
    </item>
    <item>
      <title>🛠️ Hacktoberfest 2025 — 17 Pull Requests in One Day, for the Love of Clean Code 😅🤖🧠</title>
      <dc:creator>Brice</dc:creator>
      <pubDate>Sun, 05 Oct 2025 22:15:24 +0000</pubDate>
      <link>https://dev.to/boly38/hacktoberfest-2025-17-pull-requests-en-une-journee-par-amour-du-code-propre-1hp4</link>
      <guid>https://dev.to/boly38/hacktoberfest-2025-17-pull-requests-en-une-journee-par-amour-du-code-propre-1hp4</guid>
      <description>&lt;p&gt;Experience report from Boly38 on an intense open source contribution day: 17 PRs focused on security, CI/CD, and code sustainability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Hacktoberfest 2025 — 17 Pull Requests in One Day, for the Love of Clean Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Published by &lt;a href="https://github.com/boly38" rel="noopener noreferrer"&gt;@boly38&lt;/a&gt; — October 5, 2025&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🌍 Introduction
&lt;/h3&gt;

&lt;p&gt;Every October, Hacktoberfest inspires thousands of developers to give back to open source.&lt;br&gt;&lt;br&gt;
This year, I decided to dedicate an entire day to improving the &lt;strong&gt;quality and security&lt;/strong&gt; of the projects I maintain or contribute to.&lt;/p&gt;

&lt;p&gt;The result?&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;17 Pull Requests opened or under review&lt;/strong&gt; across 5 repositories, all focused on &lt;strong&gt;maintenance, modernization, and automation&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔒 The Day’s Goal: Make Code Safer and More Sustainable
&lt;/h3&gt;

&lt;p&gt;Instead of adding new features, my focus was to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix npm security alerts (&lt;code&gt;audit fix&lt;/code&gt;),
&lt;/li&gt;
&lt;li&gt;repair and clean up CI workflows,
&lt;/li&gt;
&lt;li&gt;migrate to modern tools (&lt;code&gt;pnpm&lt;/code&gt;, &lt;code&gt;Node 18&lt;/code&gt;),
&lt;/li&gt;
&lt;li&gt;and automate releases using &lt;code&gt;gh&lt;/code&gt; (GitHub CLI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren’t flashy changes, but they make projects &lt;strong&gt;stronger and more reliable for every contributor&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ The Contributions in Detail
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🧩 &lt;code&gt;creharmony/node-etsy-client&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🧾 &lt;em&gt;Update README&lt;/em&gt; — updated workflow name (#72)
&lt;/li&gt;
&lt;li&gt;🧪 &lt;em&gt;Fix audit &amp;amp; tests&lt;/em&gt; — updated dependencies (#71)
&lt;/li&gt;
&lt;li&gt;🚀 &lt;em&gt;gh release + improved contribution doc&lt;/em&gt; (#70)
&lt;/li&gt;
&lt;li&gt;🧱 &lt;em&gt;Migrated Node 16 → 18&lt;/em&gt; (#68)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧩 &lt;code&gt;boly38/drobadi&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🔁 &lt;em&gt;npm → pnpm + ESLint fixes&lt;/em&gt; (#67)
&lt;/li&gt;
&lt;li&gt;🧭 &lt;em&gt;Immutable release + gh create release doc&lt;/em&gt; (#66)
&lt;/li&gt;
&lt;li&gt;🧪 &lt;em&gt;Bump chai@latest&lt;/em&gt; (#64)
&lt;/li&gt;
&lt;li&gt;🩹 &lt;em&gt;Audit fix: multiple dependencies&lt;/em&gt; (#63, #61, #57)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧩 &lt;code&gt;DatavenueLiveObjects/Start-here-nodeJS&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🧱 &lt;em&gt;Audit fix + log4js/mqtt updates&lt;/em&gt; (#35)
&lt;/li&gt;
&lt;li&gt;⚙️ &lt;em&gt;Re-established audit job&lt;/em&gt; (#31)
&lt;/li&gt;
&lt;li&gt;🚀 &lt;em&gt;Added release workflow&lt;/em&gt; (#29)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧩 &lt;code&gt;boly38/action-umami-report&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;em&gt;Fix audit on main push&lt;/em&gt; (#103)
&lt;/li&gt;
&lt;li&gt;🧩 &lt;em&gt;Add vulnerability scan to PRs&lt;/em&gt; (#101)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧩 &lt;code&gt;boly38/botEnSky&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;em&gt;Make app Nixpacks/Coolify compatible&lt;/em&gt; (#152)
&lt;/li&gt;
&lt;li&gt;⚙️ &lt;em&gt;Switch npm → pnpm&lt;/em&gt; (#151)
&lt;/li&gt;
&lt;li&gt;🚀 &lt;em&gt;Immutable release + GitHub CLI integration&lt;/em&gt; (#149)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📊 Technical Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security / audits&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;~41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD / workflows&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;~29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation &amp;amp; release&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;~18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance / migration&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;~12%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🧮 &lt;strong&gt;17 PRs&lt;/strong&gt; across &lt;strong&gt;5 repositories&lt;/strong&gt;, with &lt;strong&gt;16 validated for Hacktoberfest&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open source isn’t only about new features — it’s also about &lt;strong&gt;keeping code healthy&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Automating workflows frees up time for innovation.
&lt;/li&gt;
&lt;li&gt;Every audit fix is a small, invisible but essential win.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And above all: contribution doesn’t have to be flashy to be valuable.&lt;/p&gt;




&lt;h3&gt;
  
  
  🪴 Bonus: Hacktoberfest, Holopin &amp;amp; Treenation
&lt;/h3&gt;

&lt;p&gt;As always, Hacktoberfest rewards contributors with &lt;strong&gt;Holopin badges&lt;/strong&gt; and a &lt;strong&gt;Treenation tree&lt;/strong&gt; 🌳 for every 6th accepted PR.&lt;br&gt;&lt;br&gt;
A small symbolic gesture that makes every commit a little greener 💚.&lt;/p&gt;




&lt;h3&gt;
  
  
  ❤️ Conclusion
&lt;/h3&gt;

&lt;p&gt;One day, 17 PRs, and a huge sense of satisfaction:&lt;br&gt;&lt;br&gt;
seeing the builds green again, audits clean, and dependencies up to date.&lt;/p&gt;

&lt;p&gt;If you want to join in, there’s still time this October!&lt;br&gt;&lt;br&gt;
➡️ &lt;a href="https://hacktoberfest.com" rel="noopener noreferrer"&gt;hacktoberfest.com&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  👤 About Me
&lt;/h3&gt;

&lt;p&gt;I’m &lt;strong&gt;Boly38&lt;/strong&gt;, an open-source developer passionate about code reliability, CI/CD workflows, and the Node.js ecosystem.&lt;br&gt;&lt;br&gt;
⚙️ &lt;a href="https://github.com/boly38" rel="noopener noreferrer"&gt;github.com/boly38&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💬 Come say hi on &lt;a href="https://bsky.app/profile/boly38.bsky.social" rel="noopener noreferrer"&gt;BlueSky&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;PS: I didn’t actually write a single line of this post — ChatGPT generated the summary based on a simple copy/paste from my Hacktoberfest profile 😎🤖&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>hacktoberfest</category>
      <category>cicd</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Quickstart howto post on Facebook using API</title>
      <dc:creator>Brice</dc:creator>
      <pubDate>Sat, 28 Oct 2023 19:05:42 +0000</pubDate>
      <link>https://dev.to/boly38/quickstart-howto-post-on-facebook-using-api-1c93</link>
      <guid>https://dev.to/boly38/quickstart-howto-post-on-facebook-using-api-1c93</guid>
      <description>&lt;p&gt;In addition to my &lt;a href="https://dev.to/boly38/my-contribution-to-hacktoberfest2023-3bdl"&gt;Hactkoberfest contribution&lt;/a&gt;, &lt;/p&gt;

&lt;p&gt;I just created a quickstart for user who wants to use Facebook API to post on a page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;get page info&lt;/li&gt;
&lt;li&gt;post on a page&lt;/li&gt;
&lt;li&gt;get long-lived access token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;cf. &lt;a href="https://github.com/boly38/testFB"&gt;https://github.com/boly38/testFB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;this project gives you the basis curl commands.&lt;/p&gt;

&lt;p&gt;Thanks to dev.to previous contributions that give me some inputs !&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>facebook</category>
      <category>quickstart</category>
    </item>
    <item>
      <title>My contribution to #Hacktoberfest2023 😜🥳</title>
      <dc:creator>Brice</dc:creator>
      <pubDate>Mon, 23 Oct 2023 11:28:46 +0000</pubDate>
      <link>https://dev.to/boly38/my-contribution-to-hacktoberfest2023-3bdl</link>
      <guid>https://dev.to/boly38/my-contribution-to-hacktoberfest2023-3bdl</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;I'm github fan ✨ and sometime participate to #Hacktoberfest when I've some free time. That's a good opportunity to make some PR to public projects too !&lt;/p&gt;

&lt;h3&gt;
  
  
  New release done for #Hacktoberfest2023 🥳
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://github.com/boly38/node-mongotools"&gt;http://github.com/boly38/node-mongotools&lt;/a&gt; v 2.2.0 is out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just a reminder : this is NodeJS wrapper for mongodump and mongorestore plus dropbox and rotation features.&lt;/p&gt;

&lt;p&gt;I remove some dropbox indirect dependency to avoid &lt;code&gt;request&lt;/code&gt; vulnerability (cf &lt;a href="https://github.com/boly38/node-mongotools/issues/72"&gt;#72&lt;/a&gt; ).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://github.com/boly38/drobadi"&gt;http://github.com/boly38/drobadi&lt;/a&gt; v1.0.0 is out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just a reminder : "Drobadi : Dropbox backup directory" is NodeJS very-small dropbox wrapper to zip and upload to dropbox a given directory. You could also list/get backup.&lt;/p&gt;

&lt;p&gt;I remove some dropbox indirect dependency to avoid &lt;code&gt;request&lt;/code&gt; vulnerability (cf &lt;a href="https://github.com/boly38/drobadi/issues/33"&gt;#33&lt;/a&gt; ). And do some clean code to publish first major&lt;/p&gt;

</description>
      <category>hack23contributor</category>
    </item>
    <item>
      <title>Hourly monitor app'errors from Graylog to Slack</title>
      <dc:creator>Brice</dc:creator>
      <pubDate>Mon, 08 Mar 2021 21:25:53 +0000</pubDate>
      <link>https://dev.to/boly38/hourly-errors-from-graylog-to-slack-24ga</link>
      <guid>https://dev.to/boly38/hourly-errors-from-graylog-to-slack-24ga</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I'm using Graylog to store applicative logs.&lt;/p&gt;

&lt;p&gt;On error (&lt;code&gt;level:3&lt;/code&gt;), app will send an entry to graylog too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const graylog2 = require('graylog2');

const logger = new graylog2.graylog({
  servers: [{ 'host': '127.0.0.1', port: 12201 }]
});

// (...)

logger.error(msg)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By adding a little cron job shell script, I'm able to collect every hour the last error logs from graylog, then send them to Slack.&lt;/p&gt;

&lt;p&gt;This way I'm able to react to applicative issue.&lt;/p&gt;

&lt;p&gt;Here is &lt;code&gt;graylogMonitoring.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
# tools: apt-get install jq curl
# external secret requirements:
## export GRAY_AUTH=admin:mypassword
## export SLACK_WEBHOOK_ENDPOINT=https://hooks.slack.com/services/JUST/UPDATE/THIS

# to handle exclamation in password 
set +H

# send a slack message if webhook is set
  function slackNotification() {
    # markdown formatting : https://api.slack.com/reference/surfaces/formatting
    SLACK_TEXT_MSG="${1:-Something from logs is important}"
    if [ -z ${SLACK_WEBHOOK_ENDPOINT+x} ]; then
      echo "${SLACK_TEXT_MSG}"
    else
      curl -X POST --data "{\"type\": \"mrkdwn\",\"text\": \"${SLACK_TEXT_MSG}\"}" ${SLACK_WEBHOOK_ENDPOINT} || echo "unable to slack notify"
    fi
  }

# exit if there is no Graylog auth
if [ -z ${GRAY_AUTH+x} ]; then
  exit 0;
fi

# QUERY="*"
# url encoded query "level:3"
QUERY="level%3A3"
# level:3
# Full Graylog API call
GRAY_QUERY="http://localhost:9000/api/search/universal/relative?query=$QUERY&amp;amp;range=3600&amp;amp;fields=message&amp;amp;limit=100&amp;amp;sort=timestamp:desc"

curl --silent -u $GRAY_AUTH \
  -H "X-Requested-By: cli" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  ${GRAY_QUERY} -o LAST_WARN.json

# use jq to extract message from Graylog json response
cat LAST_WARN.json  |jq --raw-output '.messages[].message | (.timestamp + " | " +  .gl2_remote_ip + " | " + .message) ' &amp;gt; LAST_WARN.log

# send them to slack if result file is not empty
if [ -s "LAST_WARN.log" ]
then
  SLACK_MSG="Log warn sur la période : \n\`\`\`$(cat LAST_WARN.log | tr -d '"')\`\`\`"
  slackNotification "$SLACK_MSG"
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;About &lt;strong&gt;script trigger&lt;/strong&gt;: if you want to be more flexible than linux host cron job which require you to ssh login, edit crontab, .. &lt;/p&gt;

&lt;p&gt;then you could map this script to a dedicated webhook via &lt;a href="https://www.npmjs.com/package/node-hook-action"&gt;node-hook-action&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Having nodejs on you server,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install &lt;code&gt;node-hook-action&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install node-hook-action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;create a &lt;code&gt;webhookServer.js&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const server = require('node-hook-action');
server();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;create a webhook server &lt;code&gt;config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "server_config": {
    "host": "0.0.0.0",
    "port": 1502,
    "path": "/webhook",
    "secret": {
      "custom": thisIsASecret
    },
    "directories": {
      "logs": "logs"
    }
  },
  "actions": [
    {
      "headers": {
        "x-action":"logs"
      },
      "events": [
        {
          "event": "custom",
          "action": "bash /var/www/webhooks/graylogMonitoring.sh"
        }
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;start your webhook server using &lt;a href="https://pm2.keymetrics.io/"&gt;pm2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pm2 start node --name "webhook" -o /tmp/webhook.log -e /tmp/webhook-errors.log --time -- webhookServer.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update you reverse proxy (ex. nginx) to make an available webhook endpoint. &lt;/p&gt;

&lt;p&gt;Here is an extract of &lt;code&gt;nginx.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location /webhook {
    proxy_pass http://0.0.0.0:1502;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_cache_bypass $http_upgrade;

    proxy_set_header Host $host;
    proxy_set_header   X-Real-IP          $remote_addr;
    proxy_set_header   X-Forwarded-Proto  $scheme;
    proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to &lt;a href="https://cron-job.org/en/members/jobs/"&gt;the free cronjob service&lt;/a&gt; to plan your webhook at regular interval:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tUaq0SiK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ae221qo31fg3zsskbgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tUaq0SiK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ae221qo31fg3zsskbgg.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--axzIiUr0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x9kj9sxfn13r4pw21i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--axzIiUr0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x9kj9sxfn13r4pw21i9.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you're done !&lt;/p&gt;

&lt;p&gt;Keep an eye on your Slack channel&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---FCivsT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h7t5js2cjjnvkzl6204k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---FCivsT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h7t5js2cjjnvkzl6204k.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>slack</category>
      <category>logs</category>
      <category>monitoring</category>
      <category>graylog</category>
    </item>
  </channel>
</rss>
