<?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: Stephane Paquet</title>
    <description>The latest articles on DEV Community by Stephane Paquet (@spaquet).</description>
    <link>https://dev.to/spaquet</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F583684%2F41e4b1b3-5d0d-4620-a8d3-40d56ff2b5a8.jpeg</url>
      <title>DEV Community: Stephane Paquet</title>
      <link>https://dev.to/spaquet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spaquet"/>
    <language>en</language>
    <item>
      <title>Markify, Markdown without the markup</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Mon, 05 Oct 2026 19:24:48 +0000</pubDate>
      <link>https://dev.to/spaquet/markify-markdown-without-the-markup-10np</link>
      <guid>https://dev.to/spaquet/markify-markdown-without-the-markup-10np</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Markify is a free native Markdown editor for macOS 26. It turns notes, specifications and agent reports into a clean page you can read and edit, while keeping the underlying files plain Markdown.&lt;/p&gt;

&lt;p&gt;It’s built for developers and writers who want less friction between their thoughts and their documents. It currently has no dedicated outdoor feature.&lt;/p&gt;

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

&lt;p&gt;Explore Markify and see screenshots: &lt;a href="https://spaquet.github.io/markify/" rel="noopener noreferrer"&gt;Markify (https://spaquet.github.io/markify/)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/spaquet" rel="noopener noreferrer"&gt;
        spaquet
      &lt;/a&gt; / &lt;a href="https://github.com/spaquet/markify" rel="noopener noreferrer"&gt;
        markify
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A native Markdown editor for macOS with rendered and Markdown views in a single pane.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a href="https://spaquet.github.io/markify/" rel="nofollow 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%2Fraw.githubusercontent.com%2Fspaquet%2Fmarkify%2FHEAD%2Fdocs%2Fimages%2Fog-image.jpg" alt="Markify — One page, two lenses" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/spaquet/markify/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dfbdcda3b6cbe7c5ccf5e2a920b8a13f69507c2efd2ce239a1ecb62c438666f7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f737061717565742f6d61726b696679" alt="GitHub Release"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/spaquet/markify/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aed7e216e7d94808348730ae9ea91cfd24e2b74c895972102137afe204cd7505/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d436f6d6d6f6e73253230436c617573652532302532422532304d49542d626c7565" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://www.apple.com/macos/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8dc8e434048bb3dd855c849511c7187b6bb5f073dc4911a0181847db7e75937e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61634f532d32362532422d6c6967687467726579" alt="macOS 26+"&gt;&lt;/a&gt;
  &lt;a href="https://swift.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73c084e1b9a87b1873d7db4b94324e4baa09ba54643fbd0fd02446f9ef4d7ea6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53776966742d362e322b2d6f72616e6765" alt="Swift 6.2+"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/spaquet/markify/docs/images/app-icon.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fspaquet%2Fmarkify%2FHEAD%2Fdocs%2Fimages%2Fapp-icon.png" alt="" width="36"&gt;&lt;/a&gt; Markify&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A quiet Markdown editor for macOS 26. Write on one rendered page, press ⌘/ to see the same text as plain Markdown, and let on-device Apple Intelligence proofread and rewrite. No split preview pane.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://spaquet.github.io/markify/" rel="nofollow noopener noreferrer"&gt;spaquet.github.io/markify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/spaquet/markify/docs/images/screens/1a.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fspaquet%2Fmarkify%2FHEAD%2Fdocs%2Fimages%2Fscreens%2F1a.webp" alt="Rendered lens: headings, a note callout, a task list and a table rendered in place" width="49%"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/spaquet/markify/docs/images/screens/1b.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fspaquet%2Fmarkify%2FHEAD%2Fdocs%2Fimages%2Fscreens%2F1b.webp" alt="Markdown lens: the same document as source with dimmed syntax" width="49%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The same document in the Rendered lens (left) and the Markdown lens (right).&lt;/p&gt;

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


&lt;ul&gt;

&lt;li&gt;

&lt;strong&gt;One page, two lenses&lt;/strong&gt;: Edit in place with headings, tables, code, math and images rendered. ⌘/ crossfades to the Markdown source and keeps your caret and scroll position.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Format bar&lt;/strong&gt;: Select text to get a floating glass bar for block style, bold, italic, strikethrough, code and links.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Slash menu&lt;/strong&gt;: Type &lt;code&gt;/&lt;/code&gt; to insert tables, task lists, code blocks, callouts, math, images, footnotes or frontmatter. Each row shows its Markdown shortcut.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;GitHub-Flavored Markdown and more&lt;/strong&gt;: Tables, task lists, callouts (&lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt;), &lt;code&gt;$…$&lt;/code&gt; / &lt;code&gt;$$…$$&lt;/code&gt; math, footnotes and YAML frontmatter.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Library&lt;/strong&gt;: A glass sidebar…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/spaquet/markify" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The source is available under MIT with the Commons Clause.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Markify uses SwiftUI and TextKit 2. Two editable views share the same Markdown source: a rendered page and the Markdown itself.&lt;/p&gt;

&lt;p&gt;Plugins let coding agents send reports into Markify. Its built in AI features use Apple Intelligence on the Mac; these are not open weight models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Plain Markdown keeps the documents portable. People and agents can read, edit and version the same files without depending on one service.&lt;/p&gt;

&lt;p&gt;Source availability lets others inspect and adapt Markify. Its current AI implementation, however, does not demonstrate an advantage from open AI over a closed API.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>How Markdown became the new programming language</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Mon, 05 Oct 2026 19:21:20 +0000</pubDate>
      <link>https://dev.to/spaquet/how-markdown-became-the-new-programming-language-4i99</link>
      <guid>https://dev.to/spaquet/how-markdown-became-the-new-programming-language-4i99</guid>
      <description>&lt;h1&gt;
  
  
  How Markdown became the new programming language
&lt;/h1&gt;

&lt;p&gt;Do you remember &lt;em&gt;Terminator 3: Rise of the Machines&lt;/em&gt;? Beyond Kristanna and Arnold making an entrance, what stayed with me was all that sophisticated technology. Machines taking over the world seemed to require some pretty impressive hardware.&lt;/p&gt;

&lt;p&gt;It's 2026, and the machines in my working day can already read a project, write code and run commands. What tells them what to do? A bunch of Markdown files.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rise of the Markdown&lt;/em&gt;. Somehow, I don't think that title would have sold as many tickets.&lt;/p&gt;

&lt;p&gt;I certainly didn't expect those files to become such a big part of my job.&lt;/p&gt;

&lt;p&gt;Two years ago, I was already using AI every day. I asked questions, pasted code into chat windows and accepted autocomplete suggestions. But I still opened the files, wrote the Swift and fixed the build.&lt;/p&gt;

&lt;p&gt;Today, much of my work starts differently. I describe a feature, let an agent implement it, then read, test and question the result. I still care about the code. I just spend more time writing the instructions that produce it.&lt;/p&gt;

&lt;p&gt;The file I keep coming back to is &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The README started giving orders
&lt;/h2&gt;

&lt;p&gt;For years, Markdown explained software after someone built it. Installation instructions. API documentation. The README we promised ourselves we would update later.&lt;/p&gt;

&lt;p&gt;Now those same files can influence what gets built in the first place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; gives coding agents a place to find project context, build commands and conventions. The &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;Agent Skills format&lt;/a&gt; puts reusable instructions in a &lt;code&gt;SKILL.md&lt;/code&gt; file, alongside any scripts or references a task needs.&lt;/p&gt;

&lt;p&gt;By 2026, this is a very practical use for a format I once associated mostly with GitHub READMEs. A Markdown document can describe the project. Another can explain how to perform a task. A third can record the plan before the agent touches the code.&lt;/p&gt;

&lt;p&gt;These files don't execute themselves. The agent reads them and turns their instructions into actions. That makes the quality of the writing matter in a way ordinary documentation rarely did.&lt;/p&gt;

&lt;p&gt;Consider the difference between asking an agent to “improve the editor” and giving it this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Both editing views share the same Markdown source. Changing how the document looks must never change its text. Preserve selection offsets and undo history. Run the editor tests before calling the task complete.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That paragraph describes constraints, names failure conditions and defines a check. It gives the agent something concrete to work with, and gives me something concrete to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this slightly awkward format?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://daringfireball.net/projects/markdown/" rel="noopener noreferrer"&gt;Markdown was designed for readable text that could become HTML&lt;/a&gt;, not for directing machines. Yet its original appeal fits this new job surprisingly well.&lt;/p&gt;

&lt;p&gt;A heading separates the goal from the constraints. A code block preserves the exact command. A link points to the design decision behind a rule. You can read it all in a terminal without needing the app that created it.&lt;/p&gt;

&lt;p&gt;And it is still a file. Put it in Git and you can see who changed an instruction, discuss the change and recover the previous version.&lt;/p&gt;

&lt;p&gt;I find that more useful than another clever prompt sitting somewhere in my chat history.&lt;/p&gt;

&lt;p&gt;Files also give agents a place to recover context. A new session can read the decisions from the last one, provided the relevant documents are actually loaded. It isn't magical memory. Somebody still has to keep those notes accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing becomes part of engineering
&lt;/h2&gt;

&lt;p&gt;Calling Markdown a programming language is a stretch in the literal sense. There is no compiler checking whether “keep this simple” means the same thing to me and to the model.&lt;/p&gt;

&lt;p&gt;That's exactly where the work gets interesting.&lt;/p&gt;

&lt;p&gt;A vague specification leaves room for plausible mistakes. An outdated instruction can send several sessions down the same wrong path. A good plan makes those assumptions visible before they become hundreds of lines of code.&lt;/p&gt;

&lt;p&gt;I've started treating these documents with more care: fewer vague requests, clearer constraints, explicit checks. The generated code still needs review and testing. Writing a convincing plan doesn't make its implementation correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built Markify
&lt;/h2&gt;

&lt;p&gt;Spending more time in Markdown also made me want a better place to read it.&lt;/p&gt;

&lt;p&gt;An agent's long report is easier to think about as a document than as another wall of terminal output. The same goes for the specification I'm about to hand back to it.&lt;/p&gt;

&lt;p&gt;That's part of why I build &lt;a href="https://spaquet.github.io/markify/" rel="noopener noreferrer"&gt;Markify&lt;/a&gt;, a free native Markdown editor for macOS 26. I can write on a rendered page, then press ⌘/ to see the Markdown underneath. Both views work on the same text, and the saved file stays ordinary Markdown that an agent or another editor can use.&lt;/p&gt;

&lt;p&gt;For me, that is the useful middle ground: a comfortable page to think on, and a plain file to keep.&lt;/p&gt;

&lt;p&gt;The rise of the machines has been less cinematic than I expected. In my working day, it looks like an agent waiting for me to explain what I mean.&lt;/p&gt;

&lt;p&gt;Increasingly, I explain it in Markdown.&lt;/p&gt;

&lt;p&gt;Which file gets more of your attention now: the implementation, or the instructions behind it?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>documentation</category>
    </item>
    <item>
      <title>The files I still write are Markdown</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Tue, 29 Sep 2026 05:00:00 +0000</pubDate>
      <link>https://dev.to/spaquet/the-files-i-still-write-are-markdown-128j</link>
      <guid>https://dev.to/spaquet/the-files-i-still-write-are-markdown-128j</guid>
      <description>&lt;p&gt;A few months ago the editor that mattered was the IDE. Zed, VS Code, Vim, whatever let me move fast in code.&lt;/p&gt;

&lt;p&gt;Most of my work now sits with coding agents. They write the change, they draft the review, they leave notes in the repo. What I still own by hand is the Markdown around that work: AGENTS.md, CLAUDE.md, READMEs, design notes, decision logs. Those files are the context and memory the next agent will read. If they are stale or messy, the agent gets a worse picture of the project than I do.&lt;/p&gt;

&lt;p&gt;That shift is easy to miss because the files look small. They are not the product. They are the instructions sitting next to the product. Agents pick them up first. So do new contributors. So do I, three weeks later, when I have forgotten why a decision was made.&lt;/p&gt;

&lt;p&gt;IDEs are fine at opening a .md file. I needed something better. Split preview. Syntax soup. A ribbon that has nothing to do with the document. A marketplace plugin that wants to become its own product inside the editor I already fight with.&lt;/p&gt;

&lt;p&gt;I wanted something &lt;strong&gt;fast, local, and intuitive&lt;/strong&gt;, switch to source when I need it and get back to the rendered page without fighting the tool. One last requirement: no plugin.&lt;/p&gt;

&lt;p&gt;That last one matters more than it sounds. Plugins inherit the IDE's layout, its settings model, its update cycle. I did not want Markdown quality to depend on whether the right extension was installed on this machine today.&lt;/p&gt;

&lt;p&gt;That is the gap I built Markify to fill. Native Mac app. Ordinary .md files. Rendered page and source as two views of the same text. The caret stays put when you flip. Git sees exactly what you typed.&lt;/p&gt;

&lt;p&gt;It is not a second brain. It does not sync your life into a cloud vault. It opens the file, lets you read it as a page, and writes Markdown back to disk.&lt;/p&gt;

&lt;p&gt;Source is on GitHub here:&lt;br&gt;
&lt;a href="https://spaquet.github.io/markify/" rel="noopener noreferrer"&gt;https://spaquet.github.io/markify/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>markdown</category>
      <category>coding</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Gemtracker ❤️ CLI</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Sun, 12 Apr 2026 21:15:15 +0000</pubDate>
      <link>https://dev.to/spaquet/gemtracker-cli-13jk</link>
      <guid>https://dev.to/spaquet/gemtracker-cli-13jk</guid>
      <description>&lt;p&gt;For those of you who prefer CLI or need to test their gems in a CI pipeline or AI workflow: Gemtracker offers CLI export features.&lt;/p&gt;

&lt;p&gt;It supports 3 output formats: JSON, CSV and text. You can decide to have them exported to the terminal or to a file using the --output path/to/file.&lt;/p&gt;

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

</description>
      <category>cli</category>
      <category>ruby</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>GemTracker vs bundler-audit vs Trivy</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Sun, 12 Apr 2026 05:55:32 +0000</pubDate>
      <link>https://dev.to/spaquet/gemtracker-vs-bundler-audit-vs-trivy-1pcp</link>
      <guid>https://dev.to/spaquet/gemtracker-vs-bundler-audit-vs-trivy-1pcp</guid>
      <description>&lt;p&gt;If you maintain Ruby apps, you already know the drill: run &lt;code&gt;bundle outdated&lt;/code&gt;, then &lt;code&gt;bundler-audit&lt;/code&gt;, maybe fire up Trivy for extra security, and still end up jumping between terminals, GitHub issues, and CVE databases just to feel confident about your dependencies.&lt;/p&gt;

&lt;p&gt;I got tired of that dance. So I built &lt;strong&gt;GemTracker&lt;/strong&gt; — a single terminal command that gives you everything in one interactive TUI.&lt;/p&gt;

&lt;p&gt;Here’s a clear, up-to-date comparison (GemTracker v1.2.6) of the three tools developers actually use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/rubysec/bundler-audit" rel="noopener noreferrer"&gt;bundler-audit&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/aquasecurity/trivy" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/spaquet/gemtracker" rel="noopener noreferrer"&gt;gemtracker&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interactive TUI&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (tab-based: Gems / Search / CVE + keyboard nav)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability Scanning&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (RubySec + NVD + others)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency Tree Visualization&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (origin tree with &lt;code&gt;--dependency-tree&lt;/code&gt; flag)&lt;/td&gt;
&lt;td&gt;✅ (forward + reverse trees in Gem Details)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group-Based Analysis (default/dev/test/prod)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (scans dev deps but no group visibility)&lt;/td&gt;
&lt;td&gt;✅ (explicit Groups column + impact notes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outdated Gems Detection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (vuln-only)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gem Maintenance / Health Status&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (🟢 Healthy / 🟡 Warning / 🔴 Critical from RubyGems + GitHub)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct Links to RubyGems &amp;amp; GitHub&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple Report Formats for CI/CD&lt;/td&gt;
&lt;td&gt;✅ (text + JSON)&lt;/td&gt;
&lt;td&gt;✅ (table / JSON / SARIF / CSV-like via template / SBOM)&lt;/td&gt;
&lt;td&gt;✅ (text / CSV / JSON + &lt;code&gt;--report&lt;/code&gt; + &lt;code&gt;--output&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-Ready JSON + Workflow Integration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (JSON output usable for AI)&lt;/td&gt;
&lt;td&gt;✅ (dedicated AI_GUIDE.md + Claude &lt;code&gt;gem-check&lt;/code&gt; skill + JSON parsing examples)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix / Mitigation / Workaround Suggestions&lt;/td&gt;
&lt;td&gt;✅ (solution field in output)&lt;/td&gt;
&lt;td&gt;✅ (fixed version shown in table)&lt;/td&gt;
&lt;td&gt;✅ (proposes via AI skill + vulnerability comments + recommendation decision trees)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching for Performance&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (automatic DB + scan cache)&lt;/td&gt;
&lt;td&gt;✅ (per-project cache in &lt;code&gt;~/.cache/gemtracker/&lt;/code&gt;, auto-invalidated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project Sanity Checks (multiple versions, etc.)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (version management + health + outdated + sanity indicators)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD Exit Codes &amp;amp; Pipeline Examples&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (excellent native support + examples)&lt;/td&gt;
&lt;td&gt;✅ (dedicated export mode + exit codes 0/1 + GitHub/CircleCI/GitLab examples)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why GemTracker feels different in practice&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You stop switching tools.&lt;/strong&gt; Everything — outdated gems, CVEs, dependency impact, and health signals — lives in one fast, keyboard-driven interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You actually understand impact.&lt;/strong&gt; Forward and reverse dependency trees show you exactly which parts of your app will be affected before you upgrade or patch anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You get real maintenance intelligence.&lt;/strong&gt; The health indicators (Healthy / Warning / Critical) pull live data from RubyGems and GitHub so you can spot abandoned or risky gems at a glance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You ship safer code faster.&lt;/strong&gt; One command gives you clean reports for CI/CD, plus AI-ready JSON and ready-to-use Claude skills when you want to automate deeper analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t set out to replace bundler-audit or Trivy. I just wanted a tool that finally gave me the complete picture without the friction. GemTracker is the result.&lt;/p&gt;

&lt;p&gt;If you’re a Ruby developer who’s ever felt dependency anxiety, try it on your next project. You’ll probably wonder how you lived without it.&lt;/p&gt;

&lt;p&gt;What do you think — does your current workflow still feel fragmented? Drop your experience in the comments.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>developers</category>
      <category>coding</category>
      <category>rails</category>
    </item>
    <item>
      <title>How to Ensure Your Ruby Gems Stay Up-to-Date, Well-Maintained, and Secure</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Wed, 08 Apr 2026 10:52:17 +0000</pubDate>
      <link>https://dev.to/spaquet/how-to-ensure-your-ruby-gems-stay-up-to-date-well-maintained-and-secure-415c</link>
      <guid>https://dev.to/spaquet/how-to-ensure-your-ruby-gems-stay-up-to-date-well-maintained-and-secure-415c</guid>
      <description>&lt;p&gt;The answer is simple: use &lt;a href="https://github.com/spaquet/gemtracker" rel="noopener noreferrer"&gt;gemtracker&lt;/a&gt; the missing TUI and now CLI tool to keep your gems in check.&lt;/p&gt;

&lt;p&gt;Since &lt;strong&gt;v1.0.5&lt;/strong&gt;, GemTracker has evolved into an even sharper tool for keeping your dependencies healthy.&lt;/p&gt;

&lt;p&gt;The new release focuses on three core benefits every Ruby developer cares about: &lt;strong&gt;visibility into gem maintenance&lt;/strong&gt;, &lt;strong&gt;smarter security insights&lt;/strong&gt;, and &lt;strong&gt;frictionless integration into your workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s new in v1.1.4
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Gem Health Indicators&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instantly see which of your gems are 🟢 healthy, 🟡 at risk, or 🔴 critical — right in the main list. Full health details (last release, stars, issues, maintainers). No more guessing if a dependency is abandoned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claude Code Skill (&lt;code&gt;/gem-check&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Get AI-powered analysis directly in Claude Code: prioritized vulnerability detection, smart upgrade recommendations, and practical migration advice — all security-first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI/CD-Ready Reports&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One-command exports (text, CSV, JSON) with full vulnerability and outdated-gem data. Perfect for pipelines, compliance checks, or automated audits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broader Project Support&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Now understands &lt;code&gt;gems.locked&lt;/code&gt;, &lt;code&gt;gems.rb&lt;/code&gt;, and &lt;code&gt;.gemspec&lt;/code&gt; files (including runtime vs dev dependencies and version constraints). Works even when you don’t have a classic Gemfile.lock.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Polished Everyday Experience&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Filter view is now a clean centered modal that keeps your gem list visible. Layout is rock-solid across every screen, and official releases include built-in error tracking for better reliability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GemTracker&lt;/strong&gt; remains the zero-config terminal app that gives you complete visibility into your Ruby project: outdated gems, security risks, dependency trees, project metadata, and now real-time maintenance health — all in a beautiful, keyboard-driven interface.&lt;/p&gt;

&lt;p&gt;If you want to make sure the gems in your app are up-to-date, well maintained, and do not present any security risk, give v1.1.4 a try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/spaquet/gemtracker" rel="noopener noreferrer"&gt;https://github.com/spaquet/gemtracker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Official site: &lt;a href="https://gemtracker-website.spaquet74.workers.dev/" rel="noopener noreferrer"&gt;https://gemtracker-website.spaquet74.workers.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback, stars, or issues are always welcome — they directly help shape the next improvements.&lt;/p&gt;

&lt;p&gt;Happy bundling! 💎&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>tooling</category>
      <category>coding</category>
    </item>
    <item>
      <title>Gemtracker v1.0.5 is here!</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Sun, 05 Apr 2026 02:30:38 +0000</pubDate>
      <link>https://dev.to/spaquet/gemtracker-v105-is-here-3cep</link>
      <guid>https://dev.to/spaquet/gemtracker-v105-is-here-3cep</guid>
      <description>&lt;p&gt;Gemtraker is a terminal-based TUI (written in Go with BubbleTea) that makes it way easier to understand and manage your Ruby bundle.&lt;/p&gt;

&lt;p&gt;Just run it in any project that has a Gemfile.lock and you instantly get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full visibility into every gem version (direct + transitive dependencies)&lt;/li&gt;
&lt;li&gt;Outdated gem detection with latest version info
&lt;/li&gt;
&lt;li&gt;CVE/vulnerability highlighting so you can quickly spot risky transitive gems
&lt;/li&gt;
&lt;li&gt;Interactive dependency tree (forward &amp;amp; reverse)
&lt;/li&gt;
&lt;li&gt;Tabs for Gems, Search, CVEs, and detailed views with direct links to RubyGems &amp;amp; GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s perfect for day-to-day dependency hygiene and compliance work (SOC 2, security audits, etc.) where you need to prove exactly what’s in your supply chain.If you work with Ruby or Rails projects, I’d love for you to give it a spin!&lt;/p&gt;

&lt;p&gt;Test it, break it, share feedback, suggest features, or submit a PR — all contributions are very welcome. &lt;a href="https://github.com/spaquet/gemtracker" rel="noopener noreferrer"&gt;https://github.com/spaquet/gemtracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking forward to your thoughts, support and contributions! &lt;/p&gt;

</description>
      <category>cli</category>
      <category>ruby</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Introducing Listopia: Collaborative List Management with AI Magic</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Sat, 28 Jun 2025 15:27:56 +0000</pubDate>
      <link>https://dev.to/spaquet/introducing-listopia-collaborative-list-management-with-ai-magic-26cm</link>
      <guid>https://dev.to/spaquet/introducing-listopia-collaborative-list-management-with-ai-magic-26cm</guid>
      <description>&lt;p&gt;I’m thrilled to share Listopia, the first open-source collaborative list management app with AI-powered multi-channel publishing (MCP) support, built on Rails. &lt;/p&gt;

&lt;p&gt;Whether you’re organizing tasks, brainstorming ideas, or tracking projects, Listopia makes it seamless with natural language controls—manage your lists like you’re chatting with a friend!  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Listopia?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Collaborate Effortlessly: Work together on lists in real-time.&lt;/li&gt;
&lt;li&gt;AI-Powered: Use natural language to create and manage lists with MCP support.
&lt;/li&gt;
&lt;li&gt;Open Source: Free to use, extend, and contribute to!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it out at &lt;a href="https://listopia-dhv.pages.dev" rel="noopener noreferrer"&gt;https://listopia-dhv.pages.dev&lt;/a&gt; and join the community on &lt;a href="https://github.com/spaquet/listopia" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;I’d love your feedback, ideas, or contributions! What do you think about using AI to supercharge list management? Drop a comment below or star us on GitHub!&lt;/p&gt;




&lt;p&gt;PS, we use &lt;a href="https://github.com/crmne/ruby_llm" rel="noopener noreferrer"&gt;Ruby LLM&lt;/a&gt; so you're not stuck with only one AI.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>productivity</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Startup Growth, AI, and Leadership: My Chat with Anna 🎙️🚀</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Fri, 27 Dec 2024 00:50:46 +0000</pubDate>
      <link>https://dev.to/spaquet/startup-growth-ai-and-leadership-my-chat-with-anna-ikc</link>
      <guid>https://dev.to/spaquet/startup-growth-ai-and-leadership-my-chat-with-anna-ikc</guid>
      <description>&lt;p&gt;Had the privilege of being a guest on Anna's podcast! 🎙️ We talked about everything from AI transforming the workplace to scaling startups, growth strategies, and the founder's journey. 🚀&lt;/p&gt;

&lt;p&gt;Anna brought so much energy and asked amazing questions that made for a truly engaging conversation.&lt;/p&gt;

&lt;p&gt;Check it out if you're curious about how startups grow, innovate, and navigate challenges: &lt;a href="https://youtu.be/u9Y-yAiskck" rel="noopener noreferrer"&gt;https://youtu.be/u9Y-yAiskck&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>startup</category>
      <category>leadership</category>
      <category>innovation</category>
    </item>
    <item>
      <title>AI &amp; Personas</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Thu, 12 Dec 2024 17:54:04 +0000</pubDate>
      <link>https://dev.to/spaquet/ai-personas-248m</link>
      <guid>https://dev.to/spaquet/ai-personas-248m</guid>
      <description>&lt;p&gt;Yesterday I asked ChatGPT to generate tech predictions for the year 2025 in the style of Marc Andreessen.&lt;/p&gt;

&lt;p&gt;Why Marc Andreessen? Well, Marc is one of the most successful VC in the Silicon Valley and a very prominent figure. He also post his own predictions about what the tech will look like in 1 year or more from now so I assumed that ChatGPT has enough knowledge about him, his style and vision of the tech scene.&lt;/p&gt;

&lt;p&gt;Here is the result of this one time exercise with ChatGPT: &lt;a href="https://medium.com/@spaquet/top-10-technology-trends-for-2025-f2dc56896947" rel="noopener noreferrer"&gt;https://medium.com/@spaquet/top-10-technology-trends-for-2025-f2dc56896947&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm now going to ask Claude the exact same question, but will change the style to have answers from another prominent person in tech.&lt;/p&gt;

&lt;p&gt;Happy Holidays 🎉&lt;/p&gt;

</description>
      <category>genai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Mailcatcher for beginners</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Mon, 14 Mar 2022 21:46:29 +0000</pubDate>
      <link>https://dev.to/spaquet/mailcatcher-for-beginners-i3f</link>
      <guid>https://dev.to/spaquet/mailcatcher-for-beginners-i3f</guid>
      <description>&lt;p&gt;When in need to troubleshoot email messages use Mailcatcher.&lt;/p&gt;

&lt;p&gt;Mailcatcher is a simple SMTP server that you can run locally or remotely intercept emails during test and development phases.&lt;/p&gt;

&lt;p&gt;Once captured by Mailcatcher emails can be rendered from within their web interface and exported to be opened in any mail client.&lt;/p&gt;

&lt;p&gt;Mailcatcher web interface is refreshed in realtime when your app is using websocket otherwise every 30 seconds.&lt;/p&gt;

&lt;p&gt;Mailcatcher is language agnostic and simple to use as you just have to redirect SMTP traffic to Mailcatcher smtp port 1025.&lt;/p&gt;

&lt;p&gt;So, let's say that you have an application that uses an external SMTP provider and that you have Mailcatcher running locally, you just need to replace your third party provider by smtp://127.0.0.1:1025 and done!&lt;/p&gt;

&lt;p&gt;To access Mailcatcher web interface, simply point to &lt;a href="http://127.0.0.1:1080" rel="noopener noreferrer"&gt;http://127.0.0.1:1080&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If for any reason your instance of Mailcatcher is using a different IP address, just adapt the above examples.&lt;/p&gt;

&lt;p&gt;Over the years, I found it more convenient to not install Mailcatcher on my computer, but have it running in a docker image.&lt;/p&gt;

&lt;p&gt;Here are few ways to have it up and running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker run --rm -p 1080:1080 -p 1025:1025 --name mailcatcher stpaquet/alpinemailcatcher&lt;/code&gt; Will delete the image once you are done using it. This could be interesting for a test environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker run -d -p 1080:1080 -p 1025:1025 --name mailcatcher stpaquet/alpinemailcatcher&lt;/code&gt; Will launch the image as a daemon.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker run -it -p 1080:1080 -p 1025:1025 --name mailcatcher stpaquet/alpinemailcatcher&lt;/code&gt; Will launch the image in interactive mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Useful links:&lt;/strong&gt;&lt;br&gt;
Mailcatcher homepage: &lt;a href="https://mailcatcher.me" rel="noopener noreferrer"&gt;mailcatcher.me&lt;/a&gt;&lt;br&gt;
Dockerfile and Docker Compose: &lt;a href="https://github.com/spaquet/docker-alpine-mailcatcher" rel="noopener noreferrer"&gt;https://github.com/spaquet/docker-alpine-mailcatcher&lt;/a&gt;&lt;br&gt;
Dockerhub: &lt;a href="https://hub.docker.com/r/stpaquet/alpinemailcatcher" rel="noopener noreferrer"&gt;https://hub.docker.com/r/stpaquet/alpinemailcatcher&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Longer article can be found on Medium with Docker Compose basic configuration and more examples:  &lt;a href="https://medium.com/@spaquet/mailcatcher-to-the-rescue-4ba438dc98c2" rel="noopener noreferrer"&gt;https://medium.com/@spaquet/mailcatcher-to-the-rescue-4ba438dc98c2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>smtp</category>
      <category>mailcatcher</category>
      <category>programming</category>
      <category>docker</category>
    </item>
    <item>
      <title>Rails 7 + Devise + Log out</title>
      <dc:creator>Stephane Paquet</dc:creator>
      <pubDate>Mon, 21 Feb 2022 19:41:47 +0000</pubDate>
      <link>https://dev.to/spaquet/rails-7-devise-log-out-d1n</link>
      <guid>https://dev.to/spaquet/rails-7-devise-log-out-d1n</guid>
      <description>&lt;p&gt;A Quick and Dirty way to get the redirection working on Logout when using Devise in a Rails 7 app.&lt;/p&gt;

&lt;p&gt;You probably have noticed that most of the redirects in Devise a somehow broken. This is due to the way Turbo interfere with them as it catches the 200 status code.&lt;/p&gt;

&lt;p&gt;There are already a lot of posts explaining how to patch this while waiting for an official release. But, if your main issue is about the "redirect on log out" not working, then you can easily fix this.&lt;/p&gt;

&lt;p&gt;Instead of calling &lt;code&gt;destroy_user_session_path&lt;/code&gt; in a &lt;code&gt;link_to&lt;/code&gt;, call it inside of a &lt;code&gt;button_to&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is the full code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;%= button_to(
        "Log Out",
        destroy_user_session_path,
        method: :delete
      ) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Voilà! This simple hack enables your users to be redirected to the root_path of your app in seconds.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>tutorial</category>
      <category>devise</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
