Samuel Henrique (samueloph) My personal website Zola 2026-04-02T00:00:00+00:00 https://samueloph.dev/atom.xml Bringing HTTP/3 to curl on Amazon Linux 2026-04-02T00:00:00+00:00 2026-04-02T00:00:00+00:00 Unknown https://samueloph.dev/blog/bringing-http3-to-curl-on-amazon-linux/ <img src="bringing-http3-to-curl-on-amazon-linux.webp" alt="Screenshot of the top entry of the curl package&#x27;s changelog, showing the following: Changelogs for curl-8.17.0-1.amzn2023.0.2.x86_64 * Mon Mar 16 00:00:00 2026 Samuel Henrique (samueloph) &lt;[email protected]&gt; - 8.17.0-1.amzn2023.0.2 - Enable HTTP&#x2F;3 support in the full build using ngtcp2 and nghttp3 - HTTP&#x2F;3 is explicitly disabled in the minimal build - Add runtime dependencies on libnghttp3 and libngtcp2 with minimum version pinning - Run tests in parallel via upstream make test-nonflaky, with serial fallback for race-prone tests" width="1596" height="226" loading="lazy" /> <h4 id="tl-dr">tl;dr</h4> <p>Starting with <strong>curl 8.17.0-1.amzn2023.0.2</strong> in Amazon Linux 2023, you can now use HTTP/3.</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">dnf</span><span style="color: #B8BB26;"> swap</span><span style="color: #D3869B;"> -y</span><span style="color: #B8BB26;"> libcurl-minimal libcurl-full</span></span> <span class="giallo-l"><span style="color: #FABD2F;">dnf</span><span style="color: #B8BB26;"> swap</span><span style="color: #D3869B;"> -y</span><span style="color: #B8BB26;"> curl-minimal curl-full</span></span> <span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> --http3-only</span><span style="color: #B8BB26;"> https://example.com</span></span></code></pre> <p><em>(HTTP/3 is only enabled in the curl -full builds)</em></p> <p>Or, if you would like to try it out in a container:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">podman</span><span style="color: #B8BB26;"> run amazonlinux:2023 /bin/sh</span><span style="color: #D3869B;"> -c</span><span style="color: #A89984;"> &#39;</span><span style="color: #B8BB26;">dnf upgrade -y --releasever=latest &amp;&amp; dnf swap -y libcurl-minimal libcurl-full &amp;&amp; dnf swap -y curl-minimal curl-full &amp;&amp; curl --http3-only https://example.com</span><span style="color: #A89984;">&#39;</span></span></code></pre> <p>For a list of test endpoints, you can refer to <a rel="noopener external" target="_blank" href="https://bagder.github.io/HTTP3-test/">https://bagder.github.io/HTTP3-test/</a></p> <h1 id="the-upgrade-i-didn-t-have-to-make">The Upgrade I Didn't Have to Make</h1> <p>My teammate Steve Zarkos, who previously worked on upgrading OpenSSL in Amazon Linux from 3.0 to 3.2, spent the last few months on the complex task of bumping OpenSSL again, this time to 3.5. A bump like this only happens after extensive code analysis and testing, something that I didn't foresee happening when AL2023 was released but that was a notable request from users.</p> <p>Having <a rel="noopener external" target="_blank" href="https://samueloph.dev/blog/debian-curl-now-supports-http3/">enabled HTTP/3 on Debian</a>, I was always keeping an eye on when I would get to do the same for Amazon Linux (mind you, I work at AWS, in the Amazon Linux org). The bump to OpenSSL 3.5 was the perfect opportunity to do that, for the first time Amazon Linux is shipping an OpenSSL version that is supported by ngtcp2 for HTTP/3 support.</p> <h1 id="non-intrusive-change">Non-Intrusive Change</h1> <p>In order to avoid any intrusive changes to existing users of AL2023, I've only enabled HTTP/3 in the full build of curl, not in the minimal one, this means there is no change for the minimal images.</p> <p>The way curl handles HTTP/3 today also does not lead to any behavior changes for those who have the full variants of curl installed, this is due to the fact that HTTP/3 is only used if the user explicitly asks for it with the flags <code>--http3</code> or <code>--http3-only</code>.</p> <h1 id="side-quests">Side Quests</h1> <p>Supporting HTTP/3 on curl also requires building it with ngtcp2 and nghttp3, two packages which were not shipped in Amazon Linux, besides, my team doesn't even own the curl package, we are a security team so our packages are the security related stuff such as OpenSSL and GnuTLS. Our main focus is the services behind Amazon Linux's vulnerability handling, not package maintenance.</p> <p>I worked with the owners of the curl package and got approvals on a plan to introduce the two new dependencies under their ownership and to enable the feature on curl, I appreciate their responsiveness.</p> <p>Amazon Linux 2023 is forked from Fedora, so while introducing ngtcp2, I also sent a couple of Pull Requests upstream to keep things in sync:</p> <p><a rel="noopener external" target="_blank" href="https://src.fedoraproject.org/rpms/ngtcp2/pull-request/9">[ngtcp2] package latest release 1.21.0</a></p> <p><a rel="noopener external" target="_blank" href="https://src.fedoraproject.org/rpms/ngtcp2/pull-request/8">[ngtcp2] do not skip tests</a></p> <p>While building the curl package in Amazon Linux, I've noticed the build was taking 1 hour from start to end, and the culprit was something well known to me; tests.</p> <p>The curl test suite is quite extensive, with more than 1600 tests, all of that running without parallelization, running two times for each build of the package; once for the minimal build and again for the full build.</p> <p>I had previously enabled parallel tests in Debian back in 2024 but never got around to submit the same improvements to Amazon Linux or Fedora, this is now fixed. The build times for Amazon Linux came down to 10 minutes under the same host (previously 1 hour), and Fedora promptly merged my PR to do the same there:</p> <p><a rel="noopener external" target="_blank" href="https://src.fedoraproject.org/rpms/curl/pull-request/80">[curl] run tests in parallel</a></p> <p>All of this uncovered a test which is timing-dependent, meaning it's not supposed to be run with high levels of parallelism, so there goes another PR, this time to curl:</p> <p><a rel="noopener external" target="_blank" href="https://github.com/curl/curl/pull/21155">Flag test 766 as timing-dependent#21155</a></p> <p>What started as enabling a single feature turned into improvements that landed in curl, Fedora, and Amazon Linux alike. I did this in a mix of work and volunteer time, mostly during work hours (work email address used when this was the case), but I'm glad I put in the extra time for the sake of improving curl for everyone.</p> <h1 id="release-notes">Release Notes</h1> <p><a rel="noopener external" target="_blank" href="https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.10.20260330.html">Amazon Linux 2023 release notes for 2023.10.20260330</a></p> Latest NVIDIA Drivers for Debian (Packaged with AI) 2026-03-29T00:00:00+00:00 2026-03-29T00:00:00+00:00 Unknown https://samueloph.dev/blog/latest-nvidia-drivers-for-debian-packaged-with-ai/ <img src="latest-nvidia-drivers-for-debian-packaged-with-ai.webp" alt="Two terminal windows side-by-side, on the left there&#x27;s the Debian logo in ASCII art, and on the right it&#x27;s the output of nvidia-smi, showing the driver version 595.58.03 running on a machine that has an NVIDIA RTS 5080" width="1200" height="483" loading="lazy" /> <h4 id="tl-dr">tl;dr</h4> <p>This is not an official package, it's good enough for me and it might be good enough for you, confirmed as working in Debian Testing but I don't have a Stable machine to test there.</p> <p>You can use my custom repo to install the latest NVIDIA drivers on Debian Stable, Testing or Unstable (install from Sid repository):</p> <p><a rel="noopener external" target="_blank" href="https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/">https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/</a></p> <p>The page above contains the APT sources you need, just add the one for your release to <code>/etc/apt/sources.list.d/r-samueloph-nvidia-ai.sources</code>, run <code>sudo apt update</code> and install the packages, you might need to disable Secure Boot.</p> <h1 id="this-is-not-about-ai">This is not about AI</h1> <p>Discussions about AI are quite divisive in the Free Software communities, and there's so much to be said about it that I'm not willing to go into in this blog post. This is rather just me telling people that if they need up-to-date NVIDIA packages for Debian, they could check if my custom repository gets the job done.</p> <p>The AI part is a means to an end, I've been careful to note in the repository names that the packages were produced with AI to respect people who do not want to run it for any reason.</p> <h1 id="rtx-5000-series-support">RTX 5000 series support</h1> <p>Back in May 2025 I <a rel="noopener external" target="_blank" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1101072">opened a bug report</a> asking for the NVIDIA drivers on Debian to be updated to support the RTX 5000 series. The Nouveau drivers might be good enough for some people, but I need the NVIDIA drivers because I want to play games and do experiments with open weight models.</p> <p>Opening a bug report doesn't guarantee anything, at the end of the day Debian Developers are volunteers, so if I really wanted the newer drivers, I would have to do something about it, ideally submitting a merge request.</p> <p>I briefly looked into the NVIDIA packaging, which involves 3 source packages (and one extra git repo for tarballs), unfortunately this was going to take more time and effort than what I was willing to spend.</p> <h1 id="what-i-did">What I Did</h1> <p>After a few weeks of lamenting that I wasn't running the NVIDIA drivers, I figured I was willing to put in more effort than I originally thought, just enough to instruct the Claude Code agent to package the latest releases. I'm skilled enough with agentic tools that I knew how to use it to save time; providing a clear instruction on how to build the package and explaining the packaging layout, then letting the agent iterate until it gets a working build. The agent was running inside a VM that didn't have any of my credentials.</p> <p>After a little bit of back and forth, where I was reviewing the changes guiding the agent into how to fix certain issues, I ended up with a working set of packages.</p> <p>Once I installed it on my machine and confirmed they worked, I set up a <a rel="noopener external" target="_blank" href="https://debusine.debian.net/">debusine</a> repository to make it easier to install future updates, and let others test it out.</p> <p>Debusine is analogous to Ubuntu's famous PPA, or Fedora's EPEL, it's a relatively new project but it has been working fine for this.</p> <p>Matheus Polkorny helped me test the packages and did spot a few issues which are fixed now. The Debusine developers were also always quick to respond to my questions and <a rel="noopener external" target="_blank" href="https://salsa.debian.org/freexian-team/debusine/-/issues?sort=created_date&amp;state=opened&amp;author_username=samueloph&amp;first_page_size=20">bug reports</a>.</p> <h1 id="how-good-is-it">How Good Is It?</h1> <p><strong>Short answer: good enough for daily use, but not a substitute for an official Debian package.</strong></p> <p>The whole point of doing this is because I don't have enough free time to maintain the package myself. All of this work was done as a volunteer, on my personal time.</p> <p>This means I'm trusting the agent to some degree; I review its commits but I don't go too deep into it, the quality will be dictated by the fact that I'm a Debian Developer and so by how easily I can spot issues without double checking everything.</p> <p>I only have a single machine with an NVIDIA GPU, this machine runs Debian Testing and so I don't have a way to test the Stable packages. I can do my best to address problems but at this point there is a risk that new updates break something.</p> <p>Installing NVIDIA drivers has always been a bit risky regardless, if you're comfortable with reverting updates and handling a system without a graphical interface (in case you end up in a tty), you will be fine.</p> <p>You will likely need to disable Secure Boot in order to use them, or set up your BIOS so that a MOK can be used to sign the DKMS modules.</p> <p>When choosing the version strings for the packages, I was careful enough to pick something that would sort lower than an official Debian package, meaning that whenever that same version is packaged in Debian, your system will see it as an upgrade.</p> <p>If you have any other methods of installing the NVIDIA drivers on your Debian system that is working for you, you should likely stick to that.</p> <p>I have a strong preference for installing them through .deb packages, making the package sort out configuration changes and dependency updates, besides handling the DKMS modules.</p> <p>Ultimately I'm not happy with the amount of difficulty that Debian users have in installing up-to-date NVIDIA drivers, and I hope this makes it easier for some.</p> <h1 id="how-to-install">How To Install</h1> <p>Head over to the Debusine page that contains both repos for Trixie (Debian Stable) and Sid (for Debian Testing and Unstable):</p> <p><a rel="noopener external" target="_blank" href="https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/">https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/</a></p> <p><strong>If you are running Debian Testing, then pick the Sid repository.</strong></p> <p>That page contains the contents of the apt <code>.sources</code> file you need, create the file <code>/etc/apt/sources.list.d/r-samueloph-nvidia-ai.sources</code> with the sources for your release.</p> <p>Run <code>sudo apt update</code> and install the packages you need, if you already have a previous version installed, <code>sudo apt upgrade --update</code> would update them.</p> <p>If there are no upgrades, meaning you don't have a previous version installed, then you need to explicitly install them.</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt install nvidia-open-kernel-dkms nvidia-driver</span></span></code></pre> <p>If you run into issues in Debian Stable, consider using the Linux kernel package from the backports repository, if you need an up-to-date NVIDIA driver, you likely should also be running the backports kernel package (if you can't upgrade to Debian Testing).</p> <h1 id="future-plans">Future Plans</h1> <p>I currently have no means of measuring how many people are using the debusine repositories, so if you do end up using it feel free to let me know somehow.</p> <p>I don't know for how long I will keep managing this repository, and how much effort I will spend, but my machine needs it and for now I will keep it up-to-date with the latest production-grade NVIDIA drivers.</p> <h1 id="sources">Sources</h1> <p>The sources of the packages are available under a namespace in Salsa (Debian's GitLab instance):</p> <p><a rel="noopener external" target="_blank" href="https://salsa.debian.org/samueloph-forks-team/nvidia-drivers-forks-with-ai">https://salsa.debian.org/samueloph-forks-team/nvidia-drivers-forks-with-ai</a></p> <p>You can also get the exact sources used in the repositories from debusine:</p> <p><a rel="noopener external" target="_blank" href="https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/sid-nvidia-ai/search/?category=debian:source-package">https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/sid-nvidia-ai/search/?category=debian:source-package</a></p> <p><a rel="noopener external" target="_blank" href="https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/trixie-nvidia-ai/search/?category=debian:source-package">https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/trixie-nvidia-ai/search/?category=debian:source-package</a></p> I use curl with ECH btw (in Debian) 2026-03-27T00:00:00+00:00 2026-03-27T00:00:00+00:00 Unknown https://samueloph.dev/blog/i-use-curl-with-ech-btw-in-debian/ <h4 id="tl-dr">tl;dr</h4> <p>This is an experimental feature that, for the first time, brings full ECH support to curl on Debian using OpenSSL.</p> <p>Starting with <strong>curl 8.19.0-3+exp2</strong> (Debian Experimental), you can now use ECH, with HTTPS-RR and DoH for maximum privacy.</p> <p>curl 8.19.0-3+exp2 is quite fresh at the time of writing, bear in mind that your repository might not have synced the package yet, all mirrors should have it by March 27th 14:00 UTC.</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #928374;font-style: italic;"># defo.ie is a test server that confirms whether ECH was successfully used</span></span> <span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> -v --ech</span><span style="color: #B8BB26;"> hard https://defo.ie/ech-check.php</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"># For Encrypted Client Hello (ECH) + DNS over HTTPS (DoH)</span></span> <span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> -v --ech</span><span style="color: #B8BB26;"> hard</span><span style="color: #D3869B;"> --doh-url</span><span style="color: #B8BB26;"> https://1.1.1.1/dns-query https://defo.ie/ech-check.php</span></span></code></pre> <p><em>"--ech hard" tells curl to refuse the connection entirely if ECH cannot be negotiated.</em></p> <p>Or, if you would like to try it out in a container:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">podman</span><span style="color: #B8BB26;"> run debian:experimental /bin/bash</span><span style="color: #D3869B;"> -c</span><span style="color: #A89984;"> &#39;</span><span style="color: #B8BB26;">apt install --update -t experimental -y curl &amp;&amp; curl -v --ech hard --doh-url https://1.1.1.1/dns-query https://defo.ie/ech-check.php</span><span style="color: #A89984;">&#39;</span></span></code></pre> <p><em>(in case you haven't noticed, apt now has the <code>--update</code> option for the <code>upgrade</code> and <code>install</code> commands)</em></p> <h1 id="for-privacy">For Privacy</h1> <p>CloudFlare calls it "the last puzzle piece to privacy" in their must-read announcement: <a rel="noopener external" target="_blank" href="https://blog.cloudflare.com/announcing-encrypted-client-hello/">https://blog.cloudflare.com/announcing-encrypted-client-hello/</a>.</p> <p><a rel="noopener external" target="_blank" href="https://www.rfc-editor.org/rfc/rfc9849">Encrypted Client Hello (rfc9849)</a> encrypts the "which website are you connecting to?" part of the TLS handshake that was previously visible in plaintext.</p> <p><a rel="noopener external" target="_blank" href="https://www.rfc-editor.org/rfc/rfc9460">HTTPS-RR (rfc9460)</a> is a DNS record type that publishes connection parameters for a service, including the public key clients need to perform ECH.</p> <p><a rel="noopener external" target="_blank" href="https://www.rfc-editor.org/rfc/rfc8484">DNS Over HTTPS (rfc8484)</a> encrypts DNS queries by tunneling them over HTTPS, hiding what domains you're looking up from network observers.</p> <p>When all three operate together over a CDN with shared IP space, the target domain name is hidden from passive observers; the HTTPS-RR record is queried over DoH in order to <a rel="noopener external" target="_blank" href="https://www.rfc-editor.org/rfc/rfc9848">retrieve the ECH key (rfc9848)</a> for the TLS handshake.</p> <p>Seems like quite an important feature, and in fact the major browsers have it enabled for some time now, the trick is that they do not use OpenSSL (Chrome uses BoringSSL and Firefox uses NSS).</p> <p>For everyone else, the only option is to patch OpenSSL or wait until 4.0.0 is released, and so part of the reason Debian is the first distro to enable it (curl + OpenSSL + ECH) is that the OpenSSL maintainer (Sebastian Andrzej Siewior) packaged the alpha release just 3 days after it was published.</p> <p>Do not forget that ECH support is experimental and currently relies on the alpha release of OpenSSL.</p> <h1 id="wcurl-gets-it-too">wcurl Gets It Too</h1> <p>Considering <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">wcurl</a> is just a wrapper on curl, it gets the feature for free:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">wcurl</span><span style="color: #D3869B;"> --curl-options=</span><span style="color: #A89984;">&quot;</span><span style="color: #B8BB26;">--ech hard --doh-url https://1.1.1.1/dns-query</span><span style="color: #A89984;">&quot;</span><span style="color: #83A598;"> $URL</span></span></code></pre> <p>If you're using wcurl, you don't want to have to set parameters, this is just to show that the feature is there and if you have a <code>.curlrc</code> file, it can enable the feature seamlessly.</p> <h1 id="other-debian-releases">Other Debian Releases</h1> <p>Given the ECH feature requires OpenSSL &gt;= 4, it will not make it to Debian 13, having a small chance of going to Debian 13 Backports (emphasis on small).</p> <p><strong>It should get to Debian Unstable and Debian Testing within the next couple of months</strong> as the OpenSSL GA release happens and gets packaged, but you should be able to install the package from Experimental in your Unstable and Testing systems without issues. It will also be in Debian 14 once it becomes the new Stable.</p> <h1 id="shoulders-of-giants">Shoulders of Giants</h1> <p>Stephen Farrell's presentation from OpenSSL Conference 2025 has a lot of background on the work involved:</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=wYQq8ozP3uE">Encrypted Client Hello – Lessons learned from trying to do something that was probably too complicated</a></p> <p>They have been working on implementing ECH in open-source projects for years, something as big as this doesn't happen without lots of people dedicating both their paid and free times over it.</p> <p>I ended up being the person who enabled it on Debian, which was pretty much the least amount of work between everyone involved, but hey it's fun flipping the switch and telling you about it.</p> <h1 id="background">Background</h1> <p>Since 2025, the curl developers started organizing an yearly meeting with all maintainers of curl in Operating Systems. The 2026 edition happened in March 26th: <a rel="noopener external" target="_blank" href="https://github.com/curl/curl/wiki/curl-distro-discussion-2026">https://github.com/curl/curl/wiki/curl-distro-discussion-2026</a>.</p> <p>Attendance was really good, and as you can imagine one of the topics of discussion was ECH, in which it was pointed out that having OpenSSL 4 was the main requirement but besides it nothing unusual was needed.</p> <p>In Debian Experimental, we have been enabling HTTPS-RR since March 2025, and OpenSSL 4.0.0 alpha was packaged just recently (2026-03-13) by Sebastian Andrzej Siewior, it's time for the next step.</p> <p>The curl distro meeting was just the motivation I needed to go ahead and enable it in Debian Experimental, so as part of our Debian Brasil Weekly Meetings I've prepared and uploaded the changes, while Carlos Henrique Lima Melara worked on addressing a recent test regression for Debian Unstable. Unfortunately sergiodj couldn't join and I'm sure he's jealous of the hacking session now.</p> <h1 id="appendix">Appendix</h1> <p>While writing this, I've noticed one of the authors of the CloudFlare blogpost is the previous curl maintainer on Debian; Alessandro Ghedini let me take over the maintenance back in 2021 and today curl is maintained by a team of 4 people, it's nice to see Alessandro's involvement.</p> Debian 13: My list of exciting new features 2025-08-28T17:30:00+00:00 2025-08-28T17:30:00+00:00 Unknown https://samueloph.dev/blog/debian-13-my-list-of-exciting-new-features/ <img src="debian-13-my-list-of-exciting-new-features.webp" alt="A bunch of screenshots overlaid on top of each other showing different tools: lazygit, gnome settings, gnome system monitor, powerline-go, and the wcurl logo, the text at the top says &#x27;Debian 13: My list of exciting new features&#x27;, and there&#x27;s a Debian logo in the middle of image" width="1200" height="630" loading="lazy" /> <h1 id="beyond-debian-useful-for-other-distros-too">Beyond Debian: Useful for other distros too</h1> <p>Every two years Debian releases a new major version of its Stable series, meaning the differences between consecutive Debian Stable releases represent two years of new developments both in Debian as an organization and its native packages, but also in all other packages which are also shipped by other distributions (which are getting into this new Stable release).</p> <p>If you're not paying close attention to everything that's going on all the time in the Linux world, you miss a lot of the nice new features and tools. It's common for people to only realize there's a cool new trick available only years after it was first introduced.</p> <p>Given these considerations, the tips that I'm describing will eventually be available in whatever other distribution you use, be it because it's a Debian derivative or because it just got the same feature from the upstream project.</p> <p>I'm not going to list "passive" features (as good as they can be), the focus here is on new features that might change how you configure and use your machine, with a mix between productivity and performance.</p> <h1 id="debian-13-trixie">Debian 13 - Trixie</h1> <p>I have been a Debian Testing user for longer than 10 years now (and I recommend it for non-server users), so I'm not usually keeping track of all the cool features arriving in the new Stable releases because I'm continuously receiving them through the Debian Testing rolling release.</p> <p>Nonetheless, as a Debian Developer I'm in a good position to point out the ones I can remember. I would also like other Debian Developers to do the same as I'm sure I would learn something new.</p> <p>The Debian 13 release notes contain a <a rel="noopener external" target="_blank" href="https://www.debian.org/releases/trixie/release-notes/whats-new.en.html">"What's new" section </a>, which lists the first two items here and a few other things, in other words, take my list as an addition to the release notes.</p> <p>Debian 13 was released on 2025-08-09, and these are nice things you shouldn't miss in the new release, with a bonus one not tied to the Debian 13 release.</p> <h2 id="1-wcurl">1) wcurl</h2> <img src="wcurl-logo.svg" alt="wcurl logo" width="998" height="250" loading="lazy" /> <p>Have you ever had to download a file from your terminal using curl and didn't remember the parameters needed? I did.</p> <p>Nowadays you can use <code>wcurl</code>; "a command line tool which lets you download URLs without having to remember any parameters."</p> <p>Simply call <code>wcurl</code> with one or more URLs as parameters and it will download all of them in parallel, performing retries, choosing the correct output file name, following redirects, and more.</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">wcurl</span><span style="color: #B8BB26;"> example.com</span></span></code></pre> <p><code>wcurl</code> comes installed as part of the curl package on Debian 13 and in any other distribution you can imagine, starting with curl 8.14.0.</p> <p>I've written more about wcurl in its <a rel="noopener external" target="_blank" href="https://samueloph.dev/blog/announcing-wcurl-a-curl-wrapper-to-download-files/">release announcement</a> and I've done a lightning talk presentation in DebConf24, which is linked in the release announcement.</p> <h2 id="2-http-3-support-in-curl">2) HTTP/3 support in curl</h2> <p>Debian has become the first stable Linux distribution to ship curl with support for HTTP/3. <a rel="noopener external" target="_blank" href="https://samueloph.dev/blog/debian-curl-now-supports-http3/">I've written about this in July 2024</a>, when we first enabled it. Note that we first switched the curl CLI to GnuTLS, but then ended up releasing the curl CLI linked with OpenSSL (as support arrived later).</p> <p>Debian was the first stable Linux distro to enable it, and within rolling-release-based distros; Gentoo enabled it first in their non-default flavor of the package and Arch Linux did it three months before we pushed it to Debian Unstable/Testing/Stable-backports, kudos to them!</p> <p>HTTP/3 is not used by default by the curl CLI, you have to enable it with <code>--http3</code> or <code>--http3-only</code>.</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> --http3</span><span style="color: #B8BB26;"> https://www.example.org</span></span> <span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> --http3-only</span><span style="color: #B8BB26;"> https://www.example.org</span></span></code></pre><h2 id="3-systemd-soft-reboot">3) systemd soft-reboot</h2> <p>Starting with systemd v254, there's a new <code>soft-reboot</code> option, it's an userspace-only reboot, much faster than a full reboot if you don't need to reboot the kernel.</p> <p>You can read the announcement from the <a rel="noopener external" target="_blank" href="https://github.com/systemd/systemd/releases/tag/v254">systemd v254 GitHub release</a></p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #928374;font-style: italic;"># This will reboot your machine!</span></span> <span class="giallo-l"><span style="color: #FABD2F;">systemctl</span><span style="color: #B8BB26;"> soft-reboot</span></span></code></pre><h2 id="4-apt-update">4) apt --update</h2> <p>Are you tired of being required to run <code>sudo apt update</code> just before <code>sudo apt upgrade</code> or <code>sudo apt install $PACKAGE</code>? So am I!</p> <p>The new <code>--update</code> option lets you do both things in a single command:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt</span><span style="color: #D3869B;"> --update</span><span style="color: #B8BB26;"> upgrade</span></span> <span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt</span><span style="color: #D3869B;"> --update</span><span style="color: #B8BB26;"> install</span><span style="color: #83A598;"> $PACKAGE</span></span></code></pre> <p>I love this, but it's still not yet where it should be, fingers crossed for a simple <code>apt upgrade</code> to behave like other package managers by updating its cache as part of the task, maybe in Debian 14?</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt upgrade</span><span style="color: #D3869B;"> --update</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"># The order doesn&#39;t matter</span></span> <span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt</span><span style="color: #D3869B;"> --update</span><span style="color: #B8BB26;"> upgrade</span></span></code></pre> <p>This is especially handy for container usage, where you have to update the apt cache before installing anything, for example:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">podman</span><span style="color: #B8BB26;"> run debian:stable bin/bash</span><span style="color: #D3869B;"> -c</span><span style="color: #A89984;"> &#39;</span><span style="color: #B8BB26;">apt install --update -y curl</span><span style="color: #A89984;">&#39;</span></span></code></pre><h2 id="5-powerline-go">5) powerline-go</h2> <p><code>powerline-go</code> is a powerline-style prompt written in Golang, so it's much more performant than its Python alternative <code>powerline</code>.</p> <p>powerline-style prompts are quite useful to show things like the current status of the git repo in your working directory, exit code of the previous command, presence of jobs in the background, whether or not you're in an ssh session, and more.</p> <img src="powerline-go.webp" alt="A screenshot of a terminal with powerline-go enabled, showing how the PS1 changes inside a git repository and when the last command fails" width="1929" height="618" loading="lazy" /> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt install powerline-go</span></span></code></pre> <p>Then add this to your <code>.bashrc</code>:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FE8019;">function</span><span style="color: #FABD2F;"> _update_ps1</span><span style="color: #A89984;">() {</span></span> <span class="giallo-l"><span style="color: #83A598;"> PS1</span><span style="color: #8EC07C;">=</span><span style="color: #A89984;">&quot;$(</span><span style="color: #FABD2F;">/usr/bin/powerline-go</span><span style="color: #D3869B;"> -error</span><span style="color: #83A598;"> $?</span><span style="color: #D3869B;"> -jobs</span><span style="color: #A89984;"> $(</span><span style="color: #FE8019;">jobs</span><span style="color: #D3869B;"> -p</span><span style="color: #8EC07C;"> |</span><span style="color: #FABD2F;"> wc</span><span style="color: #D3869B;"> -l</span><span style="color: #A89984;">))&quot;</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # Uncomment the following line to automatically clear errors after showing</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # them once. This not only clears the error for powerline-go, but also for</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # everything else you run in that shell. Don&#39;t enable this if you&#39;re not</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # sure this is what you want.</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> #set &quot;?&quot;</span></span> <span class="giallo-l"><span style="color: #A89984;">}</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #FB4934;">if</span><span style="color: #FE8019;"> [</span><span style="color: #A89984;"> &quot;</span><span style="color: #83A598;">$TERM</span><span style="color: #A89984;">&quot;</span><span style="color: #FB4934;"> !=</span><span style="color: #A89984;"> &quot;</span><span style="color: #B8BB26;">linux</span><span style="color: #A89984;">&quot;</span><span style="color: #FE8019;"> ]</span><span style="color: #A89984;"> &amp;&amp;</span><span style="color: #FE8019;"> [</span><span style="color: #FB4934;"> -f</span><span style="color: #A89984;"> &quot;</span><span style="color: #B8BB26;">/usr/bin/powerline-go</span><span style="color: #A89984;">&quot;</span><span style="color: #FE8019;"> ]</span><span style="color: #A89984;">;</span><span style="color: #FB4934;"> then</span></span> <span class="giallo-l"><span style="color: #83A598;"> PROMPT_COMMAND</span><span style="color: #8EC07C;">=</span><span style="color: #A89984;">&quot;</span><span style="color: #B8BB26;">_update_ps1; </span><span style="color: #83A598;">$PROMPT_COMMAND</span><span style="color: #A89984;">&quot;</span></span> <span class="giallo-l"><span style="color: #FB4934;">fi</span></span></code></pre> <p>Or this to <code>.zshrc</code>:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FE8019;">function</span><span style="color: #FABD2F;"> powerline_precmd</span><span style="color: #A89984;">() {</span></span> <span class="giallo-l"><span style="color: #83A598;"> PS1</span><span style="color: #8EC07C;">=</span><span style="color: #A89984;">&quot;$(</span><span style="color: #FABD2F;">/usr/bin/powerline-go</span><span style="color: #D3869B;"> -error</span><span style="color: #83A598;"> $?</span><span style="color: #D3869B;"> -jobs</span><span style="color: #A89984;"> ${${</span><span style="color: #B8BB26;">(</span><span style="color: #8EC07C;">%</span><span style="color: #B8BB26;">)</span><span style="color: #8EC07C;">:%</span><span style="color: #83A598;">j</span><span style="color: #A89984;">}</span><span style="color: #8EC07C;">:-</span><span style="color: #83A598;">0</span><span style="color: #A89984;">})&quot;</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # Uncomment the following line to automatically clear errors after showing</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # them once. This not only clears the error for powerline-go, but also for</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # everything else you run in that shell. Don&#39;t enable this if you&#39;re not</span></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> # sure this is what you want.</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #928374;font-style: italic;"> #set &quot;?&quot;</span></span> <span class="giallo-l"><span style="color: #A89984;">}</span></span></code></pre> <p>If you'd like to have your prompt start in a newline, like I have in the screenshot above, you just need to set <code>-newline</code> in the powerline-go invocation in your <code>.bashrc</code>/<code>.zshrc</code>.</p> <h2 id="6-gnome-system-monitor-extension">6) Gnome System Monitor Extension</h2> <p>Tips number 6 and 7 are for Gnome users.</p> <p>Gnome is now shipping a system monitor extension which lets you get a glance of the current load of your machine from the top bar.</p> <img src="gnome_system_monitor_extension.webp" alt="Screenshot of the top bar of Gnome with the system monitor extension enabled, showing the load of: CPU, memory, network and disk" width="1537" height="59" loading="lazy" /> <p>I've found this quite useful for machines where I'm required to install third-party monitoring software that tends to randomly consume more resources than it should. If I feel like my machine is struggling, I can quickly glance at its load to verify if it's getting overloaded by some process.</p> <p>The extension is not as complete as <a rel="noopener external" target="_blank" href="https://extensions.gnome.org/extension/3010/system-monitor-next/">system-monitor-next</a>, not showing temperatures or histograms, but at least it's officially part of Gnome, easy to install and supported by them.</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt install gnome-system-monitor gnome-shell-extension-manager</span></span></code></pre> <p>And then enable the extension from the "Extension Manager" application.</p> <h2 id="7-gnome-setting-for-battery-charging-profile">7) Gnome setting for battery charging profile</h2> <p>After having to learn more about batteries in order to get into FPV drones, I've come to have a bigger appreciation for solutions that minimize the inevitable loss of capacity that accrues over time.</p> <p>There's now a "Battery Charging" setting (under the "Power") section which lets you choose between two different profiles: "Maximize Charge" and "Preserve Battery Health".</p> <img src="gnome_battery_charging.png" alt="A screenshot of the Gnome settings for Power showing the options for Battery Charging" width="1648" height="1104" loading="lazy" /> <p>On supported laptops, this setting is an easy way to set thresholds for when charging should start and stop, just like you could do it with the <code>tlp</code> package, but now from the Gnome settings.</p> <p>To increase the longevity of my laptop battery, I always keep it at "Preserve Battery Health" unless I'm traveling.</p> <p>What I would like to see next is support for choosing different "Power Modes" based on whether the laptop is plugged-in, and based on the battery charge percentage.</p> <p>There's a <a rel="noopener external" target="_blank" href="https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/issues/715">GNOME issue</a> tracking this feature, but there's some pushback on whether this is the right thing to expose to users.</p> <p>In the meantime, there are some workarounds mentioned in that issue which people who really want this feature can follow.</p> <p>If you would like to learn more about batteries; <a rel="noopener external" target="_blank" href="https://batteryuniversity.com">Battery University</a> is a great starting point, besides getting into FPV drones and being forced to handle batteries without a Battery Management System (BMS).</p> <p>And if by any chance this sparks your interest in FPV drones, Joshua Bardwell's YouTube channel is a great resource: <a rel="noopener external" target="_blank" href="https://www.youtube.com/@JoshuaBardwell">@JoshuaBardwell</a>.</p> <h2 id="8-lazygit">8) Lazygit</h2> <p>Emacs users are already familiar with the legendary <code>magit</code>; a terminal-based UI for git.</p> <p>Lazygit is an alternative for non-emacs users, you can integrate it with neovim or just use it directly.</p> <p>I'm still playing with <code>lazygit</code> and haven't integrated it into my workflows, but so far it has been a pleasant experience.</p> <img src="lazygit.webp" alt="Screenshot of lazygit from the Debian curl repository, showing a selected commit and its diff, besides the other things from the lazygit UI" width="1000" height="634" loading="lazy" /> <p>You should check out the demos from the <a rel="noopener external" target="_blank" href="https://github.com/jesseduffield/lazygit">lazygit GitHub page</a>.</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt install lazygit</span></span></code></pre> <p>And then call <code>lazygit</code> from within a git repository.</p> <h2 id="9-neovim">9) neovim</h2> <p>neovim has been shipped in Debian since 2016, but upstream has been doing a lot of work to improve the experience out-of-the-box in the last couple of years.</p> <p>If you're a neovim poweruser, you're likely not installing it from the official repositories, but for those that are, Debian 13 comes with version 0.10.4, which brings the following improvements compared to the version in Debian 12:</p> <ul> <li> <p>Treesitter support for C, Lua, Markdown, with the possibility of adding any other languages as needed;</p> </li> <li> <p>Better spellchecking due to treesitter integration (spellsitter);</p> </li> <li> <p>Mouse support enabled by default;</p> </li> <li> <p>Commenting support out-of-the-box;</p> <p>Check <code>:h commenting</code> for details, but the tl;dr is that you can use <code>gcc</code> to comment the current line and <code>gc</code> to comment the current selection.</p> </li> <li> <p>OSC52 support.</p> <p>Especially handy for those using neovim over an ssh connection, this protocol lets you copy something from within the neovim process into the clipboard of the machine you're using to connect through ssh. In other words, you can copy from neovim running in a host over ssh and paste it in the "outside" machine.</p> </li> </ul> <h2 id="10-bonus-running-old-debian-releases">10) [Bonus] Running old Debian releases</h2> <p>The bonus tip is not specific to the Debian 13 release, but something I've recently learned in the <code>#debian-devel</code> IRC channel.</p> <p>Did you know there are usable container images for all past Debian releases? I'm not talking "past" as in "some of the older releases", I'm talking past as in "literally every Debian release, including the very first one".</p> <p>Tianon Gravi "tianon" is the Debian Developer responsible for making this happen, kudos to him!</p> <p>There's a small gotcha that the releases Buzz (1.1) and Rex (1.2) require a 32-bit host, otherwise you will get the error <code>Out of virtual memory!</code>, but starting with Bo (1.3) all should work in amd64/arm64.</p> <p>Try it out:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> apt install podman</span></span> <span class="giallo-l"></span> <span class="giallo-l"><span style="color: #FABD2F;">podman</span><span style="color: #B8BB26;"> run</span><span style="color: #D3869B;"> -it</span><span style="color: #B8BB26;"> docker.io/debian/eol:bo</span></span></code></pre> <p>Don't be surprised when noticing that <code>apt/apt-get</code> is not available inside the container, that's because <code>apt</code> first appeared in Debian Slink (2.1).</p> <h1 id="changes-since-publication">Changes since publication</h1> <h2 id="2025-08-30">2025-08-30</h2> <ul> <li>Mention that Arch also enabled HTTP/3.</li> </ul> DebConf24 was fun! Security, curl, wcurl, Debian's quality 2024-09-04T00:00:00+00:00 2024-09-04T00:00:00+00:00 Unknown https://samueloph.dev/blog/debconf24-was-fun/ <img src="debconf24_was_fun.webp" alt="A picture of a badger2040w with Samuel&#x27;s badge and the curl manpage PCB on the side" width="1200" height="630" loading="lazy" /> <h4 id="tl-dr">tl;dr</h4> <p><a rel="noopener external" target="_blank" href="https://debconf24.debconf.org/">DebConf24</a> was fun!</p> <p>A playlist of all of my talks, with subtitles (en, pt-br) and chapters is available on <a rel="noopener external" target="_blank" href="https://youtube.com/playlist?list=PLKGG29PjeLnYeao03jWWH0eaRC5htIg1E&amp;si=3Hwrl5WHFFM2IaSO">YouTube</a>.</p> <h1 id="overview">Overview</h1> <p>DebConf24 was held in Busan, South Korea, between Sunday July 28th to Sunday August 4th 2024.</p> <p>As usual for DebConfs, I had a great time meeting my friends, but also met new people and got to learn a bit about the interesting things they're working on.</p> <p>I ended up getting too excited during the talk submission stage of the conference and as a result I presented 5 different activities (3 talks, 1 BoF and 1 lightning talk).</p> <p>Since I was too busy with the presentations, I did not have a lot of time to actually hang out with folks, or even to go out in the city, I guess I've learned my lesson for next time.</p> <p>The main purpose of this post is to write about all of the things I presented at the conference. I did want to list some of the interesting talks I've watched, but that I would not be able to be fair as I'm sure I would miss some.</p> <p>You can get the schedule and the recordings of any talks from the conference's website: <a rel="noopener external" target="_blank" href="https://debconf24.debconf.org/schedule/">https://debconf24.debconf.org/schedule/</a></p> <h1 id="wcurl-lightning-talk">wcurl Lightning Talk</h1> <p>The most fun of my presentations, during the second-to-last day of the conference, I've asked for help from Sergio Durigan Junior &lt;sergiodj&gt; to setup an URL containing a whitespace and redirecting that to <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">wcurl</a>'s manpage.</p> <p>I then did a little demo to showcase why me (and a lot others) struggle with downloading things with curl, and how <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">wcurl</a> solves that.</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=eM8M5qa4pPM">https://www.youtube.com/watch?v=eM8M5qa4pPM</a> <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/eM8M5qa4pPM" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> </p> <h1 id="fixing-cves-on-debian-everything-you-probably-know-already">Fixing CVEs on Debian: Everything you probably know already</h1> <p>I've always felt like DebConf was missing security-related talks, so I decided to do something about it and presented a few of the things I've learned when fixing CVEs for Debian.</p> <p>This is an area where we don't get a lot of new contributors, I'm trying to change that, and this talk can be used to introduce newcomers to it.</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=XzNVVILVyUM">https://www.youtube.com/watch?v=XzNVVILVyUM</a> <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/XzNVVILVyUM" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> </p> <h1 id="the-secret-sauce-of-debian">The secret sauce of Debian</h1> <p>Debian is not very vocal about all of the nice things it has regarding quality-assurance, testing, or CI, even though it's at the state-of-the-art for a lot of things.</p> <p>This talk is an initial step towards making people aware of the cool things happening behind the scenes. Ideally we should have it well-documented somewhere.</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=x_X2IBnpjic">https://www.youtube.com/watch?v=x_X2IBnpjic</a> <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/x_X2IBnpjic" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> </p> <h1 id="i-use-debian-btw-fzf-tmux-zoxide-and-friends">"I use Debian BTW": fzf, tmux, zoxide and friends</h1> <p>One of my earliest good memories of Debian was when it started coming with a colored PS1 by default, I still remember the feeling of relief whenever I jumped into a Debian server and didn't have to deal with a black and white PS1.</p> <p>There's still a lot of room for Debian to ship better defaults, and I think some of them can actually happen.</p> <p>This talk is a bit of a silly one where I'm just making people aware of the existence of a few Golang/Rust CLI tools, and also some dotfiles configurations that should probably be the default.</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=tfto3Seokn4">https://www.youtube.com/watch?v=tfto3Seokn4</a> <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/tfto3Seokn4" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> </p> <h1 id="curl">curl</h1> <p>The curl project does such a great job with their security advisories that it will likely never receive the amount of praise it deserves, but I did my best at mentioning it throughout my <a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=XzNVVILVyUM">CVEs talk</a>.</p> <p><strong>Maybe I will write more extensively about this someday, but in case I don't:</strong></p> <hr /> <p>There's no other project which always consistently mentions the exact range of commits that are affected by a given CVE.</p> <p>Forget about whether the versions are EOL, curl doesn't have LTS releases, yet they do such a great job at clearly documenting their CVEs that I would take that over having LTS releases anytime (that's for curl at least, I acknowledge some types of projects have a different need for LTS releases).</p> <p>Not only that, but they are also always careful about explaining alternative mitigations such as configuration changes, build flags that defuse the exploitation, or parameters that you should not use.</p> <hr /> <p>Just like we tend to do every time we meet, me and the other Debian curl maintainers spent the first 2 or 3 days of the conference talking about how we wanted to eventually meet up to discuss the package.</p> <p>It was going to be informal, maybe during the <a rel="noopener external" target="_blank" href="https://debconf24.debconf.org/about/cheese-and-wine-party/">Cheese and Wine party</a>, but then I've realized we should make it part of the official schedule, which would also give us the recordings for later.</p> <p>And so the "curl maintainers BoF" happened, where we spoke about HTTP3, GnutTLS, <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">wcurl</a> and other things.</p> <p><a rel="noopener external" target="_blank" href="https://www.youtube.com/watch?v=fL7hSypUTdM">https://www.youtube.com/watch?v=fL7hSypUTdM</a> <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/fL7hSypUTdM" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> </p> <h1 id="wcurl">wcurl</h1> <p>Right after that BoF, Daniel Stenberg <a rel="noopener external" target="_blank" href="https://curl.se/mail/archive-2024-08/0000.html">asked</a> if we were interested in having <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">wcurl</a> adopted into curl, which we definitely were, so <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/08/08/curl-welcomes-wcurl-to-the-team/">wcurl is now part of the curl project</a>.</p> <p>Daniel was also kind enough to design a logo for the project, which makes me especially happy because I can stop with my own approach at a logo (which I had to redo every few days):</p> <img src="wcurl_draft_logo.webp" alt="A laptop with a curl and a GoHorse sticker, there&#x27;s a &#x27;w&#x27; handwritten with a marker on the right side of the curl sticker, making it &#x27;wcurl&#x27;" width="700" height="699" loading="lazy" /> <p>And here is the new logo:</p> <img src="wcurl_logo.svg" alt="&#x27;wcurl&#x27; written with the same font and colors as the curl logo, with the &#x27;w&#x27; being green instead of blue, and a download icon at the end" width="998" height="250" loading="lazy" /> <p>Much better, I would say :)</p> <h1 id="curl-swag">curl Swag</h1> <p>DebConf24 was my chance at forwarding some curl swag items to the other curl maintainers, so both Sergio Durigan Junior &lt;sergiodj&gt; and Carlos Henrique Lima Melara &lt;charles&gt; got the <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/05/06/i-survived-curl-up-2024">curl-up t-shirt</a> and the very cool <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2023/11/03/curl-coasters/">curl PCB coaster</a>, both gifted by Daniel Stenberg.</p> <p>Unfortunately I didn't have any of that for DebConf attendees, but I did drop loads of curl stickers at the stickers table, they were gone very quickly.</p> <img src="debconf24_curl_stickers.webp" alt="A table full of different stickers, curl stickers can be seen over the whole table" width="450" height="800" loading="lazy" /> <h1 id="for-the-future">For the future</h1> <p>I used to think the most humbling experience you could have as someone who presented a talk was to have to watch it yourself, you notice a lot of mistakes and you instantly think about things that should be done differently.</p> <p>It turns out the most humbling thing to do is actually to write subtitles for your talks, I noticed every single mistake, often multiple times.</p> <p>So after spending more than 30 hours writing the subtitles for both English and Brazilian Portuguese for my talks, I feel like it's going to be much easier to avoid committing the same mistakes again. After some time you stop feeling shame about those mistakes and you're just left with feelings of annoyance, and at that point it becomes easier to consciously avoid them.</p> <p>I am collecting a list of things I wish I had done differently on all of those talks, so if I end up presenting any one of them again, it will be an improved version.</p> <p> <img src="debconf24_group_photo.webp" alt="A picture from the top of a group of conference attendees, there&#x27;s about 150 people in the picture" width="1484" height="1024" loading="lazy" /> Photography: Aigars Mahinovs &lt;[email protected]&gt;<br /> License: CC-BYv3+ or GPLv2+</p> Debian's curl now supports HTTP/3 2024-07-04T00:00:00+00:00 2024-07-04T00:00:00+00:00 Unknown https://samueloph.dev/blog/debian-curl-now-supports-http3/ <h4 id="tl-dr">tl;dr</h4> <p>Starting with <strong>curl 8.0.0-2</strong>, you can now use HTTP/3.</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> --http3-only</span><span style="color: #B8BB26;"> https://example.com</span></span></code></pre> <p>Or, if you would like to try it out in a container:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">podman</span><span style="color: #B8BB26;"> run debian:testing /bin/bash</span><span style="color: #D3869B;"> -c</span><span style="color: #A89984;"> &#39;</span><span style="color: #B8BB26;">apt install --update -y curl &amp;&amp; curl --http3-only https://example.com</span><span style="color: #A89984;">&#39;</span></span></code></pre> <p><em>(in case you haven't noticed, apt now has the <code>--update</code> option for the <code>upgrade</code> and <code>install</code> commands)</em></p> <h5 id="availability">Availability</h5> <ul> <li>Debian unstable - Since 2024-07-02</li> <li>Debian testing - Since 2024-07-18</li> <li>Debian 13 - Since its initial release.</li> <li>Debian 12/bookworm-backports - Since 2024-08-25</li> <li>Debian 12/bookworm - Due to the mechanisms we have in place to make sure Debian stable is in fact stable, we will never be able to ship this in the regular repository. Users can make use of the <a rel="noopener external" target="_blank" href="https://backports.debian.org/">backports</a> repositories instead.</li> <li>Debian derivatives - Rolling releases will get it by the time it's on Debian testing (e.g.: Kali Linux). Stable derivatives only in their next major release.</li> </ul> <h1 id="the-challenge">The challenge</h1> <p>HTTP/3 is fresh new, well... not really, but at least fresh enough that I'm not aware of any other Linux distribution supporting it on curl, the reason is likely two-fold:</p> <ol> <li><h3 id="openssl-is-not-there-yet">OpenSSL is not there yet</h3> <p>OpenSSL still doesn't have proper HTTP/3 support, and given that OpenSSL is so widely used, almost every curl distributor/packager will build curl with it and thus changing the TLS backend to something else is risky.</p> <p>Unfortunately, proper support for the OpenSSL libcurl is unlikely to come anytime before the end of this year, the OpenSSL performance is <a rel="noopener external" target="_blank" href="https://curl.se/mail/distros-2024-04/0001.html">not good enough yet as of version 3.3</a>.</p> <p>Daniel Stenberg has written about the state of this multiple times, most recently at <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/06/10/http-3-in-curl-mid-2024/">HTTP/3 in curl mid 2024</a>, if you're interested, I suggest reading through his other posts as well.</p> <p>Some might have noticed that nginx <a rel="noopener external" target="_blank" href="http://nginx.org/en/docs/quic.html">does support HTTP/3 through OpenSSL</a>, although when you look closely, it's not exactly perfect:</p> <blockquote> <p>An SSL library that provides QUIC support is recommended to build nginx, such as BoringSSL, LibreSSL, or QuicTLS. Otherwise, the OpenSSL compatibility layer will be used that does not support early data.</p> </blockquote> <p>As you can see, they don't recommend using OpenSSL, and when doing so, you don't get complete support.</p> <p>Update (October 2025): OpenSSL's HTTP/3 support has since matured enough that curl 8.16.0-2 switched the Debian curl CLI back to the OpenSSL backend, before the Debian 13/trixie freeze.</p> </li> <li><h3 id="http-3-support-for-gnutls-nghttp3-ngtcp2-is-recent">HTTP/3 support for GnuTLS/nghttp3/ngtcp2 is recent</h3> <p>The non-experimental support arrived <a rel="noopener external" target="_blank" href="https://github.com/curl/curl/commit/5f78cf503c786a1d48d13528dde038bccfa6c67c">back in October 2023</a>, and so that's when I started seriously planning for this.</p> <p>curl has been working on HTTP/3 support for years, and so it did support other TLS backends before that, but out of them, the one most feasible for a distribution to ship would be GnuTLS, which gets HTTP/3 support <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/06/10/http-3-in-curl-mid-2024/">through ngctp2 and nghttp3</a>.</p> </li> </ol> <h1 id="how-it-was-done">How it was done</h1> <p>The Debian curl package has historically shipped at least two variants of libcurl, an OpenSSL and a GnuTLS one.</p> <p>The OpenSSL libcurl couldn't support HTTP/3 at the time for the reasons explained above, but the GnuTLS libcurl can (with ngtcp2 and nghttp3).</p> <p>Debian packages can choose which version of libcurl to link against (without having to modify any upstream source code). Debian's "git" package being a famous example of a package that links against the GnuTLS libcurl.</p> <p>Enabling HTTP/3 on curl was done in three steps:</p> <ol> <li>Make sure all required dependencies fulfill the minimum requirements.</li> <li>Enable HTTP/3 for GnuTLS libcurl.</li> <li>Change the libcurl used by the curl CLI, from OpenSSL to GnuTLS.</li> </ol> <p>curl's HTTP/3 support requires a somewhat recent version of nghttp3 and updating that required a <a rel="noopener external" target="_blank" href="https://wiki.debian.org/Teams/ReleaseTeam/Transitions">transition</a> (due to the SONAME bump), while we've also had months of freeze for transitions due to the <a rel="noopener external" target="_blank" href="https://lists.debian.org/debian-devel-announce/2024/02/msg00000.html">time_t transition</a>.</p> <p>After the dependencies were in place, enabling HTTP/3 for the GnuTLS libcurl was <a rel="noopener external" target="_blank" href="https://salsa.debian.org/debian/curl/-/commit/51df321b0165e5164a0d898d23a64ca3bbd553c0">straightforward</a>.</p> <p>Then, for the last part, we had to switch the TLS backend used by the curl CLI. Doing the swap is also <a rel="noopener external" target="_blank" href="https://salsa.debian.org/debian/curl/-/commit/37820dad3612d1b13a9fb9550b1726b998c80cfc">quite easy</a> on the packaging level, but we have to consider the chances of this change breaking our users' environments.</p> <h4 id="update-october-2025-switching-back-to-openssl">Update (October 2025): Switching back to OpenSSL</h4> <p>Once OpenSSL's HTTP/3 support was stable and performant enough, the temporary arrangement with the GnuTLS backend had served its purpose. In October 2025, before the freeze for Debian 13/trixie, curl 8.16.0-2 switched the curl CLI back to the OpenSSL backend, now built with HTTP/3 support enabled directly.</p> <p>The GnuTLS libcurl continues to be shipped and supports HTTP/3 as before; this change only affects which backend the curl CLI binary itself links against.</p> <h1 id="ensuring-there-are-no-breakages">Ensuring there are no breakages</h1> <p>The first thing to consider regarding breakages is that this change is not going to be pushed directly to the current Debian stable releases, it will be present in the next stable release (13/trixie) but the current one will stick to the version that's already shipped.</p> <p>Secondly, we have to consider the risk of losing the ability to use certain parameters from the curl CLI which could be limited to the OpenSSL backend. During <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/05/06/i-survived-curl-up-2024/">curl-up 2024</a>, the curl developers pointed out the existence of a page that lists the <a rel="noopener external" target="_blank" href="https://curl.se/libcurl/c/tls-options.html">TLS related options and the backends they work with</a>.</p> <p>Analysing that page, ignoring all of the options that are suffixed with "BLOB" (only pertinent to the library, not the CLI), the only one left which is attention worthy is <a rel="noopener external" target="_blank" href="https://curl.se/libcurl/c/CURLOPT_ECH.html">CURLOPT_ECH</a>.</p> <blockquote> <p>This experimental feature requires a special build of OpenSSL, as ECH is not yet supported in OpenSSL releases. In contrast ECH is supported by the latest BoringSSL and wolfSSL releases.</p> </blockquote> <p>As it turns out, <code>Encrypted Client Hello</code> is experimental and it's not supported by the vanilla OpenSSL.</p> <p>This was enough of an investigation for me to go ahead with the change. Noting that even in the worst case scenario (we find a horrible regression), we can rollback without having affected a single stable release.</p> <p>Now that the package is on Debian unstable, the CI tests (autopkgtest) of every package that depends on curl is currently running, the results are compared against the migration-reference (in this case, the curl CLI with OpenSSL, before the change).</p> <p>If everything goes right, curl with HTTP/3 support will migrate to Debian testing in around 5 days. If we spot any issues, we'll have to solve them first and it's going to be hard to predict how long it takes, although it's fair to expect less than a month.</p> <p>Update (October 2025): Debian 13/trixie ultimately shipped with the OpenSSL backend instead, following the switch in curl 8.16.0-2 before the freeze.</p> <h1 id="feedback">Feedback</h1> <p>Feel free to join the Matrix room for the Debian curl maintainers:<br /> <a rel="noopener external" target="_blank" href="https://matrix.to/#/#debian-curl-maintainers:matrix.org">https://matrix.to/#/#debian-curl-maintainers:matrix.org</a></p> <h1 id="acknowledgements">Acknowledgements</h1> <p>It took us a bit longer than expected to be able to enable HTTP/3, nonetheless it's still early enough to be excited about.</p> <p>A lot of people were crucial to make this happen.</p> <p>I should recognize in the first place, obviously, the curl developers and the developers of the supporting libraries: GnuTLS, nghttp3, ngtcp2. Participating in the <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/05/06/i-survived-curl-up-2024/">curl-up 2024</a> conference helped me get motivated to push this through, besides becoming aware of the right documentation to research for impact.</p> <p>On the Debian side, Sakirnth Nagarasa &lt;sakirnth&gt; was responsible for updating and taking care of the transition for nghttp3 and ngtcp2.</p> <p>Also on the Debian side, I've got loads of help and support from the co-maintainers of the curl package: Sergio Durigan Junior &lt;sergiodj&gt; and Carlos Henrique Lima Melara &lt;charles&gt;.</p> <h1 id="changes-since-publication">Changes since publication</h1> <h2 id="2026-04-02">2026-04-02</h2> <ul> <li>Correct spelling of HTTP/3.</li> <li>Add note to explain that curl is back to using OpenSSL: OpenSSL's HTTP/3 support matured sufficiently by October 2025, and curl 8.16.0-2 switched the Debian curl CLI back to the OpenSSL backend before the Trixie freeze. Updated the OpenSSL challenge section, the "How it was done" section, and the breakages section to reflect this.</li> </ul> <h2 id="2025-03-08">2025-03-08</h2> <ul> <li>Fix podman command, the previous one was not running all commands inside the container.</li> <li>Change the podman command to use Debian testing instead of unstable.</li> </ul> <h2 id="2024-08-28">2024-08-28</h2> <ul> <li>Mention availability in bookworm-backports.</li> </ul> <h2 id="2024-07-18">2024-07-18</h2> <ul> <li>Update date of availability for Debian testing and expected date for bookworm-backports.</li> <li>Remove mention of language spoken in the Matrix room, we are using English now.</li> </ul> Announcing wcurl: a curl wrapper to download files 2024-07-03T00:00:00+00:00 2024-07-03T00:00:00+00:00 Unknown https://samueloph.dev/blog/announcing-wcurl-a-curl-wrapper-to-download-files/ <div class="yv"> <iframe src="https://www.youtube-nocookie.com/embed/eM8M5qa4pPM" title="Youtube" class="yvi" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> </div> <h4 id="tl-dr">tl;dr</h4> <p>Whenever you need to download files through the terminal and don't feel like using wget:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">wcurl</span><span style="color: #B8BB26;"> example.com/filename.txt</span></span></code></pre> <p>Manpage:<br /> <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/manual.html">https://curl.se/wcurl/manual.html</a></p> <h5 id="availability-comes-installed-with-the-curl-package">Availability (comes installed with the curl package):</h5> <ul> <li>Debian unstable - Since 2024-07-02</li> <li>Debian testing - Since 2024-07-18</li> <li>Debian 12/bookworm-backports - Since 2024-08-25</li> <li>Debian 12/bookworm - Due to the way changes are planned for Debian Stable, wcurl will not be present in bookworm. Users are recommended to either manually download wcurl or use the bookworm-backports repository. wcurl will be present in Debian 13/trixie.</li> <li>Debian derivatives - Rolling releases will get it by the time it's on Debian testing (e.g.: Kali Linux). Stable derivatives only in their next major release.</li> </ul> <p>If you don't want to wait for the package update to arrive, you can always copy the script and place it in your <code>/usr/bin</code>:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">curl</span><span style="color: #D3869B;"> -fLO</span><span style="color: #B8BB26;"> https://github.com/curl/wcurl/releases/latest/download/wcurl</span></span> <span class="giallo-l"><span style="color: #FABD2F;">chmod</span><span style="color: #B8BB26;"> +x wcurl</span></span> <span class="giallo-l"><span style="color: #FABD2F;">sudo</span><span style="color: #B8BB26;"> mv wcurl /usr/bin/wcurl</span></span></code></pre> <p>After this announcement, wcurl has joined the curl organization:<br /> <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/08/08/curl-welcomes-wcurl-to-the-team/">https://daniel.haxx.se/blog/2024/08/08/curl-welcomes-wcurl-to-the-team/</a></p> <p>Project homepage:<br /> <a rel="noopener external" target="_blank" href="https://curl.se/wcurl/">https://curl.se/wcurl/</a></p> <h1 id="smoother-cli-experience">Smoother CLI experience</h1> <p>Starting with <strong>curl version 8.8.0-2</strong>, the Debian's curl package now ships a wcurl executable.</p> <p>wcurl is the solution for those who just need to download files without having to remember curl's parameters for things like automatically naming the files.</p> <p>Some people, myself included, would fall back to using wget whenever there was a need to download a file. Sometimes even installing wget just for that usecase. After all, it's easier to remember "apt install wget" rather than "curl -L -O -C - ...".</p> <p>wcurl consists of a simple shell script that provides sane defaults for the curl invocation, for when the use case is to just download files.</p> <p>By default, wcurl will:</p> <blockquote> <ul> <li>Percent-encode whitespaces in URLs;</li> <li>Download multiple URLs in parallel if the installed curl's version is &gt;= 7.66.0;</li> <li>Follow redirects;</li> <li>Automatically choose a filename as output;</li> <li>Avoid overwriting files if the installed curl's version is &gt;= 7.83.0 (--no-clobber);</li> <li>Perform retries;</li> <li>Set the downloaded file timestamp to the value provided by the server, if available;</li> <li>Disable curl's URL globbing parser so {} and [] characters in URLs are not treated specially;</li> <li>Percent-decode the resulting filename;</li> <li>Use "index.html" as default filename if there's none in the URL.</li> </ul> </blockquote> <p>Example to download a single file:</p> <pre class="giallo" style="color: #EBDBB2; background-color: #282828;"><code data-lang="shellscript"><span class="giallo-l"><span style="color: #FABD2F;">wcurl</span><span style="color: #B8BB26;"> example.com/filename.txt</span></span></code></pre> <p>If you ever need to set a custom flag, you can make use of the <code>--curl-options</code> wcurl option, anything set there will be passed to the curl invocation. Just beware that if you need to set any custom flags, it's likely you will be better served by calling curl directly. The <code>--curl-options</code> option is there to allow for some flexibility in unforeseen circumstances.</p> <h1 id="the-need-for-wcurl">The need for wcurl</h1> <p>I've always felt a bit ashamed of not remembering curl's parameters for downloading a file and automatically naming it, having resorted to wget most of the times this was needed (even installing wget when it wasn't there, just for this). I've spoken to a few other experienced people I know and confirmed what could be obvious to others: a lot of people struggle with this.</p> <p>Recently, the curl project released the results of <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/media/curl-user-survey-2024-analysis.pdf">2024's curl survey</a>, which also showed this is as a much needed feature, just look at some of the answers:</p> <h4 id="q-which-curl-command-line-option-do-you-think-needs-improvement-and-how">Q: Which curl command line option do you think needs improvement and how?</h4> <blockquote> <p>-O, I really want wget like functionality where I don't have to specify the name</p> </blockquote> <blockquote> <p>Downloading a file (like wget) could be improved - with automatic naming of the file</p> </blockquote> <blockquote> <p>downloading files - wget is much cleaner</p> </blockquote> <blockquote> <p>I wish the default behaviour when GETting a binary was to drop it on disk. That's the only reason 'wget foo.tgz" is still ingrained in my muscle memory .</p> </blockquote> <blockquote> <p>Maybe have a way to download without specifying something in -o (the only reason i used wget still)</p> </blockquote> <blockquote> <p>--remote-time should be default</p> </blockquote> <blockquote> <p>--remote-name-all could really use a short flag</p> </blockquote> <h4 id="q-if-you-miss-support-for-something-tell-us-what">Q: If you miss support for something, tell us what!</h4> <blockquote> <p>"Write the data to the file named in the URL (or in redirects if I'm feeling daring), and timestamp the file to the last-modified-date". This is the main reason I'm still using wget.</p> </blockquote> <p>I can finally feel less bad about falling back to wget due to not remembering the parameters I want.</p> <h1 id="idealization-vs-reality">Idealization vs. reality</h1> <p>I don't believe curl will ever change its default behavior in such a way that would accommodate this need, as that would have a side-effect of breaking things which expect the current behavior (the blast radius is literally the <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2021/12/03/why-curl-is-used-everywhere-even-on-mars/">solar system</a>).</p> <p>This means a new executable needs to be shipped side-by-side with curl, an opportunity to start fresh and work with a more focused use case (to download files).</p> <p>Ideally, this new executable would be maintained by the curl project, make use of libcurl under-the-hood, and be available everywhere. Nobody wants to worry if their systems have the tool or not, it should always be there.</p> <p>Given I'm just a Debian Developer, with not as much free time as I wish, I've decided to write a simple shell script wrapper calling the curl CLI under-the-hood.</p> <p>wcurl will come installed with the curl package from now on, and I will check with the release team about shipping it on the current Debian stable as well. Shipping wcurl in other distros will be up to them (Debian-derivatives should pick it up automatically, though).</p> <p>We've tried to make it easy for anyone to ship this by using the curl license, keeping the script POSIX-compliant, and shipping a <a rel="noopener external" target="_blank" href="https://manpages.debian.org/unstable/curl/wcurl.1.en.html">manpage</a>.</p> <p>Maybe if there's enough interest across distributions, someone might sign up for implementing this in upstream curl and increase its reach. I would be happy with the curl project reusing the wcurl name when that happens. It's unlikely that wcurl would be shipped by curl upstream as it is, assuming they would prefer a solution that uses libcurl direclty (more similar to curl the CLI, to maintain).</p> <p>In the worst case, wcurl becomes a Debian-specific tool that only a few people are aware of, in the best case, it becomes the new go-to CLI tool for simply downloading files. I would be happy if at least someone other than me finds it useful.</p> <h1 id="naming-is-hard">Naming is hard</h1> <p>When I started working on it, I was calling the new executable "curld" (stands for "curl download"), but then when discussing this in one of our weekly calls in the Debian Brasília community, it was mentioned that this could be confused for a daemon.</p> <p>We then settled for the name "wcurl", suggested by Carlos Henrique Lima Melara &lt;charles&gt;. It doesn't really stand for anything, but it's very easy to remember.</p> <p>You know... "it's that wget alternative for when you want to use curl instead" :)</p> <h1 id="feedback">Feedback</h1> <p>The code is hosted in GitHub, feel free to open an issue to provide feedback.<br /> <a rel="noopener external" target="_blank" href="https://github.com/curl/wcurl">https://github.com/curl/wcurl</a></p> <p>We also have a Matrix room for the Debian curl maintainers:<br /> <a rel="noopener external" target="_blank" href="https://matrix.to/#/#debian-curl-maintainers:matrix.org">https://matrix.to/#/#debian-curl-maintainers:matrix.org</a></p> <h1 id="acknowledgments">Acknowledgments</h1> <p>The idea for wcurl came a few days before the <a rel="noopener external" target="_blank" href="https://daniel.haxx.se/blog/2024/05/06/i-survived-curl-up-2024/">curl-up conference 2024</a>. I've been thinking a lot about developer productivity in the terminal lately, different tools and better defaults. Before curl-up, I was also thinking about packaging improvements for the curl package. I don't remember what exactly happened, but I likely had to download something and felt a bit ashamed of maintaining curl and not remembering the parameters to download files the way I wanted.</p> <p>I first discussed this idea in the conference, where I asked the participants about it and there were no concerns raised, and some people said I should give it a go. Participating in curl-up was a really great experience and I'm thankful for the interactions I've had there.</p> <p>On the Debian side, I've got reviews of the code and manpage by Sergio Durigan Junior &lt;sergiodj&gt;, Guilherme Puida Moreira &lt;puida&gt; and Carlos Henrique Lima Melara &lt;charles&gt;. Sergio ended up rewriting the tool to be POSIX-compliant (my version was written in bash), so he takes all the credit for the portability.</p> <h1 id="changes-since-publication">Changes since publication</h1> <h2 id="2025-01-19">2025-01-19</h2> <ul> <li>Mention that wcurl will not be added to Debian 12/bookworm, it will be present in Debian 13/trixie.</li> </ul> <h2 id="2024-12-14">2024-12-14</h2> <ul> <li>Update list of wcurl features.</li> <li>Point out to wcurl homepage and mention that it's now part of curl.</li> <li>Reorder this changelog to have latest changes on top.</li> </ul> <h2 id="2024-08-28">2024-08-28</h2> <ul> <li>Mention availability in bookworm-backports.</li> <li>Link to wcurl lightning talk from DebConf24.</li> </ul> <h2 id="2024-07-18">2024-07-18</h2> <ul> <li>Update date of availability for Debian testing and expected date for bookworm backports.</li> <li>Mention charles as the person who suggested "wcurl" as a name.</li> <li>Update wcurl's -o/--opts options, it's now just --curl-options.</li> <li>Remove mention of language spoken in the Matrix room, we are using English now.</li> <li>Update list of features of wcurl.</li> </ul> Hello World 2024-04-18T00:00:00+00:00 2024-04-18T00:00:00+00:00 Unknown https://samueloph.dev/blog/hello-world/ <p>This is my very first post, just to make sure everything is working as expected.</p> <p>Made with <a rel="noopener external" target="_blank" href="https://www.getzola.org/">Zola</a> and the <a rel="noopener external" target="_blank" href="https://github.com/jieiku/abridge/">Abridge theme</a>.</p>