<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Open-Source on Clément Joly – Open-Source, Rust &amp; SQLite</title><link>https://joly.pw/tags/open-source/</link><description>Recent content in Open-Source on Clément Joly – Open-Source, Rust &amp; SQLite</description><image><title>Clément Joly – Open-Source, Rust &amp; SQLite</title><url>https://joly.pw/images/open-graph-pages.jpg</url><link>https://joly.pw/images/open-graph-pages.jpg</link></image><generator>Hugo</generator><language>en</language><copyright>Clément Joly</copyright><lastBuildDate>Mon, 04 May 2026 19:41:10 +0100</lastBuildDate><atom:link href="https://joly.pw/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><item><title>Rust Crates</title><link>https://joly.pw/open-source/crates/</link><pubDate>Sun, 30 Mar 2025 00:00:23 +0200</pubDate><guid>https://joly.pw/open-source/crates/</guid><description>&lt;p&gt;List of my Rust crates.&lt;/p&gt;</description><content:encoded><![CDATA[<p>List of my Rust crates.</p>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/rusqlite_migration\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to rusqlite_migration"
            data-goatcounter-click="ext-rusqlite_migration"
            data-goatcounter-referrer="crates"
            href="https://cj.rs/rusqlite_migration/">Rusqlite Migration</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>↕️ Simple database schema migration library for rusqlite, written with performance in mind.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#dea584" />
        </svg>
        </span>
        Rust
        <span>&nbsp;★&nbsp;108</span>
      </p>
  </footer>
</article>


</div>


</div>

<h2 id="work-in-progress">Work in progress</h2>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/pure-sixel#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to pure-sixel"
            data-goatcounter-click="ext-pure-sixel"
            data-goatcounter-referrer="crates"
            href="https://github.com/cljoly/pure-sixel#readme">Pure Sixel</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Pure Rust sixel encoder</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#dea584" />
        </svg>
        </span>
        Rust
        
      </p>
  </footer>
</article>


</div>


</div>]]></content:encoded></item><item><title>Neovim Plugins</title><link>https://joly.pw/open-source/nvim-plugins/</link><pubDate>Thu, 29 Feb 2024 21:00:23 +0200</pubDate><guid>https://joly.pw/open-source/nvim-plugins/</guid><description>&lt;p&gt;List of my plugins for the neovim text editor.&lt;/p&gt;</description><content:encoded><![CDATA[<p>List of my plugins for the neovim text editor.</p>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/telescope-repo.nvim\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telescope-repo.nvim"
            data-goatcounter-click="ext-telescope-repo.nvim"
            data-goatcounter-referrer="nvim-plugins"
            href="https://cj.rs/telescope-repo.nvim/">Telescope Repo Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🦘 Jump into the repositories (git, mercurial…) of your filesystem with telescope.nvim, without any setup</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#000080" />
        </svg>
        </span>
        Lua
        <span>&nbsp;★&nbsp;241</span>
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/bepo-nvim\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to bepo.nvim"
            data-goatcounter-click="ext-bepo.nvim"
            data-goatcounter-referrer="nvim-plugins"
            href="https://cj.rs/bepo-nvim/">Bepo Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>⌨️ Mappings for the bepo keyboard layout in Lua, inspired by <a href="https://github.com/michamos/vim-bepo">https://github.com/michamos/vim-bepo</a></p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#fff3d7" />
        </svg>
        </span>
        Fennel
        <span>&nbsp;★&nbsp;18</span>
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/minimal-format-nvim';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to minimal-format.nvim"
            data-goatcounter-click="ext-minimal-format.nvim"
            data-goatcounter-referrer="nvim-plugins"
            href="https://cj.rs/minimal-format-nvim">Minimal Format Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Minimal, smart formatting using native neovim capabilities.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#000080" />
        </svg>
        </span>
        Lua
        
      </p>
  </footer>
</article>


</div>


</div>

<h2 id="work-in-progress">Work in progress</h2>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/onedark-fast-nvim\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to onedark-fast.nvim"
            data-goatcounter-click="ext-onedark-fast.nvim"
            data-goatcounter-referrer="nvim-plugins"
            href="https://cj.rs/onedark-fast-nvim/">Onedark Fast Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Port of onedark to fennel, so that we generate fast Lua code.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#000080" />
        </svg>
        </span>
        Lua
        
      </p>
  </footer>
</article>


</div>


</div>]]></content:encoded></item><item><title>Hugo Modules</title><link>https://joly.pw/open-source/hugo-modules/</link><pubDate>Thu, 29 Feb 2024 20:00:23 +0200</pubDate><guid>https://joly.pw/open-source/hugo-modules/</guid><description>&lt;p&gt;List of my modules for the &lt;a href="https://gohugo.io/"&gt;Hugo static site generator&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>List of my modules for the <a href="https://gohugo.io/">Hugo static site generator</a>.</p>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/gohugo-asciinema';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to gohugo-asciinema"
            data-goatcounter-click="ext-gohugo-asciinema"
            data-goatcounter-referrer="hugo-modules"
            href="https://cj.rs/gohugo-asciinema">Gohugo Asciinema</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>⏯️ Insert the Asciinema Player in your Hugo site with ease.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#663399" />
        </svg>
        </span>
        CSS
        <span>&nbsp;★&nbsp;22</span>
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/joly.pw\/gohugo-shorturl';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to gohugo-shorturl"
            data-goatcounter-click="ext-gohugo-shorturl"
            data-goatcounter-referrer="hugo-modules"
            href="https://joly.pw/gohugo-shorturl">Gohugo Shorturl</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🔗 Hugo module to create shorturls (so your shorturl like my.site/short can redirect to asitewithalong.name/andanevenlongerpath)</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#e34c26" />
        </svg>
        </span>
        HTML
        
      </p>
  </footer>
</article>


</div>


</div>]]></content:encoded></item><item><title>Exploratory Projects</title><link>https://joly.pw/open-source/exploratory-projects/</link><pubDate>Thu, 29 Feb 2024 19:30:23 +0200</pubDate><guid>https://joly.pw/open-source/exploratory-projects/</guid><description>&lt;p&gt;These projects are still in early, exploratory phases. They may not be ready for use by other people.&lt;/p&gt;</description><content:encoded><![CDATA[<p>These projects are still in early, exploratory phases. They may not be ready for use by other people.</p>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/miniflux-gemini#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to miniflux-gemini"
            data-goatcounter-click="ext-miniflux-gemini"
            data-goatcounter-referrer="exploratory-projects"
            href="https://github.com/cljoly/miniflux-gemini#readme">Miniflux Gemini</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Expose your Miniflux instance to Gemini</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/joly.pw\/into-ledger';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to into-ledger"
            data-goatcounter-click="ext-into-ledger"
            data-goatcounter-referrer="exploratory-projects"
            href="https://joly.pw/into-ledger">Into Ledger</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🔮 AI-powered expenses classifier for ledger. The original project seems not to be maintained anymore, hence this fork to continue improving it.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/pico-heater';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to pico-heater"
            data-goatcounter-click="ext-pico-heater"
            data-goatcounter-referrer="exploratory-projects"
            href="https://github.com/cljoly/pico-heater">Pico Heater</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Heating control with a raspberry pi pico</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#3572A5" />
        </svg>
        </span>
        Python
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/onedark-fast-nvim\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to onedark-fast.nvim"
            data-goatcounter-click="ext-onedark-fast.nvim"
            data-goatcounter-referrer="exploratory-projects"
            href="https://cj.rs/onedark-fast-nvim/">Onedark Fast Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Port of onedark to fennel, so that we generate fast Lua code.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#000080" />
        </svg>
        </span>
        Lua
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/copyright-header#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to copyright-header"
            data-goatcounter-click="ext-copyright-header"
            data-goatcounter-referrer="exploratory-projects"
            href="https://github.com/cljoly/copyright-header#readme">Copyright Header</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Check all copyright headers in your project. For use with any licenses: GPL, MPL, Apache, MIT</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#c30e9b" />
        </svg>
        </span>
        Awk
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/go-sqlite-migration#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to go-sqlite-migration"
            data-goatcounter-click="ext-go-sqlite-migration"
            data-goatcounter-referrer="exploratory-projects"
            href="https://github.com/cljoly/go-sqlite-migration#readme">Go Sqlite Migration</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Demo of golang Migrations with SQLite, using user_version</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to planckez-cli"
            data-goatcounter-click="ext-planckez-cli"
            data-goatcounter-referrer="exploratory-projects"
            href="">Planckez CLI</a>
    </h3>
  </header>
  <section class="entry-content">
    <p><strong>Work in progress</strong> Trying to create a heatmap command-line daemon</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#dea584" />
        </svg>
        </span>
        Rust
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/hmrc2ledger\/';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to hmrc2ledger"
            data-goatcounter-click="ext-hmrc2ledger"
            data-goatcounter-referrer="exploratory-projects"
            href="https://cj.rs/hmrc2ledger/">Hmrc2ledger</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Put HMRC rates in a ledger database</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#c30e9b" />
        </svg>
        </span>
        Awk
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/pure-sixel#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to pure-sixel"
            data-goatcounter-click="ext-pure-sixel"
            data-goatcounter-referrer="exploratory-projects"
            href="https://github.com/cljoly/pure-sixel#readme">Pure Sixel</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Pure Rust sixel encoder</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#dea584" />
        </svg>
        </span>
        Rust
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/telegram-tee';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telegram-tee"
            data-goatcounter-click="ext-telegram-tee"
            data-goatcounter-referrer="exploratory-projects"
            href="https://cj.rs/telegram-tee">Telegram Tee</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>💬 Simple cli tool to create telegram bot behaving like tee</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/joly.pw\/ledger-lint-duplicate';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to ledger-lint-duplicate"
            data-goatcounter-click="ext-ledger-lint-duplicate"
            data-goatcounter-referrer="exploratory-projects"
            href="https://joly.pw/ledger-lint-duplicate">Ledger Lint Duplicate</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Small go utility to find transactions that may be duplicated in a ledger file.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


</div>


</div>]]></content:encoded></item><item><title>Past Software Projects</title><link>https://joly.pw/open-source/past-projects/</link><pubDate>Thu, 29 Feb 2024 19:00:23 +0200</pubDate><guid>https://joly.pw/open-source/past-projects/</guid><description>&lt;p&gt;These projects are not actively developed anymore but are listed here for reference.&lt;/p&gt;</description><content:encoded><![CDATA[<p>These projects are not actively developed anymore but are listed here for reference.</p>
<div class="projects">





<div class="projects-inner">

<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/openpomodoro-hooks#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to openpomodoro-hooks"
            data-goatcounter-click="ext-openpomodoro-hooks"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/openpomodoro-hooks#readme">Openpomodoro Hooks</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🪝 Hooks I use with open-pomodoro cli</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#89e051" />
        </svg>
        </span>
        Shell
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/sesters';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to sesters"
            data-goatcounter-click="ext-sesters"
            data-goatcounter-referrer="past-projects"
            href="https://cj.rs/sesters">Sesters</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>💱 Fast, offline currency converter 💴 💷 💶 💵</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#dea584" />
        </svg>
        </span>
        Rust
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/trie.fennel#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to trie.fennel"
            data-goatcounter-click="ext-trie.fennel"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/trie.fennel#readme">Trie Fennel</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Fennel and Lua library for Trie data structure</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#fff3d7" />
        </svg>
        </span>
        Fennel
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/pomodoro-ml';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to pomodoro"
            data-goatcounter-click="ext-pomodoro"
            data-goatcounter-referrer="past-projects"
            href="https://cj.rs/pomodoro-ml">Pomodoro</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🍅 Paper-like, light, pomodoro timer</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#1e4aec" />
        </svg>
        </span>
        Scheme
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/fast-marks.nvim#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to fast-marks.nvim"
            data-goatcounter-click="ext-fast-marks.nvim"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/fast-marks.nvim#readme">Fast Marks Nvim</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>[Given up] A fast and improved user-experience for viewing and interacting with Vim marks.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#000080" />
        </svg>
        </span>
        Lua
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/cj.rs\/lightweight-container-proxy';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to lightweight-container-proxy"
            data-goatcounter-click="ext-lightweight-container-proxy"
            data-goatcounter-referrer="past-projects"
            href="https://cj.rs/lightweight-container-proxy">Lightweight Container Proxy</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🔒 Lightweight Firefox addon providing SOCKS5 proxy per container</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#f1e05a" />
        </svg>
        </span>
        JavaScript
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/readme-as-site#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to readme-as-site"
            data-goatcounter-click="ext-readme-as-site"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/readme-as-site#readme">Readme as Site</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Achived for now, we have <a href="https://cj.rs/readme-in-static-site/">https://cj.rs/readme-in-static-site/</a>. May be revived to extend the above script and to apply it to a bunch of .md files.</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#663399" />
        </svg>
        </span>
        CSS
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/mosh-srv#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to mosh-srv"
            data-goatcounter-click="ext-mosh-srv"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/mosh-srv#readme">Mosh Srv</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>[Given up for now] Wrapper around mosh (and eventually ssh) to use SRV records</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#00ADD8" />
        </svg>
        </span>
        Go
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='http:\/\/www.oclaunch.eu.org';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to oclaunch"
            data-goatcounter-click="ext-oclaunch"
            data-goatcounter-referrer="past-projects"
            href="http://www.oclaunch.eu.org">Oclaunch</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🚀 Lauch various command, once, when opening a terminal</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#ef7a08" />
        </svg>
        </span>
        OCaml
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-telegram-bot-learn-english#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-telegram-bot-learn-english"
            data-goatcounter-click="ext-telecomnancy-telegram-bot-learn-english"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-telegram-bot-learn-english#readme">Telecomnancy Telegram Bot Learn English</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🤖 Simple Telegram bot to learn English. Group of 2 people.  [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#3572A5" />
        </svg>
        </span>
        Python
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-twitter-like#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-twitter-like"
            data-goatcounter-click="ext-telecomnancy-twitter-like"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-twitter-like#readme">Telecomnancy Twitter Like</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🦜 Twitter-like service, with a client and a server. Use network system calls and SQLite in C while preventing SQL injections. Group of two people (me, @Laur2do) [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#555555" />
        </svg>
        </span>
        C
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-web#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-web"
            data-goatcounter-click="ext-telecomnancy-web"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-web#readme">Telecomnancy Web</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Github Education-like dashboard, for Gitlab, written in Python, CSS/JS/HTML. Developed in a group of 4.   [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#3572A5" />
        </svg>
        </span>
        Python
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-Cproject#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-Cproject"
            data-goatcounter-click="ext-telecomnancy-Cproject"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-Cproject#readme">Telecomnancy Cproject</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Film recommendation with graphical interface, written in C [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#555555" />
        </svg>
        </span>
        C
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-rsfind#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-rsfind"
            data-goatcounter-click="ext-telecomnancy-rsfind"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-rsfind#readme">Telecomnancy Rsfind</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>🕵️ Find-like command, using only low-level system call and with additional features [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#555555" />
        </svg>
        </span>
        C
        
      </p>
  </footer>
</article>


<article class="project-entry" onclick="location.href='https:\/\/github.com\/cljoly\/telecomnancy-flashcard#readme';" style="cursor:pointer;">
  <header class="entry-header">
    <h3>
        <a class="" 
            aria-label="post link to telecomnancy-flashcard"
            data-goatcounter-click="ext-telecomnancy-flashcard"
            data-goatcounter-referrer="past-projects"
            href="https://github.com/cljoly/telecomnancy-flashcard#readme">Telecomnancy Flashcard</a>
    </h3>
  </header>
  <section class="entry-content">
    <p>Flashcard app, created during a coding week with my team. Group of 4 people. [School Project]</p>
  </section>
  <footer class="entry-footer project-footer">
      <p>
        <span class="project-circle">
        <svg  width="11" height="12">
          <circle cx="4" cy="7.5" r="4" fill="#b07219" />
        </svg>
        </span>
        Java
        
      </p>
  </footer>
</article>


</div>


</div>]]></content:encoded></item><item><title>Hmrc2ledger</title><link>https://joly.pw/hmrc2ledger/</link><pubDate>Sun, 21 Aug 2022 08:15:54 +0100</pubDate><guid>https://joly.pw/hmrc2ledger/</guid><description>Put HMRC rates in a ledger database</description><content:encoded><![CDATA[<p>
<p style="display: flex; justify-content: space-between">
  <a href="https://github.com/cljoly/hmrc2ledger" data-goatcounter-click="ext-github-hmrc2ledger" data-goatcounter-title="cljoly/hmrc2ledger">
    <span class="svgicon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
    stroke-linecap="round" stroke-linejoin="round">
    <path
        d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22">
    </path>
</svg></span>&nbsp;cljoly/hmrc2ledger
  </a>
  <a class="badges" href="https://github.com/cljoly/hmrc2ledger" data-goatcounter-click="ext-stargithub-hmrc2ledger" data-goatcounter-title="stars cljoly/hmrc2ledger">
    <img src="https://img.shields.io/github/stars/cljoly/hmrc2ledger?style=social" alt="Github stars for hmrc2ledger">
  </a>
</p>


<div class="badges">
</p>
<p><a href="https://cj.rs/riss">

  <img loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0icG93ZXJlZCBieTogcmlzcyI+PHRpdGxlPnBvd2VyZWQgYnk6IHJpc3M8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjEwNCIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNTU1Ii8+PHJlY3QgeD0iNzUiIHdpZHRoPSIyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzlmOWY5ZiIvPjxyZWN0IHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iMzg1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgeD0iMzg1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9Ijg4NSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0Pjx0ZXh0IHg9Ijg4NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0PjwvZz48L3N2Zz4="></a></p>

</div>

<p><strong><em>Disclaimer</em>: This is not financial advice. It may be outdated or wrong, do your own research.</strong></p>
<p>Convert <a href="https://www.gov.uk/government/collections/exchange-rates-for-customs-and-vat">CSV</a> to <a href="https://www.ledger-cli.org/">ledger</a> price db, to compute <a href="https://www.gov.uk/hmrc-internal-manuals/capital-gains-manual/cg78310">foreign</a> transaction CGT (and <a href="https://www.gov.uk/hmrc-internal-manuals/capital-gains-manual/cg78316">section 104</a> holdings).</p>




  <figure>
    <blockquote >
      <p>Contains public sector information licensed under the <a href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/">Open Government Licence v3.0</a></p>

    </blockquote>
    
  </figure>



]]></content:encoded></item><item><title>Ledger.ctags</title><link>https://joly.pw/ledger-ctags/</link><pubDate>Sun, 21 Aug 2022 08:15:54 +0100</pubDate><guid>https://joly.pw/ledger-ctags/</guid><description>Ctags file for ledger-cli</description><content:encoded><![CDATA[
<p style="display: flex; justify-content: space-between">
  <a href="https://github.com/cljoly/ledger.ctags" data-goatcounter-click="ext-github-ledger.ctags" data-goatcounter-title="cljoly/ledger.ctags">
    <span class="svgicon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
    stroke-linecap="round" stroke-linejoin="round">
    <path
        d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22">
    </path>
</svg></span>&nbsp;cljoly/ledger.ctags
  </a>
  <a class="badges" href="https://github.com/cljoly/ledger-ctags" data-goatcounter-click="ext-stargithub-ledger.ctags" data-goatcounter-title="stars cljoly/ledger.ctags">
    <img src="https://img.shields.io/github/stars/cljoly/ledger.ctags?style=social" alt="Github stars for ledger.ctags">
  </a>
</p>

<p>If you are using <a href="https://ledger-cli.org/">Ledger</a> or one of its variants for your <a href="https://plaintextaccounting.org/">plain text accounting</a>, you get to manage your finances a bit more like you manage code. With plain text files, in your favorite editor.</p>
<p>And yet, as opposed to code in most languages, you don’t have a <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol implementation</a>. So it’s a bit harder to get completions on accounts, tags, payees… You have to rely on bespoken support from your editor and that’s often imperfect or slow. Plus, if you <a href="https://www.ledger-cli.org/3.0/doc/ledger3.html#index-pre_002ddeclare-account">declare</a> your accounts and payees, you also can’t jump to the definition easily.</p>
<p>Enter ctags configuration for ledger, which this project provides. It generates <code>tag</code> file that’s understood by your editor, often out of the box (<a href="https://vimhelp.org/usr_29.txt.html#29.1">vim/neovim</a>, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Tags-Tables.html">emacs</a>) or with a generic plugin (Atom, VS Code, TextMate and <a href="https://en.wikipedia.org/wiki/Ctags#Editors_that_support_ctags">more</a>). Congrats, your editor now has very fast completions and code navigation!</p>
<h2 id="installation">Installation</h2>
<p>You need to have <a href="https://ctags.io/">ctags</a> installed<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Then drop <a href="https://raw.githubusercontent.com/cljoly/ledger.ctags/main/ledger.ctags"><code>ledger.ctags</code></a> in <code>~/.config/ctags</code> (or whatever <code>ctags</code> is configured to read).</p>
<h2 id="usage">Usage</h2>
<pre tabindex="0"><code>ctags my/ledger/journal.ldg
</code></pre><p>will collect all the elements formally <a href="https://www.ledger-cli.org/3.0/doc/ledger3.html#index-pre_002ddeclare-account">declared</a> in the journal file. This means that in the following file:</p>
<pre tabindex="0"><code class="language-ledger" data-lang="ledger">tag UUID
account Assets
payee Shop
commodity EUR

2022-01-01 * Someone
    Expenses:Food   $10
    Liabilities:Credit Card
</code></pre><p>only <code>UUID</code>, <code>Assets</code>, <code>Shop</code> and <code>EUR</code> are detected, because they are the only one declared and so the only ones with a definition to jump to. <code>Someone</code>, <code>Expenses</code>, <code>Expenses:Food</code>, <code>$</code>, <code>Liabilities</code> and <code>Liabilities:Credit  Card</code> are not declared, so they are ignored by ctags.</p>
<h3 id="initial-list-of-accounts-payees">Initial List of Accounts, Payees…</h3>
<p>As mentioned, ctags only collects elements that are declared. You could write the declarations manually, if you want to have fine-grained control of which accounts you want to actively use and have completions for. But to ease initial bootstrapping, you may want to start by adding everything you currently use in your ledger journals. You can do that with a couple commands.</p>
<p>For accounts, you can use this bash snippet:</p>
<pre tabindex="0"><code>ledger accounts | awk &#39;{ print &#34;account&#34;, $0}&#39;
</code></pre><p>For payees:</p>
<pre tabindex="0"><code>ledger payees | awk &#39;{ print &#34;payee&#34;, $0}&#39;
</code></pre><p>For tags:</p>
<pre tabindex="0"><code>ledger tags | awk &#39;{ print &#34;tag&#34;, $0}&#39;
</code></pre><p>The snippets above output proper ledger definitions for accounts, payees and tags. You can insert these outputs in your journal or in a separate file with all your declarations (say <code>declarations.ledger</code>), that you can then <code>include</code> in your main journal file.</p>
<p>Don’t forget that ctags does not follow includes, so you should pass the file with the definitions to ctags (e.g. <code>ctags declarations.ledger</code>)</p>
<h3 id="multiple-files">Multiple files</h3>
<p>If you have multiple ledger journal files, pass them all to ctags (e.g. <code>ctags *.ledger *.ldg</code>) or run it on the current directory:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>ctags -R .
</span></span></code></pre></div><hr>
<h2 id="automatic-update-with-chezmoi">Automatic Update with Chezmoi</h2>
<p>Chezmoi <a href="https://www.chezmoi.io/reference/special-files-and-directories/chezmoiexternal-format/">external</a> feature allows you to auto update and manage the <code>ledger.ctags</code> file, by adding the following to your <code>~/.local/share/chezmoi/.chezmoiexternal.toml</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#98c379">&#34;.config/ctags/&#34;</span>]
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">type</span> = <span style="color:#98c379">&#34;archive&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">include</span> = [ <span style="color:#98c379">&#34;*/ledger.ctags&#34;</span> ]
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">url</span> = <span style="color:#98c379">&#34;https://github.com/cljoly/ledger.ctags/archive/master.zip/&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">stripComponents</span> = <span style="color:#d19a66">1</span>
</span></span></code></pre></div><h2 id="contributing">Contributing</h2>
<p>Contributions (documentation or code improvements in particular) are welcome, see <a href="https://cj.rs/docs/contribute/">contributing</a>!</p>
<p>Feel free <a href="https://github.com/cljoly/ledger.ctags/issues/new">to fill an issue</a> if your <em>declared</em> accounts, tags, payee, alias… are not properly detected.</p>
<h2 id="acknowledgments">Acknowledgments</h2>
<p>I would like to thank the creators, and all the contributors, of <a href="https://ctags.io/">ctags</a> and <a href="https://ledger-cli.org/">ledger</a>. This is small configuration to make these two great projects work better together.</p>

<div class="badges">

<p><a href="https://cj.rs/riss">

  <img loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0icG93ZXJlZCBieTogcmlzcyI+PHRpdGxlPnBvd2VyZWQgYnk6IHJpc3M8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjEwNCIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNTU1Ii8+PHJlY3QgeD0iNzUiIHdpZHRoPSIyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzlmOWY5ZiIvPjxyZWN0IHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iMzg1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgeD0iMzg1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9Ijg4NSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0Pjx0ZXh0IHg9Ijg4NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0PjwvZz48L3N2Zz4="></a></p>

</div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Another implementation may work, but it’s untested. Feel free to send a PR though!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>README In Static Site (RISS)</title><link>https://joly.pw/readme-in-static-site/</link><pubDate>Sat, 21 Aug 2021 08:15:54 +0100</pubDate><guid>https://joly.pw/readme-in-static-site/</guid><description>💎 Transform and insert your GitHub readme in your static site</description><content:encoded><![CDATA[<p>
<p style="display: flex; justify-content: space-between">
  <a href="https://codeberg.org/cljoly/readme-in-static-site" data-goatcounter-click="ext-codeberg-readme-in-static-site" data-goatcounter-title="cljoly/readme-in-static-site">
    <span class="svgicon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
    <path
        d='M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12 12 12 0 0 0-.045 0zm.375 6.467l4.416 16.553a12 12 0 0 0 5.137-4.213z' />
</svg></span>&nbsp;cljoly/readme-in-static-site
  </a>
  <a class="badges" href="https://github.com/cljoly/readme-in-static-site" data-goatcounter-click="ext-stargithub-readme-in-static-site" data-goatcounter-title="stars cljoly/readme-in-static-site">
    <img src="https://img.shields.io/github/stars/cljoly/readme-in-static-site?style=social" alt="Github stars for readme-in-static-site">
  </a>
</p>


<div class="badges">
</p>
<p><a href="https://github.com/cljoly/readme-in-static-site/blob/main/riss.awk">
<img alt="GitHub code size in bytes" loading="lazy" src="https://img.shields.io/github/size/cljoly/readme-in-static-site/riss.awk?color=purple"></a> 
<img alt="GitHub tag (latest SemVer)" loading="lazy" src="https://img.shields.io/github/v/tag/cljoly/readme-in-static-site?color=darkgreen&sort=semver"> <a href="https://github.com/cljoly/readme-in-static-site/actions/workflows/checks.yml">
<img alt="CI" loading="lazy" src="https://codeberg.org/cljoly/readme-in-static-site/actions/workflows/checks.yml/badge.svg"></a> <a href="https://cj.rs/riss">

  <img loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0icG93ZXJlZCBieTogcmlzcyI+PHRpdGxlPnBvd2VyZWQgYnk6IHJpc3M8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjEwNCIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNTU1Ii8+PHJlY3QgeD0iNzUiIHdpZHRoPSIyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzlmOWY5ZiIvPjxyZWN0IHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iMzg1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgeD0iMzg1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9Ijg4NSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0Pjx0ZXh0IHg9Ijg4NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0PjwvZz48L3N2Zz4="></a></p>
<p>
<img alt="RISS in action" loading="lazy" src="/blog/putting-readmes-on-your-static-site/riss-in-action.png"></p>

</div>

<p>This <a href="#benchmark">fast</a> <a href="https://cj.rs/riss.awk">script</a> allows you to insert your GitHub README in your static site and apply transformations. For instance, you can read this <a href="https://github.com/cljoly/readme-in-static-site/blob/main/README.md">README on GitHub</a> and <a href="https://cj.rs/readme-in-static-site">on my website</a>.</p>
<h3 id="why">Why?</h3>
<p>The GitHub README of your repo needs to efficiently describe your project to GitHub’s visitor. But featuring your project on your website allows you to (among other things):</p>
<ul>
<li>have more control on the theme and layout,</li>
<li>insert scripts that GitHub would prohibit (like <a href="#replace-asciinema-image">asciinema</a>),</li>
<li>have your project’s homepage independent of your hosting platform, if you wish to change at some point.</li>
</ul>
<p>Chances are that for small projects, the page about your project is very similar to the GitHub README. Don’t duplicate efforts, describe the differences! This <a href="https://github.com/vhodges/stitcherd">has</a> <a href="https://dev.to/lornasw93/github-readme-on-portfolio-project-page-51i8">been</a> a <a href="https://richjenks.com/github-pages-from-readme/">long-awaited</a> <a href="https://medium.com/@bolajiayodeji/how-to-convert-github-markdown-files-to-a-simple-website-b08602d05e1c">feature</a>, in <a href="https://news.ycombinator.com/item?id=29305990">one</a> <a href="https://stackoverflow.com/q/48919200/4253785">form</a> or <a href="https://stackoverflow.com/a/69296054/4253785">another</a>.</p>
<p>See this <a href="https://cj.rs/blog/putting-readmes-on-your-static-site/">blog post</a> for more details.</p>
<h2 id="testimonials">Testimonials</h2>
<p><a href="https://news.ycombinator.com/item?id=29304376">
<img loading="lazy" src="https://img.shields.io/badge/dynamic/json?color=Orange&label=HackerNews&query=%24.score&url=https%3A%2F%2Fhacker-news.firebaseio.com%2Fv0%2Fitem%2F29304376.json&logo=ycombinator&color=orange"></a> <a href="https://lobste.rs/s/a4jzvv/readme_static_site_riss#c_hiil4z.json">
<img loading="lazy" src="https://img.shields.io/badge/dynamic/json?color=green&label=Lobsters&query=%24.score&url=https%3A%2F%2Flobste.rs%2Fs%2Fa4jzvv%2Freadme_static_site_riss.json&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAL0ALQAtZF7+HAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCCBAuLt2rqugAAACMSURBVDjL1ZMxCsJQEERfRPEk9im9mGfxBpaCnaXmBraeQEidKsKz2eIb/peEIOLAwu4Ws7PMbsUAKlOwYCaWmd4aWCV1B4yXpR59R61SitwKDdBHfgPaSTsF8zOmHz5NLykAeCRqvuvCfxGcgP0YF3ZqHy7c1Yt6jfo8dCF3idvkQjcRRVQ/f6bZBC+RBoeZnlCyqwAAAABJRU5ErkJggg==&labelColor=500000"></a></p>
<p>RISS made it to the first page of <a href="https://news.ycombinator.com/item?id=29304376">HackerNews</a> and <a href="https://lobste.rs/s/a4jzvv/readme_static_site_riss">Lobsters</a> and got comments like:</p>




  <figure>
    <blockquote >
      <p>I never really understood the idea to have a separate README and index page. Glad to see i&rsquo;m not the only one :)</p>

    </blockquote>
    
  </figure>



<p><a href="https://news.ycombinator.com/item?id=29305519">southerntofu</a></p>




  <figure>
    <blockquote >
      <p>Kudos for making it reusable and not specific to a single static site generator. […]</p>

    </blockquote>
    
  </figure>



<p><a href="https://lobste.rs/s/a4jzvv/readme_static_site_riss#c_hiil4z">hannu</a></p>




  <figure>
    <blockquote >
      <p>[…] A small but good idea, I like how simple riss.awk is.</p>

    </blockquote>
    
  </figure>



<p><a href="https://news.ycombinator.com/item?id=29305070">lifthrasiir</a></p>
<h3 id="run-it-nothing-to-install">Run It (Nothing to Install)</h3>
<p>To try it with <a href="https://gohugo.io/">Hugo</a> or <a href="https://www.getzola.org/">Zola</a>, run the following in your static-site sources:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>wget https://cj.rs/riss.awk
</span></span><span style="display:flex;"><span>awk -f riss.awk /path/to/my-project/README.md &gt; content/my-project.md
</span></span></code></pre></div><p>If you don’t use Hugo or Zola, no problem! It should also work with any markdown-based static-site generator. Just put the markdown file where it makes sense for that generator.</p>
<p>To automatically update these files in your static-site sources, see <a href="#automate-with-github-actions">Automate with GitHub Actions</a> below. Since RISS is based on Awk, there is nothing to install, besides copying the script itself!</p>
<h2 id="example">Example</h2>
<h3 id="add-a-front-matter">Add a Front Matter</h3>
<p>Most static site generators require a “<a href="https://gohugo.io/getting-started/configuration/#configure-front-matter">front matter</a>” at the beginning of a markdown file to attach some metadata. But you don’t want to add this to your GitHub README! Let’s hide this on GitHub and have it in the script’s output.</p>
<p>In you .md file on GitHub, put:</p>
<pre><code>&lt;!-- insert
---
title: &quot;README In Static Site (RISS)&quot;
date: 2021-08-21T10:15:54
---
end_insert --&gt;
&lt;!-- Powered by https://cj.rs/riss --&gt;
&lt;!-- remove --&gt;

# README In Static Site (RISS)
&lt;!-- end_remove --&gt;
</code></pre>
<p>The output of the script will be:</p>
<pre><code>---
title: &quot;README In Static Site (RISS)&quot;
date: 2021-08-21T10:15:54
---
&lt;!-- Powered by https://cj.rs/riss --&gt;
</code></pre>
<p>and this piece of yaml will be hidden on GitHub!</p>
<h3 id="replace-asciinema-image">Replace Asciinema Image</h3>
<p>You can’t embed the asciinema player on GitHub for security reasons. So the <a href="https://asciinema.org/docs/embedding">asciinema documentation</a> suggests using an image there and to link it to a webpage with the player. But on your own website, you can embed this player.</p>
<p>In your .md file, put:</p>
<pre><code>&lt;!-- remove --&gt;
[![Finding the repositories with “telescope” in their name, with the README in the panel on the right](https://asciinema.org/a/427156.svg)](https://asciinema.org/a/427156)
&lt;!-- end_remove --&gt;
&lt;!-- insert
&lt;asciinema-player src=&quot;./telescope.cast&quot; poster=&quot;npt:0:04&quot;&gt;&lt;/asciinema-player&gt;
end_insert --&gt;
</code></pre>
<p>The output will contain only the asciinema player:</p>
<pre><code>&lt;asciinema-player src=&quot;./telescope.cast&quot; poster=&quot;npt:0:04&quot;&gt;&lt;/asciinema-player&gt;
</code></pre>
<p><em>Note</em>: you also need to add the JS/CSS files of the asciinema player somewhere in your theme. This <a href="https://cj.rs/gohugo-asciinema/">Hugo module</a> makes it easy.</p>
<h3 id="more">More</h3>
<p>See the <a href="https://github.com/cljoly/readme-in-static-site/blob/main/test.md">input file (typically on GitHub)</a> and the <a href="https://github.com/cljoly/readme-in-static-site/blob/main/test_output.md">output of the script</a>. You can find another real word <a href="https://github.com/cljoly/telescope-repo.nvim/blob/master/README.md">README</a> converted to a <a href="https://cj.rs/telescope-repo-nvim/">webpage</a> (this gives another example of asciinema conversion using a Hugo shortcode).</p>
<p>With some shell scripting, you could also transform all the markdown files in your repo and put them in a subdirectory of your site, so that your project’s documentation, policy, etc… lives on your site or even on a site of its own.</p>
<h3 id="your-example">Your Example!</h3>
<p>Have you used this script to transform some markdown (or other) and insert it on your website? <a href="https://github.com/cljoly/readme-in-static-site/issues/new">Open an issue</a> if you would like a link to your use case from this README!</p>
<ul>
<li><strong>telescope-repo.nvim</strong>: <a href="https://github.com/cljoly/telescope-repo.nvim/blob/master/README.md">readme</a>, <a href="https://cj.rs/telescope-repo-nvim/">website</a>; features an Asciinema clip.</li>
<li><strong>neovide</strong>: <a href="https://github.com/neovide/neovide/blob/main/README.md">readme</a>, <a href="https://neovide.dev/">first iteration of their website</a>, <a href="https://github.com/neovide/neovide/pull/1114">PR setting this up</a>. They have now moved to mdbook and that’s great! RISS makes the first iteration of your website easy and you are free to move to more complete solutions when your project grows.</li>
<li><strong>Hugo APT Repository</strong>: <a href="https://github.com/8hobbies/hugo-apt/blob/master/README.md">readme</a>, <a href="https://hugo-apt.8hob.io/">website</a>, <a href="https://github.com/8hobbies/hugo-apt/pull/12">PR setting it up</a>.</li>
</ul>
<h2 id="transformations-reference">Transformations Reference</h2>
<p>The transformations are driven by HTML comments, so that you can have different results when comments are ignored (e.g. in your GitHub README) and after executing the script on your markdown file.</p>
<h3 id="escaping">Escaping</h3>
<p><strong>It is important that your comment starts at the beginning of the line:</strong> spaces are used for escaping, meaning that if the comment has spaces at the beginning of the line, it is ignored.</p>
<p>So this is escaped</p>
<pre tabindex="0"><code>    &lt;!-- insert
</code></pre><p>but this is not</p>
<pre><code>&lt;!-- insert
</code></pre>
<h3 id="insertion">Insertion</h3>
<p>Use these two lines for text you want to have in your output, but not in the raw .md file.</p>
<pre><code>&lt;!-- insert
end_insert --&gt;
</code></pre>
<h3 id="remove">Remove</h3>
<p>Use these two comments for text you want to have in your raw .md file, but not in the output</p>
<pre><code>&lt;!-- remove --&gt;
&lt;!-- end_remove --&gt;
</code></pre>
<h2 id="spread-the-word">Spread the Word</h2>
<p>If you find this script useful, please consider inserting the following in your readme:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span><span style="color:#7f848e">&lt;!-- Powered by https://cj.rs/riss --&gt;</span>
</span></span></code></pre></div><p>This will help other people find the script. <em>Thanks for spreading the word!</em></p>
<p>If you feel especially charitable, you could put this badge somewhere:</p>
<p><a href="https://cj.rs/riss">

  <img loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0icG93ZXJlZCBieTogcmlzcyI+PHRpdGxlPnBvd2VyZWQgYnk6IHJpc3M8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjEwNCIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNTU1Ii8+PHJlY3QgeD0iNzUiIHdpZHRoPSIyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzlmOWY5ZiIvPjxyZWN0IHdpZHRoPSIxMDQiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iMzg1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgeD0iMzg1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI2NTAiPnBvd2VyZWQgYnk8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9Ijg4NSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0Pjx0ZXh0IHg9Ijg4NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTkwIj5yaXNzPC90ZXh0PjwvZz48L3N2Zz4="></a></p>
<p>with for instance this code:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>[<span style="color:#e06c75">![</span>](<span style="color:#e06c75">https://img.shields.io/badge/powered%20by-riss-lightgrey</span>)](https://cj.rs/riss)
</span></span></code></pre></div><h2 id="breaking-api-changes">Breaking API Changes</h2>
<p>We follow <a href="https://semver.org/">semver</a> and any change that change would cause real world READMEs to be converted differently requires a new major version. In particular, the following is a breaking change:</p>
<ul>
<li>adding new keywords (like <code>remove</code> or <code>insert</code>), as they may be used in the README prior to their introduction in RISS,</li>
<li>changing a keywords syntax.</li>
</ul>
<h2 id="benchmark">Benchmark</h2>
<p><strong>Processes 17600 lines in 10 ms</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ <span style="color:#c678dd">for</span> i in <span style="color:#56b6c2">{</span>1..100<span style="color:#56b6c2">}</span>; <span style="color:#c678dd">do</span> shuf README.md &gt;&gt;bench.md; <span style="color:#c678dd">done</span> <span style="color:#7f848e"># Create a big md file</span>
</span></span><span style="display:flex;"><span>$ wc -l README.md
</span></span><span style="display:flex;"><span><span style="color:#d19a66">176</span> README.md
</span></span><span style="display:flex;"><span>$ wc -l bench.md
</span></span><span style="display:flex;"><span><span style="color:#d19a66">17600</span> bench.md
</span></span><span style="display:flex;"><span>$ hyperfine <span style="color:#98c379">&#39;awk -f riss.awk README.md&#39;</span> <span style="color:#98c379">&#39;awk -f riss.awk bench.md&#39;</span>
</span></span></code></pre></div><table>
  <thead>
      <tr>
          <th style="text-align: left">Command</th>
          <th style="text-align: right">Mean [ms]</th>
          <th style="text-align: right">Min [ms]</th>
          <th style="text-align: right">Max [ms]</th>
          <th style="text-align: right">Relative</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><code>awk -f riss.awk README.md</code></td>
          <td style="text-align: right">2.8 ± 0.2</td>
          <td style="text-align: right">2.4</td>
          <td style="text-align: right">3.7</td>
          <td style="text-align: right">1.00</td>
      </tr>
      <tr>
          <td style="text-align: left"><code>awk -f riss.awk bench.md</code></td>
          <td style="text-align: right">9.7 ± 0.4</td>
          <td style="text-align: right">8.9</td>
          <td style="text-align: right">10.7</td>
          <td style="text-align: right">3.46 ± 0.30</td>
      </tr>
  </tbody>
</table>
<h2 id="automate-with-github-actions">Automate with GitHub Actions</h2>
<p>You can automatically update the markdown file in the sources of your site with GitHub Actions. Add this workflow to, for instance, <code>.github/workflows/readme.yml</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#e06c75">name</span>: Update README files
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e06c75">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#e06c75">schedule</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#e06c75">cron</span>: <span style="color:#98c379">&#39;30 */2 * * *&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#e06c75">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">branches</span>:
</span></span><span style="display:flex;"><span>    - master
</span></span><span style="display:flex;"><span>  <span style="color:#7f848e"># To run this workflow manually from GitHub GUI</span>
</span></span><span style="display:flex;"><span>  <span style="color:#e06c75">workflow_dispatch</span>:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e06c75">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#e06c75">build</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">runs-on</span>: ubuntu-latest
</span></span><span style="display:flex;"><span>    <span style="color:#e06c75">steps</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#e06c75">name</span>: Check out the repo
</span></span><span style="display:flex;"><span>      <span style="color:#e06c75">uses</span>: actions/checkout@v2
</span></span><span style="display:flex;"><span>    - <span style="color:#e06c75">name</span>: Get the latest READMEs
</span></span><span style="display:flex;"><span>      <span style="color:#e06c75">run</span>: make readme-update
</span></span><span style="display:flex;"><span>    - <span style="color:#e06c75">name</span>: Commit and push if there are changes
</span></span><span style="display:flex;"><span>      <span style="color:#e06c75">run</span>: |-<span style="color:#98c379">
</span></span></span><span style="display:flex;"><span><span style="color:#98c379">        git diff
</span></span></span><span style="display:flex;"><span><span style="color:#98c379">        git config --global user.email &#34;bot@example.com&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#98c379">        git config --global user.name &#34;bot&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#98c379">        git diff --quiet || (git add -u &amp;&amp; git commit -m &#34;Update READMEs&#34;)
</span></span></span><span style="display:flex;"><span><span style="color:#98c379">        git push</span>
</span></span></code></pre></div><p>and then your <code>Makefile</code> may contain something like:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-make" data-lang="make"><span style="display:flex;"><span><span style="color:#61afef;font-weight:bold">readme-update</span><span style="color:#56b6c2">:</span>
</span></span><span style="display:flex;"><span>	curl https://raw.githubusercontent.com/cljoly/readme-in-static-site/main/README.md | awk -f riss.awk &gt;content/readme-in-static-site.md
</span></span></code></pre></div><p>Alternatively, you might configure your repositories to trigger a website rebuild when committing on your README, for instance using <a href="https://mainawycliffe.dev/blog/github-actions-trigger-via-webhooks/">GitHub actions webhooks</a>.</p>
<h2 id="contributions-are-welcome">Contributions are Welcome!</h2>
<p>Feel free to <a href="https://github.com/cljoly/readme-in-static-site/issues/new">open an issue</a> to discuss something or to send a PR.</p>
<p>See also the <a href="#spread-the-word">Spread the Word</a> section if you would like to make more folks aware of this script.</p>
<p>
<img alt="GitHub" loading="lazy" src="https://img.shields.io/github/license/cljoly/readme-in-static-site"></p>
]]></content:encoded></item><item><title>Talks and Papers</title><link>https://joly.pw/open-source/talks-and-papers/</link><pubDate>Sun, 13 Dec 2020 21:51:08 +0100</pubDate><guid>https://joly.pw/open-source/talks-and-papers/</guid><description>Talks I gave and papers I wrote</description></item><item><title>Contribution Guidelines</title><link>https://joly.pw/open-source/docs/contribute/</link><pubDate>Sat, 02 Oct 2021 21:00:23 +0200</pubDate><guid>https://joly.pw/open-source/docs/contribute/</guid><description>&lt;div class="badges"&gt;
&lt;p&gt;&lt;a href="#i-dont-want-to-use-github"&gt;
&lt;img alt="Git Email" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iR2l0IGVtYWlsOiBzdXBwb3J0ZWQiPjx0aXRsZT5HaXQgZW1haWw6IHN1cHBvcnRlZDwvdGl0bGU+PGxpbmVhckdyYWRpZW50IGlkPSJzIiB4Mj0iMCIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2JiYiIgc3RvcC1vcGFjaXR5PSIuMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIuMSIvPjwvbGluZWFyR3JhZGllbnQ+PGNsaXBQYXRoIGlkPSJyIj48cmVjdCB3aWR0aD0iMTI0IiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iNTkiIGhlaWdodD0iMjAiIGZpbGw9IiM1NTUiLz48cmVjdCB4PSI1OSIgd2lkdGg9IjY1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNGMxIi8+PHJlY3Qgd2lkdGg9IjEyNCIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSIzMDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjQ5MCI+R2l0IGVtYWlsPC90ZXh0Pjx0ZXh0IHg9IjMwNSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iNDkwIj5HaXQgZW1haWw8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9IjkwNSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iNTUwIj5zdXBwb3J0ZWQ8L3RleHQ+PHRleHQgeD0iOTA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI1NTAiPnN1cHBvcnRlZDwvdGV4dD48L2c+PC9zdmc+"&gt;&lt;/a&gt;
&lt;a href="#tldr"&gt;
&lt;img alt="Contributions welcome!" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0aW9ucyB3ZWxjb21lISI+PHRpdGxlPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjAiIGhlaWdodD0iMjAiIGZpbGw9IiMzZGE2MzkiLz48cmVjdCB4PSIwIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjIwIiBmaWxsPSIjM2RhNjM5Ii8+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI3MDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjEzMTAiPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RleHQ+PHRleHQgeD0iNzA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSIxMzEwIj5Db250cmlidXRpb25zIHdlbGNvbWUhPC90ZXh0PjwvZz48L3N2Zz4="&gt;&lt;/a&gt;
&lt;a href="https://cj.rs/docs/code-of-conduct/"&gt;
&lt;img alt="Contributor Covenant" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJDb2RlIG9mIGNvbmR1Y3QiPjx0aXRsZT5Db2RlIG9mIGNvbmR1Y3Q8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9Ijk5IiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0iIzRiYWFhYSIvPjxyZWN0IHg9IjAiIHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzRiYWFhYSIvPjxyZWN0IHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI0OTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9Ijg5MCI+Q29kZSBvZiBjb25kdWN0PC90ZXh0Pjx0ZXh0IHg9IjQ5NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iODkwIj5Db2RlIG9mIGNvbmR1Y3Q8L3RleHQ+PC9nPjwvc3ZnPg=="&gt;&lt;/a&gt;
&lt;a href="https://cj.rs/docs/security/"&gt;
&lt;img alt="Security Policy" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MSIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTZWN1cml0eSBwb2xpY3kiPjx0aXRsZT5TZWN1cml0eSBwb2xpY3k8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjkxIiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0icHVycGxlIi8+PHJlY3QgeD0iMCIgd2lkdGg9IjkxIiBoZWlnaHQ9IjIwIiBmaWxsPSJwdXJwbGUiLz48cmVjdCB3aWR0aD0iOTEiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iNDU1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI4MTAiPlNlY3VyaXR5IHBvbGljeTwvdGV4dD48dGV4dCB4PSI0NTUiIHk9IjE0MCIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIGZpbGw9IiNmZmYiIHRleHRMZW5ndGg9IjgxMCI+U2VjdXJpdHkgcG9saWN5PC90ZXh0PjwvZz48L3N2Zz4="&gt;&lt;/a&gt;
&lt;a href="https://cj.rs/donate"&gt;
&lt;img alt="Buy me a tea" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCdXkgbWUgYSB0ZWEiPjx0aXRsZT5CdXkgbWUgYSB0ZWE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjgzIiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2Y5Njg1NCIvPjxyZWN0IHg9IjAiIHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgZmlsbD0iI2Y5Njg1NCIvPjxyZWN0IHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI0MTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjczMCI+QnV5IG1lIGEgdGVhPC90ZXh0Pjx0ZXh0IHg9IjQxNSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iNzMwIj5CdXkgbWUgYSB0ZWE8L3RleHQ+PC9nPjwvc3ZnPg=="&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thanks for considering contributing! &lt;a href="https://cj.rs/open-source"&gt;My projects&lt;/a&gt; all follow the guidelines outlined in this document.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;If you just want to fix a typo or another very small thing, just create a PR.&lt;/p&gt;
&lt;h2 id="documentation"&gt;Documentation&lt;/h2&gt;
&lt;p&gt;As the author of a tool or library, we are blind to many of the problems that users may encounter. As an external person, you have the power to spot this! Feel free to open an issue or to send a PR with proposed changes to the documentation.&lt;/p&gt;</description><content:encoded><![CDATA[
<div class="badges">

<p><a href="#i-dont-want-to-use-github">

  <img alt="Git Email" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjQiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iR2l0IGVtYWlsOiBzdXBwb3J0ZWQiPjx0aXRsZT5HaXQgZW1haWw6IHN1cHBvcnRlZDwvdGl0bGU+PGxpbmVhckdyYWRpZW50IGlkPSJzIiB4Mj0iMCIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2JiYiIgc3RvcC1vcGFjaXR5PSIuMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIuMSIvPjwvbGluZWFyR3JhZGllbnQ+PGNsaXBQYXRoIGlkPSJyIj48cmVjdCB3aWR0aD0iMTI0IiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iNTkiIGhlaWdodD0iMjAiIGZpbGw9IiM1NTUiLz48cmVjdCB4PSI1OSIgd2lkdGg9IjY1IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNGMxIi8+PHJlY3Qgd2lkdGg9IjEyNCIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSIzMDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjQ5MCI+R2l0IGVtYWlsPC90ZXh0Pjx0ZXh0IHg9IjMwNSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iNDkwIj5HaXQgZW1haWw8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9IjkwNSIgeT0iMTUwIiBmaWxsPSIjMDEwMTAxIiBmaWxsLW9wYWNpdHk9Ii4zIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgdGV4dExlbmd0aD0iNTUwIj5zdXBwb3J0ZWQ8L3RleHQ+PHRleHQgeD0iOTA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSI1NTAiPnN1cHBvcnRlZDwvdGV4dD48L2c+PC9zdmc+"></a>
<a href="#tldr">

  <img alt="Contributions welcome!" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0aW9ucyB3ZWxjb21lISI+PHRpdGxlPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjAiIGhlaWdodD0iMjAiIGZpbGw9IiMzZGE2MzkiLz48cmVjdCB4PSIwIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjIwIiBmaWxsPSIjM2RhNjM5Ii8+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI3MDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjEzMTAiPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RleHQ+PHRleHQgeD0iNzA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSIxMzEwIj5Db250cmlidXRpb25zIHdlbGNvbWUhPC90ZXh0PjwvZz48L3N2Zz4="></a>
<a href="https://cj.rs/docs/code-of-conduct/">

  <img alt="Contributor Covenant" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJDb2RlIG9mIGNvbmR1Y3QiPjx0aXRsZT5Db2RlIG9mIGNvbmR1Y3Q8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9Ijk5IiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0iIzRiYWFhYSIvPjxyZWN0IHg9IjAiIHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzRiYWFhYSIvPjxyZWN0IHdpZHRoPSI5OSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI0OTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9Ijg5MCI+Q29kZSBvZiBjb25kdWN0PC90ZXh0Pjx0ZXh0IHg9IjQ5NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iODkwIj5Db2RlIG9mIGNvbmR1Y3Q8L3RleHQ+PC9nPjwvc3ZnPg=="></a>
<a href="https://cj.rs/docs/security/">

  <img alt="Security Policy" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MSIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTZWN1cml0eSBwb2xpY3kiPjx0aXRsZT5TZWN1cml0eSBwb2xpY3k8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjkxIiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0icHVycGxlIi8+PHJlY3QgeD0iMCIgd2lkdGg9IjkxIiBoZWlnaHQ9IjIwIiBmaWxsPSJwdXJwbGUiLz48cmVjdCB3aWR0aD0iOTEiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjcykiLz48L2c+PGcgZmlsbD0iI2ZmZiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IlZlcmRhbmEsR2VuZXZhLERlamFWdSBTYW5zLHNhbnMtc2VyaWYiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc2l6ZT0iMTEwIj48dGV4dCBhcmlhLWhpZGRlbj0idHJ1ZSIgeD0iNDU1IiB5PSIxNTAiIGZpbGw9IiMwMTAxMDEiIGZpbGwtb3BhY2l0eT0iLjMiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiB0ZXh0TGVuZ3RoPSI4MTAiPlNlY3VyaXR5IHBvbGljeTwvdGV4dD48dGV4dCB4PSI0NTUiIHk9IjE0MCIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIGZpbGw9IiNmZmYiIHRleHRMZW5ndGg9IjgxMCI+U2VjdXJpdHkgcG9saWN5PC90ZXh0PjwvZz48L3N2Zz4="></a>
<a href="https://cj.rs/donate">

  <img alt="Buy me a tea" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCdXkgbWUgYSB0ZWEiPjx0aXRsZT5CdXkgbWUgYSB0ZWE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjgzIiBoZWlnaHQ9IjIwIiByeD0iMyIgZmlsbD0iI2ZmZiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI3IpIj48cmVjdCB3aWR0aD0iMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2Y5Njg1NCIvPjxyZWN0IHg9IjAiIHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgZmlsbD0iI2Y5Njg1NCIvPjxyZWN0IHdpZHRoPSI4MyIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI0MTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjczMCI+QnV5IG1lIGEgdGVhPC90ZXh0Pjx0ZXh0IHg9IjQxNSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iNzMwIj5CdXkgbWUgYSB0ZWE8L3RleHQ+PC9nPjwvc3ZnPg=="></a></p>

</div>

<p>Thanks for considering contributing! <a href="https://cj.rs/open-source">My projects</a> all follow the guidelines outlined in this document.</p>
<h2 id="tldr">TL;DR</h2>
<p>If you just want to fix a typo or another very small thing, just create a PR.</p>
<h2 id="documentation">Documentation</h2>
<p>As the author of a tool or library, we are blind to many of the problems that users may encounter. As an external person, you have the power to spot this! Feel free to open an issue or to send a PR with proposed changes to the documentation.</p>
<h2 id="code">Code</h2>
<h3 id="pull-request">Pull Request</h3>
<ul>
<li>It is advisable, <strong>but not mandatory</strong>, to create an issue to discuss the feature you want to add, so that you can make sure it has good chances to be merged. This also avoids having multiple persons working on the same thing.
<ul>
<li>Similarly, feel free to create a <a href="https://github.blog/2019-02-14-introducing-draft-pull-requests/">draft PR</a> with your changes before they are completed. This is useful to point to a particular part of the code during discussions.</li>
</ul>
</li>
<li>Try to create one pull request per high level feature or bug fix. Then if necessary <a href="https://github.blog/2022-06-30-write-better-commits-build-better-projects/#structure-the-narrative">try to stage your changes</a> by crafting multiple commits: if your commits follow a progression on your changes, it’ll be easier to review.</li>
<li>New features need to be covered by adding new unit tests, where applicable. Similarly, bug fixes need to be accompanied by a regression test where applicable, to ensure that the bug does not come back. Reviewers and maintainers are in charge of enforcing this.</li>
</ul>
<h3 id="llm--genai">LLM / GenAI</h3>
<ul>
<li>Do not use an LLM to submit PRs that you don’t understand. If you must use an LLM, rework the output yourself so that it is your work and you understand it. This also alleviate some of the concerns with copyright of material based on LLM output. Keep the PR small to make reviews easier.</li>
<li>Do not use an LLM to generate issues or comments.</li>
</ul>




  
  
  
  

  <div class="alert alert-warning">
    <p class="alert-heading">
      ⚠️
      
        Warning
      
    </p>
    <p>Submitting generated content in violation of the above guidelines is considered spam. Repeat submission of spam will lead to bans.</p>
  </div>



<h3 id="i-dont-want-to-use-github">I Don’t Want to Use GitHub</h3>
<p>That’s fine, feel free to send your contributions <a href="https://git-send-email.io/">by email</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> to the address listed <a href="https://cj.rs/contact">on the Contact page</a>. You can also push to a publicly accessible repo and <a href="https://git-scm.com/docs/git-request-pull">request that I pull from it</a>.</p>
<p>If you are contributing this way, please use the <a href="https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s"><code>-s</code>/<code>--signoff</code></a> with each commit, so that a <code>Signed-off-by</code> trailer is added to each of your commits.
Or manually add a <code>Signed-off-by</code> trailer at the end of your commits, like this:</p>
<pre tabindex="0"><code>Signed-off-by: Put Your Name Here &lt;TheEmailYou@UseWith.Git&gt;
</code></pre><p>This signifies your agreement with the <a href="#meaning-of-signed-off-by-lines-in-commit-messages">DCO below</a>.</p>
<h3 id="i-dont-know-what-to-do">I Don’t Know What to Do</h3>
<p>If you don’t know what to do, but still want to help, that’s great! Look for issues labeled <a href="https://github.com/search?q=user%3Acljoly+label%3A%22good+first+issue%22+state%3Aopen&amp;type=Issues"><code>good-first-issue</code></a> or <a href="https://github.com/search?q=user%3Acljoly+label%3A%22help+wanted%22+state%3Aopen&amp;type=Issues"><code>help-wanted</code></a>. You can also <a href="https://cj.rs/contact">contact me</a>, and tell me about your interests and skills.</p>
<h3 id="dependencies">Dependencies</h3>
<p>As much as possible, I limit the number of dependencies used in my projects. Dependencies provide a short term win, by relying on someone else’s expertise and implementation to solve a particular problem. But there are two main long-term costs:</p>
<ol>
<li><a href="https://lucumr.pocoo.org/2025/1/24/build-it-yourself/">ongoing maintenance</a>: spending more and more time updating an ever expanding tree of dependencies.</li>
<li><a href="https://research.swtch.com/deps">security risks</a>: for every dependency and transitive dependency, every new version can be a malware in disguise, especially as the authors change.</li>
</ol>
<p>Please avoid introducing new dependencies in your PRs if possible. If you do, please outline why you think it’s a worthy trade off.</p>
<h2 id="delegating-trust">Delegating Trust</h2>
<p>In light of the <a href="https://security.archlinux.org/CVE-2024-3094">XZ-backdoor</a> and many other <a href="https://en.wikipedia.org/wiki/Supply_chain_attack">supply-chain attacks</a>, I can’t give commit permissions lightly.</p>
<p>As a result I don’t delegate commit rights unless:</p>
<ol>
<li>I’ve known someone in person for years, <strong>and</strong></li>
<li>they have established a track-record of contributions.</li>
</ol>
<p>It may mean that a project goes abandoned or doesn’t improve as quickly.
Or that it may be overtaken by a fork that gets more attention.
That’s fine.
It’s the trade off I make.
I would rather a fork succeed than letting <a href="https://robmensching.com/blog/posts/2024/03/30/a-microcosm-of-the-interactions-in-open-source-projects/">a nefarious actor inherit the trust I’ve built</a>.</p>
<h2 id="hobby-project-take-it-slow">Hobby Project: Take It Slow</h2>
<p>My projects are hobby projects.
They are done during my, and contributor’s, free time.
It may mean that your comments or PR may go unanswered for days or weeks.
I value comments, PRs and otherwise constructive interactions.
It’s part of the joy of working on Open-Source software for me.
But I may not have bandwidth to review some changes in a timely manner.
I’m not a full-time Open-Source maintainer.
At least, not yet.
That’s life.</p>
<p>Equally, as a contributor, please feel free to say that you don’t have time or energy anymore.
You can do that even in the middle of a PR.
Someone else can always pick it up.</p>
<p>We are here to have fun developing software.
We don’t owe anything<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> to consumers of our software.
After all, our Open-Source licenses disclaim as much.</p>
<h2 id="rules">Rules</h2>
<h3 id="code-of-conduct">Code of Conduct</h3>
<p>To foster a welcoming environment, we follow and enforce <a href="https://cj.rs/docs/code-of-conduct/">a code of conduct</a>.</p>
<h3 id="meaning-of-signed-off-by-lines-in-commit-messages">Meaning of “Signed-off-by” Lines in Commit Messages</h3>
<p>When <code>Signed-off-by</code> trailers are used, it means that the committer agrees to the representations from <a href="https://developercertificate.org">the Developer Certificate of Origin (DCO)</a>, reproduced below:</p>
<pre tabindex="0"><code>Developer&#39;s Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
</code></pre><p>This is the DCO used by the Linux kernel and Git projects.</p>
<p>When a <code>Signed-off-by</code> trailer is <em>not</em> present, we are relying on any provisions of the project’s license.
In addition, if the contribution was submitted through GitHub, the GitHub Terms of Service apply, in particular <a href="https://docs.github.com/en/site-policy/github-terms/github-terms-of-service#6-contributions-under-repository-license">Section D.6</a> (<a href="https://web.archive.org/web/20240817042952/https://docs.github.com/en/site-policy/github-terms/github-terms-of-service#6-contributions-under-repository-license">archived version</a>).</p>




  <figure>
    <blockquote >
      <ol start="6">
<li>Contributions Under Repository License</li>
</ol>
<p>Whenever you add Content to a repository containing notice of a license, you license that Content under the same terms, and you agree that you have the right to license that Content under those terms. If you have a separate agreement to license that Content under different terms, such as a contributor license agreement, that agreement will supersede.</p>
<p>[&hellip;]</p>

    </blockquote>
    
  </figure>



<h3 id="copyright-notices">Copyright Notices</h3>
<p>In general, original copyright holders retain their copyrights. We follow these <a href="https://www.linuxfoundation.org/blog/blog/copyright-notices-in-open-source-software-projects">community best practices</a> (<a href="https://web.archive.org/web/20240914120829/https://www.linuxfoundation.org/blog/blog/copyright-notices-in-open-source-software-projects">archive</a>):</p>
<ol>
<li>If a file contains code from a third party that wasn’t submitted by that third party, then the original copyright headers are kept.</li>
<li>For code submitted to the project as a contribution, fine grained copyright ownership is tracked in the source control system (typically, Git). A simplified header is then used in the file, to convey that the work is copyrighted and licensed as a part of the project:
<pre tabindex="0"><code>Copyright XYZ and contributors.
</code></pre>where <code>XYZ</code> is obviously replaced by the name of the person who leads the project.</li>
<li>Don’t change someone else’s notices without their permission.</li>
</ol>




  
  
  
  

  <div class="alert alert-note">
    <p class="alert-heading">
      ℹ️
      
        Note
      
    </p>
    <p>The copyright notices are usually right after the <code>SPDX-License-Identifier:</code> line and before the license notices.</p>
  </div>



<h2 id="see-also">See Also</h2>
<p>The other <a href="https://cj.rs/open-source/docs/">Open-Source documents</a>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you want to accept patches by email too, <a href="https://git-am.io/">git-am.io</a> is a good starting point.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I do try to produce high-quality, secure software. I take pride in my work. But there is no guarantee. That’s the bargain in volunteer-maintained Open-Source software.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Contributor Covenant Code of Conduct</title><link>https://joly.pw/open-source/docs/code-of-conduct/</link><pubDate>Thu, 09 Sep 2021 21:00:23 +0200</pubDate><guid>https://joly.pw/open-source/docs/code-of-conduct/</guid><description>&lt;div class="badges"&gt;
&lt;p&gt;&lt;a href="https://www.contributor-covenant.org/"&gt;
&lt;img alt="Contributor Covenant" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNTYiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0b3IgQ292ZW5hbnQ6IDIuMSI+PHRpdGxlPkNvbnRyaWJ1dG9yIENvdmVuYW50OiAyLjE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE1NiIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjEyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzU1NSIvPjxyZWN0IHg9IjEyOSIgd2lkdGg9IjI3IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNGJhYWFhIi8+PHJlY3Qgd2lkdGg9IjE1NiIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI2NTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjExOTAiPkNvbnRyaWJ1dG9yIENvdmVuYW50PC90ZXh0Pjx0ZXh0IHg9IjY1NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTE5MCI+Q29udHJpYnV0b3IgQ292ZW5hbnQ8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9IjE0MTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjE3MCI+Mi4xPC90ZXh0Pjx0ZXh0IHg9IjE0MTUiIHk9IjE0MCIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIGZpbGw9IiNmZmYiIHRleHRMZW5ndGg9IjE3MCI+Mi4xPC90ZXh0PjwvZz48L3N2Zz4="&gt;&lt;/a&gt; &lt;a href="https://cj.rs/open-source/docs/contribute/"&gt;
&lt;img alt="Contributions welcome!" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0aW9ucyB3ZWxjb21lISI+PHRpdGxlPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjAiIGhlaWdodD0iMjAiIGZpbGw9IiMzZGE2MzkiLz48cmVjdCB4PSIwIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjIwIiBmaWxsPSIjM2RhNjM5Ii8+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI3MDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjEzMTAiPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RleHQ+PHRleHQgeD0iNzA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSIxMzEwIj5Db250cmlidXRpb25zIHdlbGNvbWUhPC90ZXh0PjwvZz48L3N2Zz4="&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="our-pledge"&gt;Our Pledge&lt;/h2&gt;
&lt;p&gt;We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.&lt;/p&gt;
&lt;p&gt;We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.&lt;/p&gt;</description><content:encoded><![CDATA[
<div class="badges">

<p><a href="https://www.contributor-covenant.org/">

  <img alt="Contributor Covenant" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNTYiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0b3IgQ292ZW5hbnQ6IDIuMSI+PHRpdGxlPkNvbnRyaWJ1dG9yIENvdmVuYW50OiAyLjE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE1NiIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjEyOSIgaGVpZ2h0PSIyMCIgZmlsbD0iIzU1NSIvPjxyZWN0IHg9IjEyOSIgd2lkdGg9IjI3IiBoZWlnaHQ9IjIwIiBmaWxsPSIjNGJhYWFhIi8+PHJlY3Qgd2lkdGg9IjE1NiIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI2NTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjExOTAiPkNvbnRyaWJ1dG9yIENvdmVuYW50PC90ZXh0Pjx0ZXh0IHg9IjY1NSIgeT0iMTQwIiB0cmFuc2Zvcm09InNjYWxlKC4xKSIgZmlsbD0iI2ZmZiIgdGV4dExlbmd0aD0iMTE5MCI+Q29udHJpYnV0b3IgQ292ZW5hbnQ8L3RleHQ+PHRleHQgYXJpYS1oaWRkZW49InRydWUiIHg9IjE0MTUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjE3MCI+Mi4xPC90ZXh0Pjx0ZXh0IHg9IjE0MTUiIHk9IjE0MCIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIGZpbGw9IiNmZmYiIHRleHRMZW5ndGg9IjE3MCI+Mi4xPC90ZXh0PjwvZz48L3N2Zz4="></a> <a href="https://cj.rs/open-source/docs/contribute/">

  <img alt="Contributions welcome!" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0aW9ucyB3ZWxjb21lISI+PHRpdGxlPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjAiIGhlaWdodD0iMjAiIGZpbGw9IiMzZGE2MzkiLz48cmVjdCB4PSIwIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjIwIiBmaWxsPSIjM2RhNjM5Ii8+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI3MDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjEzMTAiPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RleHQ+PHRleHQgeD0iNzA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSIxMzEwIj5Db250cmlidXRpb25zIHdlbGNvbWUhPC90ZXh0PjwvZz48L3N2Zz4="></a></p>

</div>

<h2 id="our-pledge">Our Pledge</h2>
<p>We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.</p>
<p>We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.</p>
<h2 id="our-standards">Our Standards</h2>
<p>Examples of behavior that contributes to a positive environment for our
community include:</p>
<ul>
<li>Demonstrating empathy and kindness toward other people</li>
<li>Being respectful of differing opinions, viewpoints, and experiences</li>
<li>Giving and gracefully accepting constructive feedback</li>
<li>Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience</li>
<li>Focusing on what is best not just for us as individuals, but for the
overall community</li>
</ul>
<p>Examples of unacceptable behavior include:</p>
<ul>
<li>The use of sexualized language or imagery, and sexual attention or
advances of any kind</li>
<li>Trolling, insulting or derogatory comments, and personal or political attacks</li>
<li>Public or private harassment</li>
<li>Publishing others&rsquo; private information, such as a physical or email
address, without their explicit permission</li>
<li>Other conduct which could reasonably be considered inappropriate in a
professional setting</li>
</ul>
<h2 id="enforcement-responsibilities">Enforcement Responsibilities</h2>
<p>Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.</p>
<p>Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.</p>
<h2 id="scope">Scope</h2>
<p>This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.</p>
<h2 id="enforcement">Enforcement</h2>
<p>Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
<a href="https://joly.pw/contact/">https://joly.pw/contact/</a>.
All complaints will be reviewed and investigated promptly and fairly.</p>
<p>All community leaders are obligated to respect the privacy and security of the
reporter of any incident.</p>
<h2 id="enforcement-guidelines">Enforcement Guidelines</h2>
<p>Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:</p>
<h3 id="1-correction">1. Correction</h3>
<p><strong>Community Impact</strong>: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.</p>
<p><strong>Consequence</strong>: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.</p>
<h3 id="2-warning">2. Warning</h3>
<p><strong>Community Impact</strong>: A violation through a single incident or series
of actions.</p>
<p><strong>Consequence</strong>: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.</p>
<h3 id="3-temporary-ban">3. Temporary Ban</h3>
<p><strong>Community Impact</strong>: A serious violation of community standards, including
sustained inappropriate behavior.</p>
<p><strong>Consequence</strong>: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.</p>
<h3 id="4-permanent-ban">4. Permanent Ban</h3>
<p><strong>Community Impact</strong>: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.</p>
<p><strong>Consequence</strong>: A permanent ban from any sort of public interaction within
the community.</p>
<h2 id="attribution">Attribution</h2>
<p>This Code of Conduct is adapted from the <a href="https://www.contributor-covenant.org">Contributor Covenant</a>,
version 2.1, available at
<a href="https://www.contributor-covenant.org/version/2/1/code_of_conduct.html">https://www.contributor-covenant.org/version/2/1/code_of_conduct.html</a>.</p>
<p>Community Impact Guidelines were inspired by
<a href="https://github.com/mozilla/diversity">Mozilla&rsquo;s code of conduct enforcement ladder</a>.</p>
<p>For answers to common questions about this code of conduct, see the FAQ at
<a href="https://www.contributor-covenant.org/faq">https://www.contributor-covenant.org/faq</a>. Translations are available
at <a href="https://www.contributor-covenant.org/translations">https://www.contributor-covenant.org/translations</a>.</p>
]]></content:encoded></item><item><title>Security Policy</title><link>https://joly.pw/open-source/docs/security/</link><pubDate>Sun, 14 Aug 2022 14:00:23 +0200</pubDate><guid>https://joly.pw/open-source/docs/security/</guid><description>Guidelines to report a security issue</description><content:encoded><![CDATA[
<div class="badges">

<p><a href="https://cj.rs/open-source/docs/contribute/">

  <img alt="Contributions welcome!" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEiIGhlaWdodD0iMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29udHJpYnV0aW9ucyB3ZWxjb21lISI+PHRpdGxlPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RpdGxlPjxsaW5lYXJHcmFkaWVudCBpZD0icyIgeDI9IjAiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiYmIiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iLjEiLz48L2xpbmVhckdyYWRpZW50PjxjbGlwUGF0aCBpZD0iciI+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgcng9IjMiIGZpbGw9IiNmZmYiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD0idXJsKCNyKSI+PHJlY3Qgd2lkdGg9IjAiIGhlaWdodD0iMjAiIGZpbGw9IiMzZGE2MzkiLz48cmVjdCB4PSIwIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjIwIiBmaWxsPSIjM2RhNjM5Ii8+PHJlY3Qgd2lkdGg9IjE0MSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNzKSIvPjwvZz48ZyBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iVmVyZGFuYSxHZW5ldmEsRGVqYVZ1IFNhbnMsc2Fucy1zZXJpZiIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zaXplPSIxMTAiPjx0ZXh0IGFyaWEtaGlkZGVuPSJ0cnVlIiB4PSI3MDUiIHk9IjE1MCIgZmlsbD0iIzAxMDEwMSIgZmlsbC1vcGFjaXR5PSIuMyIgdHJhbnNmb3JtPSJzY2FsZSguMSkiIHRleHRMZW5ndGg9IjEzMTAiPkNvbnRyaWJ1dGlvbnMgd2VsY29tZSE8L3RleHQ+PHRleHQgeD0iNzA1IiB5PSIxNDAiIHRyYW5zZm9ybT0ic2NhbGUoLjEpIiBmaWxsPSIjZmZmIiB0ZXh0TGVuZ3RoPSIxMzEwIj5Db250cmlidXRpb25zIHdlbGNvbWUhPC90ZXh0PjwvZz48L3N2Zz4="></a></p>

</div>

<h2 id="supported-versions">Supported Versions</h2>
<table>
  <thead>
      <tr>
          <th>Version</th>
          <th style="text-align: center">Supported</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Latest tag</td>
          <td style="text-align: center">✅</td>
      </tr>
      <tr>
          <td>Latest commit on <code>master</code> or <code>main</code></td>
          <td style="text-align: center">✅</td>
      </tr>
      <tr>
          <td>All other versions or commit</td>
          <td style="text-align: center">❌</td>
      </tr>
  </tbody>
</table>
<h2 id="reporting-a-vulnerability">Reporting a Vulnerability</h2>
<p>First, thanks for considering reporting!</p>
<p>Then please <a href="https://cj.rs/contact/">contact me</a> and describe the issue as precisely as possible. Don’t hesitate to propose a fix (for instance, with a <a href="https://git-send-email.io/">patch sent over email</a>) if you have one.</p>
<p>If you wish to send encrypted material, here are the <a href="https://cj.rs/contact/#keys">public keys</a>.</p>
<h2 id="signature">Signature</h2>
<p>Commits and tags created after 2024-01-01 are signed with a key listed in <a href="https://cj.rs/.ssh/allowed_signers">this file</a>.</p>
<p>The <a href="https://cj.rs/blog/my-commits-and-tags-are-now-signed/">blog post</a> gives more context and example of verification.</p>
<h2 id="disclaimer">Disclaimer</h2>
<p>This policy is not a guarantee that my software will have the desired behaviour or won’t cause harm. Please refer to the License of each software for the full disclaimer.</p>
<h2 id="see-also">See Also</h2>
<p>The other <a href="https://cj.rs/open-source/docs/">Open-Source documents</a>.</p>
]]></content:encoded></item></channel></rss>