<?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>Link Blog on Clément Joly – Open-Source, Rust &amp; SQLite</title><link>https://cj.rs/tags/links/</link><description>Recent content in Link Blog on Clément Joly – Open-Source, Rust &amp; SQLite</description><image><title>Clément Joly – Open-Source, Rust &amp; SQLite</title><url>https://cj.rs/images/open-graph-pages.jpg</url><link>https://cj.rs/images/open-graph-pages.jpg</link></image><generator>Hugo</generator><language>en</language><copyright>Clément Joly</copyright><atom:link href="https://cj.rs/tags/links/index.xml" rel="self" type="application/rss+xml"/><item><title>Features I want to try first in Neovim 0.12</title><link>https://cj.rs/blog/nvim0.12/</link><pubDate>Sun, 29 Mar 2026 20:06:06 +0100</pubDate><guid>https://cj.rs/blog/nvim0.12/</guid><description>Auto-completion without plugins, improved UI core, plugin management and more...</description><content:encoded><![CDATA[



  
  
  
  

  <div class="alert alert-comment">
    <p class="alert-heading">
      💬
      
        This is a comment on
      
    </p>
    <p><a href="https://neovim.io/doc/user/news-0.12/">Neovim 0.12 News</a> (<a href="https://web.archive.org/web/20260329192230/https://neovim.io/doc/user/news/">archive</a>)</p>
  </div>



<p><a href="https://github.com/neovim/neovim/releases/tag/v0.12.0">Neovim 0.12</a> was released earlier today.
I don’t have enough time just now, but I’m sharing here the list of things from <a href="https://neovim.io/doc/user/news-0.12/">the release page</a> that I want to try first.</p>
<h2 id="whole-new-features">Whole new features</h2>
<p>Here are new features to replace some plugins and simplify my configuration:</p>
<ul>
<li>There is a new <code>'autocomplete'</code> option. When set, completion suggestions appear in insert mode, without pressing a triggering shortcut. The <code>'complete'</code> option also gains the ability to call arbitrary functions, as long as they follow the <a href="https://neovim.io/doc/user/insert/#complete-functions"><code>complete-functions</code></a> interface. These two features combined could replace the many completion plugins that came and went over the years. I certainly hope to use them to remove mini.completion from my config.<br>
More importantly, they might help the ecosystem to standardize around a common interface for completion sources. At the moment, LSP servers play this role, but a full-blown LSP server implementation in every plugin is quite heavy. For example, <a href="https://github.com/saecki/crates.nvim">crates.nvim</a> supports some completion plugins (nvim-cmp, coq.nvim) and also exposes an LSP server for cross-compatibility support. In the future, such a crate might only implement the <code>complete-functions</code> interface and it could be used as a source by either native nvim completions or plugins.</li>
<li>The other big highlight of this release is the native plugin manager, <a href="https://neovim.io/doc/user/pack/#vim.pack"><code>vim.pack</code></a>. It was contributed mainly by Evgeni Chasnovski (known for mini.nvim). <a href="https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack">His guide of this new component is worth a read</a>. In particular, you can pin plugins to a particular hash, for a version you have audited and update only once you have audited the changes in any new version.</li>
<li>The default status line was reworked and integrates with <code>vim.diagnostic.status()</code>, <code>vim.ui.progress_status()</code> and an indicator for the new <code>busy</code> state. This will allow me to remove some custom logic to produce diagnostic status (<code>E:2 W:3</code> for 2 errors and 3 warnings) and maybe even drop my custom status line code entirely.</li>
<li>I will try to use the <code>MarkSet</code> to make user-placed marks visible in the gutter of the current buffer. I used plugins for that feature in the past, but it should be simple to implement it in configuration with <code>MarkSet</code> now.</li>
<li>I’ll use <code>vim.net.request()</code> to replace some calls to external commands. It will make the configuration more portable and shorter — it might even be marginally faster, eliminating an external command call.</li>
<li><code>'diffopt'</code> <code>inline</code> and <code>inline:word</code> will provide richer diff at the line level, a bit like <a href="https://dandavison.github.io/delta/">delta</a>.</li>
<li>It’s nice to have native plugins for the undo tree (<code>:Undotree</code>) and to compare whole folders (<code>:DiffTool</code>).</li>
<li>I plan to use the new treesitter selection shortcuts (<code>an</code>, <code>in</code>, <code>[n</code> and <code>]n</code> in visual mode) to replace the deprecated <a href="https://github.com/mfussenegger/nvim-treehopper">treehopper</a> plugin: I don’t really care about jumping to a particular highlight node, visual mode should work better for me.</li>
</ul>
<h2 id="polish-of-existing-features">Polish of existing features</h2>
<p>This release introduces some nice <a href="https://neovim.io/doc/user/news-0.12/#_performance">performance improvements</a>, for instance on <code>Ctrl+r</code> in insert mode and <code>packadd</code>.</p>
<p>Some handy shortcuts were added:</p>




  <figure>
    <blockquote cite="https://neovim.io/doc/user/news-0.12/">
      <ul>
<li><code>grt</code> in Normal mode maps to vim.lsp.buf.type_definition()</li>
<li><code>grx</code> in Normal mode maps to vim.lsp.codelens.run()</li>
<li><code>gx</code> in help buffers opens the online documentation for the tag at cursor</li>
</ul>

    </blockquote>
    
      <figcaption class="blockquote-caption">
        
          <cite style="text-align: right"><a href="https://neovim.io/doc/user/news-0.12/">https://neovim.io/doc/user/news-0.12/</a></cite>
          <br/>
        
        
      </figcaption>
    
  </figure>



<p>Finally, the UI was reworked: it is now less coupled with the core. So the core can be <code>:restart</code>ed or <code>:connect</code>ed to with the same UI.
The <code>ui2</code> opt-in should also remove the dreaded “Press ENTER” message.
I plan to give it a try and go back to <code>cmdheight=0</code>.
Both of these settings are marked experimental, but if they are stable enough for me, I might get one more line for files.</p>




  
  
  
  

  <div class="alert alert-edit">
    <p class="alert-heading">
      ✏
      
        Edit
      
    </p>
    <p>2026-03-30: Changed <a href="https://neovim.io/doc/user/news/">https://neovim.io/doc/user/news/</a> to point to <a href="https://neovim.io/doc/user/news-0.12/">https://neovim.io/doc/user/news-0.12/</a>, since the former changed after publishing this post. Further explain why I think <code>complete</code>/<code>autocomplete</code> could help standardize the ecosystem.
2026-04-05: Add a link to <a href="https://neovim.io/doc/user/pack/#vim.pack">vim.pack</a></p>
  </div>



]]></content:encoded></item><item><title>DNS-PERSIST-01: Safer Wildcard Certificates</title><link>https://cj.rs/blog/wildcard/</link><pubDate>Sun, 22 Feb 2026 06:45:30 +0000</pubDate><guid>https://cj.rs/blog/wildcard/</guid><description>No need to put sensitive DNS write API tokens all over the place</description><content:encoded><![CDATA[



  
  
  
  

  <div class="alert alert-comment">
    <p class="alert-heading">
      💬
      
        This is a comment on
      
    </p>
    <p><a href="https://letsencrypt.org/2026/02/18/dns-persist-01.html">DNS-PERSIST-01: A New Model for DNS-based Challenge Validation</a></p>
  </div>



<h2 id="the-source-of-truth">The Source of Truth</h2>
<p>Connecting to a website?
Sending an email?
Which server<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> you reach depends on DNS records.
And <a href="https://en.wikipedia.org/wiki/DNS_Certification_Authority_Authorization">CAA</a> or <a href="https://en.wikipedia.org/wiki/SSHFP_record">SSHFP</a> records establish trust for public key cryptographic protocols.</p>
<p>DNS records are the source of truth.</p>
<h2 id="dns-api-tokens">DNS API Tokens</h2>
<p>Currently, wildcard certificates with Let’s Encrypt <a href="https://letsencrypt.org/docs/faq/#does-let-s-encrypt-issue-wildcard-certificates">require</a> to <a href="https://letsencrypt.org/docs/challenge-types/#dns-01-challenge">write an arbitrary string in a DNS record</a>, for every single certificate renewed or issued.
In practice, this often involves sharing a <em>write</em> API token to change the DNS.
This is risky: should an attacker obtain the token, they can do a lot of damage: hijack traffic (and get valid certificates for it), receive and send emails using the corresponding domain&hellip;</p>
<p>And often API tokens are not scoped just to access one domain, through human error or because the provider lacks the feature.
Then, they might give access to all domains in an account at the DNS provider and the attacker can move laterally to more targets.</p>
<p>With this in mind, I have not set up wildcard certificates with Let’s Encrypt so far.
The risk simply outweighed the gains for the use cases I had.
And I’m not alone: <a href="https://github.com/krtab/agnos">agnos</a> was written to address the same concern.
And the <a href="https://letsencrypt.org/docs/challenge-types/#dns-01-challenge">DNS challenge documentation calls this out</a>: “Keeping API credentials on your web server is risky”.</p>
<h2 id="dns-challenges-without-tokens">DNS Challenges Without Tokens</h2>
<p>So I’m really excited about this new challenge type, <a href="https://letsencrypt.org/2026/02/18/dns-persist-01.html"><code>DNS-PERSIST-01</code></a>.
It is a <em>static</em> DNS TXT record that authorizes a particular Let’s Encrypt account<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> to get certificates, even wildcard ones, for a particular domain.
No need to share very sensitive DNS API token!<br>
It also means that Let’s Encrypt clients don’t need to support the API of your DNS provider to emit wildcard certificates.
Pick any client and DNS provider you want, including a self hosted one.</p>
<p>Looking forward to this being fully implemented and available to everyone!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Or at least it’s IP&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Granted, an account is tied to a private key on the machine requesting the certificate. But this is a lot less sensitive, it’s only used by Let’s Encrypt, not for everything attached to a domain.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>6-day Certificates With Let’s Encrypt and Caddy</title><link>https://cj.rs/blog/6days/</link><pubDate>Sat, 17 Jan 2026 13:36:24 +0000</pubDate><guid>https://cj.rs/blog/6days/</guid><description>First impressions</description><content:encoded><![CDATA[



  
  
  
  

  <div class="alert alert-comment">
    <p class="alert-heading">
      💬
      
        This is a comment on
      
    </p>
    <p><a href="https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability.html">6-day and IP Address Certificates are Generally Available</a> by Matthew McPherrin (<a href="https://lobste.rs/s/boyarm/6_day_ip_address_certificates_are">via</a>)</p>
  </div>



<p>Let’s Encrypt has just announced that short-lived<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> certificates are generally available.
They can also be used for IP addresses, which is especially useful for <a href="https://en.wikipedia.org/wiki/DNS_over_HTTPS">DNS over HTTPS</a>.
Those certificates <em>could</em> be smaller in the future, if information for validity checks is omitted.
However, for now at least, these certificates still <a href="https://letsencrypt.org/docs/profiles/#shortlived">include revocation information</a>.</p>
<h2 id="using-those-new-certificates-with-caddy">Using Those New Certificates With Caddy</h2>
<p>I wanted to give those certificates a try with Caddy.
Caddy needs to use the <a href="https://letsencrypt.org/docs/profiles/#shortlived"><code>shortlived</code></a> Let’s Encrypt profile.
The profile feature isn’t explicitly mentioned in the <a href="https://caddyserver.com/docs/caddyfile/directives/tls#issuers">docs</a>, but some <a href="https://caddy.community/t/using-setting-acme-profiles-as-of-2-10/31006">community posts</a> use a <code>profile</code> directive.
This also works in the global configuration:</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-Caddy" data-lang="Caddy"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#c678dd">cert_issuer</span> <span style="color:#98c379">acme</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#c678dd">profile</span> <span style="color:#98c379">shortlived</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Reloading the Caddy configuration was not enough to prompt an early renewal, so I deleted the underlying certificate files and restarted Caddy:</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>sudo rm -rf /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com
</span></span><span style="display:flex;"><span>sudo systemctl restart caddy
</span></span></code></pre></div><p>And I got a brand new certificate for my domain name, valid only for a few days. It’s marginally smaller<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> than with the <code>classic</code> profile, mostly because these short-lived certificates also use the <a href="https://letsencrypt.org/2025/11/24/gen-y-hierarchy">new generation hierarchy</a>. But they should be roughly the same size as the <code>tlsserver</code> profile.</p>




  
  
  
  

  <div class="alert alert-note">
    <p class="alert-heading">
      ℹ️
      
        Note
      
    </p>
    <p><a href="https://github.com/caddyserver/caddy/issues/7399">Certificates against IPv6 addresses</a> (i.e. not against a domain using IPv6) seem to require an unreleased version of Caddy.</p>
  </div>



<h2 id="conclusion">Conclusion</h2>
<p>With Caddy, certificate renewal should be automated enough that short-lived certificates don’t cause any problems.
But I’ll see with this experiment if there are any surprising pain points.</p>
<p>My understanding is that browsers only cache TLS sessions, not certificates: when a full handshake is performed, the full certificate chain is then sent anyway<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.
So even if the certificate expires more frequently, it is not sent more often.
The slightly smaller certificate chain is thus a small net benefit.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The certificates are valid for about 6 days and precisely 160 hours. 160 is the sum of the eleven first prime numbers (2+3+5+7+11+13+17+19+23+29+31) and of the cube of the first three. How cool is that!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Comparing the .pem files as a proxy, 1.2k vs 1.3k for the bare certificate, 4.0k vs 4.8k for the whole chain&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>According to <a href="https://stackoverflow.com/a/52610552">this StackOverflow answer</a> and <a href="https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/">this Cloudflare explanation</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Re: Short URLs</title><link>https://cj.rs/blog/su/</link><pubDate>Sun, 04 Jan 2026 16:27:23 +0000</pubDate><guid>https://cj.rs/blog/su/</guid><description>Adopting shorter &amp;amp; more meaningful URLs on my website for 2026!</description><content:encoded><![CDATA[



  
  
  
  

  <div class="alert alert-comment">
    <p class="alert-heading">
      💬
      
        This is a comment on
      
    </p>
    <p><a href="https://sive.rs/su">Short URLs: why and how</a> by Derek Sivers</p>
  </div>



<h2 id="in-the-beginning-were-short-urls">In the Beginning Were Short URLs</h2>
<p>I recently read Derek Sivers’s <a href="https://sive.rs/su">Short URLs: why and how</a>, <em>again</em>.
He makes a compelling case for using very short, but meaningful, URLs on your website.
Very short here means one or two words at most, or even just 2 to 4 characters.
On his website, that’s <a href="https://sive.rs/anna">https://sive.rs/anna</a>, <a href="https://sive.rs/plaintext">https://sive.rs/plaintext</a> <a href="https://sive.rs/1s">https://sive.rs/1s</a>, or indeed <a href="https://sive.rs/su">https://sive.rs/su</a> for that particular post. That’s very different from typical URLs like <a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/">https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> or <a href="https://github.blog/changelog/2021-10-11-improved-notification-email-titles-for-issues-and-prs/">https://github.blog/changelog/2021-10-11-improved-notification-email-titles-for-issues-and-prs/</a>.</p>
<p>Similarly, before I even read that post, the first few pages I created on my website had similar URLs: <a href="https://cj.rs/cv/">/cv</a> or <a href="https://cj.rs/open-source/">/open-source</a>.
Why?
It’s easy to remember and you can type it (quickly!).
They are also easy to share on the phone or face to face.
Someone asks for my CV?
Easy, go to <code>cj.rs/cv</code> (<code>Charlie Juliett DOT Romeo Sierra SLASH Charlie Victor</code><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> on the phone).</p>
<p>Short URLs also look nice and tight.
I even purchased <code>cj.rs</code> to replace <code>joly.pw</code> as the main domain in 2019<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>Derek makes similar points:</p>




  <figure>
    <blockquote cite="https://sive.rs/su">
      <ul>
<li><strong>I can remember my URLs.</strong> I can avoid the search engine step. (No
need to search when I already know the answer.) Which means&hellip;</li>
<li><strong>I can type it or say it.</strong> Whether texting, answering an email, or
talking to someone on the phone, I can say, &ldquo;Go to <a href="https://sieve.rs/ff">sive.rs/ff</a>
for my talk about the first follower.&rdquo; or &ldquo;My newest book is at
<a href="https://sieve.rs/h">sive.rs/h</a>.&rdquo; I do this often, so having memorable URLs, <strong>easy
to type in full</strong>, saves me a lot of searching.</li>
<li><strong>They look nicer.</strong> They&rsquo;re aesthetic. They show care. We should
put something of beauty into the world, instead of creating <a href="/polut">digital
pollution</a>.</li>
</ul>

    </blockquote>
    
      <figcaption class="blockquote-caption">
        
          <cite style="text-align: right"><a href="https://sive.rs/su">https://sive.rs/su</a></cite>
          <br/>
        
        
      </figcaption>
    
  </figure>



<p>He then adds:</p>




  <figure>
    <blockquote cite="https://sive.rs/su">
      <ul>
<li><strong>They remove the middle-man.</strong> With <em>long</em> URLs, people use those
ugly social share buttons that promote (and further entrench)
harmful social media sites, and add visual clutter to your site.
Short URLs encourage people to copy and paste the URL directly,
which lets them share it anywhere, instead of only the sites for
which you have a share button.</li>
<li><strong>They&rsquo;re enough.</strong> Using 36 characters (a-z and 0-9):<br>
2-character URLs give me 1296 (36²) unique combinations.<br>
3-character URLs give me 46,656 (36³) unique combinations.<br>
4-character URLs give me 1,679,616 (36⁴) unique combinations.<br>
I don&rsquo;t need more than that.</li>
</ul>

    </blockquote>
    
      <figcaption class="blockquote-caption">
        
          <cite style="text-align: right"><a href="https://sive.rs/su">https://sive.rs/su</a></cite>
          <br/>
        
        
      </figcaption>
    
  </figure>



<p>I did not really think about those last points<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, but they make sense as nice complementary benefits.</p>
<h2 id="losing-my-way-and-finding-it-back">Losing My Way and Finding It Back</h2>
<p>If we were thinking alike about short URLs, then why did I use <a href="https://cj.rs/blog/lets-encrypt-caa-records-with-caddy/">https://cj.rs/blog/lets-encrypt-caa-records-with-caddy/</a> for my last blog post?
Why did I add the full title at the end of a path that is nested inside blog?
Shouldn’t I have used something like <code>letsencrypt-caa</code> or <code>caddy-caa</code>?</p>
<p>Mainly I lost sight of the benefits of concise URLs.
And <a href="https://gohugo.io/">Hugo</a> has nice <a href="https://gohugo.io/quick-reference/glossary/#section-page">sections</a> to organise content, set cascading parameters, list related pages…</p>
<p>But regardless of the tool, I certainly think in terms of categories for my pages.
I remember things like “I have written this blog post” or “I have created this page at the root to showcase my open source work”.</p>
<p>A bit of hierarchical organisation makes sense even for the user.
Some pages share a common theme, but in different categories.
For instance, I have <a href="https://cj.rs/blog/new-asciinema-hugo-module-versions/">a blog post on an Asciinema module for Hugo</a> and <a href="https://cj.rs/gohugo-asciinema/">the page of that project</a> both pertaining to the same underlying project.
So ideally, they would be at <code>cj.rs/hugo-asciinema</code> and <code>cj.rs/blog/hugo-asciinema</code> instead of <code>cj.rs/hugo-asciinema</code> and <code>cj.rs/announcement-hugo-asciinema</code>.</p>
<p>Finally, even when there is only one page on a particular topic, some hierarchy is useful.
Something like <code>cj.rs/su</code> can look cryptic in a tweet, whereas <code>cj.rs/blog/su</code> makes more sense.
Both can still be easily remembered and typed.
And having <code>/blog/</code> for blog posts leaves space right under <code>/</code> for proper pages on the same topic that may exist later.
While there are over one million 4-letter combinations in a-z and 0-9, meaningful words are much rarer.
On the same example as above, I’m keeping <code>/asciinema</code> in store for something more closely related to Asciinema in the future.
If I had spent that one word on the Hugo module, it would have been gone forever<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>.</p>
<h2 id="striking-a-balance">Striking a Balance</h2>
<p>Moving forward, I’ll revert to much shorter URLs using (for the path part):</p>
<ul>
<li>One or two words at the top level, for projects and generally pages that are not blog posts. Think <code>/contact</code>, <code>/rusqlite-migration</code> or <code>/open-source</code>.</li>
<li>At most one folder, like <code>/blog/</code> for blog posts. The exception would be multi-parts articles, which could be under <code>/blog/topic/1</code>, <code>/blog/topic/2</code>…</li>
<li>That list may evolve if there are strong reasons, but I’ll keep in mind the memorability and direct typing benefits.</li>
</ul>




  
  
  
  

  <div class="alert alert-note">
    <p class="alert-heading">
      ℹ️
      
        Note
      
    </p>
    <p>As a side note, I think short URLs work even if the domain is made of multiple words like <code>shinychair.com</code>, <code>blog.joinmastodon.org</code>, <code>alostgardener.blog</code>. Even with these domains, short URLs convey meaning, are still relatively easy to type and are easy to remember for the site owner.</p>
  </div>



<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>An interesting read of it’s own, I should perhaps blog about it some day. But in the meantime, feel free to go and read it, I’ll wait.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I keep a letter-word table handy at &lt;<a href="https://cj.rs/nato">/nato</a>&gt;.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>At least according to a whois look up.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Although <code>cj.rs</code> looks like a URL shortener and URL shorteners were the inspiration to look for niche TLDs. For the first couple months, I have to admit I couldn’t get over how cool a two letters domain felt. I now think it is a bit unfortunate to use the Republic of Serbia’s TLD, instead of, say, a <code>.org</code>, which seems less likely to implement residency requirements.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Don’t change URLs: <a href="https://www.w3.org/Provider/Style/URI">Hypertext Style: Cool URIs don&rsquo;t change.</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>