<?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>💸 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=" "&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-371" src="https://platform.twitter.com/embed/Tweet.html?id=1992068608395276623"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1992068608395276623-371');
  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-874" src="https://platform.twitter.com/embed/Tweet.html?id=2025338147153084787"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2025338147153084787-874');
  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-627" src="https://platform.twitter.com/embed/Tweet.html?id=2030389652960710939"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2030389652960710939-627');
  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-543" src="https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1995616096351891548-543');
  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-914" src="https://platform.twitter.com/embed/Tweet.html?id=2027947601442836653"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2027947601442836653-914');
  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-188" src="https://platform.twitter.com/embed/Tweet.html?id=2027632648970223954"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2027632648970223954-188');
  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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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-547" src="https://platform.twitter.com/embed/Tweet.html?id=2016990414583321074"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2016990414583321074-547');
  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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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=" "&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-961" src="https://platform.twitter.com/embed/Tweet.html?id=2019167438546563160"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2019167438546563160-961');
  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=" "&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=" "&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;p&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; 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;
              Comments


              29&lt;span class="hidden s:inline"&gt; 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;p&gt;

&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;16&lt;span class="hidden s:inline"&gt; 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;
              Comments


              14&lt;span class="hidden s:inline"&gt; 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;p&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt; 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;
              Comments


              9&lt;span class="hidden s:inline"&gt; 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;p&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; 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;
              Comments


              29&lt;span class="hidden s:inline"&gt; 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-227" src="https://platform.twitter.com/embed/Tweet.html?id=1987002052460106151"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1987002052460106151-227');
  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-94" src="https://platform.twitter.com/embed/Tweet.html?id=1989079778058727889"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1989079778058727889-94');
  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-967" src="https://platform.twitter.com/embed/Tweet.html?id=1995616096351891548"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1995616096351891548-967');
  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-559" src="https://platform.twitter.com/embed/Tweet.html?id=2005772435057242580"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2005772435057242580-559');
  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=" "&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;p&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt; 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;
              Comments


              9&lt;span class="hidden s:inline"&gt; 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-629" src="https://platform.twitter.com/embed/Tweet.html?id=1968410713480733162"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1968410713480733162-629');
  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-138" src="https://platform.twitter.com/embed/Tweet.html?id=1974974775836754362"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1974974775836754362-138');
  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;p&gt;

&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-411" src="https://platform.twitter.com/embed/Tweet.html?id=1970676017556865268"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1970676017556865268-411');
  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-740" src="https://platform.twitter.com/embed/Tweet.html?id=1971740458331394521"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1971740458331394521-740');
  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%2Fmedia.dev.to%2Fcdn-cgi%2Fimage%2Fwidth%3D90%2Cheight%3D90%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto%2Fhttps%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Forganization%252Fprofile_image%252F5458%252F98dc3bfe-45f7-48c6-a182-21944edf46b6.jpg" class="crayons-logo__image"&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; 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;
              Comments


              10&lt;span class="hidden s:inline"&gt; 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-727" src="https://platform.twitter.com/embed/Tweet.html?id=1926774800480870459"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1926774800480870459-727');
  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-543" src="https://platform.twitter.com/embed/Tweet.html?id=1915874203083149769"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1915874203083149769-543');
  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;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This work is licensed under a
&lt;a href="http://creativecommons.org/licenses/by-sa/4.0/" rel="nofollow noopener noreferrer"&gt;Creative Commons Attribution-ShareAlike 4.0 International License&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&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;br&gt;
&lt;/div&gt;
&lt;br&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt; 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;
              Comments


              9&lt;span class="hidden s:inline"&gt; 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-986" src="https://platform.twitter.com/embed/Tweet.html?id=1909597554590855170"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1909597554590855170-986');
  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-564" src="https://platform.twitter.com/embed/Tweet.html?id=1910458188945867005"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1910458188945867005-564');
  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-566" src="https://platform.twitter.com/embed/Tweet.html?id=1908757267941666914"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1908757267941666914-566');
  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-438" src="https://platform.twitter.com/embed/Tweet.html?id=1901655379542475129"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1901655379542475129-438');
  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=" "&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>
    <item>
      <title>🎓 2025 Teacher journey at University of New-Caledonia</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sun, 23 Mar 2025 21:13:59 +0000</pubDate>
      <link>https://dev.to/adriens/2025-teacher-journey-at-university-of-new-caledonia-cf2</link>
      <guid>https://dev.to/adriens/2025-teacher-journey-at-university-of-new-caledonia-cf2</guid>
      <description>&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1900928845521244177-122" src="https://platform.twitter.com/embed/Tweet.html?id=1900928845521244177"&gt;
&lt;/iframe&gt;

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  ❔ About
&lt;/h2&gt;

&lt;p&gt;As teased during &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;,  I wanted to put more efforts in :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"🧑‍🤝‍🧑 Mentoring students"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/adriens" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/adriens/compiling-2025-pushing-technical-skills-for-more-creativity-290n" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔭 Compiling 2025 : growing technical skills for more creativity&lt;/h2&gt;
      &lt;h3&gt;adriens ・ Jan 31&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#newyearchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I wanted to put more effort in evangelizing skills, knowledge and ideas with the young generation.&lt;/p&gt;

&lt;p&gt;Luckily I had the - indeed unexpected - opportunity to teach at the master, at IAE from UNC : &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://iae.unc.nc/formations/portail-miage/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiae.unc.nc%2Fwp-content%2Fuploads%2FAUB_6559-min.jpg" height="542" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://iae.unc.nc/formations/portail-miage/" rel="noopener noreferrer" class="c-link"&gt;
          Master MIAGE - IAE NC
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiae.unc.nc%2Ffavicon.ico" width="32" height="32"&gt;
        iae.unc.nc
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  ℹ️ More about IAE New-Caledonia
&lt;/h2&gt;

&lt;p&gt;Below the credo : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Venez nous rejoindre et faire vivre notre devise : « créateur d’avenirs »." - &lt;a href="https://iae.unc.nc/iae/mot-de-bienvenue-de-la-directrice-virginie-de-barnier/" rel="noopener noreferrer"&gt;ref&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iae.unc.nc/formations/portail-miage/" rel="noopener noreferrer"&gt;IAE&lt;/a&gt; : &lt;em&gt;"Master's Degree in Computer Methods Applied to Business Management (MIAGE)"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unc.nc/" rel="noopener noreferrer"&gt;UNC&lt;/a&gt; : &lt;em&gt;University of New-Caledonia&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 (Student )Learning Objectives
&lt;/h2&gt;

&lt;p&gt;As detailed in the &lt;a href="https://github.com/adriens/unc_iae_miage_interop_si_feedbacks/blob/main/SYLLABUS.md#-objectifs-p%C3%A9dagogiques" rel="noopener noreferrer"&gt;provided syllabus&lt;/a&gt;, here are the key objectives : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Master the fundamental concepts&lt;/strong&gt; of interoperability: levels, challenges, and issues.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand key technologies&lt;/strong&gt; and standards ensuring interoperability: protocols, data formats, ontologies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement interoperability&lt;/strong&gt; solutions in real-world projects. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze the organizational&lt;/strong&gt; and technical challenges related to interoperability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💰 Personal rewards
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;🔍 &lt;strong&gt;Discover&lt;/strong&gt; new problems &lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Meet&lt;/strong&gt; new talents
&lt;/li&gt;
&lt;li&gt;🎭 &lt;strong&gt;Learn new ways&lt;/strong&gt; of storytelling &amp;amp; teaching techniques
&lt;/li&gt;
&lt;li&gt;💬 Talk about my &lt;strong&gt;passion&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Spread&lt;/strong&gt; IT culture
&lt;/li&gt;
&lt;li&gt;🛠️ Train in getting students’ &lt;strong&gt;ideas into working solutions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Put technical solutions in perspective&lt;/strong&gt; for students to create patterns
&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;Share Open Source&lt;/strong&gt; &amp;amp; Open Data concerns
&lt;/li&gt;
&lt;li&gt;🌱 &lt;strong&gt;Participate in the &lt;code&gt;#techforgood&lt;/code&gt;&lt;/strong&gt; movement
&lt;/li&gt;
&lt;li&gt;🎉 &lt;strong&gt;Have fun&lt;/strong&gt; while working&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🚀 About the journey
&lt;/h2&gt;

&lt;p&gt;The main goal of this article is to put all live cloud driven resources available as I cannot share all contents.&lt;/p&gt;

&lt;p&gt;So in this post, you'll find all the public things I can share to my students so they can get all the resources in a very easy way... and share them to a wider audience.&lt;/p&gt;

&lt;p&gt;Sooooo.... let's go 👇&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 How to keep up-to-date with news ?
&lt;/h2&gt;

&lt;p&gt;Just like, comment this post to get some cool stuff.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>datascience</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🔭 Compiling 2025 : growing technical skills for more creativity</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Fri, 31 Jan 2025 03:33:23 +0000</pubDate>
      <link>https://dev.to/adriens/compiling-2025-pushing-technical-skills-for-more-creativity-290n</link>
      <guid>https://dev.to/adriens/compiling-2025-pushing-technical-skills-for-more-creativity-290n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;: Compiling 2025.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Forewords : about the &lt;em&gt;"why"&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;First I'd like to mention that the more times goes by, the more I'd like to focus on an artistic path... which requires technical skills and knowledge to get freedom of creation:&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;At the &lt;strong&gt;core of all the work I produce there is curiosity&lt;/strong&gt;, generally, it always starts with the following questions: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt; does this...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What if&lt;/strong&gt; I was....&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I wonder&lt;/strong&gt; if...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So my learning pattern is the following one : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Pick&lt;/strong&gt; a specific question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧑‍🎨 Learn the pieces of tech&lt;/strong&gt; that helps me answer the question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 Write down&lt;/strong&gt; what I learned to put things in order in my mind and achieve the work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌌 Discover&lt;/strong&gt; new questions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧑‍🎓 Assesments and certifications
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Follow the machine &lt;a href="https://www.kaggle.com/learn/intro-to-machine-learning" rel="noopener noreferrer"&gt;Intro to Machine Learning&lt;/a&gt; learning path on Kaggle&lt;/li&gt;
&lt;li&gt;Pass the &lt;a href="https://huggingface.us17.list-manage.com/subscribe?u=7f57e683fa28b51bfc493d048&amp;amp;id=9ed45a3ef6" rel="noopener noreferrer"&gt;Hugging Face AI Agents Course 🤗&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Give a try to &lt;a href="https://dlthub.com/" rel="noopener noreferrer"&gt;dlt&lt;/a&gt; and hopefully achieve some courses&lt;/li&gt;
&lt;/ul&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍🎨 Creative
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do some stuff around embeddings and make something creative w. &lt;a href="https://x.com/nomic_ai" rel="noopener noreferrer"&gt;Nomic AI&lt;/a&gt; for example around poetry, movies, politics&lt;/li&gt;
&lt;li&gt;Classify datasets and play with vectorial projection&lt;/li&gt;
&lt;li&gt;Try to write even a minimalistic novel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🇫🇷 Have a lot of fun by creating some "détournements" - getting some famous movie trailers and adding french subtitles to make jokes about IT culture - :&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  📰 Data-journalism
&lt;/h2&gt;

&lt;p&gt;Now that I've grabbed a lot of skills and &lt;a href="https://www.kaggle.com/adriensales/datasets" rel="noopener noreferrer"&gt;datasets on Kaggle&lt;/a&gt;, I'm very interested in putting data in perspective with traditional medias:&lt;/p&gt;

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

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



&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;I find very interesting to see how I can fact-check or illustratre things thanks to Open Data and Open Source software. In a way, I find it like a crucial part of democracy.&lt;/p&gt;

&lt;p&gt;Also on this journey, I learn a lot about very various topics and technologies, or sometimes produce new datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍🤝‍🧑 Mentoring students
&lt;/h2&gt;

&lt;p&gt;As each year, mentor interns at &lt;a href="https://dev.to/optnc"&gt;&lt;code&gt;OPT-NC&lt;/code&gt;&lt;/a&gt; and produce some original tech creations. Here my work consist in identifying appealing subjects so CS students can come and give a try to produce something, &lt;strong&gt;regardless of their current skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I have to create various pitches with various skills requirements so it's very opened to all for a maximum impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎙️ Speaker at Events
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maybe produce some creative Open Data content around Neo4J to show off at &lt;code&gt;#NODES25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Participate to &lt;a href="https://dev.to/adriens/series/24637"&gt;Pacific dataviz challenge&lt;/a&gt; and try some new dataviz tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧪 Prototyping &amp;amp; discovering
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Play w. &lt;a href="https://ollama.com/blog/structured-outputs" rel="noopener noreferrer"&gt;&lt;code&gt;ollama&lt;/code&gt; structured output&lt;/a&gt; and fix some real life questions&lt;/li&gt;
&lt;li&gt;Write a python package with &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Grab some GOlang skills by building a &lt;code&gt;cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find a way to apply more mathemtic in concrete enterprise problems&lt;/li&gt;
&lt;li&gt;Perform a LLM fine tuning on top of Open Data&lt;/li&gt;
&lt;li&gt;Evangelize around &lt;a href="https://microcks.io/" rel="noopener noreferrer"&gt;Microcks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Build something with my Sensecap Watcher:&lt;/li&gt;
&lt;/ul&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Books
&lt;/h2&gt;

&lt;p&gt;I have a &lt;a href="https://www.goodreads.com/review/list/124105866-adrien-sales?ref=nav_mybooks&amp;amp;shelf=to-read" rel="noopener noreferrer"&gt;bookshelf with my to-read list&lt;/a&gt;, still here are the ones I absoluetly want to achieve in 2025:&lt;/p&gt;

&lt;p&gt;Currently reading&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;... but here's what's in the pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/" rel="noopener noreferrer"&gt;Designing Data-Intensive Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oreilly.com/library/view/implementing-data-mesh/9781098156213/" rel="noopener noreferrer"&gt;Implementing Data Mesh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.fr/Team-Topologies-Organizing-Business-Technology/dp/1942788819" rel="noopener noreferrer"&gt;Team Topologies: Organizing Business and Technology Teams for Fast Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Software-Architect-Elevator-Redefining-Architects/dp/1492077542" rel="noopener noreferrer"&gt;The Software Architect Elevator: Redefining the Architect's Role in the Digital Enterprise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/book/show/150778915-the-heart-and-the-chip" rel="noopener noreferrer"&gt;The Heart and the Chip: Our Bright Future with Robots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/book/show/34454589-the-handmaid-s-tale" rel="noopener noreferrer"&gt;The Handmaid's Tale&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌊 Outdoor sports
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Make real progress in Wingfoiling ;-p&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>newyearchallenge</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>🤖 Job seeker agent.ai for Public Services in New-Caledonia</title>
      <dc:creator>adriens</dc:creator>
      <pubDate>Sat, 25 Jan 2025 22:35:01 +0000</pubDate>
      <link>https://dev.to/adriens/job-seeker-agentai-for-public-services-in-new-caledonia-2d6b</link>
      <guid>https://dev.to/adriens/job-seeker-agentai-for-public-services-in-new-caledonia-2d6b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://srv.buysellads.com/ads/long/x/T6EK3TDFTTTTTT6WWB6C5TTTTTTGBRAPKATTTTTTWTFVT7YTTTTTTKPPKJFH4LJNPYYNNSZL2QLCE2DPPQVCEI45GHBT" rel="noopener noreferrer"&gt;Agent.ai&lt;/a&gt; Challenge: Productivity-Pro Agent (&lt;a href="https://dev.to/challenges/agentai"&gt;See Details&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Currently, the way to find a job in Public Services in New-Caledonia is a classical form:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drhfpnc.gouv.nc/avis-vacances-postes-AVP" 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%2F9ape205lnswzl580v6eg.png" alt="Image description" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But when I come to look for a job this way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I'm a full stack developer but also passionate about data-engineering, AI &amp;amp; DEVOPS"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;... things get complicated &lt;strong&gt;- time consuming 😵 -&lt;/strong&gt; to find the best possible matches.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why I built this agent
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://agent.ai/agent/jobs-avps-drhfpnc-new-caledonia" rel="noopener noreferrer"&gt;&lt;code&gt;New-Caledonia Public Services (DRHFPNC) Job Seeker&lt;/code&gt; Agent&lt;/a&gt; to &lt;strong&gt;provide a ready to-use as a service agent that points anyone the best job opportunities according to its skills&lt;/strong&gt; or aspirations so they find them &amp;amp; apply to them efficiently without having to crawl pdfs and run many &lt;em&gt;"legacy searches"&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔭 Envision and perspectives
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🗞️ Build a &lt;code&gt;Job trends&lt;/code&gt; Blog Poster&lt;/strong&gt; that makes weekly notes on specific skills and related job opportunities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📑 Custom job recommendation team&lt;/strong&gt; : a Team that takes in input curriculum/skills from a specific set of sources (curriculum, online linkedIn activity,...) to make dedicated recommendations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌐 Plug it into a team&lt;/strong&gt; next to &lt;a href="https://agent.ai/profile/1putsxwtwuuv3p2p" rel="noopener noreferrer"&gt;LinkedIn Profile Analyzer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📜  Create an agent that make is possible to put together&lt;/strong&gt; all the assesments of a given user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/jobs-avps-drhfpnc-new-caledonia" 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%2Fqbshxrtmxamt9ctf6c90.png" alt="Image description" width="761" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it became public : &lt;/p&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  🍿 End User UX on mobile
&lt;/h2&gt;

&lt;p&gt;Below a demo of the UX from a mobile device:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/EGiq_P3mD1M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  🔬 How it's built demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jiuVHmZp_Ls"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  💬  &lt;code&gt;Agent.ai&lt;/code&gt; Experience
&lt;/h2&gt;

&lt;p&gt;At first, I watched the video tutorial which took me a very few minutes, then I was ready to go to build the firs version of the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔬 How does it work ?
&lt;/h2&gt;

&lt;p&gt;I have developped and scheduled a Kaggle Notebook : &lt;a href="https://www.kaggle.com/code/adriensales/loader-avis-de-vacances-de-poste-avps-drhfpnc" rel="noopener noreferrer"&gt;⚙ Loader Avis de vacances de poste AVPs DRHFPNC&lt;/a&gt; that takes in input an OpenData dataset, performs transformations and as well pushed data into a Github Repo &lt;a href="https://github.com/adriens/odata-avps-drhfpnc" rel="noopener noreferrer"&gt;&lt;code&gt;adriens/odata-avps-drhfpnc&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;It pushed &lt;a href="https://github.com/adriens/odata-avps-drhfpnc/blob/main/data/avps-drhfpnc-with-headers.csv" rel="noopener noreferrer"&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/a&gt; files and the &lt;a href="https://github.com/adriens/odata-avps-drhfpnc/tree/main/avps" rel="noopener noreferrer"&gt;&lt;code&gt;markdown&lt;/code&gt; version from initial pdf ones&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For this agent I used the scraping feature of the &lt;a href="https://raw.githubusercontent.com/adriens/odata-avps-drhfpnc/refs/heads/main/data/avps-drhfpnc-with-headers.csv" rel="noopener noreferrer"&gt;raw &lt;code&gt;csv&lt;/code&gt; file&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%2Fm7wgz55fn4hrbm72s8kb.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%2Fm7wgz55fn4hrbm72s8kb.png" alt="Image description" width="571" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then i's just about prompting...&lt;/p&gt;

&lt;h2&gt;
  
  
  🤩 Best agent RUNs
&lt;/h2&gt;

&lt;p&gt;Below some agent analysis that retained my attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agent.ai/agent/jobs-avps-drhfpnc-new-caledonia?rid=60a0b658e77d4d808a0f4e520e7cbdcf" rel="noopener noreferrer"&gt;&lt;em&gt;"I'm a full stack developer but also passionated about dataengineering, ai &amp;amp; DEVOPS"&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agent.ai/agent/jobs-avps-drhfpnc-new-caledonia?rid=995964352d2b4beebc37cfb9a844d3e7" rel="noopener noreferrer"&gt;&lt;em&gt;"je suis dans le domaine médical"&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agent.ai/builder/agent/edit?id=axdh4u78tu2kmw7u" rel="noopener noreferrer"&gt;&lt;em&gt;"Je cherche un emploi dans la comptabilité"&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agent.ai/agent/jobs-avps-drhfpnc-new-caledonia?rid=800b61af6473428b9af86d1ae073cae5" rel="noopener noreferrer"&gt;&lt;em&gt;"je suis dans le domaine médical"&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Making the product better : API automation, datasources,...
&lt;/h2&gt;

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

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



&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 Social interactions
&lt;/h2&gt;

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

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



&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>agentaichallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
