{"title":"Samuel Henrique (samueloph)","subtitle":"My personal website","link":[{"@attributes":{"rel":"self","type":"application\/atom+xml","href":"https:\/\/samueloph.dev\/atom.xml"}},{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev"}}],"generator":"Zola","updated":"2026-04-02T00:00:00+00:00","id":"https:\/\/samueloph.dev\/atom.xml","entry":[{"title":"Bringing HTTP\/3 to curl on Amazon Linux","published":"2026-04-02T00:00:00+00:00","updated":"2026-04-02T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/bringing-http3-to-curl-on-amazon-linux\/"}},"id":"https:\/\/samueloph.dev\/blog\/bringing-http3-to-curl-on-amazon-linux\/","content":" <img src=\"bringing-http3-to-curl-on-amazon-linux.webp\" alt=\"Screenshot of\nthe top entry of the curl package&#x27;s changelog, showing the following:\nChangelogs for curl-8.17.0-1.amzn2023.0.2.x86_64\n* Mon Mar 16 00:00:00 2026 Samuel Henrique (samueloph) &lt;samhn@amazon.com&gt; - 8.17.0-1.amzn2023.0.2\n- Enable HTTP&#x2F;3 support in the full build using ngtcp2 and nghttp3\n- HTTP&#x2F;3 is explicitly disabled in the minimal build\n- Add runtime dependencies on libnghttp3 and libngtcp2 with minimum version pinning\n- Run tests in parallel via upstream make test-nonflaky, with serial fallback for race-prone tests\" width=\"1596\" height=\"226\" loading=\"lazy\" \/>\n<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p>Starting with <strong>curl 8.17.0-1.amzn2023.0.2<\/strong> in Amazon Linux 2023, you can now use HTTP\/3.<\/p>\n<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>\n<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>\n<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>\n<p><em>(HTTP\/3 is only enabled in the curl -full builds)<\/em><\/p>\n<p>Or, if you would like to try it out in a container:<\/p>\n<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>\n<p>For a list of test endpoints, you can refer to\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/bagder.github.io\/HTTP3-test\/\">https:\/\/bagder.github.io\/HTTP3-test\/<\/a><\/p>\n<h1 id=\"the-upgrade-i-didn-t-have-to-make\">The Upgrade I Didn't Have to Make<\/h1>\n<p>My teammate Steve Zarkos, who previously worked on upgrading OpenSSL in Amazon\nLinux from 3.0 to 3.2, spent the last few months on the complex task of bumping\nOpenSSL again, this time to 3.5. A bump like this only happens after extensive\ncode analysis and testing, something that I didn't foresee happening when\nAL2023 was released but that was a notable request from users.<\/p>\n<p>Having <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/samueloph.dev\/blog\/debian-curl-now-supports-http3\/\">enabled HTTP\/3 on\nDebian<\/a>, I was\nalways keeping an eye on when I would get to do the same for Amazon Linux (mind\nyou, I work at AWS, in the Amazon Linux org). The bump to OpenSSL 3.5 was the\nperfect opportunity to do that, for the first time Amazon Linux is shipping an\nOpenSSL version that is supported by ngtcp2 for HTTP\/3 support.<\/p>\n<h1 id=\"non-intrusive-change\">Non-Intrusive Change<\/h1>\n<p>In order to avoid any intrusive changes to existing users of AL2023, I've only\nenabled HTTP\/3 in the full build of curl, not in the minimal one, this means\nthere is no change for the minimal images.<\/p>\n<p>The way curl handles HTTP\/3 today also does not lead to any behavior changes\nfor those who have the full variants of curl installed, this is due to the fact\nthat HTTP\/3 is only used if the user explicitly asks for it with the flags\n<code>--http3<\/code> or <code>--http3-only<\/code>.<\/p>\n<h1 id=\"side-quests\">Side Quests<\/h1>\n<p>Supporting HTTP\/3 on curl also requires building it with ngtcp2 and nghttp3,\ntwo packages which were not shipped in Amazon Linux, besides, my team doesn't\neven own the curl package, we are a security team so our packages are the\nsecurity related stuff such as OpenSSL and GnuTLS. Our main focus is the\nservices behind Amazon Linux's vulnerability handling, not package maintenance.<\/p>\n<p>I worked with the owners of the curl package and got approvals on a plan to\nintroduce the two new dependencies under their ownership and to enable the\nfeature on curl, I appreciate their responsiveness.<\/p>\n<p>Amazon Linux 2023 is forked from Fedora, so while introducing ngtcp2, I also\nsent a couple of Pull Requests upstream to keep things in sync:<\/p>\n<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>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/src.fedoraproject.org\/rpms\/ngtcp2\/pull-request\/8\">[ngtcp2] do not skip tests<\/a><\/p>\n<p>While building the curl package in Amazon Linux, I've noticed the build was\ntaking 1 hour from start to end, and the culprit was something well known to\nme; tests.<\/p>\n<p>The curl test suite is quite extensive, with more than 1600 tests, all of that\nrunning without parallelization, running two times for each build of the\npackage; once for the minimal build and again for the full build.<\/p>\n<p>I had previously enabled parallel tests in Debian back in 2024 but never got\naround to submit the same improvements to Amazon Linux or Fedora, this is now\nfixed. The build times for Amazon Linux came down to 10 minutes under the same\nhost (previously 1 hour), and Fedora promptly merged my PR to do the same\nthere:<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/src.fedoraproject.org\/rpms\/curl\/pull-request\/80\">[curl] run tests in parallel<\/a><\/p>\n<p>All of this uncovered a test which is timing-dependent, meaning it's not\nsupposed to be run with high levels of parallelism, so there goes another PR,\nthis time to curl:<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/github.com\/curl\/curl\/pull\/21155\">Flag test 766 as timing-dependent#21155<\/a><\/p>\n<p>What started as enabling a single feature turned into improvements that landed\nin curl, Fedora, and Amazon Linux alike. I did this in a mix of work and\nvolunteer time, mostly during work hours (work email address used when this was\nthe case), but I'm glad I put in the extra time for the sake of improving curl\nfor everyone.<\/p>\n<h1 id=\"release-notes\">Release Notes<\/h1>\n<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>\n"},{"title":"Latest NVIDIA Drivers for Debian (Packaged with AI)","published":"2026-03-29T00:00:00+00:00","updated":"2026-03-29T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/latest-nvidia-drivers-for-debian-packaged-with-ai\/"}},"id":"https:\/\/samueloph.dev\/blog\/latest-nvidia-drivers-for-debian-packaged-with-ai\/","content":" <img src=\"latest-nvidia-drivers-for-debian-packaged-with-ai.webp\" alt=\"Two\nterminal windows side-by-side, on the left there&#x27;s the Debian logo in ASCII\nart, and on the right it&#x27;s the output of nvidia-smi, showing the driver version\n595.58.03 running on a machine that has an NVIDIA RTS 5080\" width=\"1200\" height=\"483\" loading=\"lazy\" \/>\n<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p>This is not an official package, it's good enough for me and it might be good\nenough for you, confirmed as working in Debian Testing but I don't have a\nStable machine to test there.<\/p>\n<p>You can use my custom repo to install the latest NVIDIA drivers on Debian\nStable, Testing or Unstable (install from Sid repository):<\/p>\n<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>\n<p>The page above contains the APT sources you need, just add the one for your\nrelease 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>\n<h1 id=\"this-is-not-about-ai\">This is not about AI<\/h1>\n<p>Discussions about AI are quite divisive in the Free Software communities, and\nthere's so much to be said about it that I'm not willing to go into in this\nblog post. This is rather just me telling people that if they need up-to-date\nNVIDIA packages for Debian, they could check if my custom repository gets the\njob done.<\/p>\n<p>The AI part is a means to an end, I've been careful to note in the repository\nnames that the packages were produced with AI to respect people who do not want\nto run it for any reason.<\/p>\n<h1 id=\"rtx-5000-series-support\">RTX 5000 series support<\/h1>\n<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\nreport<\/a> asking for\nthe NVIDIA drivers on Debian to be updated to support the RTX 5000 series. The\nNouveau drivers might be good enough for some people, but I need the NVIDIA\ndrivers because I want to play games and do experiments with open weight\nmodels.<\/p>\n<p>Opening a bug report doesn't guarantee anything, at the end of the day Debian\nDevelopers are volunteers, so if I really wanted the newer drivers, I would\nhave to do something about it, ideally submitting a merge request.<\/p>\n<p>I briefly looked into the NVIDIA packaging, which involves 3 source packages\n(and one extra git repo for tarballs), unfortunately this was going to take\nmore time and effort than what I was willing to spend.<\/p>\n<h1 id=\"what-i-did\">What I Did<\/h1>\n<p>After a few weeks of lamenting that I wasn't running the NVIDIA drivers, I\nfigured I was willing to put in more effort than I originally thought, just\nenough to instruct the Claude Code agent to package the latest releases. I'm\nskilled enough with agentic tools that I knew how to use it to save time;\nproviding a clear instruction on how to build the package and explaining the\npackaging layout, then letting the agent iterate until it gets a working build.\nThe agent was running inside a VM that didn't have any of my credentials.<\/p>\n<p>After a little bit of back and forth, where I was reviewing the changes guiding\nthe agent into how to fix certain issues, I ended up with a working set of\npackages.<\/p>\n<p>Once I installed it on my machine and confirmed they worked, I set up a\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/debusine.debian.net\/\">debusine<\/a> repository to make it easier to\ninstall future updates, and let others test it out.<\/p>\n<p>Debusine is analogous to Ubuntu's famous PPA, or Fedora's EPEL, it's a\nrelatively new project but it has been working fine for this.<\/p>\n<p>Matheus Polkorny helped me test the packages and did spot a few issues which\nare fixed now. The Debusine developers were also always quick to respond to my\nquestions 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\nreports<\/a>.<\/p>\n<h1 id=\"how-good-is-it\">How Good Is It?<\/h1>\n<p><strong>Short answer: good enough for daily use, but not a substitute for an official Debian package.<\/strong><\/p>\n<p>The whole point of doing this is because I don't have enough free time to\nmaintain the package myself. All of this work was done as a volunteer, on my\npersonal time.<\/p>\n<p>This means I'm trusting the agent to some degree; I review its commits but I\ndon't go too deep into it, the quality will be dictated by the fact that I'm\na Debian Developer and so by how easily I can spot issues without double checking\neverything.<\/p>\n<p>I only have a single machine with an NVIDIA GPU, this machine runs Debian\nTesting and so I don't have a way to test the Stable packages. I can do my best\nto address problems but at this point there is a risk that new updates break\nsomething.<\/p>\n<p>Installing NVIDIA drivers has always been a bit risky regardless, if you're\ncomfortable with reverting updates and handling a system without a graphical\ninterface (in case you end up in a tty), you will be fine.<\/p>\n<p>You will likely need to disable Secure Boot in order to use them, or set up your\nBIOS so that a MOK can be used to sign the DKMS modules.<\/p>\n<p>When choosing the version strings for the packages, I was careful enough to\npick something that would sort lower than an official Debian package, meaning\nthat whenever that same version is packaged in Debian, your system will see it\nas an upgrade.<\/p>\n<p>If you have any other methods of installing the NVIDIA drivers on your Debian\nsystem that is working for you, you should likely stick to that.<\/p>\n<p>I have a strong preference for installing them through .deb packages, making\nthe package sort out configuration changes and dependency updates, besides\nhandling the DKMS modules.<\/p>\n<p>Ultimately I'm not happy with the amount of difficulty that Debian users have in\ninstalling up-to-date NVIDIA drivers, and I hope this makes it easier for some.<\/p>\n<h1 id=\"how-to-install\">How To Install<\/h1>\n<p>Head over to the Debusine page that contains both repos for Trixie (Debian\nStable) and Sid (for Debian Testing and Unstable):<\/p>\n<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>\n<p><strong>If you are running Debian Testing, then pick the Sid repository.<\/strong><\/p>\n<p>That page contains the contents of the apt <code>.sources<\/code> file you need, create the\nfile <code>\/etc\/apt\/sources.list.d\/r-samueloph-nvidia-ai.sources<\/code> with the sources for your release.<\/p>\n<p>Run <code>sudo apt update<\/code> and install the packages you need, if you already have a\nprevious version installed, <code>sudo apt upgrade --update<\/code> would update them.<\/p>\n<p>If there are no upgrades, meaning you don't have a previous version installed,\nthen you need to explicitly install them.<\/p>\n<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>\n<p>If you run into issues in Debian Stable, consider using the Linux kernel package\nfrom the backports repository, if you need an up-to-date NVIDIA driver, you\nlikely should also be running the backports kernel package (if you can't\nupgrade to Debian Testing).<\/p>\n<h1 id=\"future-plans\">Future Plans<\/h1>\n<p>I currently have no means of measuring how many people are using the debusine\nrepositories, so if you do end up using it feel free to let me know somehow.<\/p>\n<p>I don't know for how long I will keep managing this repository, and how much\neffort I will spend, but my machine needs it and for now I will keep it\nup-to-date with the latest production-grade NVIDIA drivers.<\/p>\n<h1 id=\"sources\">Sources<\/h1>\n<p>The sources of the packages are available under a namespace in Salsa (Debian's\nGitLab instance):<\/p>\n<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>\n<p>You can also get the exact sources used in the repositories from debusine:<\/p>\n<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>\n<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>\n"},{"title":"I use curl with ECH btw (in Debian)","published":"2026-03-27T00:00:00+00:00","updated":"2026-03-27T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/i-use-curl-with-ech-btw-in-debian\/"}},"id":"https:\/\/samueloph.dev\/blog\/i-use-curl-with-ech-btw-in-debian\/","content":"<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p>This is an experimental feature that, for the first time, brings full ECH\nsupport to curl on Debian using OpenSSL.<\/p>\n<p>Starting with <strong>curl 8.19.0-3+exp2<\/strong> (Debian Experimental), you can now use\nECH, with HTTPS-RR and DoH for maximum privacy.<\/p>\n<p>curl 8.19.0-3+exp2 is quite fresh at the time of writing, bear in mind that your\nrepository might not have synced the package yet, all mirrors should have it by\nMarch 27th 14:00 UTC.<\/p>\n<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>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\"># For Encrypted Client Hello (ECH) + DNS over HTTPS (DoH)<\/span><\/span>\n<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>\n<p><em>\"--ech hard\" tells curl to refuse the connection entirely if ECH cannot be negotiated.<\/em><\/p>\n<p>Or, if you would like to try it out in a container:<\/p>\n<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>\n<p><em>(in case you haven't noticed, apt now has the <code>--update<\/code> option for the\n<code>upgrade<\/code> and <code>install<\/code> commands)<\/em><\/p>\n<h1 id=\"for-privacy\">For Privacy<\/h1>\n<p>CloudFlare calls it \"the last puzzle piece to privacy\" in their must-read\nannouncement: <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>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9849\">Encrypted Client Hello (rfc9849)<\/a> encrypts the\n\"which website are you connecting to?\" part of the TLS handshake that was\npreviously visible in plaintext.<\/p>\n<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\npublishes connection parameters for a service, including the public key clients\nneed to perform ECH.<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8484\">DNS Over HTTPS (rfc8484)<\/a> encrypts DNS queries\nby tunneling them over HTTPS, hiding what domains you're looking up from\nnetwork observers.<\/p>\n<p>When all three operate together over a CDN with shared IP space, the target\ndomain name is hidden from passive observers; the HTTPS-RR record is queried\nover DoH in order to <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9848\">retrieve the ECH key\n(rfc9848)<\/a> for the TLS handshake.<\/p>\n<p>Seems like quite an important feature, and in fact the major browsers have it\nenabled for some time now, the trick is that they do not use OpenSSL (Chrome\nuses BoringSSL and Firefox uses NSS).<\/p>\n<p>For everyone else, the only option is to patch OpenSSL or wait until 4.0.0 is\nreleased, and so part of the reason Debian is the first distro to enable it\n(curl + OpenSSL + ECH) is that the OpenSSL maintainer (Sebastian Andrzej\nSiewior) packaged the alpha release just 3 days after it was published.<\/p>\n<p>Do not forget that ECH support is experimental and currently relies on the\nalpha release of OpenSSL.<\/p>\n<h1 id=\"wcurl-gets-it-too\">wcurl Gets It Too<\/h1>\n<p>Considering <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">wcurl<\/a> is just a wrapper on curl, it gets\nthe feature for free:<\/p>\n<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>\n<p>If you're using wcurl, you don't want to have to set parameters, this is just\nto show that the feature is there and if you have a <code>.curlrc<\/code> file, it can\nenable the feature seamlessly.<\/p>\n<h1 id=\"other-debian-releases\">Other Debian Releases<\/h1>\n<p>Given the ECH feature requires OpenSSL &gt;= 4, it will not make it to Debian 13,\nhaving a small chance of going to Debian 13 Backports (emphasis on small).<\/p>\n<p><strong>It should get to Debian Unstable and Debian Testing within the next couple of\nmonths<\/strong> as the OpenSSL GA release happens and gets packaged, but you should be\nable to install the package from Experimental in your Unstable and Testing\nsystems without issues. It will also be in Debian 14 once it becomes the new Stable.<\/p>\n<h1 id=\"shoulders-of-giants\">Shoulders of Giants<\/h1>\n<p>Stephen Farrell's presentation from OpenSSL Conference 2025 has a lot of\nbackground on the work involved:<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=wYQq8ozP3uE\">Encrypted Client Hello \u2013 Lessons learned from trying to do something that was\nprobably too complicated<\/a><\/p>\n<p>They have been working on implementing ECH in open-source projects for years,\nsomething as big as this doesn't happen without lots of people dedicating both\ntheir paid and free times over it.<\/p>\n<p>I ended up being the person who enabled it on Debian, which was pretty much the\nleast amount of work between everyone involved, but hey it's fun flipping the\nswitch and telling you about it.<\/p>\n<h1 id=\"background\">Background<\/h1>\n<p>Since 2025, the curl developers started organizing an yearly meeting with all\nmaintainers of curl in Operating Systems. The 2026 edition happened in March\n26th:\n<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>\n<p>Attendance was really good, and as you can imagine one of the topics of\ndiscussion was ECH, in which it was pointed out that having OpenSSL 4 was\nthe main requirement but besides it nothing unusual was needed.<\/p>\n<p>In Debian Experimental, we have been enabling HTTPS-RR since March 2025, and\nOpenSSL 4.0.0 alpha was packaged just recently (2026-03-13) by Sebastian\nAndrzej Siewior, it's time for the next step.<\/p>\n<p>The curl distro meeting was just the motivation I needed to go ahead and\nenable it in Debian Experimental, so as part of our Debian Brasil Weekly\nMeetings I've prepared and uploaded the changes, while Carlos Henrique Lima\nMelara worked on addressing a recent test regression for Debian Unstable.\nUnfortunately sergiodj couldn't join and I'm sure he's jealous of the hacking\nsession now.<\/p>\n<h1 id=\"appendix\">Appendix<\/h1>\n<p>While writing this, I've noticed one of the authors of the CloudFlare blogpost\nis the previous curl maintainer on Debian; Alessandro Ghedini let me take over\nthe maintenance back in 2021 and today curl is maintained by a team of 4\npeople, it's nice to see Alessandro's involvement.<\/p>\n"},{"title":"Debian 13: My list of exciting new features","published":"2025-08-28T17:30:00+00:00","updated":"2025-08-28T17:30:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/debian-13-my-list-of-exciting-new-features\/"}},"id":"https:\/\/samueloph.dev\/blog\/debian-13-my-list-of-exciting-new-features\/","content":" <img src=\"debian-13-my-list-of-exciting-new-features.webp\" alt=\"A bunch of\nscreenshots overlaid on top of each other showing different tools: lazygit,\ngnome settings, gnome system monitor, powerline-go, and the wcurl logo, the\ntext at the top says &#x27;Debian 13: My list of exciting new features&#x27;, and there&#x27;s\na Debian logo in the middle of image\" width=\"1200\" height=\"630\" loading=\"lazy\" \/>\n<h1 id=\"beyond-debian-useful-for-other-distros-too\">Beyond Debian: Useful for other distros too<\/h1>\n<p>Every two years Debian releases a new major version of its Stable series,\nmeaning the differences between consecutive Debian Stable releases represent\ntwo years of new developments both in Debian as an organization and its native\npackages, but also in all other packages which are also shipped by other\ndistributions (which are getting into this new Stable release).<\/p>\n<p>If you're not paying close attention to everything that's going on all the time\nin the Linux world, you miss a lot of the nice new features and tools. It's\ncommon for people to only realize there's a cool new trick available only years\nafter it was first introduced.<\/p>\n<p>Given these considerations, the tips that I'm describing will eventually be\navailable in whatever other distribution you use, be it because it's a Debian\nderivative or because it just got the same feature from the upstream project.<\/p>\n<p>I'm not going to list \"passive\" features (as good as they can be), the focus\nhere is on new features that might change how you configure and use your\nmachine, with a mix between productivity and performance.<\/p>\n<h1 id=\"debian-13-trixie\">Debian 13 - Trixie<\/h1>\n<p>I have been a Debian Testing user for longer than 10 years now (and I recommend\nit for non-server users), so I'm not usually keeping track of all the cool\nfeatures arriving in the new Stable releases because I'm continuously receiving\nthem through the Debian Testing rolling release.<\/p>\n<p>Nonetheless, as a Debian Developer I'm in a good position to point out the ones\nI can remember. I would also like other Debian Developers to do the same as I'm\nsure I would learn something new.<\/p>\n<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\n<\/a>, which\nlists the first two items here and a few other things, in other words, take my\nlist as an addition to the release notes.<\/p>\n<p>Debian 13 was released on 2025-08-09, and these are nice things you shouldn't\nmiss in the new release, with a bonus one not tied to the Debian 13 release.<\/p>\n<h2 id=\"1-wcurl\">1) wcurl<\/h2>\n <img src=\"wcurl-logo.svg\" alt=\"wcurl logo\" width=\"998\" height=\"250\" loading=\"lazy\" \/>\n<p>Have you ever had to download a file from your terminal using curl and didn't\nremember the parameters needed? I did.<\/p>\n<p>Nowadays you can use <code>wcurl<\/code>; \"a command line tool which lets you download URLs\nwithout having to remember any parameters.\"<\/p>\n<p>Simply call <code>wcurl<\/code> with one or more URLs as parameters and it will download\nall of them in parallel, performing retries, choosing the correct output file\nname, following redirects, and more.<\/p>\n<p>Try it out:<\/p>\n<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>\n<p><code>wcurl<\/code> comes installed as part of the curl package on Debian 13 and in any other\ndistribution you can imagine, starting with curl 8.14.0.<\/p>\n<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\nannouncement<\/a>\nand I've done a lightning talk presentation in DebConf24, which is linked in\nthe release announcement.<\/p>\n<h2 id=\"2-http-3-support-in-curl\">2) HTTP\/3 support in curl<\/h2>\n<p>Debian has become the first stable Linux distribution to ship curl with support\nfor 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\n2024<\/a>, when we\nfirst enabled it. Note that we first switched the curl CLI to GnuTLS, but then\nended up releasing the curl CLI linked with OpenSSL (as support arrived later).<\/p>\n<p>Debian was the first stable Linux distro to enable it, and within\nrolling-release-based distros; Gentoo enabled it first in their non-default\nflavor of the package and Arch Linux did it three months before we pushed it to\nDebian Unstable\/Testing\/Stable-backports, kudos to them!<\/p>\n<p>HTTP\/3 is not used by default by the curl CLI, you have to enable it with\n<code>--http3<\/code> or <code>--http3-only<\/code>.<\/p>\n<p>Try it out:<\/p>\n<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>\n<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>\n<p>Starting with systemd v254, there's a new <code>soft-reboot<\/code> option, it's an\nuserspace-only reboot, much faster than a full reboot if you don't need to\nreboot the kernel.<\/p>\n<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\nrelease<\/a><\/p>\n<p>Try it out:<\/p>\n<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>\n<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>\n<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>\n<p>The new <code>--update<\/code> option lets you do both things in a single command:<\/p>\n<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>\n<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>\n<p>I love this, but it's still not yet where it should be, fingers crossed for a\nsimple <code>apt upgrade<\/code> to behave like other package managers by updating its\ncache as part of the task, maybe in Debian 14?<\/p>\n<p>Try it out:<\/p>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\"># The order doesn&#39;t matter<\/span><\/span>\n<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>\n<p>This is especially handy for container usage, where you have to update the apt\ncache before installing anything, for example:<\/p>\n<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>\n<p><code>powerline-go<\/code> is a powerline-style prompt written in Golang, so it's much more\nperformant than its Python alternative <code>powerline<\/code>.<\/p>\n<p>powerline-style prompts are quite useful to show things like the current status\nof the git repo in your working directory, exit code of the previous command,\npresence of jobs in the background, whether or not you're in an ssh session,\nand more.<\/p>\n <img src=\"powerline-go.webp\" alt=\"A screenshot of a terminal with\npowerline-go enabled, showing how the PS1 changes inside a git repository and\nwhen the last command fails\" width=\"1929\" height=\"618\" loading=\"lazy\" \/>\n<p>Try it out:<\/p>\n<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>\n<p>Then add this to your <code>.bashrc<\/code>:<\/p>\n<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>\n<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>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    # Uncomment the following line to automatically clear errors after showing<\/span><\/span>\n<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>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    # sure this is what you want.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    #set &quot;?&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: #A89984;\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<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>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #FB4934;\">fi<\/span><\/span><\/code><\/pre>\n<p>Or this to <code>.zshrc<\/code>:<\/p>\n<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>\n<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>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    # Uncomment the following line to automatically clear errors after showing<\/span><\/span>\n<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>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    # sure this is what you want.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: #928374;font-style: italic;\">    #set &quot;?&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: #A89984;\">}<\/span><\/span><\/code><\/pre>\n<p>If you'd like to have your prompt start in a newline, like I have in the\nscreenshot above, you just need to set <code>-newline<\/code> in the powerline-go\ninvocation in your <code>.bashrc<\/code>\/<code>.zshrc<\/code>.<\/p>\n<h2 id=\"6-gnome-system-monitor-extension\">6) Gnome System Monitor Extension<\/h2>\n<p>Tips number 6 and 7 are for Gnome users.<\/p>\n<p>Gnome is now shipping a system monitor extension which lets you get a glance of\nthe current load of your machine from the top bar.<\/p>\n <img src=\"gnome_system_monitor_extension.webp\" alt=\"Screenshot of the top\nbar of Gnome with the system monitor extension enabled, showing the load of:\nCPU, memory, network and disk\" width=\"1537\" height=\"59\" loading=\"lazy\" \/>\n<p>I've found this quite useful for machines where I'm required to install\nthird-party monitoring software that tends to randomly consume more resources\nthan it should. If I feel like my machine is struggling, I can quickly glance\nat its load to verify if it's getting overloaded by some process.<\/p>\n<p>The extension is not as complete as\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/extensions.gnome.org\/extension\/3010\/system-monitor-next\/\">system-monitor-next<\/a>,\nnot showing temperatures or histograms, but at least it's officially part of\nGnome, easy to install and supported by them.<\/p>\n<p>Try it out:<\/p>\n<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>\n<p>And then enable the extension from the \"Extension Manager\" application.<\/p>\n<h2 id=\"7-gnome-setting-for-battery-charging-profile\">7) Gnome setting for battery charging profile<\/h2>\n<p>After having to learn more about batteries in order to get into FPV drones,\nI've come to have a bigger appreciation for solutions that minimize the\ninevitable loss of capacity that accrues over time.<\/p>\n<p>There's now a \"Battery Charging\" setting (under the \"Power\") section which lets\nyou choose between two different profiles: \"Maximize Charge\" and \"Preserve\nBattery Health\".<\/p>\n <img src=\"gnome_battery_charging.png\" alt=\"A screenshot of the Gnome\nsettings for Power showing the options for Battery Charging\" width=\"1648\" height=\"1104\" loading=\"lazy\" \/>\n<p>On supported laptops, this setting is an easy way to set thresholds for when\ncharging should start and stop, just like you could do it with the <code>tlp<\/code> package,\nbut now from the Gnome settings.<\/p>\n<p>To increase the longevity of my laptop battery, I always keep it at \"Preserve\nBattery Health\" unless I'm traveling.<\/p>\n<p>What I would like to see next is support for choosing different \"Power Modes\"\nbased on whether the laptop is plugged-in, and based on the battery\ncharge percentage.<\/p>\n<p>There's a <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/gitlab.gnome.org\/GNOME\/gnome-settings-daemon\/-\/issues\/715\">GNOME\nissue<\/a>\ntracking this feature, but there's some pushback on whether this is the right\nthing to expose to users.<\/p>\n<p>In the meantime, there are some workarounds mentioned in that issue which\npeople who really want this feature can follow.<\/p>\n<p>If you would like to learn more about batteries; <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/batteryuniversity.com\">Battery\nUniversity<\/a> is a great starting point, besides\ngetting into FPV drones and being forced to handle batteries without a Battery\nManagement System (BMS).<\/p>\n<p>And if by any chance this sparks your interest in FPV drones, Joshua Bardwell's\nYouTube channel is a great resource:\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/@JoshuaBardwell\">@JoshuaBardwell<\/a>.<\/p>\n<h2 id=\"8-lazygit\">8) Lazygit<\/h2>\n<p>Emacs users are already familiar with the legendary <code>magit<\/code>; a terminal-based\nUI for git.<\/p>\n<p>Lazygit is an alternative for non-emacs users, you can integrate it with neovim\nor just use it directly.<\/p>\n<p>I'm still playing with <code>lazygit<\/code> and haven't integrated it into my workflows,\nbut so far it has been a pleasant experience.<\/p>\n <img src=\"lazygit.webp\" alt=\"Screenshot of lazygit from the Debian curl\nrepository, showing a selected commit and its diff, besides the other things\nfrom the lazygit UI\" width=\"1000\" height=\"634\" loading=\"lazy\" \/>\n<p>You should check out the demos from the <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/github.com\/jesseduffield\/lazygit\">lazygit GitHub\npage<\/a>.<\/p>\n<p>Try it out:<\/p>\n<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>\n<p>And then call <code>lazygit<\/code> from within a git repository.<\/p>\n<h2 id=\"9-neovim\">9) neovim<\/h2>\n<p>neovim has been shipped in Debian since 2016, but upstream has been doing a lot of\nwork to improve the experience out-of-the-box in the last couple of years.<\/p>\n<p>If you're a neovim poweruser, you're likely not installing it from the official\nrepositories, but for those that are, Debian 13 comes with version 0.10.4,\nwhich brings the following improvements compared to the version in Debian 12:<\/p>\n<ul>\n<li>\n<p>Treesitter support for C, Lua, Markdown, with the possibility of adding any\nother languages as needed;<\/p>\n<\/li>\n<li>\n<p>Better spellchecking due to treesitter integration (spellsitter);<\/p>\n<\/li>\n<li>\n<p>Mouse support enabled by default;<\/p>\n<\/li>\n<li>\n<p>Commenting support out-of-the-box;<\/p>\n<p>Check <code>:h commenting<\/code> for details, but the\ntl;dr is that you can use <code>gcc<\/code> to comment the current line and <code>gc<\/code> to comment\nthe current selection.<\/p>\n<\/li>\n<li>\n<p>OSC52 support.<\/p>\n<p>Especially handy for those using neovim over an ssh\nconnection, this protocol lets you copy something from within the neovim\nprocess into the clipboard of the machine you're using to connect through ssh.\nIn other words, you can copy from neovim running in a host over ssh and paste\nit in the \"outside\" machine.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"10-bonus-running-old-debian-releases\">10) [Bonus] Running old Debian releases<\/h2>\n<p>The bonus tip is not specific to the Debian 13 release, but something I've\nrecently learned in the <code>#debian-devel<\/code> IRC channel.<\/p>\n<p>Did you know there are usable container images for all past Debian releases?\nI'm not talking \"past\" as in \"some of the older releases\", I'm talking past as\nin \"literally every Debian release, including the very first one\".<\/p>\n<p>Tianon Gravi \"tianon\" is the Debian Developer responsible for making this\nhappen, kudos to him!<\/p>\n<p>There's a small gotcha that the releases Buzz (1.1) and Rex (1.2) require a\n32-bit host, otherwise you will get the error <code>Out of virtual memory!<\/code>, but\nstarting with Bo (1.3) all should work in amd64\/arm64.<\/p>\n<p>Try it out:<\/p>\n<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>\n<span class=\"giallo-l\"><\/span>\n<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>\n<p>Don't be surprised when noticing that <code>apt\/apt-get<\/code> is not available inside the\ncontainer, that's because <code>apt<\/code> first appeared in Debian Slink (2.1).<\/p>\n<h1 id=\"changes-since-publication\">Changes since publication<\/h1>\n<h2 id=\"2025-08-30\">2025-08-30<\/h2>\n<ul>\n<li>Mention that Arch also enabled HTTP\/3.<\/li>\n<\/ul>\n"},{"title":"DebConf24 was fun! Security, curl, wcurl, Debian's quality","published":"2024-09-04T00:00:00+00:00","updated":"2024-09-04T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/debconf24-was-fun\/"}},"id":"https:\/\/samueloph.dev\/blog\/debconf24-was-fun\/","content":" <img src=\"debconf24_was_fun.webp\" alt=\"A picture of a badger2040w with\nSamuel&#x27;s badge and the curl manpage PCB on the side\" width=\"1200\" height=\"630\" loading=\"lazy\" \/>\n<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/debconf24.debconf.org\/\">DebConf24<\/a> was fun!<\/p>\n<p>A playlist of all of my talks, with subtitles (en, pt-br) and chapters is\navailable on <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/youtube.com\/playlist?list=PLKGG29PjeLnYeao03jWWH0eaRC5htIg1E&amp;si=3Hwrl5WHFFM2IaSO\">YouTube<\/a>.<\/p>\n<h1 id=\"overview\">Overview<\/h1>\n<p>DebConf24 was held in Busan, South Korea, between Sunday July 28th to Sunday August 4th 2024.<\/p>\n<p>As usual for DebConfs, I had a great time meeting my friends, but also met new\npeople and got to learn a bit about the interesting things they're working on.<\/p>\n<p>I ended up getting too excited during the talk submission stage of the\nconference and as a result I presented 5 different activities (3 talks, 1 BoF\nand 1 lightning talk).<\/p>\n<p>Since I was too busy with the presentations, I did not have a lot of time to\nactually hang out with folks, or even to go out in the city, I guess I've\nlearned my lesson for next time.<\/p>\n<p>The main purpose of this post is to write about all of the things I presented\nat the conference. I did want to list some of the interesting talks I've\nwatched, but that I would not be able to be fair as I'm sure I would miss some.<\/p>\n<p>You can get the schedule and the recordings of any talks from the conference's website:\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/debconf24.debconf.org\/schedule\/\">https:\/\/debconf24.debconf.org\/schedule\/<\/a><\/p>\n<h1 id=\"wcurl-lightning-talk\">wcurl Lightning Talk<\/h1>\n<p>The most fun of my presentations, during the second-to-last day of the\nconference, I've asked for help from Sergio Durigan Junior &lt;sergiodj&gt; to\nsetup an URL containing a whitespace and redirecting that to <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">wcurl<\/a>'s\nmanpage.<\/p>\n<p>I then did a little demo to showcase why me (and a lot others) struggle\nwith downloading things with curl, and how <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">wcurl<\/a> solves that.<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=eM8M5qa4pPM\">https:\/\/www.youtube.com\/watch?v=eM8M5qa4pPM<\/a>\n<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/eM8M5qa4pPM\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<\/p>\n<h1 id=\"fixing-cves-on-debian-everything-you-probably-know-already\">Fixing CVEs on Debian: Everything you probably know already<\/h1>\n<p>I've always felt like DebConf was missing security-related talks, so I decided\nto do something about it and presented a few of the things I've learned when\nfixing CVEs for Debian.<\/p>\n<p>This is an area where we don't get a lot of new contributors, I'm trying to\nchange that, and this talk can be used to introduce newcomers to it.<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=XzNVVILVyUM\">https:\/\/www.youtube.com\/watch?v=XzNVVILVyUM<\/a>\n<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/XzNVVILVyUM\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<\/p>\n<h1 id=\"the-secret-sauce-of-debian\">The secret sauce of Debian<\/h1>\n<p>Debian is not very vocal about all of the nice things it has regarding\nquality-assurance, testing, or CI, even though it's at the state-of-the-art for\na lot of things.<\/p>\n<p>This talk is an initial step towards making people aware of the cool\nthings happening behind the scenes. Ideally we should have it\nwell-documented somewhere.<\/p>\n<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>\n<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/x_X2IBnpjic\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<\/p>\n<h1 id=\"i-use-debian-btw-fzf-tmux-zoxide-and-friends\">\"I use Debian BTW\": fzf, tmux, zoxide and friends<\/h1>\n<p>One of my earliest good memories of Debian was when it started coming with a\ncolored PS1 by default, I still remember the feeling of relief whenever I\njumped into a Debian server and didn't have to deal with a black and white PS1.<\/p>\n<p>There's still a lot of room for Debian to ship better defaults, and I think\nsome of them can actually happen.<\/p>\n<p>This talk is a bit of a silly one where I'm just making people aware of the\nexistence of a few Golang\/Rust CLI tools, and also some dotfiles configurations\nthat should probably be the default.<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=tfto3Seokn4\">https:\/\/www.youtube.com\/watch?v=tfto3Seokn4<\/a>\n<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/tfto3Seokn4\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<\/p>\n<h1 id=\"curl\">curl<\/h1>\n<p>The curl project does such a great job with their security advisories that it\nwill likely never receive the amount of praise it deserves, but I did my best\nat mentioning it throughout my <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=XzNVVILVyUM\">CVEs talk<\/a>.<\/p>\n<p><strong>Maybe I will write more extensively about this someday, but in case I don't:<\/strong><\/p>\n<hr \/>\n<p>There's no other project which always consistently mentions the exact range of\ncommits that are affected by a given CVE.<\/p>\n<p>Forget about whether the versions are EOL, curl doesn't have LTS releases, yet\nthey do such a great job at clearly documenting their CVEs that I would take\nthat over having LTS releases anytime (that's for curl at least, I\nacknowledge some types of projects have a different need for LTS\nreleases).<\/p>\n<p>Not only that, but they are also always careful about explaining alternative\nmitigations such as configuration changes, build flags that defuse the\nexploitation, or parameters that you should not use.<\/p>\n<hr \/>\n<p>Just like we tend to do every time we meet, me and the other Debian curl\nmaintainers spent the first 2 or 3 days of the conference talking about how we\nwanted to eventually meet up to discuss the package.<\/p>\n<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\nparty<\/a>, but then\nI've realized we should make it part of the official schedule, which would\nalso give us the recordings for later.<\/p>\n<p>And so the \"curl maintainers BoF\" happened, where we spoke about HTTP3,\nGnutTLS, <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">wcurl<\/a> and other things.<\/p>\n<p><a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=fL7hSypUTdM\">https:\/\/www.youtube.com\/watch?v=fL7hSypUTdM<\/a>\n<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/fL7hSypUTdM\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<\/p>\n<h1 id=\"wcurl\">wcurl<\/h1>\n<p>Right after that BoF, Daniel Stenberg\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/mail\/archive-2024-08\/0000.html\">asked<\/a> if we were interested\nin having <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">wcurl<\/a> adopted into curl, which we\ndefinitely 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\nproject<\/a>.<\/p>\n<p>Daniel was also kind enough to design a logo for the project, which makes me\nespecially happy because I can stop with my own approach at a logo (which I had\nto redo every few days):<\/p>\n <img src=\"wcurl_draft_logo.webp\" alt=\"A laptop with a curl and a GoHorse\nsticker, there&#x27;s a &#x27;w&#x27; handwritten with a marker on the right side of the curl\nsticker, making it &#x27;wcurl&#x27;\" width=\"700\" height=\"699\" loading=\"lazy\" \/>\n<p>And here is the new logo:<\/p>\n <img src=\"wcurl_logo.svg\" alt=\"&#x27;wcurl&#x27; written with the same font and\ncolors as the curl logo, with the &#x27;w&#x27; being green instead of blue, and a\ndownload icon at the end\" width=\"998\" height=\"250\" loading=\"lazy\" \/>\n<p>Much better, I would say :)<\/p>\n<h1 id=\"curl-swag\">curl Swag<\/h1>\n<p>DebConf24 was my chance at forwarding some curl swag items to the other\ncurl maintainers, so both Sergio Durigan Junior &lt;sergiodj&gt; and Carlos\nHenrique 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\nt-shirt<\/a>\nand the very cool <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/daniel.haxx.se\/blog\/2023\/11\/03\/curl-coasters\/\">curl PCB\ncoaster<\/a>, both gifted\nby Daniel Stenberg.<\/p>\n<p>Unfortunately I didn't have any of that for DebConf attendees, but I did drop\nloads of curl stickers at the stickers table, they were gone very quickly.<\/p>\n <img src=\"debconf24_curl_stickers.webp\" alt=\"A table full of different\nstickers, curl stickers can be seen over the whole table\" width=\"450\" height=\"800\" loading=\"lazy\" \/>\n<h1 id=\"for-the-future\">For the future<\/h1>\n<p>I used to think the most humbling experience you could have as someone who presented\na talk was to have to watch it yourself, you notice a lot of mistakes and\nyou instantly think about things that should be done differently.<\/p>\n<p>It turns out the most humbling thing to do is actually to write subtitles for\nyour talks, I noticed every single mistake, often multiple times.<\/p>\n<p>So after spending more than 30 hours writing the subtitles for both English and\nBrazilian Portuguese for my talks, I feel like it's going to be much easier to\navoid committing the same mistakes again. After some time you stop feeling shame\nabout those mistakes and you're just left with feelings of annoyance, and at\nthat point it becomes easier to consciously avoid them.<\/p>\n<p>I am collecting a list of things I wish I had done differently on all of those\ntalks, so if I end up presenting any one of them again, it will be an improved\nversion.<\/p>\n<p> <img src=\"debconf24_group_photo.webp\" alt=\"A picture from the top of a\ngroup of conference attendees, there&#x27;s about 150 people in the picture\" width=\"1484\" height=\"1024\" loading=\"lazy\" \/>\n\nPhotography: Aigars Mahinovs &lt;aigaruius@debian.org&gt;<br \/>\nLicense: CC-BYv3+ or GPLv2+<\/p>\n"},{"title":"Debian's curl now supports HTTP\/3","published":"2024-07-04T00:00:00+00:00","updated":"2024-07-04T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/debian-curl-now-supports-http3\/"}},"id":"https:\/\/samueloph.dev\/blog\/debian-curl-now-supports-http3\/","content":"<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p>Starting with <strong>curl 8.0.0-2<\/strong>, you can now use HTTP\/3.<\/p>\n<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>\n<p>Or, if you would like to try it out in a container:<\/p>\n<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>\n<p><em>(in case you haven't noticed, apt now has the <code>--update<\/code> option for the\n<code>upgrade<\/code> and <code>install<\/code> commands)<\/em><\/p>\n<h5 id=\"availability\">Availability<\/h5>\n<ul>\n<li>Debian unstable - Since 2024-07-02<\/li>\n<li>Debian testing - Since 2024-07-18<\/li>\n<li>Debian 13 - Since its initial release.<\/li>\n<li>Debian 12\/bookworm-backports - Since 2024-08-25<\/li>\n<li>Debian 12\/bookworm - Due to the mechanisms we have in place to make sure\nDebian stable is in fact stable, we will never be able to ship this in the\nregular repository. Users can make use of the\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/backports.debian.org\/\">backports<\/a> repositories instead.<\/li>\n<li>Debian derivatives - Rolling releases will get it by the time it's on Debian\ntesting (e.g.: Kali Linux). Stable derivatives only in their next major release.<\/li>\n<\/ul>\n<h1 id=\"the-challenge\">The challenge<\/h1>\n<p>HTTP\/3 is fresh new, well... not really, but at least fresh enough that I'm not\naware of any other Linux distribution supporting it on curl, the reason is\nlikely two-fold:<\/p>\n<ol>\n<li><h3 id=\"openssl-is-not-there-yet\">OpenSSL is not there yet<\/h3>\n<p>OpenSSL still doesn't have proper HTTP\/3 support, and given that OpenSSL is so\nwidely used, almost every curl distributor\/packager will build curl with it\nand thus changing the TLS backend to something else is risky.<\/p>\n<p>Unfortunately, proper support for the OpenSSL libcurl is unlikely to come anytime\nbefore 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\nyet as of version 3.3<\/a>.<\/p>\n<p>Daniel Stenberg has written about the state of this multiple times, most\nrecently 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\n2024<\/a>, if\nyou're interested, I suggest reading through his other posts as well.<\/p>\n<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>,\nalthough when you look closely, it's not exactly perfect:<\/p>\n<blockquote>\n<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>\n<\/blockquote>\n<p>As you can see, they don't recommend using OpenSSL, and when doing so, you don't get complete support.<\/p>\n<p>Update (October 2025): OpenSSL's HTTP\/3 support has since matured enough\nthat curl 8.16.0-2 switched the Debian curl CLI back to the OpenSSL backend,\nbefore the Debian 13\/trixie freeze.<\/p>\n<\/li>\n<li><h3 id=\"http-3-support-for-gnutls-nghttp3-ngtcp2-is-recent\">HTTP\/3 support for GnuTLS\/nghttp3\/ngtcp2 is recent<\/h3>\n<p>The non-experimental support arrived <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/github.com\/curl\/curl\/commit\/5f78cf503c786a1d48d13528dde038bccfa6c67c\">back in October\n2023<\/a>,\nand so that's when I started seriously planning for this.<\/p>\n<p>curl has been working on HTTP\/3 support for years, and so it did support other\nTLS backends before that, but out of them, the one most feasible for a\ndistribution 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\nnghttp3<\/a>.<\/p>\n<\/li>\n<\/ol>\n<h1 id=\"how-it-was-done\">How it was done<\/h1>\n<p>The Debian curl package has historically shipped at least two variants of libcurl, an\nOpenSSL and a GnuTLS one.<\/p>\n<p>The OpenSSL libcurl couldn't support HTTP\/3 at the time for the reasons\nexplained above, but the GnuTLS libcurl can (with ngtcp2 and nghttp3).<\/p>\n<p>Debian packages can choose which version of libcurl to link against (without\nhaving to modify any upstream source code). Debian's \"git\" package being a famous\nexample of a package that links against the GnuTLS libcurl.<\/p>\n<p>Enabling HTTP\/3 on curl was done in three steps:<\/p>\n<ol>\n<li>Make sure all required dependencies fulfill the minimum requirements.<\/li>\n<li>Enable HTTP\/3 for GnuTLS libcurl.<\/li>\n<li>Change the libcurl used by the curl CLI, from OpenSSL to GnuTLS.<\/li>\n<\/ol>\n<p>curl's HTTP\/3 support requires a somewhat recent version of nghttp3 and\nupdating 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\nhad 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\ntransition<\/a>.<\/p>\n<p>After the dependencies were in place, enabling HTTP\/3 for the GnuTLS libcurl was\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/salsa.debian.org\/debian\/curl\/-\/commit\/51df321b0165e5164a0d898d23a64ca3bbd553c0\">straightforward<\/a>.<\/p>\n<p>Then, for the last part, we had to switch the TLS backend used by the curl CLI.\nDoing the swap is also <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/salsa.debian.org\/debian\/curl\/-\/commit\/37820dad3612d1b13a9fb9550b1726b998c80cfc\">quite\neasy<\/a>\non the packaging level, but we have to consider the chances of this change\nbreaking our users' environments.<\/p>\n<h4 id=\"update-october-2025-switching-back-to-openssl\">Update (October 2025): Switching back to OpenSSL<\/h4>\n<p>Once OpenSSL's HTTP\/3 support was stable and performant enough, the temporary\narrangement with the GnuTLS backend had served its purpose. In October 2025,\nbefore the freeze for Debian 13\/trixie, curl 8.16.0-2 switched the curl CLI\nback to the OpenSSL backend, now built with HTTP\/3 support enabled directly.<\/p>\n<p>The GnuTLS libcurl continues to be shipped and supports HTTP\/3 as before; this\nchange only affects which backend the curl CLI binary itself links against.<\/p>\n<h1 id=\"ensuring-there-are-no-breakages\">Ensuring there are no breakages<\/h1>\n<p>The first thing to consider regarding breakages is that this change is not\ngoing to be pushed directly to the current Debian stable releases, it will be\npresent in the next stable release (13\/trixie) but the current one will stick to the\nversion that's already shipped.<\/p>\n<p>Secondly, we have to consider the risk of losing the ability to use certain\nparameters from the curl CLI which could be limited to the OpenSSL backend.\nDuring <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\nthat 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\nwith<\/a>.<\/p>\n<p>Analysing that page, ignoring all of the options that are suffixed with \"BLOB\"\n(only pertinent to the library, not the CLI), the only one left which is\nattention worthy is <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/libcurl\/c\/CURLOPT_ECH.html\">CURLOPT_ECH<\/a>.<\/p>\n<blockquote>\n<p>This experimental feature requires a special build of OpenSSL, as ECH is not\nyet supported in OpenSSL releases. In contrast ECH is supported by the latest\nBoringSSL and wolfSSL releases.<\/p>\n<\/blockquote>\n<p>As it turns out, <code>Encrypted Client Hello<\/code> is experimental and it's not\nsupported by the vanilla OpenSSL.<\/p>\n<p>This was enough of an investigation for me to go ahead with the change. Noting\nthat even in the worst case scenario (we find a horrible regression), we can\nrollback without having affected a single stable release.<\/p>\n<p>Now that the package is on Debian unstable, the CI tests (autopkgtest) of every\npackage that depends on curl is currently running, the results are compared\nagainst the migration-reference (in this case, the curl CLI with OpenSSL,\nbefore the change).<\/p>\n<p>If everything goes right, curl with HTTP\/3 support will migrate to Debian\ntesting in around 5 days. If we spot any issues, we'll have to solve them\nfirst and it's going to be hard to predict how long it takes, although it's\nfair to expect less than a month.<\/p>\n<p>Update (October 2025): Debian 13\/trixie ultimately shipped with the OpenSSL\nbackend instead, following the switch in curl 8.16.0-2 before the freeze.<\/p>\n<h1 id=\"feedback\">Feedback<\/h1>\n<p>Feel free to join the Matrix room for the Debian curl maintainers:<br \/>\n<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>\n<h1 id=\"acknowledgements\">Acknowledgements<\/h1>\n<p>It took us a bit longer than expected to be able to enable HTTP\/3, nonetheless it's\nstill early enough to be excited about.<\/p>\n<p>A lot of people were crucial to make this happen.<\/p>\n<p>I should recognize in the first place, obviously, the curl developers and the\ndevelopers of the supporting libraries: GnuTLS, nghttp3, ngtcp2. Participating\nin the <a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/daniel.haxx.se\/blog\/2024\/05\/06\/i-survived-curl-up-2024\/\">curl-up\n2024<\/a>\nconference helped me get motivated to push this through, besides becoming aware\nof the right documentation to research for impact.<\/p>\n<p>On the Debian side, Sakirnth Nagarasa &lt;sakirnth&gt; was responsible for updating\nand taking care of the transition for nghttp3 and ngtcp2.<\/p>\n<p>Also on the Debian side, I've got loads of help and support from the\nco-maintainers of the curl package: Sergio Durigan Junior &lt;sergiodj&gt; and Carlos\nHenrique Lima Melara &lt;charles&gt;.<\/p>\n<h1 id=\"changes-since-publication\">Changes since publication<\/h1>\n<h2 id=\"2026-04-02\">2026-04-02<\/h2>\n<ul>\n<li>Correct spelling of HTTP\/3.<\/li>\n<li>Add note to explain that curl is back to using OpenSSL: OpenSSL's HTTP\/3\nsupport matured sufficiently by October 2025, and curl 8.16.0-2 switched\nthe Debian curl CLI back to the OpenSSL backend before the Trixie freeze.\nUpdated the OpenSSL challenge section, the \"How it was done\" section, and\nthe breakages section to reflect this.<\/li>\n<\/ul>\n<h2 id=\"2025-03-08\">2025-03-08<\/h2>\n<ul>\n<li>Fix podman command, the previous one was not running all commands inside the container.<\/li>\n<li>Change the podman command to use Debian testing instead of unstable.<\/li>\n<\/ul>\n<h2 id=\"2024-08-28\">2024-08-28<\/h2>\n<ul>\n<li>Mention availability in bookworm-backports.<\/li>\n<\/ul>\n<h2 id=\"2024-07-18\">2024-07-18<\/h2>\n<ul>\n<li>Update date of availability for Debian testing and expected date for bookworm-backports.<\/li>\n<li>Remove mention of language spoken in the Matrix room, we are using English now.<\/li>\n<\/ul>\n"},{"title":"Announcing wcurl: a curl wrapper to download files","published":"2024-07-03T00:00:00+00:00","updated":"2024-07-03T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/announcing-wcurl-a-curl-wrapper-to-download-files\/"}},"id":"https:\/\/samueloph.dev\/blog\/announcing-wcurl-a-curl-wrapper-to-download-files\/","content":"<div class=\"yv\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/eM8M5qa4pPM\" title=\"Youtube\" class=\"yvi\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe>\n<\/div>\n<h4 id=\"tl-dr\">tl;dr<\/h4>\n<p>Whenever you need to download files through the terminal and don't feel like using wget:<\/p>\n<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>\n<p>Manpage:<br \/>\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/manual.html\">https:\/\/curl.se\/wcurl\/manual.html<\/a><\/p>\n<h5 id=\"availability-comes-installed-with-the-curl-package\">Availability (comes installed with the curl package):<\/h5>\n<ul>\n<li>Debian unstable - Since 2024-07-02<\/li>\n<li>Debian testing - Since 2024-07-18<\/li>\n<li>Debian 12\/bookworm-backports - Since 2024-08-25<\/li>\n<li>Debian 12\/bookworm - Due to the way changes are planned for Debian Stable,\nwcurl will not be present in bookworm. Users are recommended to either manually\ndownload wcurl or use the bookworm-backports repository. wcurl will be present\nin Debian 13\/trixie.<\/li>\n<li>Debian derivatives - Rolling releases will get it by the time it's on Debian\ntesting (e.g.: Kali Linux). Stable derivatives only in their next major release.<\/li>\n<\/ul>\n<p>If you don't want to wait for the package update to arrive, you can always copy\nthe script and place it in your <code>\/usr\/bin<\/code>:<\/p>\n<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>\n<span class=\"giallo-l\"><span style=\"color: #FABD2F;\">chmod<\/span><span style=\"color: #B8BB26;\"> +x wcurl<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: #FABD2F;\">sudo<\/span><span style=\"color: #B8BB26;\"> mv wcurl \/usr\/bin\/wcurl<\/span><\/span><\/code><\/pre>\n<p>After this announcement, wcurl has joined the curl organization:<br \/>\n<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>\n<p>Project homepage:<br \/>\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/curl.se\/wcurl\/\">https:\/\/curl.se\/wcurl\/<\/a><\/p>\n<h1 id=\"smoother-cli-experience\">Smoother CLI experience<\/h1>\n<p>Starting with <strong>curl version 8.8.0-2<\/strong>, the Debian's curl package now ships a wcurl\nexecutable.<\/p>\n<p>wcurl is the solution for those who just need to download files without having\nto remember curl's parameters for things like automatically naming the files.<\/p>\n<p>Some people, myself included, would fall back to using wget whenever there was a\nneed to download a file. Sometimes even installing wget just for that usecase.\nAfter all, it's easier to remember \"apt install wget\" rather than \"curl -L -O -C - ...\".<\/p>\n<p>wcurl consists of a simple shell script that provides sane defaults for the curl\ninvocation, for when the use case is to just download files.<\/p>\n<p>By default, wcurl will:<\/p>\n<blockquote>\n<ul>\n<li>Percent-encode whitespaces in URLs;<\/li>\n<li>Download multiple URLs in parallel if the installed curl's version is &gt;= 7.66.0;<\/li>\n<li>Follow redirects;<\/li>\n<li>Automatically choose a filename as output;<\/li>\n<li>Avoid overwriting files if the installed curl's version is &gt;= 7.83.0 (--no-clobber);<\/li>\n<li>Perform retries;<\/li>\n<li>Set the downloaded file timestamp to the value provided by the server, if available;<\/li>\n<li>Disable curl's URL globbing parser so {} and [] characters in URLs are not treated specially;<\/li>\n<li>Percent-decode the resulting filename;<\/li>\n<li>Use \"index.html\" as default filename if there's none in the URL.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Example to download a single file:<\/p>\n<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>\n<p>If you ever need to set a custom flag, you can make use of the <code>--curl-options<\/code>\nwcurl option, anything set there will be passed to the curl invocation.\nJust beware that if you need to set any custom flags, it's likely you will be\nbetter served by calling curl directly. The <code>--curl-options<\/code> option is there to\nallow for some flexibility in unforeseen circumstances.<\/p>\n<h1 id=\"the-need-for-wcurl\">The need for wcurl<\/h1>\n<p>I've always felt a bit ashamed of not remembering curl's parameters for\ndownloading a file and automatically naming it, having resorted to wget most of\nthe times this was needed (even installing wget when it wasn't there, just for\nthis). I've spoken to a few other experienced people I know and confirmed what\ncould be obvious to others: a lot of people struggle with this.<\/p>\n<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\nsurvey<\/a>, which\nalso showed this is as a much needed feature, just look at some of the answers:<\/p>\n<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>\n<blockquote>\n<p>-O, I really want wget like functionality where I don't have to specify the name<\/p>\n<\/blockquote>\n<blockquote>\n<p>Downloading a file (like wget) could be improved - with automatic naming of the file<\/p>\n<\/blockquote>\n<blockquote>\n<p>downloading files - wget is much cleaner<\/p>\n<\/blockquote>\n<blockquote>\n<p>I wish the default behaviour when GETting a binary was to drop it on disk. That's the only\nreason 'wget foo.tgz\" is still ingrained in my muscle memory .<\/p>\n<\/blockquote>\n<blockquote>\n<p>Maybe have a way to download without specifying something in -o (the only reason i used wget\nstill)<\/p>\n<\/blockquote>\n<blockquote>\n<p>--remote-time should be default<\/p>\n<\/blockquote>\n<blockquote>\n<p>--remote-name-all could really use a short flag<\/p>\n<\/blockquote>\n<h4 id=\"q-if-you-miss-support-for-something-tell-us-what\">Q: If you miss support for something, tell us what!<\/h4>\n<blockquote>\n<p>\"Write the data to the file named in the URL (or in redirects if I'm feeling daring), and\ntimestamp the file to the last-modified-date\". This is the main reason I'm still using wget.<\/p>\n<\/blockquote>\n<p>I can finally feel less bad about falling back to wget due to not remembering the\nparameters I want.<\/p>\n<h1 id=\"idealization-vs-reality\">Idealization vs. reality<\/h1>\n<p>I don't believe curl will ever change its default behavior in such a way that\nwould accommodate this need, as that would have a side-effect of breaking things\nwhich expect the current behavior (the blast radius is literally the\n<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>\n<p>This means a new executable needs to be shipped side-by-side with curl, an\nopportunity to start fresh and work with a more focused use case (to download\nfiles).<\/p>\n<p>Ideally, this new executable would be maintained by the curl project, make use\nof libcurl under-the-hood, and be available everywhere. Nobody wants to worry\nif their systems have the tool or not, it should always be there.<\/p>\n<p>Given I'm just a Debian Developer, with not as much free time as I wish, I've\ndecided to write a simple shell script wrapper calling the curl CLI\nunder-the-hood.<\/p>\n<p>wcurl will come installed with the curl package from now on, and I will check\nwith the release team about shipping it on the current Debian stable as well.\nShipping wcurl in other distros will be up to them (Debian-derivatives should\npick it up automatically, though).<\/p>\n<p>We've tried to make it easy for anyone to ship this by using the curl license,\nkeeping 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>\n<p>Maybe if there's enough interest across distributions, someone might sign up\nfor implementing this in upstream curl and increase its reach. I would be happy\nwith the curl project reusing the wcurl name when that happens. It's unlikely\nthat wcurl would be shipped by curl upstream as it is, assuming they would\nprefer a solution that uses libcurl direclty (more similar to curl the CLI, to\nmaintain).<\/p>\n<p>In the worst case, wcurl becomes a Debian-specific tool that only a few people\nare aware of, in the best case, it becomes the new go-to CLI tool for simply\ndownloading files. I would be happy if at least someone other than me finds\nit useful.<\/p>\n<h1 id=\"naming-is-hard\">Naming is hard<\/h1>\n<p>When I started working on it, I was calling the new executable \"curld\"\n(stands for \"curl download\"), but then when discussing this in one of our\nweekly calls in the Debian Bras\u00edlia community, it was mentioned that this could\nbe confused for a daemon.<\/p>\n<p>We then settled for the name \"wcurl\", suggested by Carlos Henrique Lima\nMelara &lt;charles&gt;. It doesn't really stand for anything,\nbut it's very easy to remember.<\/p>\n<p>You know... \"it's that wget alternative for when you want to use curl instead\"\n:)<\/p>\n<h1 id=\"feedback\">Feedback<\/h1>\n<p>The code is hosted in GitHub, feel free to open an issue to provide feedback.<br \/>\n<a rel=\"noopener external\" target=\"_blank\" href=\"https:\/\/github.com\/curl\/wcurl\">https:\/\/github.com\/curl\/wcurl<\/a><\/p>\n<p>We also have a Matrix room for the Debian curl maintainers:<br \/>\n<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>\n<h1 id=\"acknowledgments\">Acknowledgments<\/h1>\n<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\n2024<\/a>.\nI've been thinking a lot about developer productivity in the terminal lately,\ndifferent tools and better defaults. Before curl-up, I was also thinking about\npackaging improvements for the curl package. I don't remember what exactly\nhappened, but I likely had to download something and felt a bit ashamed of\nmaintaining curl and not remembering the parameters to download files the way I\nwanted.<\/p>\n<p>I first discussed this idea in the conference, where I asked the\nparticipants about it and there were no concerns raised, and some people said I should give it a go.\nParticipating in curl-up was a really great experience and I'm thankful for the\ninteractions I've had there.<\/p>\n<p>On the Debian side, I've got reviews of the code and manpage by Sergio Durigan\nJunior &lt;sergiodj&gt;, Guilherme Puida Moreira &lt;puida&gt; and Carlos Henrique Lima\nMelara &lt;charles&gt;. Sergio ended up rewriting the tool to be POSIX-compliant (my\nversion was written in bash), so he takes all the credit for the portability.<\/p>\n<h1 id=\"changes-since-publication\">Changes since publication<\/h1>\n<h2 id=\"2025-01-19\">2025-01-19<\/h2>\n<ul>\n<li>Mention that wcurl will not be added to Debian 12\/bookworm, it will be\npresent in Debian 13\/trixie.<\/li>\n<\/ul>\n<h2 id=\"2024-12-14\">2024-12-14<\/h2>\n<ul>\n<li>Update list of wcurl features.<\/li>\n<li>Point out to wcurl homepage and mention that it's now part of curl.<\/li>\n<li>Reorder this changelog to have latest changes on top.<\/li>\n<\/ul>\n<h2 id=\"2024-08-28\">2024-08-28<\/h2>\n<ul>\n<li>Mention availability in bookworm-backports.<\/li>\n<li>Link to wcurl lightning talk from DebConf24.<\/li>\n<\/ul>\n<h2 id=\"2024-07-18\">2024-07-18<\/h2>\n<ul>\n<li>Update date of availability for Debian testing and expected date for bookworm backports.<\/li>\n<li>Mention charles as the person who suggested \"wcurl\" as a name.<\/li>\n<li>Update wcurl's -o\/--opts options, it's now just --curl-options.<\/li>\n<li>Remove mention of language spoken in the Matrix room, we are using English now.<\/li>\n<li>Update list of features of wcurl.<\/li>\n<\/ul>\n"},{"title":"Hello World","published":"2024-04-18T00:00:00+00:00","updated":"2024-04-18T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/samueloph.dev\/blog\/hello-world\/"}},"id":"https:\/\/samueloph.dev\/blog\/hello-world\/","content":"<p>This is my very first post, just to make sure everything is working as expected.<\/p>\n<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>\n"}]}