<?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: adriens</title>
    <description>The latest articles on DEV Community by adriens (@adriens).</description>
    <link>https://dev.to/adriens</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%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png</url>
      <title>DEV Community: adriens</title>
      <link>https://dev.to/adriens</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adriens"/>
    <language>en</language>
    <item>
      <title>📊 I (finally) built the demo of my duckdb brew extension</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Fri, 29 May 2026 08:07:18 +0000</pubDate>
      <link>https://dev.to/adriens/i-finally-built-the-demo-of-my-duckdb-brew-extension-c6o</link>
      <guid>https://dev.to/adriens/i-finally-built-the-demo-of-my-duckdb-brew-extension-c6o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 Where it comes from
&lt;/h2&gt;

&lt;p&gt;In the previous &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt; I submitted a realization ; a &lt;code&gt;duckdb&lt;/code&gt; extension to make &lt;code&gt;brew&lt;/code&gt; packages reporting easier for analysis and security/audit concerns : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f" class="crayons-story__hidden-navigation-link"&gt;🦆Built a duckdb community extension for brew&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;GitHub Copilot CLI Challenge Submission&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-3232987" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f" id="article-link-3232987"&gt;
          🦆Built a duckdb community extension for brew
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cli"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cli&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubcopilot"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubcopilot&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;8&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              5&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Since that my extension got accepted as part of community extensions (see &lt;a href="https://duckdb.org/community_extensions/extensions/brew" rel="noopener noreferrer"&gt;dedicated page&lt;/a&gt;), I maintain it along &lt;code&gt;duckdb&lt;/code&gt; releases and have an constant 824 downloads/month, slowly gaining in popularity : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2058293935114801558-705" src="https://platform.twitter.com/embed/Tweet.html?id=2058293935114801558"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2058293935114801558-705');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2058293935114801558&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I've provided a set of ready to use &lt;code&gt;SQL&lt;/code&gt;, yet for some it may not show the full potentiel that I had in my head : I needed to make it more visual with dataviz and professionan datascience tools.&lt;/p&gt;

&lt;p&gt;I must confess I was a bit procrastinating that part... But this DEV Challenge PROMPT triggered the action!&lt;/p&gt;

&lt;h2&gt;
  
  
  🤗 What I Built
&lt;/h2&gt;

&lt;p&gt;I have created a Python based Quarto Notebook that generates a nice looking pdf report, thanks to the extension, ad put Graph Datascience in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/7oVyu5jouxU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 The Comeback Story
&lt;/h2&gt;

&lt;p&gt;Images are much better than words : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2060466960794853574-236" src="https://platform.twitter.com/embed/Tweet.html?id=2060466960794853574"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2060466960794853574-236');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2060466960794853574&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🦥 My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I built the Quarto notebook within 2 hours of prompting before getting out of tokens : &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%2F99fkl0m9k49pf2fea0qb.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%2F99fkl0m9k49pf2fea0qb.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>datascience</category>
      <category>security</category>
    </item>
    <item>
      <title>⚚ I reverse-engineered my mobile operator's APK — then Hermes Agent wrote the executive report</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Thu, 28 May 2026 23:01:45 +0000</pubDate>
      <link>https://dev.to/adriens/i-reverse-engineered-my-mobile-operators-apk-then-hermes-agent-wrote-the-executive-report-2j3o</link>
      <guid>https://dev.to/adriens/i-reverse-engineered-my-mobile-operators-apk-then-hermes-agent-wrote-the-executive-report-2j3o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;: Write About Hermes Agent&lt;/em&gt;&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%2F5s4ragmo9l44h9n03ugp.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%2F5s4ragmo9l44h9n03ugp.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2059698327235805258-575" src="https://platform.twitter.com/embed/Tweet.html?id=2059698327235805258"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2059698327235805258-575');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2059698327235805258&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Zw-lfNFA0fQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📸 Screenshots
&lt;/h2&gt;

&lt;p&gt;Just check how amazing these reports look like!&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%2Fh35idkeksm06uvxqopw9.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%2Fh35idkeksm06uvxqopw9.png" alt=" " width="799" height="333"&gt;&lt;/a&gt;&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%2F4ggs9a2sbj4p1xmqe7p1.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%2F4ggs9a2sbj4p1xmqe7p1.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&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%2Fku8badzwm9b1aewey8vw.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%2Fku8badzwm9b1aewey8vw.png" alt=" " width="799" height="280"&gt;&lt;/a&gt;&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%2F9f0a1bal7o4n17fpjzcn.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%2F9f0a1bal7o4n17fpjzcn.png" alt=" " width="800" height="585"&gt;&lt;/a&gt;&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%2Fd3559l8zh7mjwy1gc1ok.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%2Fd3559l8zh7mjwy1gc1ok.png" alt=" " width="800" height="760"&gt;&lt;/a&gt;&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%2Fibzai5n6shn80b2xpcni.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%2Fibzai5n6shn80b2xpcni.png" alt=" " width="800" height="824"&gt;&lt;/a&gt;&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%2F5bb2u5qzo6tv9yo7982o.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%2F5bb2u5qzo6tv9yo7982o.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&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%2Fvq7ccs37sz474pk7h3yi.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%2Fvq7ccs37sz474pk7h3yi.png" alt=" " width="800" height="678"&gt;&lt;/a&gt;&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%2Fxl7wt2yzvp7pyhj1s9o6.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%2Fxl7wt2yzvp7pyhj1s9o6.png" alt=" " width="800" height="804"&gt;&lt;/a&gt;&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%2Fphb10ou2plkwtqdnkns2.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%2Fphb10ou2plkwtqdnkns2.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Building a Multi-Stakeholder API Monitoring Report with Hermes Agent
&lt;/h1&gt;

&lt;p&gt;"Just generate a PDF" — famous last words. What started as a simple request turned into something much bigger: a full monitoring stack for my mobile operator, built evenings and weekends, culminating in a 17-page professional report that would have taken a full week to build manually. Total cost with Hermes Agent: &lt;strong&gt;$19.57&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏝️ The Backstory: A Stack No One Else Has
&lt;/h2&gt;

&lt;p&gt;I'm Adrien, a developer in New Caledonia. OPT-NC's Helia mobile service has an app — but no public API, no CLI, nothing on any marketplace. So I &lt;strong&gt;reverse-engineered the APK&lt;/strong&gt;, extracted the private HTTP calls, and rebuilt them in a &lt;strong&gt;Go CLI&lt;/strong&gt; that snapshots voice, data, and SMS consumption every 5 minutes into a local &lt;strong&gt;DuckDB&lt;/strong&gt; database.&lt;/p&gt;

&lt;p&gt;Then I built &lt;strong&gt;KDE Plasma widgets&lt;/strong&gt; in Python/PyQt that read from DuckDB and display live on my desktop — mirroring the official app's data, but with history, trends, burn rate, and alerts. Plus a &lt;strong&gt;system tray icon&lt;/strong&gt; showing live API status at a glance.&lt;/p&gt;

&lt;p&gt;The official app shows you &lt;em&gt;now&lt;/em&gt;. My stack shows you &lt;em&gt;now, history, trends, and alerts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No other Helia customer has this.&lt;/strong&gt; That's the breakthrough.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Problem Hermes Agent Solved
&lt;/h2&gt;

&lt;p&gt;All this data was sitting in DuckDB. The question was: &lt;em&gt;how do I present it to people who don't speak SQL?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three completely different audiences: the &lt;strong&gt;CEO&lt;/strong&gt; who needs a 30-second summary screenshot-ready for PowerPoint, the &lt;strong&gt;CIO&lt;/strong&gt; who wants ROI in euros and SLA compliance, and the &lt;strong&gt;Network Admin&lt;/strong&gt; who needs actionable tickets with specific hours and error patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 The Role-Playing Game That Became the Design Document
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of code, I asked Hermes Agent to do something unusual: &lt;strong&gt;simulate a full team meeting&lt;/strong&gt; with 7 personas — CEO, CIO, network admin, developers, and marketing.&lt;/p&gt;

&lt;p&gt;It produced a full transcript. Each persona argued their case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;CIO&lt;/strong&gt;: &lt;em&gt;"I need ROI in euros, not percentages."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;CEO&lt;/strong&gt;: &lt;em&gt;"I need the 30-second version I can project tomorrow morning."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Network Admin&lt;/strong&gt;: &lt;em&gt;"Give me Jira tickets with specific hours, not a dashboard."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That transcript became the design document. Every page of the report was written against a specific person's stated need. No guessing. No generic output.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ What Hermes Agent Built in ~1 Hour
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It started with the data.&lt;/strong&gt; No assumptions — it queried the schema and immediately caught something: average latency was 2,534ms but the median was 204ms. Bimodal distribution. That single insight shaped every chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It extracted brand colors from the website&lt;/strong&gt; before writing a single line of LaTeX. Hermes Agent opened Helia's site, pulled the magenta/pink gradient from the SVG logo, and used it consistently across every chart, table, and tcolorbox. Small detail. Big difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then it built everything:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 Python scripts: latency distributions, timeout heatmap, sparkline, 4-panel executive chart&lt;/li&gt;
&lt;li&gt;Full XeLaTeX report with TikZ progress bars and brand-colored boxes&lt;/li&gt;
&lt;li&gt;A French accent fixer script baked into the pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One message: &lt;em&gt;"update with fresh data"&lt;/em&gt; — triggered 8+ tool calls automatically: DuckDB → diff → scripts → charts → LaTeX → 2× compile → verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 The Charts It Produced (Without Being Asked)
&lt;/h2&gt;

&lt;p&gt;I asked for charts. I didn't ask for &lt;em&gt;this&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency distribution&lt;/strong&gt; — median/mean/P95 lines labeled, shaded fast vs slow zones, annotated arrow pointing to the long tail: &lt;em&gt;"Queue longue (timeout ~12s) (~40% des pings)"&lt;/em&gt;. Log-scale version revealing the true bimodal structure: two peaks at ~80ms and ~4s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4-panel executive dashboard&lt;/strong&gt; — availability gauge (87.2% vs 99.5% SLA), latency (2534ms vs 500ms — &lt;em&gt;"5.1x trop lent"&lt;/em&gt;), timeout rate (&lt;em&gt;"1 requête sur 8 échoue"&lt;/em&gt;), composite SLA score per metric. &lt;strong&gt;Score global: 65%. Verdict: RED.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeout heatmap&lt;/strong&gt; — all 18 timeouts concentrated on Wednesday evening 19h–22h. The rest of the week: clean. Instant actionable insight for the network admin.&lt;/p&gt;

&lt;p&gt;All in Helia brand colors. All annotated. None of it explicitly requested.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 The Executive Summary: Fits in One Slide
&lt;/h2&gt;

&lt;p&gt;Page 3 of the report is designed to be screenshotted directly into PowerPoint. Verdict box at the top (red), plain-language translation (&lt;em&gt;"1 call in 8 fails"&lt;/em&gt;), business impact in euros, top 3 problems with responsible parties. The CEO gets it in 30 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Orchestration is the real superpower.&lt;/strong&gt; I asked for a PDF. It fetched brand colors, queried the DB, wrote Python scripts, compiled LaTeX — all unprompted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iteration is the default.&lt;/strong&gt; The first charts were basic. The final ones have annotated thresholds, color-coded data points, and statistical summaries. That's the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills are the real ROI.&lt;/strong&gt; Everything got distilled into a reusable &lt;code&gt;~/.claude/skills/reporting-latex/&lt;/code&gt; skill. Next similar project starts at 80%, not zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  💰 The Cost
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://openrouter.ai/qwen/qwen3.7-max" rel="noopener noreferrer"&gt;Qwen3.7-Max&lt;/a&gt; via OpenRouter.&lt;/strong&gt; Alibaba's flagship agentic model, built for long-horizon autonomous execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;326 requests. 61.4M tokens. $19.57. ~1 hour. vs a full week manually.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🖥️ What's Next
&lt;/h2&gt;

&lt;p&gt;The next step: &lt;strong&gt;run it all locally&lt;/strong&gt;. I'm currently eyeing an &lt;a href="https://www.ldlc.com/fiche/PB00675416.html" rel="noopener noreferrer"&gt;Apple Mac Studio M4 Max&lt;/a&gt; — 16-core CPU, 40-core GPU, 64 Go unified memory. New Caledonia is 20,000km from everything; local inference just makes sense. Zero API costs, zero latency to the cloud, full control.&lt;/p&gt;

&lt;p&gt;With 64GB unified memory, I'd be able to run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3-Coder-Next&lt;/strong&gt; — purpose-built for agentic coding, 70%+ on SWE-bench, needs 46GB RAM ✅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3.5-35B-A3B&lt;/strong&gt; — the 2026 community default for local inference, ~80 tok/s via MLX ✅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3.6-27B&lt;/strong&gt; — optimized specifically for agentic coding workflows ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same class of model as Qwen3.7-Max on OpenRouter — locally, for free, forever. A fully local Hermes Agent stack.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From $19.57 on OpenRouter to owning the hardware. That's the roadmap.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The pattern: &lt;strong&gt;monitor → query → visualize → compose → translate&lt;/strong&gt;. The &lt;em&gt;translate&lt;/em&gt; step — turning a percentile into a story a CEO can act on — is where Hermes Agent earns its keep.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you used Hermes Agent for multi-tool orchestration? Curious how your experience compares.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>datascience</category>
    </item>
    <item>
      <title>🧞‍♂️Transform unstructured PDFs Job Offers into a dataset w. gemma4:2b</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sun, 17 May 2026 22:47:08 +0000</pubDate>
      <link>https://dev.to/adriens/transform-unstructured-pdfs-job-offers-into-a-dataset-w-gemma42b-4ggb</link>
      <guid>https://dev.to/adriens/transform-unstructured-pdfs-job-offers-into-a-dataset-w-gemma42b-4ggb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 About the power of collections and our ability to compare things
&lt;/h2&gt;

&lt;p&gt;First a bit of philosophy.&lt;/p&gt;

&lt;p&gt;Did you notice how we tend to align things, tend to shape things so they can be aligned, compared (based on a common attributes like color, weight,...).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Comparing objects is much easier when they share common structure, &lt;strong&gt;then we can use attributes to get more knowledge, produce KPIs, make clever choices and put things in evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;👉 Well the same happens with machines : it's much much easier to compare and manage documents when they share a same structure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the very core idea that motivated this work to explore how Open Source AI could help in a very pragmatic way... and feel the opportunities it opens with concrete prototypes.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙋 What I Built
&lt;/h2&gt;

&lt;p&gt;I've built a whole real life and live data pipeline that takes as input Open Data Public Sector Job offers (&lt;a href="https://data.gouv.nc/explore/dataset/avis-de-vacances-de-poste-avp-drhfpnc" rel="noopener noreferrer"&gt;&lt;code&gt;dataset/avis-de-vacances-de-poste-avp-drhfpnc&lt;/code&gt;&lt;/a&gt;) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Raw &lt;code&gt;PDFs&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From a dedicated GH repo &lt;a href="https://github.com/adriens/avps" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/avps&lt;/code&gt;&lt;/a&gt; I've prepared a whole structured mix of &lt;code&gt;md&lt;/code&gt; thanks to &lt;code&gt;csv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then from the GH Action I did transform brut raw PDFs with &lt;a href="https://pypi.org/project/marker-pdf/" rel="noopener noreferrer"&gt;&lt;code&gt;pypi.org/marker-pdf&lt;/code&gt;&lt;/a&gt; into &lt;code&gt;markdown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;I ended to publish a dedicated Zensical &lt;code&gt;gh-pages&lt;/code&gt; website : &lt;a href="https://adriens.github.io/avps/" rel="noopener noreferrer"&gt;&lt;code&gt;adriens.github.io/avps&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next, this is where things go really interesting : I wanted to be able to compare job offers the one against the others... &lt;strong&gt;but markdown were far too much different the one from others&lt;/strong&gt; : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not the same number of sections&lt;/li&gt;
&lt;li&gt;Not the same section titles : hard skills, soft skills, missions,...&lt;/li&gt;
&lt;li&gt;Not the same levels of sections&lt;/li&gt;
&lt;li&gt;Not necessarly itemized the one &lt;/li&gt;
&lt;li&gt;Not the same style at all (section levels, CAPITALs, email, cities...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... which made it very hard... or even impossible to compare them amongs the others... or even crazier : put them in a traditional SQL structured database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 This is where &lt;code&gt;gemma4:2b&lt;/code&gt; comes in to create a very well and consistent set of markdowns&lt;/strong&gt; that can then be used for various use cases : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create very well structured &lt;code&gt;ePub&lt;/code&gt;&lt;/strong&gt; to read job offers on the go (and docx)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a very clean and well organized PDF&lt;/strong&gt; : very easy to load in assistants, print or to drop in any assistant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver structured data&lt;/strong&gt; with clean &lt;code&gt;json&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make a &lt;code&gt;duckdb&lt;/code&gt; database and perform &lt;code&gt;SQL&lt;/code&gt;&lt;/strong&gt; on the data by using the now well structured markdowns, which made it possible to open unprecedented and exciting reporting opportunities (here in &lt;code&gt;duckdb&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share all this&lt;/strong&gt; as a dataset on Kaggle
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'--- RÉPARTITION DES COMPÉTENCES PAR DOMAINE ---'&lt;/span&gt;
&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;titre_report&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;domaine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nb_competences&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;savoir_faire&lt;/span&gt; 
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2055533578021396775-283" src="https://platform.twitter.com/embed/Tweet.html?id=2055533578021396775"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2055533578021396775-283');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2055533578021396775&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h1&gt;
  
  
  🎯 Problems it solves
&lt;/h1&gt;

&lt;p&gt;In input we really had very various kind of PDF documents, and no structured tabular data, now, they both are delivered as : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Well formated and structured markdown&lt;/li&gt;
&lt;li&gt;A real database that embeds data as tables and views for advanced SQL reporting and charting&lt;/li&gt;
&lt;li&gt;Ready to use and perfectly well structred ePub and PDF documents, very easy for LLMs to understand&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🤗 Experience it creates
&lt;/h1&gt;

&lt;p&gt;The experience is rather an data experience as thanks to data normalisation and standardization we can load and compare job offers, which make job search and indexing much much more efficient, whatever the input.&lt;/p&gt;

&lt;p&gt;Last but not least, using &lt;code&gt;gemma4:2b-it&lt;/code&gt; proves that great things can be achieved even with small resources and that well prepared data opens so many intelligence opportunities, without having to deal with frontier models as &lt;em&gt;"the output I got is good enough"&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Rui7jSKNJNk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  💰 The benefits : then and now
&lt;/h2&gt;

&lt;p&gt;Below the benchmark of markdown before and after&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚖️ Benchmark : &lt;strong&gt;&lt;code&gt;marker-pdf&lt;/code&gt; vs. &lt;code&gt;marker-pdf&lt;/code&gt; ➕ &lt;code&gt;gemma4:e2b&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Below some results:&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%2Fdjebvux6akthvn2tn4bb.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%2Fdjebvux6akthvn2tn4bb.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Structure consistency:&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%2F5qu87m44rlsez1bvz0vt.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%2F5qu87m44rlsez1bvz0vt.png" alt=" " width="583" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Analytics on top of database
&lt;/h3&gt;

&lt;p&gt;One the well-structured &lt;code&gt;json&lt;/code&gt; could be produced from the markdown I could efficiently load them into a &lt;code&gt;duckdb&lt;/code&gt; database and do some reporting see &lt;a href="https://www.kaggle.com/code/adriensales/avps-drhfpnc-les-pdf-en-sql-avec-duckdb" rel="noopener noreferrer"&gt;AVPS DRHFPNC - Les pdf en &lt;code&gt;SQL&lt;/code&gt; avec &lt;code&gt;duckdb&lt;/code&gt;&lt;/a&gt; Kaggle notebook : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2055751934301380738-571" src="https://platform.twitter.com/embed/Tweet.html?id=2055751934301380738"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2055751934301380738-571');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2055751934301380738&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kaggle Notebook : &lt;a href="https://www.kaggle.com/code/adriensales/ia-avps-drhfpnc-structur-s" rel="noopener noreferrer"&gt;IA AVPs DRHFPNC Structurés&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle dataset : &lt;a href="https://www.kaggle.com/datasets/adriensales/avps-nouvelle-caldonie-structurs/data" rel="noopener noreferrer"&gt;&lt;code&gt;avps-nouvelle-caldonie-structurs/data&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub repo &lt;a href="https://github.com/adriens/avps" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/avps&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Zensical website : &lt;a href="https://adriens.github.io/avps/" rel="noopener noreferrer"&gt;&lt;code&gt;adriens.github.io/avps&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle notebook that shows how to load structured &lt;code&gt;json&lt;/code&gt; into a &lt;code&gt;duckdb&lt;/code&gt; database : &lt;a href="https://www.kaggle.com/code/adriensales/avps-drhfpnc-les-pdf-en-sql-avec-duckdb" rel="noopener noreferrer"&gt;AVPS DRHFPNC - Les pdf en &lt;code&gt;SQL&lt;/code&gt; avec &lt;code&gt;duckdb&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎁 Goodies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://notebooklm.google.com/notebook/fa2d947b-4d60-4381-974c-5ea37f07f602" rel="noopener noreferrer"&gt;Notebook LM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;I chose &lt;code&gt;google/gemma-4/transformers/gemma-4-e2b-it&lt;/code&gt; from &lt;a href="https://github.com/Kaggle/kagglehub" rel="noopener noreferrer"&gt;&lt;code&gt;kagglehub&lt;/code&gt;&lt;/a&gt; as I had a huge amounf of data to load (all New-Caledonia ones) and a restricted amount of time on Kaggle as well as small GPUs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Also my intent was to be able to &lt;strong&gt;run this code one day onPrem on my very own hardware so I decided to stay as little as possible.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🤔 What remains to do...
&lt;/h2&gt;

&lt;p&gt;Try to: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add an evaluation phasis&lt;/strong&gt; to check output consistency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try to switch to CPU mode&lt;/strong&gt; so the Notebook can be scheduled without exceeding the maximum Kaggle window&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://huggingface.co/google/gemma-4-E4B" rel="noopener noreferrer"&gt;&lt;code&gt;gemma-4-E4B&lt;/code&gt;&lt;/a&gt; and benchmark output quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Produce native &lt;code&gt;adoc&lt;/code&gt;&lt;/strong&gt; with proper annotations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First produce &lt;code&gt;json&lt;/code&gt;&lt;/strong&gt; (and more standardized values, enums,...) then re-generate &lt;code&gt;md&lt;/code&gt;/&lt;code&gt;adoc&lt;/code&gt; from it&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>💸 How $0 marketing budget boosted my creativity &amp; automation opportunities</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Wed, 11 Mar 2026 20:11:05 +0000</pubDate>
      <link>https://dev.to/adriens/how-0-marketing-budget-boosted-my-creativity-automation-opportunities-3n9j</link>
      <guid>https://dev.to/adriens/how-0-marketing-budget-boosted-my-creativity-automation-opportunities-3n9j</guid>
      <description>&lt;h2&gt;
  
  
  💡 Inception back in days
&lt;/h2&gt;

&lt;p&gt;Years ago I watched the following &lt;a href="https://www.netflix.com/nc/title/80057883" rel="noopener noreferrer"&gt;Netflix series&lt;/a&gt; : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A look beyond blueprints and computers into the art and science of design, showcasing great designers from every discipline whose work shapes our world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/dmWeJVtv1lw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Then wrote a &lt;a href="https://www.linkedin.com/pulse/how-did-netflix-put-my-heart-brain-fire-abstract-art-design-sales/" rel="noopener noreferrer"&gt;dedicated article&lt;/a&gt; : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How did Netflix put my heart &amp;amp; brain on fire with "Abstract: The Art of Design"​ S02&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/how-did-netflix-put-my-heart-brain-fire-abstract-art-design-sales/" rel="noopener noreferrer"&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%2F1ipnf2n7291yvdbl8jfh.png" alt=" " width="647" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That brought me a lot of inspiration about : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The power of simple/pure designs&lt;/li&gt;
&lt;li&gt;Importance of typography&lt;/li&gt;
&lt;li&gt;How to manage color gradients&lt;/li&gt;
&lt;li&gt;How a minimalist design opens opportunities&lt;/li&gt;
&lt;li&gt;How playing with things makes us creative and productive (&lt;a href="https://casholman.com/" rel="noopener noreferrer"&gt;Cas Holman&lt;/a&gt;, founder of toy company)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⏳ About &lt;code&gt;geol&lt;/code&gt; : the need for a logo
&lt;/h2&gt;

&lt;p&gt;Then since last year we started to work on &lt;a href="https://github.com/opt-nc/geol" rel="noopener noreferrer"&gt;&lt;code&gt;geol&lt;/code&gt;&lt;/a&gt;, and I started to feel the need to get a logo for example to : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display in the terminal&lt;/li&gt;
&lt;li&gt;Show up in youtube thumbnails&lt;/li&gt;
&lt;li&gt;Give an identity to our &lt;a href="https://opt-nc.github.io/geol/" rel="noopener noreferrer"&gt;website&lt;/a&gt; (we &lt;a href="https://youtu.be/JHWafHI52D8" rel="noopener noreferrer"&gt;built one w. Docusaurus&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I filled an issue... to fix later.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 How low marketing skills and budget boosted my creativity
&lt;/h2&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1992068608395276623-107" src="https://platform.twitter.com/embed/Tweet.html?id=1992068608395276623"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1992068608395276623-107');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1992068608395276623&amp;amp;theme=dark"
  }



 &lt;/p&gt;
&lt;h2&gt;
  
  
  🍿 Show me what it looks like
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/iRfW13FleGE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Inception and paper/pen drafts
&lt;/h2&gt;

&lt;p&gt;To build a logo, you need to focus on what your product does at its very core.&lt;br&gt;
In my case, I came to the conclusion that there were two core things: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⏳ Pay a tribute&lt;/strong&gt; to the data source : &lt;a href="https://endoflife.date/" rel="noopener noreferrer"&gt;&lt;code&gt;endoflife.date&lt;/code&gt;&lt;/a&gt; API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🚦 Colors&lt;/strong&gt; which is the color identities, know when:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🟢 We're ok&lt;/strong&gt; with a product,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🟠 When we should start to take care&lt;/strong&gt;: time to plan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔴 When it's too late&lt;/strong&gt;: you're at risk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So finally, two dimensions : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📐 Shape&lt;/li&gt;
&lt;li&gt;🎨 Colors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It started to trigger my curiosity about geometric considerations, which could hence be described thanks to mathematical objects, &lt;strong&gt;finally opening coding and automation opportunities.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started to draw and draw a lot of shapes, think about how to put colors, the benefits of a simple geometrical/mathematical vectorial approach while enjoying a coffee cup outdoor seating at a café, drafting ideas and charts w. the paper/pen strategy : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2025338147153084787-440" src="https://platform.twitter.com/embed/Tweet.html?id=2025338147153084787"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2025338147153084787-440');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2025338147153084787&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  ☝️ Put more constraints to be more productive
&lt;/h2&gt;

&lt;p&gt;I really love the pattern that consists of putting more rules to be more creative and just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;see what happens if...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally I got my own rules.&lt;/p&gt;

&lt;p&gt;The logo should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Be perfectly described with a few mathematical&lt;/strong&gt; geometrical rules as possible (easier to code or to draw, even by a kid)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give sense to colors&lt;/strong&gt; and product lifecycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay a tribute to its core meaning&lt;/strong&gt; : the hourglass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fun with graph datascience&lt;/strong&gt;: it has to be both eulerian and hamiltoninan &lt;/li&gt;
&lt;li&gt;Be as light as possible&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🚀 Pure code and automation
&lt;/h2&gt;

&lt;p&gt;Once I found the solution came the coding part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design the &lt;code&gt;svg&lt;/code&gt; (and put placeholders inside them)&lt;/li&gt;
&lt;li&gt;Create a &lt;a href="https://taskfile.dev/" rel="noopener noreferrer"&gt;&lt;code&gt;Taskfile&lt;/code&gt;&lt;/a&gt; to automate a bunch of things (generate various formats from a single &lt;code&gt;task&lt;/code&gt; command)&lt;/li&gt;
&lt;li&gt;Inject colors with code and automation&lt;/li&gt;
&lt;li&gt;Create automation tasks that build jpeg, png, animated &amp;amp; static gifs, webp, optimize jpeg... all built and delivered as output artefacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So finally I came from a workflow on a paper to a fully automated makefile:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2030389652960710939-827" src="https://platform.twitter.com/embed/Tweet.html?id=2030389652960710939"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2030389652960710939-827');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2030389652960710939&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🖼️ Benefits : the &lt;code&gt;100%&lt;/code&gt; LaTeX cheatsheet
&lt;/h2&gt;

&lt;p&gt;As a benefit I could produce a 100% LateX version of the logo (&lt;a href="https://youtu.be/iRfW13FleGE?si=1A9q3YO6ZM8i_-T6&amp;amp;t=801" rel="noopener noreferrer"&gt;see full demo&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1995616096351891548-579" src="https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1995616096351891548-579');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🔭 Further opportunities
&lt;/h2&gt;

&lt;p&gt;What's exciting with a "simple logo" is that it makes it possible to use the mathematical vectorial description and inject it in many artistic artefacts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3d printing&lt;/li&gt;
&lt;li&gt;Pixelart&lt;/li&gt;
&lt;li&gt;T-Shirts&lt;/li&gt;
&lt;li&gt;Code driven animations&lt;/li&gt;
&lt;li&gt;Shaders&lt;/li&gt;
&lt;li&gt;Desktop Wallpapers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who knows where creativy will take us 🤗&lt;/p&gt;

</description>
      <category>automation</category>
      <category>marketing</category>
      <category>design</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🦈 Analyzing Open Data shark attacks with gemini-cli and Quarto 📊</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sat, 28 Feb 2026 06:55:37 +0000</pubDate>
      <link>https://dev.to/adriens/analyzing-open-data-shark-attacks-with-gemini-cli-and-quarto-3pe8</link>
      <guid>https://dev.to/adriens/analyzing-open-data-shark-attacks-with-gemini-cli-and-quarto-3pe8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  😂 Spoiler alert : what it was not
&lt;/h2&gt;

&lt;p&gt;It was not a straight and peaceful journey&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2027947601442836653-336" src="https://platform.twitter.com/embed/Tweet.html?id=2027947601442836653"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2027947601442836653-336');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2027947601442836653&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  ❔ What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;I created a Quarto Notebook based on Open data (I maintain since many years now) that reports Shark attacks in New-Caledonia to better understand what happens since many years now.&lt;/p&gt;

&lt;p&gt;I used Gemini-cli to :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Help implement the Notebook that I wanted to look a bit like a newspaper report&lt;/li&gt;
&lt;li&gt;Give me some inspirations during chats&lt;/li&gt;
&lt;li&gt;Ask him to challenge me with questions&lt;/li&gt;
&lt;li&gt;Imagine an interview which gave me the opportunity to better express &amp;amp; share my ideas&lt;/li&gt;
&lt;li&gt;Challenge me with new questions&lt;/li&gt;
&lt;li&gt;Finally produce a journalistic like paper anyone can read and print&lt;/li&gt;
&lt;li&gt;Finally put this pdf as input with other related articles data sources into NotebookLM to produce a video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretty fast, I could get first stuning dataviz : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2027632648970223954-198" src="https://platform.twitter.com/embed/Tweet.html?id=2027632648970223954"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2027632648970223954-198');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2027632648970223954&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Work planning (brain on fire)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Saturday 2026-02-28 : 07:00 AM to 18:30 PM&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;First MVP&lt;/li&gt;
&lt;li&gt;Video demo&lt;/li&gt;
&lt;li&gt;NotebookLM video production&lt;/li&gt;
&lt;li&gt;First article version and publication&lt;/li&gt;
&lt;li&gt;First social posts to share the insights I discovered&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Sunday 2026-03-01 07h00 AM - 10:30 &amp;amp; 13:00 - 15:00&lt;/strong&gt; :

&lt;ul&gt;
&lt;li&gt;pdf finetuning, review and little enhancements&lt;/li&gt;
&lt;li&gt;Section title review&lt;/li&gt;
&lt;li&gt;Charts title review&lt;/li&gt;
&lt;li&gt;Take feedbacks and implement them&lt;/li&gt;
&lt;li&gt;Chase on keyfindings hallucinations with specific data-driven PROMPTs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  🍿 Demos
&lt;/h2&gt;

&lt;p&gt;The main output of the project is a &lt;a href="https://github.com/adriens/odata-ncl/blob/main/data/shark-attacks/shark-attacks-ncl.pdf" rel="noopener noreferrer"&gt;pdf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yet, here is the full storytelling I'll use for educational purpose: &lt;/p&gt;

&lt;h3&gt;
  
  
  Long edition with pdf commenting
&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/M3iiRXKgz60"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Short edition (for educational purposes)
&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/4YQoeajyMHA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📑 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source code : &lt;a href="https://github.com/adriens/odata-ncl/tree/main/data/shark-attacks" rel="noopener noreferrer"&gt;&lt;code&gt;github.com/adriens/odata-ncl/data/shark-attacks&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Final &lt;a href="https://github.com/adriens/odata-ncl/blob/main/data/shark-attacks/shark-attacks-ncl.pdf" rel="noopener noreferrer"&gt;pdf&lt;/a&gt; report&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notebooklm.google.com/notebook/16b78338-09b8-4ed0-9493-5ebae276b933" rel="noopener noreferrer"&gt;NotebookLM project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python SDK for water quality : &lt;a href="https://github.com/adriens/edb-noumea" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/edb-noumea&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ready to use &lt;code&gt;csv&lt;/code&gt; data for water quality : &lt;a href="https://github.com/adriens/edb-noumea-data" rel="noopener noreferrer"&gt;&lt;code&gt;edb-noumea-data&lt;/code&gt;&lt;/a&gt;, automated with Gh Actions&lt;/li&gt;
&lt;li&gt;Go &lt;code&gt;TUI&lt;/code&gt; to browser water quality from any terminal : &lt;a href="https://github.com/adriens/edb-noumea-tui" rel="noopener noreferrer"&gt;&lt;code&gt;edb-noumea-tui&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle dataset : &lt;a href="https://www.kaggle.com/datasets/adriensales/shark-attack-nouvelle-caldonie/data" rel="noopener noreferrer"&gt;🦈 Shark Attacks - New Caledonia&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle Notebook : &lt;a href="https://www.kaggle.com/code/adriensales/shark-attacks-new-caledonia-for-dummies" rel="noopener noreferrer"&gt;🦈 Shark Attacks New-Caledonia for dummies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle Notebook : &lt;a href="https://www.kaggle.com/code/ssff11/shark-attacks-in-new-caledonia-analysis" rel="noopener noreferrer"&gt;Shark Attacks in New Caledonia - Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle Notebook : &lt;a href="https://www.kaggle.com/code/adriensales/shark-attacks-new-caledonia-kpis" rel="noopener noreferrer"&gt;🦈 Shark Attacks New-Caledonia KPIs&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧑‍🎓 What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Need to very seriouly &amp;amp; carefully review AI generated comment on charts as quite often for example the "Key findings" were wrong : 

&lt;ul&gt;
&lt;li&gt;Nor respect for the color code accross the whole document (fatal vs. non fatal attacks)&lt;/li&gt;
&lt;li&gt;Evaluating 59% as the 2/3 of the attacks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Put the terminal to a given level of transparency so I coul read the resulting pdf while chating with gemini-cli (I have a small laptop with single screen)&lt;/li&gt;

&lt;li&gt;I could very efficently take other people feedbacks in account which had a huge impact on dataviz and KPIs to avoid bias&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;I only used Gemin-cli : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I really enjoyed being interviewed by Gemini, it really made me creative, it was the first time I did this, but for sure I will reuse this pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📸 Screenshots
&lt;/h2&gt;

&lt;p&gt;Below a collection of the resulting pdf : &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%2F17de9rstrkogd9e36ton.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%2F17de9rstrkogd9e36ton.png" alt=" " width="800" height="680"&gt;&lt;/a&gt;&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%2F9s6veuoxj9qxo5v5244t.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%2F9s6veuoxj9qxo5v5244t.png" alt=" " width="800" height="848"&gt;&lt;/a&gt;&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%2F2izncqqnr82w8d3cb31f.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%2F2izncqqnr82w8d3cb31f.png" alt=" " width="800" height="545"&gt;&lt;/a&gt;&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%2Fzmm1omc1tdcdj1uvrjze.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%2Fzmm1omc1tdcdj1uvrjze.png" alt=" " width="800" height="691"&gt;&lt;/a&gt;&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%2Fupeyrrulh9t2k3e08qj2.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%2Fupeyrrulh9t2k3e08qj2.png" alt=" " width="800" height="636"&gt;&lt;/a&gt;&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%2F12mrzjm7vw4movgb8tjm.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%2F12mrzjm7vw4movgb8tjm.png" alt=" " width="800" height="687"&gt;&lt;/a&gt;&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%2Fk7p9hj6p0iy8co1fvidl.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%2Fk7p9hj6p0iy8co1fvidl.png" alt=" " width="800" height="538"&gt;&lt;/a&gt;&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%2F6366ij4f7fapx0xinwgn.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%2F6366ij4f7fapx0xinwgn.png" alt=" " width="800" height="627"&gt;&lt;/a&gt;&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%2Fek7kivte1l4867f4c6pj.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%2Fek7kivte1l4867f4c6pj.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&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%2Fma60ecqe7bike3vgditt.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%2Fma60ecqe7bike3vgditt.png" alt=" " width="800" height="852"&gt;&lt;/a&gt;&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%2Fbfybghute8aah0r8fcxw.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%2Fbfybghute8aah0r8fcxw.png" alt=" " width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>datascience</category>
    </item>
    <item>
      <title>🦆Built a duckdb community extension for brew</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sat, 14 Feb 2026 03:55:40 +0000</pubDate>
      <link>https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f</link>
      <guid>https://dev.to/adriens/built-a-duckdb-community-extension-for-brew-4k6f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤓 What I Built
&lt;/h2&gt;

&lt;p&gt;Sometimes ago I got asked to report what I installed on my Ubuntu... and like many people it turned out I installed various softwares in very various ways : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;&lt;code&gt;brew&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;uv&lt;/code&gt; (but mostly in virtual environments)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, at first I started with that kind of data-analysis and dataviz (and made it open source, see &lt;a href="https://github.com/adriens/ubuntu-rmarkdown-report" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/ubuntu-rmarkdown-report&lt;/code&gt;&lt;/a&gt;):&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%2Fxzhprk9t7dt9q83d90xg.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%2Fxzhprk9t7dt9q83d90xg.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I started to &lt;strong&gt;look around how I could efficiently automate that with standard data tools to make this work look like a piece of cake (avoid boilerplate &lt;code&gt;R&lt;/code&gt; code in my case).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I then found the great &lt;a href="https://osquery.io/" rel="noopener noreferrer"&gt;&lt;code&gt;osquery&lt;/code&gt;&lt;/a&gt; initiative, which makes it possible to query any operating system metric or information from a simple &lt;code&gt;SQL&lt;/code&gt; : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;osquery&lt;/code&gt; exposes an operating system as a high-performance relational database. This allows you to write SQL queries to explore operating system data. With osquery, SQL tables represent abstract concepts such as running processes, loaded kernel modules, open network connections, browser plugins, hardware events or file hashes.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But when I wanted to query installed &lt;code&gt;brew&lt;/code&gt; packages, it turned out that I had to write an extension (which is very well documented).&lt;/p&gt;

&lt;p&gt;So I finally opted to write a dedicated &lt;code&gt;Rmarkdown&lt;/code&gt; notebook, started to play with custom dataframes (easy to share)... &lt;strong&gt;but pretty soon I felt like it would be much more convenient to be able to query this data within &lt;code&gt;duckdb&lt;/code&gt; itself so it could make the data much much easier to get in various usecases (&lt;code&gt;R&lt;/code&gt;, &lt;code&gt;Python&lt;/code&gt;, &lt;code&gt;Go&lt;/code&gt;, ... ).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 The idea : the &lt;code&gt;duckdb&lt;/code&gt; extensions community
&lt;/h2&gt;

&lt;p&gt;Therefore, I decided to build - and heopefully to get it accepted - a &lt;a href="https://duckdb.org/community_extensions/extensions/brew" rel="noopener noreferrer"&gt;&lt;code&gt;duckdb brew&lt;/code&gt; community extension&lt;/a&gt; so I can build reports on the installed homebrew packages from simple &lt;code&gt;SQL&lt;/code&gt; and benefit from the amazing &lt;code&gt;duckdb&lt;/code&gt; ecosystem and a very large amount of language bindings and data tools:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2016990414583321074-741" src="https://platform.twitter.com/embed/Tweet.html?id=2016990414583321074"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2016990414583321074-741');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2016990414583321074&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Demo
&lt;/h2&gt;

&lt;p&gt;Official &lt;code&gt;duckdb&lt;/code&gt;'s &lt;a href="https://duckdb.org/community_extensions/extensions/brew" rel="noopener noreferrer"&gt;&lt;code&gt;brew&lt;/code&gt; DuckDB CE extension's page.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Below the whole story, from the function table concept in various databases, to the pitch, including the developer experience with Copilot CLI:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/-BkiKuB1noI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📷 Screenshots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📈  Historical brew install
&lt;/h3&gt;

&lt;p&gt;When doing reports, I felt the need to know how many brew packages I installed, and when:&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%2F6r47y53f6dp80dh55ufp.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%2F6r47y53f6dp80dh55ufp.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌌  Graph Dependencies
&lt;/h3&gt;

&lt;p&gt;For security analysis, it makes sense to be aware of the centrality of the installed software.&lt;/p&gt;

&lt;p&gt;It is now made easy to produce and chart, see below:&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%2F4yv00v2czi0xwwjelzmr.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%2F4yv00v2czi0xwwjelzmr.png" alt=" " width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐧 &lt;code&gt;SQL&lt;/code&gt; reports from terminal
&lt;/h3&gt;

&lt;p&gt;Then it's really very easy to do reports from the terminal itself:&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%2Fq72rkg4mw38vkhv7wbn9.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%2Fq72rkg4mw38vkhv7wbn9.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&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%2F7jvr0ftjfk7a3bwv2aoh.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%2F7jvr0ftjfk7a3bwv2aoh.png" alt=" " width="646" height="635"&gt;&lt;/a&gt;&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%2Fqa52du73d2o0dc9an5jg.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%2Fqa52du73d2o0dc9an5jg.png" alt=" " width="610" height="606"&gt;&lt;/a&gt;&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%2Fuo7unfh9ddbugdklgf1f.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%2Fuo7unfh9ddbugdklgf1f.png" alt=" " width="606" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤓 My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;Below my complete development workflow setup, which consists in three panels : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The top left one&lt;/strong&gt; : to run &lt;code&gt;make&lt;/code&gt; commands by myself, which made things easier to handle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bottom left one&lt;/strong&gt; : the GH Copilot CLI to which I asked to add features, write nice commit messages, check CI for failures, write Release Notes, create tags and releases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The right one&lt;/strong&gt; : dedicated to try the output binary by myself, purely manual written SQL statements etc...&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This how it looks::&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%2F3e02z22cfuf31wt6ugu3.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%2F3e02z22cfuf31wt6ugu3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&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%2Fjvhan8qqlsnl9uob7mph.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%2Fjvhan8qqlsnl9uob7mph.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video announce : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2019167438546563160-116" src="https://platform.twitter.com/embed/Tweet.html?id=2019167438546563160"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2019167438546563160-116');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2019167438546563160&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍🎓 Lesson learned : &lt;code&gt;CI&lt;/code&gt;, tests and lint first
&lt;/h2&gt;

&lt;p&gt;The CLI experience is very responsive, but what I would keep in mind and would like to put the maximum emphasis is how crucial are about build automation and CI : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;li&gt;Linting process&lt;/li&gt;
&lt;li&gt;Code formating rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more they are part of the build tools and CI pipeline, the more the vibe coding experience is efficent and &lt;strong&gt;the more we build trust with the generated code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my case, &lt;code&gt;duckdb&lt;/code&gt; community provided a repo template (see &lt;a href="https://github.com/duckdb/extension-template" rel="noopener noreferrer"&gt;&lt;code&gt;duckdb/extension-template&lt;/code&gt;&lt;/a&gt;) with all the required stuff &lt;strong&gt;so I could very efficiently start to work, which means : get continuous feedback from CI and give it immediately to Copilot for continuous improvement&lt;/strong&gt; without having to ask help to community. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/adriens/duckdb-brew/actions/runs/21662489997" rel="noopener noreferrer"&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%2Fr2p0map40k632kfksz31.png" alt=" " width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📑 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Extension source code : &lt;a href="https://github.com/adriens/duckdb-brew/" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/duckdb-brew&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;duckdb brew&lt;/code&gt; extension homepage : &lt;a href="https://duckdb.org/community_extensions/extensions/brew" rel="noopener noreferrer"&gt;https://duckdb.org/community_extensions/extensions/brew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adriens/ubuntu-rmarkdown-report" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/ubuntu-rmarkdown-report&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>⏳ Managing EOLs w. geol: the impossible 1' Mux demo</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Fri, 02 Jan 2026 21:53:35 +0000</pubDate>
      <link>https://dev.to/adriens/managing-eols-w-geol-the-impossible-1-mux-demo-cnl</link>
      <guid>https://dev.to/adriens/managing-eols-w-geol-the-impossible-1-mux-demo-cnl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux"&gt;DEV's Worldwide Show and Tell Challenge Presented by Mux&lt;/a&gt;&lt;/em&gt;&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%2Fi5pigtgt75nqxjsvsaw2.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%2Fi5pigtgt75nqxjsvsaw2.png" alt=" " width="659" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ❔ What I Built
&lt;/h2&gt;

&lt;p&gt;We have built and maintain &lt;a href="https://github.com/opt-nc/geol" rel="noopener noreferrer"&gt;&lt;code&gt;geol&lt;/code&gt;&lt;/a&gt; a &lt;code&gt;cli&lt;/code&gt; to help manage, report and survey software EOLs (end-of-life), both for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive&lt;/strong&gt; &lt;code&gt;cli&lt;/code&gt; UX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automates DEVOPS&lt;/strong&gt; &lt;code&gt;CI/CD&lt;/code&gt; pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See below for previous Hacktoberfest hackathon : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-story__hidden-navigation-link"&gt;⏳geol, the cli to efficiently manage EOLs like a boss&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest: Maintainer Spotlight&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-2951766" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 29 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" id="article-link-2951766"&gt;
          ⏳geol, the cli to efficiently manage EOLs like a boss
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hacktoberfest"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hacktoberfest&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              30&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  ⏱️ My &lt;code&gt;1'&lt;/code&gt; Pitch Video
&lt;/h2&gt;

&lt;p&gt;&lt;iframe src="https://player.mux.com/02sUXDw3XC3WkSDfzO2IQiEIfDB9d02yxqEgZ01q1PB0102E" width="710" height="399"&gt;
&lt;/iframe&gt;

&lt;/p&gt;

&lt;h2&gt;
  
  
  📑 Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🤓 Project repository&lt;/strong&gt; : &lt;a href="https://github.com/opt-nc/geol" rel="noopener noreferrer"&gt;&lt;code&gt;opt-nc/geol&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🍿 Youtube playlist&lt;/strong&gt; : &lt;a href="https://www.youtube.com/playlist?list=PL7GdrgVAWcDhTeW8rjUCZVp2Mic1fx-j9" rel="noopener noreferrer"&gt;&lt;code&gt;geol&lt;/code&gt; playlist&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/orgs/opt-nc/projects/28" rel="noopener noreferrer"&gt;🗓️ Product Kanban&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💭 The Story Behind It
&lt;/h2&gt;

&lt;p&gt;Since a long time now (December 2022), I started to work on following software technical debt, security, ... at scale with: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DEVOPS in mind&lt;/li&gt;
&lt;li&gt;Datascience &amp;amp; dataengineering&lt;/li&gt;
&lt;li&gt;Datavisualizations&lt;/li&gt;
&lt;li&gt;DEVSECOPS &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I discovered &lt;a href="https://endoflife.date/" rel="noopener noreferrer"&gt;&lt;code&gt;endoflife.date&lt;/code&gt;&lt;/a&gt; website, its API.&lt;br&gt;
Since that day, &lt;a href="https://github.com/endoflife-date/endoflife.date/pulls?q=is%3Apr+author%3Aadriens+is%3Aclosed" rel="noopener noreferrer"&gt;I contributed almost 200 PRs&lt;/a&gt; to add/enhance products.&lt;/p&gt;

&lt;p&gt;Also, on a daily basis, I used &lt;a href="https://github.com/hugovk/norwegianblue" rel="noopener noreferrer"&gt;&lt;code&gt;hugovk/norwegianblue&lt;/code&gt;&lt;/a&gt; (aka. &lt;code&gt;eol&lt;/code&gt;) to efficiently browse products end of lifes, for example with &lt;code&gt;markdown&lt;/code&gt; to efficiently produce Github issues of html reports:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/manage-eols-like-a-boss-with-endoflifedate-2ikf" class="crayons-story__hidden-navigation-link"&gt;⌛ Manage EoLs like a boss with endoflife.date 🛑&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-1244289" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/manage-eols-like-a-boss-with-endoflifedate-2ikf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 14 '22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/manage-eols-like-a-boss-with-endoflifedate-2ikf" id="article-link-1244289"&gt;
          ⌛ Manage EoLs like a boss with endoflife.date 🛑
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/manage-eols-like-a-boss-with-endoflifedate-2ikf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;16&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/manage-eols-like-a-boss-with-endoflifedate-2ikf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              14&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Then, years later I wondered what if I could try to push it harder and build a brand new Go based version of &lt;code&gt;eol&lt;/code&gt;,... which I did during a 48h hours hackathon : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__hidden-navigation-link"&gt;⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-2200466" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" id="article-link-2200466"&gt;
          ⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              9&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The result was pretty nice, I like the feeling... especially : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;"Eat your own dog food approach"&lt;/em&gt; (aka. Dogfeeding)&lt;/li&gt;
&lt;li&gt;Freedom to design a brand new client, with a dedicated UX&lt;/li&gt;
&lt;li&gt;Remove the need for Python runtime&lt;/li&gt;
&lt;li&gt;Try some exciting new ideas&lt;/li&gt;
&lt;li&gt;Improve productivity and talk about technical debt around me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally we officially created &lt;a href="https://github.com/opt-nc/geol" rel="noopener noreferrer"&gt;&lt;code&gt;geol&lt;/code&gt;&lt;/a&gt; : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-story__hidden-navigation-link"&gt;⏳geol, the cli to efficiently manage EOLs like a boss&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest: Maintainer Spotlight&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-2951766" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 29 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" id="article-link-2951766"&gt;
          ⏳geol, the cli to efficiently manage EOLs like a boss
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hacktoberfest"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hacktoberfest&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              30&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  ⚙️ Technical Highlights
&lt;/h2&gt;

&lt;p&gt;We wanted to learn as much and take as much profit as possible from Go ecosystem, to adopt the same stack of some tools we love - and admire - to use on a daily basis : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Language : &lt;code&gt;Golang&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Delivery : &lt;code&gt;brew&lt;/code&gt; to deliver/install efficiently as fast - and yet secure - as we want&lt;/li&gt;
&lt;li&gt;Release Management : &lt;a href="https://github.com/goreleaser/goreleaser" rel="noopener noreferrer"&gt;&lt;code&gt;goreleaser/goreleaser&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/spf13/cobra" rel="noopener noreferrer"&gt;&lt;code&gt;spf13/cobra&lt;/code&gt;&lt;/a&gt; for CLI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/fang" rel="noopener noreferrer"&gt;&lt;code&gt;charmbracelet/fang&lt;/code&gt;&lt;/a&gt; on top of Cobra to give glamour to our cli&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/lipgloss" rel="noopener noreferrer"&gt;&lt;code&gt;charmbracelet/lipgloss&lt;/code&gt;&lt;/a&gt; for styish terminal outputs : colors, arrays, links, &lt;code&gt;markdown&lt;/code&gt; display and redirection t files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;duckdb&lt;/code&gt; as primary export format&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://osv.dev/#use-vulnerability-scanner" rel="noopener noreferrer"&gt;&lt;code&gt;osv.dev&lt;/code&gt;&lt;/a&gt; to continuously check for vulnerabilities in our base code&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codeql.github.com/" rel="noopener noreferrer"&gt;Code QL&lt;/a&gt; as part of our CI to ensure our tool does not bring security issues&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docusaurus.io/" rel="noopener noreferrer"&gt;Docusaurus&lt;/a&gt; for nice professional website (work in progress)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/crush" rel="noopener noreferrer"&gt;&lt;code&gt;crush&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;&lt;code&gt;gemini-cli&lt;/code&gt;&lt;/a&gt; to evaluate the design of our cli&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pandoc&lt;/code&gt; for document post-processing (eg. transform output &lt;code&gt;markdown&lt;/code&gt; into &lt;code&gt;html&lt;/code&gt; or &lt;code&gt;pdf&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LaTeX&lt;/code&gt; to build the &lt;a href="https://x.com/rastadidi/status/1995616096351891548" rel="noopener noreferrer"&gt;cheetsheat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The way we an put together &lt;code&gt;geol&lt;/code&gt; and &lt;code&gt;trivy&lt;/code&gt; (with &lt;code&gt;crush&lt;/code&gt; or &lt;code&gt;gemini-cli&lt;/code&gt;) at work together to build efficient and nice looking technical debt and security reports&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://distrobox.it/" rel="noopener noreferrer"&gt;&lt;code&gt;distrobox&lt;/code&gt;&lt;/a&gt; to test install and binaries on various OS and architectures&lt;/li&gt;
&lt;li&gt;Now, I'm starting to focus on what can be done around &lt;code&gt;geol&lt;/code&gt; outputs to automate reporting, with a professional data-stack, like &lt;a href="https://rmarkdown.rstudio.com/" rel="noopener noreferrer"&gt;&lt;code&gt;Rmarkdown&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://quarto.org/" rel="noopener noreferrer"&gt;&lt;code&gt;quarto&lt;/code&gt;&lt;/a&gt; to make professional looking technical debt reports&lt;/li&gt;
&lt;li&gt;Also, I'm thinking about the most efficient way to share EOL's datas into other systems to make technical debt easier to monitor&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🐦 Some Tweets showcasing what's achieved and how
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;distrobox&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1987002052460106151-80" src="https://platform.twitter.com/embed/Tweet.html?id=1987002052460106151"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1987002052460106151-80');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1987002052460106151&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Putting &lt;code&gt;geol&lt;/code&gt;, &lt;code&gt;trivy&lt;/code&gt;, &lt;code&gt;gemini&lt;/code&gt; &amp;amp; &lt;code&gt;latex&lt;/code&gt; to work
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1989079778058727889-348" src="https://platform.twitter.com/embed/Tweet.html?id=1989079778058727889"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1989079778058727889-348');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1989079778058727889&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Building cheetsheat with pure code w. &lt;code&gt;LaTeX&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1995616096351891548-64" src="https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1995616096351891548-64');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Build a website with &lt;code&gt;docusaurus&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2005772435057242580-641" src="https://platform.twitter.com/embed/Tweet.html?id=2005772435057242580"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2005772435057242580-641');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2005772435057242580&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>⏳geol, the cli to efficiently manage EOLs like a boss</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Wed, 29 Oct 2025 20:39:59 +0000</pubDate>
      <link>https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne</link>
      <guid>https://dev.to/adriens/geol-the-cli-to-efficiently-manage-eols-like-a-boss-3hne</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest2025"&gt;2025 Hacktoberfest Writing Challenge&lt;/a&gt;: Maintainer Spotlight&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⏱️ &lt;code&gt;geol&lt;/code&gt; in &lt;code&gt;5'&lt;/code&gt; for impatients
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ZqiXogK2fSw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🤗 Building ideas &amp;amp; patterns before software
&lt;/h2&gt;

&lt;p&gt;First of all, I would like to point &lt;strong&gt;what makes my core motivation &amp;amp; energy last, what keeps me in movement : my curiosity.&lt;/strong&gt;&lt;br&gt;
I only understood recently that &lt;strong&gt;this is curiosity and the satisfaction we get once got answers that (from my POV) makes things possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course we are building software or products, but first, &lt;strong&gt;I want to focus on creating and experimenting news ways of viewing problems that affect us and prototype new ways of fixing issues&lt;/strong&gt; (regardless of programming languages or technologies) or rewiring known problems, then share these techniques and POVs with others to confront perspectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing excites me more that seeing the solution come to life&lt;/strong&gt;, talk with my teammates about how to tweak an output, what to remove until we get something really useful and pleasant.&lt;/p&gt;

&lt;p&gt;Some call this being nerd... I don't care but &lt;strong&gt;what I enjoy the most is talking about software engineering, DEVOPS and architecture while enjoying a coffee, drawing something on a paper&lt;/strong&gt;, challenging perspectives and make it happen on a schedule, at a regular pace... and gain experience.&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%2Fcv0jgkgzq4g9j8313rrq.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%2Fcv0jgkgzq4g9j8313rrq.png" alt=" " width="800" height="719"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  💭 About the core idea
&lt;/h2&gt;

&lt;p&gt;Back in time time in January, I submitted a first try to porting &lt;a href="https://github.com/hugovk/norwegianblue" rel="noopener noreferrer"&gt;&lt;code&gt;eol&lt;/code&gt;&lt;/a&gt; to a &lt;code&gt;golang&lt;/code&gt; stack : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__hidden-navigation-link"&gt;⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-2200466" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" id="article-link-2200466"&gt;
          ⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              9&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Also I previously talked - a lot - about these data and why it matters: &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1968410713480733162-10" src="https://platform.twitter.com/embed/Tweet.html?id=1968410713480733162"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1968410713480733162-10');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1968410713480733162&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I wanted to push  &lt;del&gt;a bit&lt;/del&gt; much  further around around stack lifecycle management and bring &lt;code&gt;DEVOPS&lt;/code&gt;,&lt;code&gt;DEVSECOPS&lt;/code&gt; and &lt;code&gt;SECOPS&lt;/code&gt; to the front and imagine complementary practices to automate things around that.&lt;/p&gt;

&lt;p&gt;After a paper and pen ideation session :&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1974974775836754362-999" src="https://platform.twitter.com/embed/Tweet.html?id=1974974775836754362"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1974974775836754362-999');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1974974775836754362&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I finally opted for a full unboxing video that would focus on the MVP, from start to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Unboxing demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vhFXWGqB_-g"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍🤝‍🧑 Team mates
&lt;/h2&gt;

&lt;p&gt;Innovation is much more interesting when it's achieved with other people, below the &lt;a href="https://github.com/opt-nc/geol?tab=readme-ov-file#%E2%80%8D%E2%80%8D-core-team-and-roles" rel="noopener noreferrer"&gt;core team&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adriens"&gt;👨 Adrien&lt;/a&gt; : &lt;code&gt;adriens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/supervinh"&gt;👨 Vinh&lt;/a&gt; : &lt;code&gt;supervinh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/mbarre"&gt;👱🏻‍♀️ Michèle&lt;/a&gt; : &lt;code&gt;mbarre&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Our &lt;code&gt;MVP&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I designed a &lt;a href="https://github.com/opt-nc/geol/milestone/1" rel="noopener noreferrer"&gt;&lt;code&gt;MVP&lt;/code&gt; milestone&lt;/a&gt; to be sure to be ready to deliver for D-day and at last deliver the demo:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/opt-nc/geol/issues/4" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        📢 Tell the world `geol` exists
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#4&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/adriens" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F5235127%3Fv%3D4" alt="adriens avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/adriens" rel="noopener noreferrer"&gt;adriens&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/opt-nc/geol/issues/4" rel="noopener noreferrer"&gt;&lt;time&gt;Aug 10, 2025&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎯 DoD&lt;/h1&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Write a dedicated article&lt;/li&gt;
&lt;li&gt;[ ] Create an unboxing video&lt;/li&gt;
&lt;li&gt;[ ] Tweet&lt;/li&gt;
&lt;li&gt;[ ] linkedIn&lt;/li&gt;
&lt;li&gt;[ ] Add as a contribution to &lt;a href="https://github.com/endoflife-date/endoflife.date" rel="noopener noreferrer"&gt;https://github.com/endoflife-date/endoflife.date&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/opt-nc/geol/issues/4" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  🤩 What we learned and techniques we developed on the journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧰 Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/charmbracelet" rel="noopener noreferrer"&gt;Charmbracelet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/fang" rel="noopener noreferrer"&gt;&lt;code&gt;charmbracelet/fang&lt;/code&gt;&lt;/a&gt; &lt;em&gt;"The CLI starter kit"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/lipgloss" rel="noopener noreferrer"&gt;&lt;code&gt;charmbracelet/lipgloss&lt;/code&gt;&lt;/a&gt; &lt;em&gt;"Style definitions for nice terminal layouts 👄"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spf13/cobra" rel="noopener noreferrer"&gt;&lt;code&gt;Cobra&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google-gemini/" rel="noopener noreferrer"&gt;&lt;code&gt;gemini-cli&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charmbracelet/crush" rel="noopener noreferrer"&gt;&lt;code&gt;charmbracelet/crush&lt;/code&gt;&lt;/a&gt; &lt;em&gt;"The glamourous AI coding agent for your favourite terminal 💘"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/goreleaser/goreleaser" rel="noopener noreferrer"&gt;&lt;code&gt;GoReleaser&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/go-task/task" rel="noopener noreferrer"&gt;&lt;code&gt;go-task/task&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pandoc.org/" rel="noopener noreferrer"&gt;&lt;code&gt;pandoc&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://asciidoctor.org/" rel="noopener noreferrer"&gt;&lt;code&gt;asciidoctor&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fish-shell/fish-shell" rel="noopener noreferrer"&gt;&lt;code&gt;fish-shell/fish-shell&lt;/code&gt;&lt;/a&gt; &lt;em&gt;"The user-friendly command line shell."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aquasecurity/trivy" rel="noopener noreferrer"&gt;&lt;code&gt;aquasecurity/trivy&lt;/code&gt;&lt;/a&gt; &lt;em&gt;"Find vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ➿ &lt;code&gt;cli&lt;/code&gt; design tuning with AI
&lt;/h3&gt;

&lt;p&gt;I used &lt;code&gt;gemini-cli&lt;/code&gt; and &lt;code&gt;crush&lt;/code&gt; to continuously evaluate &amp;amp; improve the design of our &lt;code&gt;cli&lt;/code&gt; : which command to add, examples to provide, better options, option names, sub-commands layouts,...&lt;/p&gt;

&lt;p&gt;👉 Our goal was to achieve zero-prompts answers, eg. : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1970676017556865268-741" src="https://platform.twitter.com/embed/Tweet.html?id=1970676017556865268"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1970676017556865268-741');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1970676017556865268&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the agent &lt;em&gt;"learn to use &lt;code&gt;geol&lt;/code&gt; thanks to &lt;code&gt;man&lt;/code&gt; pages"&lt;/em&gt; (it appeared than, after benchmarking, &lt;code&gt;man&lt;/code&gt; was the best option)&lt;/li&gt;
&lt;li&gt;Challenge the assistant to produce new kind of documents, for example with the help of third parties &lt;code&gt;cli&lt;/code&gt; like &lt;code&gt;trivy&lt;/code&gt; or &lt;code&gt;grype&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📰 Original report productions
&lt;/h2&gt;

&lt;p&gt;I challenged &lt;code&gt;geol&lt;/code&gt; and &lt;code&gt;trivy&lt;/code&gt; as data producers, &lt;code&gt;gemini-cli&lt;/code&gt; as thinker to efficiently produce &lt;code&gt;LaTeX&lt;/code&gt; some original reports pretty easily and share them:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1971740458331394521-342" src="https://platform.twitter.com/embed/Tweet.html?id=1971740458331394521"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1971740458331394521-342');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1971740458331394521&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  🔭 Further ideas
&lt;/h2&gt;

&lt;p&gt;Below some features to be implemented that excites us a lot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stack survey : &lt;a href="https://github.com/opt-nc/geol/issues/15" rel="noopener noreferrer"&gt;🔔 Lock, warn &amp;amp; report watch stack 👀 &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Data exports : &lt;a href="https://github.com/opt-nc/geol/issues/96" rel="noopener noreferrer"&gt;📤 Add &lt;code&gt;export&lt;/code&gt; and &lt;code&gt;duckdb&lt;/code&gt; sub-command : &lt;code&gt;geol export duckdb&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation export : design still in progress 😅 but preparing some cool work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🙌 Last words
&lt;/h2&gt;

&lt;p&gt;This project makes us learn a lot about software packaging, distribution, make choice to be sure to deliver the most &lt;del&gt;important&lt;/del&gt; useful features, also carefully not implement the things that should not be... and learn learn and learn about free software.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>🛡️ Data quality, SQL, duckdb and http_client on CI🦆</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Mon, 08 Sep 2025 04:02:44 +0000</pubDate>
      <link>https://dev.to/adriens/data-quality-sql-duckdb-and-httpclient-on-ci-22</link>
      <guid>https://dev.to/adriens/data-quality-sql-duckdb-and-httpclient-on-ci-22</guid>
      <description>&lt;h2&gt;
  
  
  💭 CI, &lt;code&gt;duckdb&lt;/code&gt; et and data protection
&lt;/h2&gt;

&lt;p&gt;To efficiently yet effortlessly manage data quality, we created a GitHub Action to install &lt;code&gt;duckdb&lt;/code&gt; : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/optnc/effortless-data-quality-wduckdb-on-github-2mkb" class="crayons-story__hidden-navigation-link"&gt;🦆 Effortless Data Quality w/duckdb on GitHub ♾️&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/optnc"&gt;
            &lt;img alt="opt-nc logo" 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%2Forganization%2Fprofile_image%2F5458%2F98dc3bfe-45f7-48c6-a182-21944edf46b6.jpg" class="crayons-logo__image" width="600" height="600"&gt;
          &lt;/a&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-1531531" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/optnc" class="crayons-story__secondary fw-medium"&gt;opt-nc&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/optnc/effortless-data-quality-wduckdb-on-github-2mkb" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 25 '23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/optnc/effortless-data-quality-wduckdb-on-github-2mkb" id="article-link-1531531"&gt;
          🦆 Effortless Data Quality w/duckdb on GitHub ♾️
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/duckdb"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;duckdb&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubactions"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubactions&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/data"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;data&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/optnc/effortless-data-quality-wduckdb-on-github-2mkb" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/optnc/effortless-data-quality-wduckdb-on-github-2mkb#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              10&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;... but recently I had to face an another challenge : as part of our CI, I had the need to validate data... that were relying on web resources.&lt;/p&gt;

&lt;p&gt;I needed to &lt;strong&gt;be sure that a GitHub Account was really existing&lt;/strong&gt; (for example to avoid typos) as part of our CI.&lt;/p&gt;

&lt;p&gt;In this very short article, I'll show how to use DuckDB with the &lt;a href="https://duckdb.org/community_extensions/extensions/http_client.html" rel="noopener noreferrer"&gt;&lt;code&gt;http_client&lt;/code&gt;&lt;/a&gt; extension to verify GitHub handles stored in a table, &lt;strong&gt;for example to lint data as part of a CI pipeline&lt;/strong&gt; thanks to &lt;a href="https://github.com/marketplace/actions/duckdb-setup" rel="noopener noreferrer"&gt;GitHub Duckdb Action&lt;/a&gt;... and do the job with a very simple &lt;code&gt;SQL&lt;/code&gt; script and &lt;a href="https://duckdb.org/docs/stable/sql/constraints.html#check-constraint" rel="noopener noreferrer"&gt;&lt;code&gt;CHECK&lt;/code&gt; constraints&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 For impatients
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/I6ai5ttKVp8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🔖 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Query-farm/duckdb-extension-httpclient" rel="noopener noreferrer"&gt;https://github.com/Query-farm/duckdb-extension-httpclient&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckdb.org/community_extensions/extensions/http_client.html" rel="noopener noreferrer"&gt;https://duckdb.org/community_extensions/extensions/http_client.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/marketplace/actions/duckdb-setup" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/duckdb-setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🕹️ Do the job with &lt;code&gt;SQL&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;First install extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt; &lt;span class="n"&gt;http_client&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;community&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;LOAD&lt;/span&gt; &lt;span class="n"&gt;http_client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create a table with some example data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;person_gh_member&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;sam_accountname&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;gh_member&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- insert rows&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;person_gh_member&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sam_accountname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gh_member&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;values&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'adriens'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'adriens'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'johndoe'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'asmith'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'annasmithRRRRR'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, run a query to check the status of each GitHub handle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;view&lt;/span&gt; &lt;span class="n"&gt;v_person_gh_status&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt;
    &lt;span class="k"&gt;select&lt;/span&gt; 
    &lt;span class="n"&gt;sam_accountname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gh_member&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'https://github.com/'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;gh_member&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;gh_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gh_url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http_gh_status&lt;/span&gt;
    &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;person_gh_member&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;--where gh_status &amp;lt;&amp;gt; 200;&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;v_person_gh_status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, to lint, we can add a check to see if any status is not 200:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;v_person_gh_status&lt;/span&gt;
    &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;http_gh_status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;lint_gh_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;gh_handle&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gh_url&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;check&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gh_url&lt;/span&gt; &lt;span class="k"&gt;like&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/%'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;gh_status&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;check&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gh_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;lint_gh_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;gh_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;gh_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;gh_status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;select&lt;/span&gt;
    &lt;span class="n"&gt;gh_member&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'https://github.com/'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;gh_member&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;gh_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gh_url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;gh_status&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;person_gh_member&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devops</category>
      <category>ci</category>
      <category>database</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🎬 2025 UNC MIAGE démo finale</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sun, 18 May 2025 20:57:50 +0000</pubDate>
      <link>https://dev.to/adriens/2025-unc-miage-demo-finale-508g</link>
      <guid>https://dev.to/adriens/2025-unc-miage-demo-finale-508g</guid>
      <description>&lt;h2&gt;
  
  
  ❔ Une video... pourquoi pas un rapport 🤔
&lt;/h2&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1926774800480870459-19" src="https://platform.twitter.com/embed/Tweet.html?id=1926774800480870459"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1926774800480870459-19');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1926774800480870459&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1915874203083149769-186" src="https://platform.twitter.com/embed/Tweet.html?id=1915874203083149769"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1915874203083149769-186');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1915874203083149769&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Règles de base
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teaser &amp;lt; 1'&lt;/strong&gt; : que j'utiliserai pour faire les shorts YT pour pitcher votre travail (elevator pitch)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rappeler le cadre&lt;/strong&gt; qui a permis ces travaux (UNC/IAE, promotion,...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durée totale&lt;/strong&gt; ≤ 20'&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format&lt;/strong&gt; : horizontal (16:9), format &lt;code&gt;MP4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Texte et liens vers les ressources&lt;/strong&gt; démontrées (datasets, notebooks, repos,...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Résumé&lt;/strong&gt; (5 lignes max)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pitch résumé&lt;/strong&gt; format twitter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nom du fichier&lt;/strong&gt; : &lt;code&gt;2025_unc_miage_{kaggle_handle}.mp4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un thumbnail format YT&lt;/strong&gt; (visuel, logo UNC/IAE, stack, avatar Kaggle,...)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Objectif
&lt;/h2&gt;

&lt;p&gt;Présenter votre projet de fin d’année sous forme d’une &lt;strong&gt;vidéo synthétique et structurée&lt;/strong&gt;, destinée à restituer de manière claire, convaincante et captivante &lt;strong&gt;plus de 3 mois de progrés et de travaux&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;La vidéo devra à minima inclure :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La &lt;strong&gt;problématique&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;collaboration&lt;/strong&gt; mise en oeuvre&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;pipeline technique&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;résultats obtenus&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;limites et perspectives&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ce que vous auriez aimé creuser&lt;/strong&gt; mais que vous n'avez pas pu faute de temps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Idées
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Se faire &lt;strong&gt;plaisir&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Etre &lt;strong&gt;créatif&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profiter des possibilités ouvertes&lt;/strong&gt; par le montage video (montage ,coupage, animations,...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Créer un support de présentation&lt;/strong&gt; en ligne (Canva, ppt, ...) afin de structurer le contenu, avec des visuels et des revues de code,...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mettre en avant le caractère innovant&lt;/strong&gt; pour la Nouvelle-Calédonie&lt;/li&gt;
&lt;li&gt;Ce que vous avez &lt;strong&gt;découvert&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mettre en avant &lt;strong&gt;ce que vous avez aimé (côté humain, technologique,..)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Pointer là où &lt;strong&gt;vous vous êtes fait plaisir&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ce qui a suscité le plus de curiosité&lt;/strong&gt; ou l'envie de continuer vers plus de recherche, d'approfondir une technologie ou un thème&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si vous pouviez passer le flambeau&lt;/strong&gt; à d'autres étudiants l'année prochaine ce vous aimeriez voir réalisé&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La mise en perspective des travaux&lt;/strong&gt; des autres camarades de promotion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Donner du feedback sur la pédagogie&lt;/strong&gt; ou le pipeline didactique qui a émergé&lt;/li&gt;
&lt;li&gt;En quoi &lt;strong&gt;vous pensez que votre travail est innovant&lt;/strong&gt; voire disruptif&lt;/li&gt;
&lt;li&gt;En quoi votre &lt;strong&gt;travail bénéficie à la société&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Contexte métier ou &lt;strong&gt;sociétal&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sources de données et pipeline&lt;/strong&gt; (collecte, nettoyage, transformation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modèles/stack utilisés&lt;/strong&gt; et justification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Résultats&lt;/strong&gt; (graphiques, métriques, comparaisons)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyse critique&lt;/strong&gt;, limites, éthique&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impacts concrets&lt;/strong&gt; ou potentiel du projet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chiffres clés&lt;/strong&gt; ou visuel fort&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Appel à l’action&lt;/strong&gt; (“Découvrez la vidéo complète !”)&lt;/li&gt;
&lt;li&gt;Limites &amp;amp; &lt;strong&gt;perspectives&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si vous avez dépassé les objectifs&lt;/strong&gt; que vous vous étiez fixés&lt;/li&gt;
&lt;li&gt;**Si/comment cette expérience va impacter **votre carrière&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧮 Axes d’évaluation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capacité à captiver&lt;/strong&gt; le spectateur&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarté et structuration&lt;/strong&gt; du propos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mise en avant des problématiques d'interopérabilité&lt;/strong&gt; d'un point de vue technique&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problématiques&lt;/strong&gt; organisationnelles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualité technique&lt;/strong&gt; de la démarche&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyse critique&lt;/strong&gt; des résultats et des limites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valorisation des résultats&lt;/strong&gt; (visualisation, impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualité visuelle&lt;/strong&gt; et sonore de la vidéo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacité à vulgariser&lt;/strong&gt; / synthétiser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curiosité suscitée chez le spectateur&lt;/strong&gt; pour le travail réalisé ou de nouvelles questions&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🧭 Dimension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Note / Pondération&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Clarté et structuration du message&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Présentation logique, fluide, introduction + développement + conclusion. Le discours est compréhensible, bien rythmé.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Qualité de vulgarisation et de synthèse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capacité à expliquer clairement les concepts, à vulgariser les aspects techniques, à aller à l’essentiel sans perdre de rigueur.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Richesse et pertinence technique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pipeline de données, stack, interopérabilité, justifications techniques, rigueur méthodologique.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Créativité, montage et impact visuel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Originalité du montage, qualité sonore et visuelle, utilisation pertinente de visuels, démos, animations.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Portée, analyse critique et engagement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mise en perspective, limites, éthique, bénéfices pour la société, passion, envie de transmettre, implication personnelle.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>datascience</category>
      <category>learning</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>🥳 We built the cli of our dreams to send sms ❣️</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Mon, 14 Apr 2025 21:48:18 +0000</pubDate>
      <link>https://dev.to/optnc/we-built-the-cli-of-our-dreams-to-send-sms-3c7m</link>
      <guid>https://dev.to/optnc/we-built-the-cli-of-our-dreams-to-send-sms-3c7m</guid>
      <description>&lt;h2&gt;
  
  
  🤔 About the benefits of &lt;code&gt;cli&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Since a few years now, we started to design various &lt;code&gt;cli&lt;/code&gt; for internal batch usage, on our Java Stack on top of &lt;a href="https://picocli.info/" rel="noopener noreferrer"&gt;&lt;code&gt;picocli&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;&lt;code&gt;quarkus&lt;/code&gt;&lt;/a&gt;, delivered as images, and run on &lt;a href="https://podman.io/" rel="noopener noreferrer"&gt;&lt;code&gt;podman&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our goal was to : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Avoid as much as possible to write&lt;/strong&gt; unnecessary documentations : each tool should describe himself according to a common pattern&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rely on the best possible practices&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;And overall : &lt;strong&gt;deliver a consistent first-class UX to OPS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Therefore I started to read and follow the following site to follow the best possible guidelines : &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/cli-guidelines" rel="noopener noreferrer"&gt;
        cli-guidelines
      &lt;/a&gt; / &lt;a href="https://github.com/cli-guidelines/cli-guidelines" rel="noopener noreferrer"&gt;
        cli-guidelines
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A guide to help you write better command-line programs, taking traditional UNIX principles and updating them for the modern day.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Command Line Interface Guidelines&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An open-source guide to help you write better command-line programs, taking traditional UNIX principles and updating them for the modern day.&lt;/p&gt;
&lt;p&gt;This is the source code for the guide. To read it, go to &lt;a href="https://clig.dev/" rel="nofollow noopener noreferrer"&gt;clig.dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://discord.gg/EbAW5rUCkE" rel="nofollow noopener noreferrer"&gt;Join us on Discord&lt;/a&gt; if you want to discuss the guide, or just chat about CLI design.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The content of the guide lives in a single Markdown file, &lt;a href="https://github.com/cli-guidelines/cli-guidelines/content/_index.md" rel="noopener noreferrer"&gt;content/_index.md&lt;/a&gt;
The website is built using &lt;a href="https://gohugo.io/" rel="nofollow noopener noreferrer"&gt;Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To run Hugo locally to see your changes, run:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ brew install hugo
$ cd &amp;lt;path&amp;gt;/&amp;lt;to&amp;gt;/cli-guidelines/
$ hugo server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To view the site on an external mobile device, run:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;hugo server --bind 0.0.0.0 --baseURL http://$(hostname -f):1313
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deployment&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The site is hosted on &lt;a href="https://workers.cloudflare.com/" rel="nofollow noopener noreferrer"&gt;Cloudflare Workers&lt;/a&gt; as
a static-assets project, built and deployed from this repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;build.sh&lt;/code&gt; installs a pinned Hugo and builds the site into &lt;code&gt;public/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wrangler.toml&lt;/code&gt; runs &lt;code&gt;build.sh&lt;/code&gt; and uploads &lt;code&gt;public/&lt;/code&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/cli-guidelines/cli-guidelines" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  🎯 Our &lt;code&gt;Go&lt;/code&gt;(al)
&lt;/h2&gt;

&lt;p&gt;On my very own side I gave a try during a hackathon to Go and &lt;a href="https://goreleaser.com/" rel="noopener noreferrer"&gt;&lt;code&gt;goreleaser&lt;/code&gt;&lt;/a&gt; : &lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__hidden-navigation-link"&gt;⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/adriens" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" alt="adriens profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adriens" class="crayons-story__secondary fw-medium m:hidden"&gt;
              adriens
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                adriens
                
              
              &lt;div id="story-author-preview-content-2200466" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/adriens" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F446871%2F3e9ded5c-f368-4906-a277-35e56c9f97a7.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;adriens&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" id="article-link-2200466"&gt;
          ⏳GitHub Copilot 1-Day Build Challenge : eol, a tiny Go client to manage eols
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adriens/github-copilot-1-day-build-challenge-eol-a-tiny-go-client-to-manage-eols-j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              9&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Then, I wanted to bring my team to the Go experience at the office  as sometimes we need to deliver apps to &lt;strong&gt;systems on which we don't want or can't install new softwares&lt;/strong&gt; : so delivering a static binary thanks to Go and &lt;a href="https://goreleaser.com/" rel="noopener noreferrer"&gt;&lt;code&gt;goreleaser&lt;/code&gt;&lt;/a&gt; seemed a good option for effortless cross-compilation... and of course build the best possible &lt;code&gt;UX&lt;/code&gt; thanks to &lt;a href="https://cobra.dev/" rel="noopener noreferrer"&gt;Cobra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So I used this opportunity to sharpen our skill with my team : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1909597554590855170-191" src="https://platform.twitter.com/embed/Tweet.html?id=1909597554590855170"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1909597554590855170-191');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1909597554590855170&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;And...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build the best possible &lt;code&gt;cli&lt;/code&gt; of our dreams to send &lt;code&gt;sms&lt;/code&gt; from a terminal and see what we can deliver and learn from that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🍿 &lt;code&gt;v1.0.0&lt;/code&gt; &lt;code&gt;brew&lt;/code&gt; unboxing
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/jHg7Ydlo55E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 The story behind the product development
&lt;/h2&gt;

&lt;p&gt;As I always say to my team &amp;amp; student, always &lt;a href="https://www.goodreads.com/book/show/7108725-start-with-why?ref=nav_sb_ss_1_12" rel="noopener noreferrer"&gt;"Start with why"&lt;/a&gt; : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1910458188945867005-547" src="https://platform.twitter.com/embed/Tweet.html?id=1910458188945867005"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1910458188945867005-547');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1910458188945867005&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;After having drafted my ideas : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1908757267941666914-800" src="https://platform.twitter.com/embed/Tweet.html?id=1908757267941666914"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1908757267941666914-800');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1908757267941666914&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Here are the motivations that kept us on track : &lt;/p&gt;

&lt;p&gt;Do things extremely : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧩 Interoperable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🫴 Easy to integrate for anyone&lt;/strong&gt; (even on legacy systems)&lt;/li&gt;
&lt;li&gt;⚡ Efficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🦥 Useful : make people save time&lt;/strong&gt;, ie. make more with less effort&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Easy to deliver&lt;/strong&gt; and install&lt;/li&gt;
&lt;li&gt;🤩 Beautiful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📉 Fast to build&lt;/strong&gt; : for an improved Time to market&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🟢 Fast&lt;/strong&gt; to (learn to) use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💡 Inspiring&lt;/strong&gt; for us and others, eg. create new business opportunities ideas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;😍 Desirable&lt;/strong&gt; : people should feel the desire to use the product and feel joy while using it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧑‍🤝‍🧑 Create new relationships with people&lt;/strong&gt; and discover new practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔭 What's next
&lt;/h2&gt;

&lt;p&gt;Next, we'll focus on &lt;strong&gt;showing and sharing&lt;/strong&gt; the benefits : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;♾️ Continuous delivery tools&lt;/strong&gt; and automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📼 New ways of documentation&lt;/strong&gt; with next-gen tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Security&lt;/strong&gt; (beacause it always matters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🦸 One liners&lt;/strong&gt; (because they're both a cool and efficient way to get things done)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🐧 Classical linux&lt;/strong&gt; tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;📚 General IT Culture&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧑‍🎨 Creative product design&lt;/strong&gt; and development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully you'll like it as much as we do...and will engage yourself on the same kind of way : the &lt;a href="https://dev.to/t/learning"&gt;&lt;code&gt;#learnbydoing&lt;/code&gt;&lt;/a&gt; journey 🤗&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>cli</category>
      <category>learning</category>
    </item>
    <item>
      <title>🔬Public docker images Trivy scans as duckdb datas on Kaggle</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Mon, 31 Mar 2025 21:03:40 +0000</pubDate>
      <link>https://dev.to/adriens/public-docker-images-trivy-scans-as-duckdb-datas-on-kaggle-231n</link>
      <guid>https://dev.to/adriens/public-docker-images-trivy-scans-as-duckdb-datas-on-kaggle-231n</guid>
      <description>&lt;h2&gt;
  
  
  ❔ About
&lt;/h2&gt;

&lt;p&gt;As &lt;a href="https://trivy.dev/" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt; is becoming quite popular : &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1901655379542475129-914" src="https://platform.twitter.com/embed/Tweet.html?id=1901655379542475129"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1901655379542475129-914');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1901655379542475129&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I decided to give it a first try... and see &lt;strong&gt;what could be achieved within a very (very) few lines of code&lt;/strong&gt; : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With datascience&lt;/li&gt;
&lt;li&gt;Scheduled on Kaggle&lt;/li&gt;
&lt;li&gt;With existing datasets&lt;/li&gt;
&lt;li&gt;Deliver nice ready-to-use data as &lt;a href="https://duckdb.org/" rel="noopener noreferrer"&gt;&lt;code&gt;duckdb&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://parquet.apache.org/" rel="noopener noreferrer"&gt;&lt;code&gt;parquet&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;csv&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... and last but not least produce some first dataviz and see how it goes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com/code/optnouvellecaldonie/opt-nc-dockerhub-trivy-scans-for-dummies" rel="noopener noreferrer"&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%2Fz4p8804xim4rr5tbwx7i.png" alt=" " width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But... enough talk, let's see how it looks like !&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/kNWiZjAtMiE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🔖 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/datasets/optnouvellecaldonie/opt-nc-dockerhub-trivy-images-scans-database" rel="noopener noreferrer"&gt;OPT-NC DockerHub Trivy images scans database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/code/optnouvellecaldonie/opt-nc-dockerhub-trivy-scans-for-dummies" rel="noopener noreferrer"&gt;🧑‍ OPT-NC DockerHub Trivy scans for dummies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/code/optnouvellecaldonie/opt-nc-s-dockerhub-public-images" rel="noopener noreferrer"&gt;🐋 OPT-NC's DockerHub public images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/code/optnouvellecaldonie/trivy-docker-images-scans" rel="noopener noreferrer"&gt;🛡️ Trivy Docker images scans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>dataengineering</category>
      <category>jupyter</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
