<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://dirkjan.ochtman.nl/writing/">
	<title>Dirkjan Ochtman</title>
	<subtitle>writing</subtitle>
	<link href="https://dirkjan.ochtman.nl/writing/" rel="alternate"/>
	<link href="https://dirkjan.ochtman.nl/writing/atom.xml" rel="self"/>
	<id>https://dirkjan.ochtman.nl/writing/</id>
	<updated>2026-08-13T00:00:00+02:00</updated>
	<author>
		<name>Dirkjan Ochtman</name>
	</author>
	<entry>
		<title>OxiSH: a modern, memory-safe SSH server</title>
		<link href="https://dirkjan.ochtman.nl/writing/2026/08/13/announcing-oxish.html" rel="alternate"/>
		<id>tag:dirkjan.ochtman.nl,2026-08-13:/writing/2026/08/13/announcing-oxish.html</id>
		<published>2026-08-13T00:00:00+02:00</published>
		<updated>2026-08-13T00:00:00+02:00</updated>
		<content type="html">&lt;p&gt;I'm happy to announce &lt;a href=&quot;https://github.com/djc/oxish&quot;&gt;OxiSH&lt;/a&gt;, a modern, memory-safe SSH server
that I've been working on for 20 months. OxiSH is written in Rust, with a safe
&lt;a href=&quot;https://sans-io.readthedocs.io/&quot;&gt;sans-I/O&lt;/a&gt; protocol core and an abstraction for the underlying
cryptography primitives.&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why?&lt;/h2&gt;
&lt;p&gt;Many large organizations have shown that up to 70% of security vulnerabilities in software written in C and C++
happen due to memory safety issues (&lt;a href=&quot;https://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-systems-programming-language/&quot;&gt;Microsoft&lt;/a&gt;,
&lt;a href=&quot;https://security.googleblog.com/2019/05/queue-hardening-enhancements.html&quot;&gt;Google&lt;/a&gt;). In the US,
government agencies have been &lt;a href=&quot;https://media.defense.gov/2025/Jun/23/2003742198/-1/-1/0/CSI_MEMORY_SAFE_LANGUAGES_REDUCING_VULNERABILITIES_IN_MODERN_SOFTWARE_DEVELOPMENT.PDF&quot;&gt;advocating&lt;/a&gt;
for the use of memory-safe programming languages for a few years now. The &lt;a href=&quot;https://www.memorysafety.org/about/&quot;&gt;Prossimo&lt;/a&gt; project
lists three risk criteria to help prioritize where memory safety is most important:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Very widely used (nearly every server and/or client)&lt;/li&gt;
&lt;li&gt;On a security boundary&lt;/li&gt;
&lt;li&gt;Performing a critical function&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SSH servers meet all three of these criteria.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.openssh.org/&quot;&gt;OpenSSH&lt;/a&gt; is the predominant implementation; it's written in C and has
been around for decades. It continues to suffer from memory safety issues to this day. I started
OxiSH because I think it's worth investing in a memory-safe alternative.&lt;/p&gt;
&lt;h2 id=&quot;what-s-been-done&quot;&gt;What's been done?&lt;/h2&gt;
&lt;p&gt;Before starting on OxiSH, I spent some time looking for existing SSH implementations in Rust that
could help me bring this idea to life sooner. In particular, I looked at &lt;a href=&quot;https://github.com/Eugeny/russh&quot;&gt;russh&lt;/a&gt;
which seems to be fairly popular. However, I noticed that it implements some old crypto primitives
and seems to have a fairly monolithic design, so I decided to start from scratch instead.&lt;/p&gt;
&lt;p&gt;Although I could keep working on OxiSH in (semi-) stealth mode, I think it's now in a
good enough state to announce publicly. That does not mean it is ready for production usage, and
there are a bunch of limitations (see below). This is a starting point, looking for feedback and
contributions from other folks; I will soon start dogfooding this on my own server as well.&lt;/p&gt;
&lt;p&gt;I have a Tokio-based async networking server with a sans-I/O SSH protocol core, public key
authentication support (with Ed25519 and ECDSA P-256 keys only), and a basic shell implementation
that can spawn a child process and connect it to the SSH session. It gets tested on Linux and macOS
against OpenSSH clients in CI. &lt;a href=&quot;https://github.com/djc/oxish/issues/252&quot;&gt;Windows support&lt;/a&gt; would be
nice but will require someone else to step in. There is no client implementation yet, and I currently
don't have plans to work on that, but the sans-I/O core could well be used to enable it. Beyond the
low-level sans-I/O API, there's also a (currently small) library API to enable reuse.&lt;/p&gt;
&lt;p&gt;Cryptographic primitives are implemented with two different backends, graviola and aws-lc-rs.
Cargo features can be used to select which backend is used at compile time; &lt;a href=&quot;https://github.com/ctz/graviola&quot;&gt;graviola&lt;/a&gt;, the default,
is easier to build but only works on x86-64 and ARM64, while &lt;a href=&quot;https://github.com/aws/aws-lc-rs&quot;&gt;aws-lc-rs&lt;/a&gt; is more portable, should
be slightly more efficient, and can be compiled in FIPS mode on Linux. It implements hybrid
post-quantum key exchange using the &lt;code&gt;mlkem768x25519-sha256&lt;/code&gt; algorithm, and &lt;code&gt;curve25519-sha256&lt;/code&gt;
is supported for key exchange as a fallback algorithm for older clients. Ed25519 and
&lt;code&gt;ecdsa-sha2-nistp256&lt;/code&gt; are the only supported public key algorithms, AES-128-GCM is the only
supported encryption algorithm and SHA-256 is the only supported hash algorithm. It should be
fairly easy to add other algorithms that are supported by the underlying backends, but I'd like
to keep the set as small as possible to reduce attack surface.&lt;/p&gt;
&lt;p&gt;I have made an effort to review historic OpenSSH vulnerabilities to make sure both the design and
implementation of OxiSH avoid similar mistakes outside the memory-safety realm. I would like to pay
for an external audit of the codebase in the future, but I'm unlikely to be able to fund that work myself.&lt;/p&gt;
&lt;p&gt;Here are some of the more obvious missing features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No &lt;a href=&quot;https://github.com/djc/oxish/issues/251&quot;&gt;agent forwarding&lt;/a&gt;, let alone other kinds of forwarding&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;sftp&lt;/code&gt; &lt;a href=&quot;https://github.com/djc/oxish/issues/251&quot;&gt;support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No &lt;a href=&quot;https://github.com/djc/oxish/issues/253&quot;&gt;password authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full feature (or even bug for bug compatibility) with OpenSSH is explicitly not a goal of this project,
but I'd like to hear more about what people would need to see to replace OpenSSH in their environment.
Please file an issue!&lt;/p&gt;
&lt;h2 id=&quot;who-have-been-involved&quot;&gt;Who have been involved?&lt;/h2&gt;
&lt;p&gt;I wrote most of the code, and I have reviewed all of it in great detail. I have more than
10 years of experience writing Rust code, and have been maintaining some popular network protocol
projects for the last few years, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rustls.dev/&quot;&gt;rustls&lt;/a&gt;, a widely used TLS library in Rust&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn&quot;&gt;Quinn&lt;/a&gt;, a popular implementation of the QUIC protocol in Rust&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns&quot;&gt;Hickory DNS&lt;/a&gt;, a DNS implementation in Rust&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a few weeks earlier this year, I was fortunate to get help from the fine folks at the &lt;a href=&quot;https://trifectatech.org/&quot;&gt;Trifecta
Tech Foundation&lt;/a&gt;, who were able to get an investment from the &lt;a href=&quot;https://www.sovereign.tech/&quot;&gt;Sovereign
Tech Agency&lt;/a&gt; to help figure out some of the core platform interactions
in the server, including an initial draft of privilege separation and terminal handling. We hope
to continue our collaboration on this project in the future.&lt;/p&gt;
&lt;h2 id=&quot;where-to-from-here&quot;&gt;Where to from here?&lt;/h2&gt;
&lt;p&gt;As mentioned above, this is just a starting point. Please &lt;a href=&quot;https://github.com/djc/oxish/issues&quot;&gt;leave feedback&lt;/a&gt;
and/or contribute PRs directly (but please check out the &lt;a href=&quot;https://github.com/djc/oxish/blob/main/CONTRIBUTING.md&quot;&gt;contributing guidelines&lt;/a&gt;
including AI policy before jumping in). If you want to support my work on OxiSH and other projects, please
consider &lt;a href=&quot;https://github.com/sponsors/djc&quot;&gt;sponsoring me&lt;/a&gt;. If you want to get in touch privately, my email
address should be easy to find from my website.&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Rust maintenance in 2025</title>
		<link href="https://dirkjan.ochtman.nl/writing/2026/01/09/reviewing-2025.html" rel="alternate"/>
		<id>tag:dirkjan.ochtman.nl,2026-01-09:/writing/2026/01/09/reviewing-2025.html</id>
		<published>2026-01-09T00:00:00+01:00</published>
		<updated>2026-01-09T00:00:00+01:00</updated>
		<content type="html">&lt;p&gt;It has been 15 months since I left my job at a startup and decided to work on improving open
source Rust software going forward. I started out trying to write &lt;a href=&quot;https://dirkjan.ochtman.nl/writing/2025/01/21/october-2024-on-github.html&quot;&gt;monthly updates&lt;/a&gt;, but that proved
too time-consuming. Instead, here's a summary of what I worked on in 2025,
and what I want to do in 2026.&lt;/p&gt;
&lt;p&gt;While substantial parts of this work have been paid for (particularly for rustls and Hickory DNS),
a lot of what I do ends up being fairly invisible maintenance work; fixing bugs, keeping
dependencies up to date to avoid duplicate dependencies, and so forth. I'm grateful for everyone
who has supported my work through &lt;a href=&quot;https://github.com/sponsors/djc&quot;&gt;GitHub Sponsors&lt;/a&gt; or
&lt;a href=&quot;https://thanks.dev&quot;&gt;thanks.dev&lt;/a&gt;, and hope that organizations that benefit from my work will
consider sponsoring me in 2026.&lt;/p&gt;
&lt;h2 id=&quot;rust-project&quot;&gt;Rust Project&lt;/h2&gt;
&lt;p&gt;rustup is gearing up for a &lt;a href=&quot;https://blog.rust-lang.org/inside-rust/2025/12/20/rustup-1.29.0-beta-cft/&quot;&gt;1.29 release&lt;/a&gt;
soon, which contains some nice UX improvements started by &lt;a href=&quot;https://blog.rust-lang.org/2025/11/18/gsoc-2025-results/#make-rustup-concurrent&quot;&gt;Francisco Gouveia&lt;/a&gt; which I contributed to.
After changing the default backend to reqwest with rustls in 1.28, I worked on making it even more robust.
I continued simplifying the codebase; after about 15 months and 460 commits, I have so far removed more code
than I've added.&lt;/p&gt;
&lt;p&gt;Early in the year I became a RustSec maintainer after noticing that the RustSec project
seemed to be slowing down due to a lack of active maintainers. Since then I've reviewed 125
advisories (many of which have been merged), as well as submitting 30 PRs to improve rustsec
crates like cargo-audit and the underlying rustsec library crate which is also used by cargo-deny.&lt;/p&gt;
&lt;p&gt;Via my work on RustSec, I started contracting with the Rust Foundation to work on a
&lt;a href=&quot;https://rust-lang.github.io/rfcs/3872-crates-io-security.html&quot;&gt;security tab for crates.io&lt;/a&gt;.
I wrote the RFC and started the implementation work, an early version of which has been deployed.
I will continue by adding some more advisory metadata on the crates.io pages.&lt;/p&gt;
&lt;h2 id=&quot;rustls&quot;&gt;rustls&lt;/h2&gt;
&lt;p&gt;The ISRG (through its &lt;a href=&quot;https://www.memorysafety.org/&quot;&gt;Prossimo&lt;/a&gt; project) has been
funding much of my rustls work in 2025. I worked on improving &lt;a href=&quot;https://www.memorysafety.org/blog/rustls-error-handling/&quot;&gt;error handling&lt;/a&gt; to make it easier to troubleshoot
errors as well as &lt;a href=&quot;https://github.com/rustls/rustls/releases/tag/rustls-post-quantum-v%2F0.2.4&quot;&gt;(experimental) support&lt;/a&gt;
for post-quantum secure ML-DSA signature algorithms.&lt;/p&gt;
&lt;p&gt;In July we branched off 0.23.x to start work on &lt;a href=&quot;https://github.com/rustls/rustls/issues/2400&quot;&gt;0.24&lt;/a&gt;,
which is focused on stabilizing the API. In particular, I spent a bunch of time on the identity
verification and resolution API as well as moving the first-party crypto providers out of the
main crate. We also have plans to introduce a lower-level API, which will hopefully allow
more efficient integrations for downstream users. rustls is currently the 56th most
downloaded crate (in the last 90 days) -- after many years of contributing to rustls, I'm still
excited by the prospect of making networking on the public internet safer and faster at the same time.&lt;/p&gt;
&lt;p&gt;Outside of funded work, I worked on improving the rcgen crate that can be used to generate
X.509 certificates (which are what TLS uses for authentication). In July, we released &lt;a href=&quot;https://github.com/rustls/rcgen/releases/tag/v0.14&quot;&gt;0.14.0&lt;/a&gt; with a new API that is easier to use
while being more resistant to misuse, and several smaller releases have followed.&lt;/p&gt;
&lt;h2 id=&quot;upki&quot;&gt;upki&lt;/h2&gt;
&lt;p&gt;After discussing the topic of web PKI security on Linux (and other non-Apple Unix platforms)
and being impressed with Canonical's efforts to adopt sudo-rs and the Rust coreutils in Ubuntu,
we talked to them about improving certificate verification on Linux. This has resulted in them
funding our work on &lt;a href=&quot;https://discourse.ubuntu.com/t/addressing-linuxs-missing-pki-infrastructure/73314&quot;&gt;addressing Linux's missing PKI infrastructure&lt;/a&gt; through
the upki project. It is still a bit early, but we're making good progress and hope to make
this another substantial security improvement, and not just for tools written in Rust.&lt;/p&gt;
&lt;h2 id=&quot;hickory-dns&quot;&gt;Hickory DNS&lt;/h2&gt;
&lt;p&gt;We released Hickory DNS 0.25 in March, which included substantial simplification, and soon
after branched off 0.26 development towards improving compliance, particularly for DNSSEC
and the recursive resolver. Parts of my efforts have been in cleaning up and modernizing
the codebase, resulting in the removal of 18k lines of code over the past 5 years.&lt;/p&gt;
&lt;p&gt;In the past 6 months, and going forward into 2026,
we're working on enabling the use of the Hickory DNS recursive resolver &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/issues/2725&quot;&gt;at Let's Encrypt&lt;/a&gt;. Hopefully this will be a first
step towards broader adoption of Hickory DNS in production.&lt;/p&gt;
&lt;h2 id=&quot;miscellaneous&quot;&gt;Miscellaneous&lt;/h2&gt;
&lt;p&gt;Over the years I have been trying to help out with maintenance of a substantial number
of Rust crates that I use myself or that are widely used in the ecosystem. In 2025, I
adopted a few more orphaned crates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/humantime&quot;&gt;humantime&lt;/a&gt; (29M recent downloads, used in tokio-console, cargo-nextest)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/hashlink&quot;&gt;hashlink&lt;/a&gt; (27M recent downloads, used in sqlx, rusqlite, salsa)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/console&quot;&gt;console&lt;/a&gt; (32M recent downloads, used in indicatif)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/hostname&quot;&gt;hostname&lt;/a&gt; (15M recent downloads, used in kube-runtime, lettre)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/resolv-conf&quot;&gt;resolv-conf&lt;/a&gt; (9.3M recent downloads, used in hickory-resolver)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crates.io/crates/dialoguer&quot;&gt;dialoguer&lt;/a&gt; (6.7M recent downloads, used in cargo-nextest, wasmpack)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I typically don't do much proactive development on these, but at least make sure dependencies
are kept up to date, and straightforward contributions get reviewed (and hopefully, merged!)
in a timely manner.&lt;/p&gt;
&lt;p&gt;To balance out the ongoing adoption of orphaned crates, I'm inclined to wind down
maintenance of chrono and chrono-tz in the coming months. The API design for these crates is
quite dated, revising it would be a lot of effort, and with &lt;a href=&quot;https://crates.io/crates/jiff&quot;&gt;jiff&lt;/a&gt;
there is now an alternative I feel comfortable recommending.&lt;/p&gt;
&lt;p&gt;Other notable crates I spent significant effort on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While I made many small improvements to Quinn, most of them have not been very interesting.
Our QUIC implementation seems mature in the sense that there are few remaining bugs,
although performance could definitely be improved more. One interesting recent development
is a PR to substantially &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/2481&quot;&gt;revise our implementation of the BBR congestion control algorithm&lt;/a&gt;. I've also been excited to see Mozilla
adopt our quinn-udp utility crate in Firefox. I hope to see support for HTTP/3 in reqwest and
hyper in 2026.&lt;/li&gt;
&lt;li&gt;In July I released &lt;a href=&quot;https://github.com/djc/instant-acme/releases/tag/0.8.0&quot;&gt;instant-acme 0.8.0&lt;/a&gt;,
with a cleaner API and support for modern ACME extensions. instant-acme
is now the most popular ACME library on crates.io, and we've received essentially no feedback --
which is usually good news with low-level libraries!&lt;/li&gt;
&lt;li&gt;Towards the end of the year, I finally took the time to get some &lt;a href=&quot;https://docs.rs/instant-xml/latest/instant_xml/&quot;&gt;documentation&lt;/a&gt; done for instant-xml, my serde-like library
which tries to be more correct and reliable in the context of the XML data model; in particular,
when dealing with namespaces. While it doesn't seem to have gained widespread adoption, feedback
from users who did try it has been positive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Across the entire year, I ended up submitting 850 and reviewing 1600 PRs, distributed over 100
repositories (a handful of which for my own use).&lt;/p&gt;
&lt;h2 id=&quot;podcast-appearances&quot;&gt;Podcast appearances&lt;/h2&gt;
&lt;p&gt;It was great to be invited to appear on 4 podcast episodes this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://oxide-and-friends.transistor.fm/episodes/a-happy-day-for-rust&quot;&gt;Oxide and Friends S5 E9&lt;/a&gt;,
the story of a rustup regression, in March&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://goodpods.com/podcasts/sustain-110616/episode-268-maintainer-month-2025-with-dirkjan-ochtman-on-sustaining-c-90915362&quot;&gt;SustainOSS 268&lt;/a&gt;,
on sustaining critical Rust libraries, in May&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://netstack.fm/#episode-7&quot;&gt;NetStack.FM episode 7&lt;/a&gt;,
on Rust networking libraries, in September&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opensourcesecurity.io/2025/2025-12-rustls-dirkjan-joe/&quot;&gt;Open Source Security&lt;/a&gt;,
on rustls, in December&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;closing-words&quot;&gt;Closing words&lt;/h2&gt;
&lt;p&gt;So far, being a professional Rust maintainer is a great experience. I hope to continue making the
Rust ecosystem a fun, safe and efficient environment for building software in 2026. Thanks to all
my sponsors past and present, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aws&lt;/li&gt;
&lt;li&gt;syntaxfm&lt;/li&gt;
&lt;li&gt;canonical&lt;/li&gt;
&lt;li&gt;getsentry&lt;/li&gt;
&lt;li&gt;sourcegraph&lt;/li&gt;
&lt;li&gt;conradludgate&lt;/li&gt;
&lt;li&gt;espoal&lt;/li&gt;
&lt;li&gt;instant-labs&lt;/li&gt;
&lt;li&gt;bdaehlie&lt;/li&gt;
&lt;li&gt;Quad9DNS&lt;/li&gt;
&lt;li&gt;denoland&lt;/li&gt;
&lt;li&gt;mstange&lt;/li&gt;
&lt;li&gt;thomaseizinger&lt;/li&gt;
&lt;li&gt;astral-sh&lt;/li&gt;
&lt;li&gt;MJDSys&lt;/li&gt;
&lt;li&gt;stepfunc&lt;/li&gt;
&lt;li&gt;repi&lt;/li&gt;
&lt;li&gt;dconnolly&lt;/li&gt;
&lt;li&gt;tweedegolf&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;details&quot;&gt;Details&lt;/h2&gt;
&lt;p&gt;For a deep dive on what I worked on, feel free to peruse this table I generated:&lt;/p&gt;
&lt;table class=&quot;pr-stats&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repostory&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;th&gt;Rev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns&quot;&gt;hickory-dns/hickory-dns&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Ahickory-dns%2Fhickory-dns+created%3A2025-01-01..2025-12-31&quot;&gt;165&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Ahickory-dns%2Fhickory-dns+created%3A2025-01-01..2025-12-31&quot;&gt;293&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rustls&quot;&gt;rustls/rustls&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frustls+created%3A2025-01-01..2025-12-31&quot;&gt;113&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frustls+created%3A2025-01-01..2025-12-31&quot;&gt;238&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rust-lang/rustup&quot;&gt;rust-lang/rustup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arust-lang%2Frustup+created%3A2025-01-01..2025-12-31&quot;&gt;63&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arust-lang%2Frustup+created%3A2025-01-01..2025-12-31&quot;&gt;177&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/instant-acme&quot;&gt;djc/instant-acme&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Finstant-acme+created%3A2025-01-01..2025-12-31&quot;&gt;36&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Finstant-acme+created%3A2025-01-01..2025-12-31&quot;&gt;50&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn&quot;&gt;quinn-rs/quinn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aquinn-rs%2Fquinn+created%3A2025-01-01..2025-12-31&quot;&gt;35&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aquinn-rs%2Fquinn+created%3A2025-01-01..2025-12-31&quot;&gt;143&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rcgen&quot;&gt;rustls/rcgen&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frcgen+created%3A2025-01-01..2025-12-31&quot;&gt;31&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frcgen+created%3A2025-01-01..2025-12-31&quot;&gt;29&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustsec/rustsec&quot;&gt;rustsec/rustsec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustsec%2Frustsec+created%3A2025-01-01..2025-12-31&quot;&gt;30&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustsec%2Frustsec+created%3A2025-01-01..2025-12-31&quot;&gt;43&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/webpki&quot;&gt;rustls/webpki&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fwebpki+created%3A2025-01-01..2025-12-31&quot;&gt;29&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fwebpki+created%3A2025-01-01..2025-12-31&quot;&gt;29&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chronotope/chrono&quot;&gt;chronotope/chrono&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Achronotope%2Fchrono+created%3A2025-01-01..2025-12-31&quot;&gt;22&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Achronotope%2Fchrono+created%3A2025-01-01..2025-12-31&quot;&gt;40&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/console-rs/console&quot;&gt;console-rs/console&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aconsole-rs%2Fconsole+created%3A2025-01-01..2025-12-31&quot;&gt;15&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aconsole-rs%2Fconsole+created%3A2025-01-01..2025-12-31&quot;&gt;19&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/bb8&quot;&gt;djc/bb8&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Fbb8+created%3A2025-01-01..2025-12-31&quot;&gt;13&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Fbb8+created%3A2025-01-01..2025-12-31&quot;&gt;13&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustsec/advisory-db&quot;&gt;rustsec/advisory-db&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustsec%2Fadvisory-db+created%3A2025-01-01..2025-12-31&quot;&gt;12&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustsec%2Fadvisory-db+created%3A2025-01-01..2025-12-31&quot;&gt;125&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chronotope/chrono-tz&quot;&gt;chronotope/chrono-tz&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Achronotope%2Fchrono-tz+created%3A2025-01-01..2025-12-31&quot;&gt;12&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Achronotope%2Fchrono-tz+created%3A2025-01-01..2025-12-31&quot;&gt;17&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/instant-xml&quot;&gt;djc/instant-xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Finstant-xml+created%3A2025-01-01..2025-12-31&quot;&gt;12&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Finstant-xml+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/console-rs/indicatif&quot;&gt;console-rs/indicatif&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aconsole-rs%2Findicatif+created%3A2025-01-01..2025-12-31&quot;&gt;11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aconsole-rs%2Findicatif+created%3A2025-01-01..2025-12-31&quot;&gt;25&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rustls-platform-verifier&quot;&gt;rustls/rustls-platform-verifier&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frustls-platform-verifier+created%3A2025-01-01..2025-12-31&quot;&gt;11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frustls-platform-verifier+created%3A2025-01-01..2025-12-31&quot;&gt;13&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rustls-native-certs&quot;&gt;rustls/rustls-native-certs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frustls-native-certs+created%3A2025-01-01..2025-12-31&quot;&gt;11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frustls-native-certs+created%3A2025-01-01..2025-12-31&quot;&gt;13&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hickory-dns/resolv-conf&quot;&gt;hickory-dns/resolv-conf&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Ahickory-dns%2Fresolv-conf+created%3A2025-01-01..2025-12-31&quot;&gt;10&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Ahickory-dns%2Fresolv-conf+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/tokio-rustls&quot;&gt;rustls/tokio-rustls&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Ftokio-rustls+created%3A2025-01-01..2025-12-31&quot;&gt;9&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Ftokio-rustls+created%3A2025-01-01..2025-12-31&quot;&gt;19&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/GitoxideLabs/gitoxide&quot;&gt;GitoxideLabs/gitoxide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3AGitoxideLabs%2Fgitoxide+created%3A2025-01-01..2025-12-31&quot;&gt;8&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3AGitoxideLabs%2Fgitoxide+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/flamegraph-rs/flamegraph&quot;&gt;flamegraph-rs/flamegraph&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aflamegraph-rs%2Fflamegraph+created%3A2025-01-01..2025-12-31&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aflamegraph-rs%2Fflamegraph+created%3A2025-01-01..2025-12-31&quot;&gt;22&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chronotope/humantime&quot;&gt;chronotope/humantime&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Achronotope%2Fhumantime+created%3A2025-01-01..2025-12-31&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Achronotope%2Fhumantime+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nico-abram/blondie&quot;&gt;nico-abram/blondie&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Anico-abram%2Fblondie+created%3A2025-01-01..2025-12-31&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Anico-abram%2Fblondie+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/memorysafety/rav1d&quot;&gt;memorysafety/rav1d&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Amemorysafety%2Frav1d+created%3A2025-01-01..2025-12-31&quot;&gt;6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Amemorysafety%2Frav1d+created%3A2025-01-01..2025-12-31&quot;&gt;20&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rustls-ffi&quot;&gt;rustls/rustls-ffi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frustls-ffi+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frustls-ffi+created%3A2025-01-01..2025-12-31&quot;&gt;36&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/pki-types&quot;&gt;rustls/pki-types&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fpki-types+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fpki-types+created%3A2025-01-01..2025-12-31&quot;&gt;15&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/webpki-roots&quot;&gt;rustls/webpki-roots&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fwebpki-roots+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fwebpki-roots+created%3A2025-01-01..2025-12-31&quot;&gt;14&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/upki&quot;&gt;rustls/upki&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fupki+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fupki+created%3A2025-01-01..2025-12-31&quot;&gt;11&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/instant-epp&quot;&gt;djc/instant-epp&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Finstant-epp+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Finstant-epp+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/abna-rs&quot;&gt;djc/abna-rs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Fabna-rs+created%3A2025-01-01..2025-12-31&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Fabna-rs+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/rustls-openssl-compat&quot;&gt;rustls/rustls-openssl-compat&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Frustls-openssl-compat+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Frustls-openssl-compat+created%3A2025-01-01..2025-12-31&quot;&gt;27&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/hyper-rustls&quot;&gt;rustls/hyper-rustls&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fhyper-rustls+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fhyper-rustls+created%3A2025-01-01..2025-12-31&quot;&gt;12&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/instant-distance&quot;&gt;djc/instant-distance&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Finstant-distance+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Finstant-distance+created%3A2025-01-01..2025-12-31&quot;&gt;6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/gcp_auth&quot;&gt;djc/gcp_auth&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Fgcp_auth+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Fgcp_auth+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/instant-segment&quot;&gt;djc/instant-segment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Finstant-segment+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Finstant-segment+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/tokio-imap&quot;&gt;djc/tokio-imap&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Ftokio-imap+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Ftokio-imap+created%3A2025-01-01..2025-12-31&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chronotope/pure-rust-locales&quot;&gt;chronotope/pure-rust-locales&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Achronotope%2Fpure-rust-locales+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Achronotope%2Fpure-rust-locales+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/seanmonstar/reqwest&quot;&gt;seanmonstar/reqwest&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aseanmonstar%2Freqwest+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aseanmonstar%2Freqwest+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/metrics-rs/metrics&quot;&gt;metrics-rs/metrics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Ametrics-rs%2Fmetrics+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Ametrics-rs%2Fmetrics+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/hostname&quot;&gt;djc/hostname&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Fhostname+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Fhostname+created%3A2025-01-01..2025-12-31&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/console-rs/dialoguer&quot;&gt;console-rs/dialoguer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aconsole-rs%2Fdialoguer+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aconsole-rs%2Fdialoguer+created%3A2025-01-01..2025-12-31&quot;&gt;6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/ktls&quot;&gt;rustls/ktls&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fktls+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fktls+created%3A2025-01-01..2025-12-31&quot;&gt;6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rustls/openssl-probe&quot;&gt;rustls/openssl-probe&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arustls%2Fopenssl-probe+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arustls%2Fopenssl-probe+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/djc/hashlink&quot;&gt;djc/hashlink&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Adjc%2Fhashlink+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Adjc%2Fhashlink+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rust-lang/crates.io&quot;&gt;rust-lang/crates.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arust-lang%2Fcrates.io+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arust-lang%2Fcrates.io+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rust-lang/team&quot;&gt;rust-lang/team&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arust-lang%2Fteam+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arust-lang%2Fteam+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/aws/aws-lc-rs&quot;&gt;aws/aws-lc-rs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aaws%2Faws-lc-rs+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aaws%2Faws-lc-rs+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stalwartlabs/mail-auth&quot;&gt;stalwartlabs/mail-auth&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Astalwartlabs%2Fmail-auth+created%3A2025-01-01..2025-12-31&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Astalwartlabs%2Fmail-auth+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tokio-rs/tracing&quot;&gt;tokio-rs/tracing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Atokio-rs%2Ftracing+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Atokio-rs%2Ftracing+created%3A2025-01-01..2025-12-31&quot;&gt;20&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tokio-rs/tokio&quot;&gt;tokio-rs/tokio&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Atokio-rs%2Ftokio+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Atokio-rs%2Ftokio+created%3A2025-01-01..2025-12-31&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rust-lang/blog.rust-lang.org&quot;&gt;rust-lang/blog.rust-lang.org&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arust-lang%2Fblog.rust-lang.org+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arust-lang%2Fblog.rust-lang.org+created%3A2025-01-01..2025-12-31&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/redis-rs/redis-rs&quot;&gt;redis-rs/redis-rs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aredis-rs%2Fredis-rs+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aredis-rs%2Fredis-rs+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rust-lang/rfcs&quot;&gt;rust-lang/rfcs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Arust-lang%2Frfcs+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Arust-lang%2Frfcs+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/steffengy/schannel-rs&quot;&gt;steffengy/schannel-rs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Asteffengy%2Fschannel-rs+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Asteffengy%2Fschannel-rs+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nagisa/rust_libloading&quot;&gt;nagisa/rust_libloading&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Anagisa%2Frust_libloading+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Anagisa%2Frust_libloading+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tomtomwombat/fastbloom&quot;&gt;tomtomwombat/fastbloom&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Atomtomwombat%2Ffastbloom+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Atomtomwombat%2Ffastbloom+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/awslabs/cargo-check-external-types&quot;&gt;awslabs/cargo-check-external-types&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aawslabs%2Fcargo-check-external-types+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aawslabs%2Fcargo-check-external-types+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/unicode-org/icu4x&quot;&gt;unicode-org/icu4x&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Aunicode-org%2Ficu4x+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Aunicode-org%2Ficu4x+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/pksunkara/cargo-workspaces&quot;&gt;pksunkara/cargo-workspaces&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Apksunkara%2Fcargo-workspaces+created%3A2025-01-01..2025-12-31&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Apksunkara%2Fcargo-workspaces+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nicoburns/blessed-rs&quot;&gt;nicoburns/blessed-rs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+author%3Adjc+repo%3Anicoburns%2Fblessed-rs+created%3A2025-01-01..2025-12-31&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/search?q=is%3Apr+reviewed-by%3Adjc+repo%3Anicoburns%2Fblessed-rs+created%3A2025-01-01..2025-12-31&quot;&gt;11&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
	</entry>
	<entry>
		<title>October on GitHub (2024)</title>
		<link href="https://dirkjan.ochtman.nl/writing/2025/01/21/october-2024-on-github.html" rel="alternate"/>
		<id>tag:dirkjan.ochtman.nl,2025-01-21:/writing/2025/01/21/october-2024-on-github.html</id>
		<published>2025-01-21T00:00:00+01:00</published>
		<updated>2025-01-21T00:00:00+01:00</updated>
		<category term="tech"/>
		<category term="code"/>
		<category term="rust"/>
		<content type="html">&lt;p&gt;Since leaving my job at the end of August, I figured I would try to write up
a report of most of the open source stuff I worked on (see &lt;a href=&quot;/writing/2024/10/18/september-2024-on-github.html&quot;&gt;previous month&lt;/a&gt;). Turns out writing these
is a lot of work, so it took me a while to write up October's activity -- I ultimately
wrote this with the help of some &lt;a href=&quot;https://github.com/djc/tmog-events&quot;&gt;tooling&lt;/a&gt; I wrote.&lt;/p&gt;
&lt;h2 id=&quot;rustls&quot;&gt;rustls&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rustls/rustls&quot;&gt;rustls&lt;/a&gt; is a pure Rust implementation of the TLS protocol.&lt;/p&gt;
&lt;p&gt;Here are some things I worked on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I migrated both &lt;a href=&quot;https://github.com/rustls/tokio-rustls/pull/87&quot;&gt;tokio-rustls&lt;/a&gt;
and &lt;a href=&quot;https://github.com/rustls/rustls-native-certs/pull/145&quot;&gt;rustls-native-certs&lt;/a&gt; to the new
PEM API in rustls-pki-types (as discussed last month), cutting down on dependencies.&lt;/li&gt;
&lt;li&gt;I &lt;a href=&quot;https://github.com/rustls/pki-types/pull/63&quot;&gt;implemented&lt;/a&gt; the &lt;code&gt;Error&lt;/code&gt; trait for the new
&lt;code&gt;pem::Error&lt;/code&gt; type in rustls-pki-types, which we had missed in the
&lt;a href=&quot;https://github.com/rustls/pki-types/pull/53&quot;&gt;PR implementing PEM decoding&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As I tried to switch instant-epp (see below) to the rustls-platform-verifier, I had to remind
myself of how the high-level rustls-platform-verifier worked and found it non-trivial to
incorporate into the instant-epp &lt;code&gt;RustlsConnector&lt;/code&gt;. I decided to improve the API by
&lt;a href=&quot;https://github.com/rustls/rustls-platform-verifier/pull/150&quot;&gt;exposing a couple of extension traits&lt;/a&gt;,
which needed some &lt;a href=&quot;https://github.com/rustls/rustls/pull/2181&quot;&gt;additional rustls API&lt;/a&gt; (adding
API while net removing code!).&lt;/li&gt;
&lt;li&gt;Reworked the &lt;a href=&quot;https://github.com/rustls/rustls-native-certs/pull/141&quot;&gt;rustls-native-certs README&lt;/a&gt;
to clarify that most users should use rustls-platform-verifier instead, as an alternative to an
&lt;a href=&quot;https://github.com/rustls/rustls-native-certs/pull/140&quot;&gt;earlier PR&lt;/a&gt; which made more cautious changes,
and linked to the &lt;a href=&quot;https://github.com/rustls/rustls-platform-verifier/pull/142&quot;&gt;deployment considerations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I addressed an &lt;a href=&quot;https://github.com/rustls/rustls/issues/2182&quot;&gt;issue report about excessive logging&lt;/a&gt;
in rustls by &lt;a href=&quot;https://github.com/rustls/rustls/pull/2184&quot;&gt;refining when we log warning alerts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ctz&quot;&gt;Joe&lt;/a&gt; and &lt;a href=&quot;https://github.com/cpu&quot;&gt;Daniel&lt;/a&gt; did more performance work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls/pull/2155&quot;&gt;Improve receive performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls/pull/2187&quot;&gt;server: default send_tls13_tickets 4 -&amp;gt; 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls/pull/2168&quot;&gt;Faster TLS1.3 server resumption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls/pull/2167&quot;&gt;bench: match default BoringSSL/OpenSSL ticket count&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls/pull/2172&quot;&gt;Make ciphersuite enum smaller&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This culminated in a post on how rustls &lt;a href=&quot;https://www.memorysafety.org/blog/rustls-performance-outperforms/&quot;&gt;outperforms OpenSSL and BoringSSL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There was &lt;a href=&quot;https://github.com/rustls/rustls/issues/709&quot;&gt;some discussion&lt;/a&gt; on a better interface to setting
the certificate verifier for an entire process, potentially by mimicking the crypto provider API.&lt;/p&gt;
&lt;p&gt;Finally, initial support for &lt;a href=&quot;https://github.com/rustls/rustls/pull/2062&quot;&gt;RFC 7250 raw public keys&lt;/a&gt;
(which is helpful especially in P2P scenarios) was released as part of &lt;a href=&quot;https://github.com/rustls/rustls/releases/tag/v%2F0.23.16&quot;&gt;0.23.16&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hickory-dns&quot;&gt;Hickory DNS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns&quot;&gt;Hickory DNS&lt;/a&gt; is a project to
build a comprehensive suite of Rust libraries to build DNS services on top of.
Because the project is nearing a (fairly large) &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/issues/2206&quot;&gt;feature release&lt;/a&gt;, I've been trying
to make a number of improvements to the project, cleaning up the API and moving
code around to reduce complexity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2521&quot;&gt;removed the synchronous client API&lt;/a&gt;,
which was a thin, not very well maintained wrapper around the larger, more capable async API.
This entailed &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2518&quot;&gt;porting some tests&lt;/a&gt;
and also &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2515&quot;&gt;removing the synchronous resolver API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I started looking at the DNSSEC cryptography API to figure out what needed to be done to
both support &lt;em&gt;ring&lt;/em&gt; as a full-fledged replacement for OpenSSL and add support for the
&lt;em&gt;ring&lt;/em&gt;-like aws-lc-rs provider. The DNSSEC API wasn't very well-designed, so this took quite some
efforts. I started by looking at the &lt;code&gt;KeyPair&lt;/code&gt; type which had a lot of functionality attached to it,
and cleaned it up by &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2534&quot;&gt;moving code&lt;/a&gt; out of it
and &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2541&quot;&gt;clarifying private/public key responsibilities&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improved CI cycle times by &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2542&quot;&gt;avoiding unnecessary release builds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Made a number of generic code quality/API improvements, like &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2527&quot;&gt;simplifying socket address literals&lt;/a&gt;, &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2486&quot;&gt;moving StoreConfig to bin crate&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2530&quot;&gt;making error modules private&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2507&quot;&gt;switching to using doc_auto_cfg&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2508&quot;&gt;cleaning up rustdoc warnings&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2509&quot;&gt;replacing TryParseIp trait with IntoName::to_ip()&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Simplified rustls usage by &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2505&quot;&gt;leveraging the new PEM reading API&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notable PRs I reviewed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2502&quot;&gt;propagating NX domain and no record found errors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/marcus0x62&quot;&gt;Marcus&lt;/a&gt; addressed a very old &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/issues/13&quot;&gt;request&lt;/a&gt;
to enable &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2162&quot;&gt;blackholing DNS requests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Someone contributed an implementation of the &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2417&quot;&gt;CERT record type&lt;/a&gt; from &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc4398&quot;&gt;RFC 4398&lt;/a&gt; for storing certificates in the DNS
(likely with some LLM help).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/divergentdave&quot;&gt;David&lt;/a&gt; added configuration to &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2487&quot;&gt;avoid specific UDP ports
on outbound traffic&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kumomta&quot;&gt;KumoMTA&lt;/h2&gt;
&lt;p&gt;I've been doing some consulting work for &lt;a href=&quot;https://kumomta.com/&quot;&gt;KumoMTA&lt;/a&gt;, a startup building
a mail transfer agent (MTA) for enterprise senders. In October, I continued my work on SPF support,
threading through the raw SPF implementation to the Lua-based configuration API
and generalizing the DNS resolution API.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/306&quot;&gt;SPF: add basic SPF Lua API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/304&quot;&gt;Discard crate-specific DNS resolver traits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/292&quot;&gt;Add support for SPF validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/302&quot;&gt;spf: reintroduce CheckHostParams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/303&quot;&gt;A trait-based resolver API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quinn&quot;&gt;Quinn&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn&quot;&gt;Quinn&lt;/a&gt; is the most popular Rust implementation of the QUIC transport protocol.&lt;/p&gt;
&lt;p&gt;I wasn't very active on Quinn in October, and only fixed &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1987&quot;&gt;a small bug in the datagram state management&lt;/a&gt; around dropping too large datagrams.&lt;/p&gt;
&lt;p&gt;Fortunately, several other folks contributed interesting work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Solana engineer contributed an optional alternative &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/2002&quot;&gt;send stream scheduling strategy&lt;/a&gt;
as well as work to &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1999&quot;&gt;reduce memory allocations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;An Iroh engineer changed quinn-proto such that it can be used on the &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1996&quot;&gt;wasm32-unknown-unknown target&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Someone cleaned up some edge cases in &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/2009&quot;&gt;idle timeout negotiation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Someone added support for &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/2003&quot;&gt;aws-lc-rs FIPS cryptography&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A Mozilla engineer implemented &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1993&quot;&gt;faster UDP/IO on Apple platforms&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Someone enabled support for Apple's &lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/2000&quot;&gt;visionOS and tvOS&lt;/a&gt; platforms.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tracing-opentelemetry&quot;&gt;tracing-opentelemetry&lt;/h2&gt;
&lt;p&gt;For lack of anyone else doing the work, I maintain the tracing-opentelemetry integration crate
that allows the tracing project to work with the opentelemetry crates. The OpenTelemetry Rust SIG have been
increasing the pace of semver-incompatible releases, but unfortunately missed some things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As such, I &lt;a href=&quot;https://github.com/open-telemetry/opentelemetry-rust/pull/2168&quot;&gt;cleaned up&lt;/a&gt; their tonic code
generation to use the right crate versions and &lt;a href=&quot;https://github.com/open-telemetry/opentelemetry-rust/pull/2179&quot;&gt;bumped their MSRV&lt;/a&gt;
to match the new dependencies.&lt;/li&gt;
&lt;li&gt;I wrote up a note in the tracing-opentelemetry README on &lt;a href=&quot;https://github.com/tokio-rs/tracing-opentelemetry/pull/172&quot;&gt;version compatibility&lt;/a&gt; between the opentelemetry-* crates
and tracing-opentelemetry.&lt;/li&gt;
&lt;li&gt;Reviewed the &lt;a href=&quot;https://github.com/tokio-rs/tracing-opentelemetry/pull/169&quot;&gt;upgrade to opentelemetry 0.26&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reviewed a &lt;a href=&quot;https://github.com/tokio-rs/tracing-opentelemetry/pull/173&quot;&gt;locking efficiency improvement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reviewed optional &lt;a href=&quot;https://github.com/tokio-rs/tracing-opentelemetry/pull/182&quot;&gt;attaching the level&lt;/a&gt; of exported spans.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bb8&quot;&gt;bb8&lt;/h2&gt;
&lt;p&gt;bb8 is a full-featured async connection pool for Tokio. Apparently it's being used in
&lt;a href=&quot;https://github.com/postgresml/pgcat&quot;&gt;PgCat&lt;/a&gt;, because an AWS engineer dropped by with some improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/bb8/pull/225&quot;&gt;Notify one waiter per pending connection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/bb8/pull/223&quot;&gt;Track open requests to avoid creating unnecessary connections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/bb8/pull/224&quot;&gt;Reap expired connections on drop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(The latter two were &lt;a href=&quot;https://github.com/djc/bb8/pull/226&quot;&gt;ultimately merged&lt;/a&gt; as part of a roll-up PR
that added some cleanup, and released with other accumulated fixes as
&lt;a href=&quot;https://github.com/djc/bb8/releases/tag/v0.8.6&quot;&gt;0.8.6&lt;/a&gt;.)&lt;/p&gt;
&lt;h2 id=&quot;instant-epp&quot;&gt;instant-epp&lt;/h2&gt;
&lt;p&gt;instant-epp implements the &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5730.html&quot;&gt;EPP protocol&lt;/a&gt; used
for provisioning domains. It relies on instant-xml (see below) for getting the namespace-heavy EPP specs right.
Although instant-epp does not see a lot of activity, a contributor popped up that contributed some changes.
Apparently most EPP users fork their dependencies instead of contributing upstream --
or funding upstream development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/instant-epp/pull/50&quot;&gt;feat!: add InfoType enum for PostalInfo.info_type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/instant-epp/pull/47&quot;&gt;feat: expose Period::new by introducing a PeriodUnit enum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/instant-epp/pull/59&quot;&gt;Make rustls connector more flexible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instant-xml&quot;&gt;instant-xml&lt;/h2&gt;
&lt;p&gt;instant-xml is a serde alternative specifically focused on the XML data model, with pretty good support
for XML namespaces (which is necessary for EPP). The same person who contributed changes to instant-epp
also made some minor improvements in instant-xml to facilitate their development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/instant-xml/pull/71&quot;&gt;Implement to and from xml for Box&amp;lt;T&amp;gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/instant-xml/pull/70&quot;&gt;fix: support all accumulators in enum forward deserialization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instant-acme&quot;&gt;instant-acme&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/djc/instant-acme&quot;&gt;instant-acme&lt;/a&gt; is a RFC 8555 client for provisioning TLS certificates.&lt;/p&gt;
&lt;p&gt;Reviewed a contributed PR to &lt;a href=&quot;https://github.com/djc/instant-acme/pull/68&quot;&gt;expose account IDs&lt;/a&gt;, which can be
used in CAA records to restrict which account can request certificates.&lt;/p&gt;
&lt;h2 id=&quot;gcp-auth&quot;&gt;gcp_auth&lt;/h2&gt;
&lt;p&gt;gcp_auth is a simple API for authenticating to Google Cloud Platform services. It supports both
production and development environments, similar to official Google SDKs for other languages
(though likely more limited in scope).&lt;/p&gt;
&lt;p&gt;In October, someone &lt;a href=&quot;https://github.com/djc/gcp_auth/pull/119&quot;&gt;contributed&lt;/a&gt; support for setting the
&lt;code&gt;audience&lt;/code&gt; in custom service account token providers, which had been asked for a few times.&lt;/p&gt;
&lt;h2 id=&quot;chrono&quot;&gt;chrono&lt;/h2&gt;
&lt;p&gt;chrono is one of the most popular date/time libraries in the Rust ecosystem. I took over maintenance
because the previous maintainers didn't want to maintain it anymore, so I support the
community by reviewing incoming pull requests.&lt;/p&gt;
&lt;p&gt;This month, someone contributed &lt;a href=&quot;https://github.com/chronotope/chrono/pull/1613&quot;&gt;support for OpenHarmony OS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;on-sustainability&quot;&gt;On sustainability&lt;/h2&gt;
&lt;p&gt;Since my last post, a few more companies started sponsoring my work, for which
I am very grateful. For now, I'm still funding most of my open source activity
from contract work, though I'm currently talking to some organizations that are
looking to more directly fund open source work. Excited to see how that goes!&lt;/p&gt;
&lt;p&gt;Many thanks to these sponsors (5 USD/month or more):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;syntaxfm&lt;/li&gt;
&lt;li&gt;getsentry&lt;/li&gt;
&lt;li&gt;denoland&lt;/li&gt;
&lt;li&gt;ctz&lt;/li&gt;
&lt;li&gt;astral-sh&lt;/li&gt;
&lt;li&gt;bdaehlie&lt;/li&gt;
&lt;li&gt;Quad9DNS&lt;/li&gt;
&lt;li&gt;thomaseizinger&lt;/li&gt;
&lt;li&gt;stepfunc&lt;/li&gt;
&lt;li&gt;tweedegolf&lt;/li&gt;
&lt;li&gt;codecov&lt;/li&gt;
&lt;li&gt;repi&lt;/li&gt;
&lt;li&gt;MJDSys&lt;/li&gt;
&lt;li&gt;mstange&lt;/li&gt;
&lt;li&gt;stackabletech&lt;/li&gt;
&lt;li&gt;dimlev&lt;/li&gt;
&lt;li&gt;Shnatsel&lt;/li&gt;
&lt;li&gt;eightseventhreethree&lt;/li&gt;
&lt;li&gt;malyn&lt;/li&gt;
&lt;li&gt;dconnolly&lt;/li&gt;
&lt;li&gt;paolobarbolini&lt;/li&gt;
&lt;li&gt;block&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	<entry>
		<title>September on GitHub (2024)</title>
		<link href="https://dirkjan.ochtman.nl/writing/2024/10/18/september-2024-on-github.html" rel="alternate"/>
		<id>tag:dirkjan.ochtman.nl,2024-10-18:/writing/2024/10/18/september-2024-on-github.html</id>
		<published>2024-10-18T00:00:00+02:00</published>
		<updated>2024-10-18T00:00:00+02:00</updated>
		<category term="tech"/>
		<category term="code"/>
		<category term="rust"/>
		<content type="html">&lt;p&gt;Since leaving my job at the end of August, I figured I would try to write up
a report of all the open source stuff I worked on in September.
Herewith a not quite complete account of things I was involved in.&lt;/p&gt;
&lt;h2 id=&quot;rustls&quot;&gt;rustls&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rustls/rustls&quot;&gt;rustls&lt;/a&gt; is a pure Rust implementation of the TLS protocol.&lt;/p&gt;
&lt;p&gt;Substantial effort last month went into &lt;a href=&quot;https://github.com/rustls/pki-types/pull/53&quot;&gt;migrating support for PEM decoding&lt;/a&gt;
from the rustls-pemfile crate (backed by the base64 crate) to the rustls-pki-types crate. While
the new decoder is slightly slower, it avoids timing side channel attacks (only used for PEM items containing
private keys). We iterated a number of times on making the new API easy to use. Adopting the new APIs should
shrink dependency graphs by getting rid of both rustls-pemfile (which got a semver-compatible bump
to &lt;a href=&quot;https://github.com/rustls/pemfile/pull/55&quot;&gt;use the new implementation&lt;/a&gt;) and the base64 crate.&lt;/p&gt;
&lt;p&gt;We went through a number of iterations reviewing a PR from &lt;a href=&quot;https://github.com/holodorum&quot;&gt;Bart Dubbeldam&lt;/a&gt; and
&lt;a href=&quot;https://github.com/aochagavia/&quot;&gt;Adolfo Ochagavía&lt;/a&gt; adding support for &lt;a href=&quot;https://github.com/rustls/rustls/pull/2062&quot;&gt;RFC 7250 raw public keys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/complexspaces&quot;&gt;ComplexSpaces&lt;/a&gt; added
&lt;a href=&quot;https://github.com/rustls/rustls-platform-verifier/pull/142&quot;&gt;deployment considerations&lt;/a&gt; to the
rustls-platform-verifier README. We now recommend (almost) everyone use the platform verifier for their server
certificate verification needs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ctz&quot;&gt;Joe&lt;/a&gt; has been doing interesting work to improve performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can now &lt;a href=&quot;https://github.com/rustls/rustls/pull/2120&quot;&gt;send flights of handshake messages&lt;/a&gt; in a single message.&lt;/li&gt;
&lt;li&gt;He &lt;a href=&quot;https://github.com/rustls/rustls/pull/2135&quot;&gt;eliminated an allocation&lt;/a&gt; in signature verification.&lt;/li&gt;
&lt;li&gt;And &lt;a href=&quot;https://github.com/rustls/rustls/pull/2122&quot;&gt;eliminated large copies&lt;/a&gt; in resumption code paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I contributed some smaller improvements last month:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I finally &lt;a href=&quot;https://github.com/rustls/rustls/pull/2126&quot;&gt;converted&lt;/a&gt; one of the rustls examples from the
long-dead docopt to clap. Joe kindly offered to &lt;a href=&quot;https://github.com/rustls/rustls/pull/2132&quot;&gt;take care&lt;/a&gt; of the others.&lt;/li&gt;
&lt;li&gt;I finished a contributed PR to &lt;a href=&quot;https://github.com/rustls/rcgen/pull/291&quot;&gt;enable signing without a
private key&lt;/a&gt; in rcgen.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rustls/rustls-native-certs/pull/134&quot;&gt;Clarified error handling&lt;/a&gt; in rustls-native-certs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hickory-dns&quot;&gt;Hickory DNS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns&quot;&gt;Hickory DNS&lt;/a&gt; is a project to
build a comprehensive suite of Rust libraries to build DNS services on top of.
Because the project is nearing a (fairly large) feature release, I've been trying
to make a number of improvements to the project, cleaning up the API and moving
code around to reduce complexity. Here are some of the things I worked on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I moved the &lt;code&gt;RuntimeProvider&lt;/code&gt; trait from hickory-resolver down into
hickory-proto. This abstraction was created to allow the resolver to abstract
over different async runtimes (and their I/O traits and types), but it did
not actually depend on the resolver infrastructure itself. Meanwhile, at the
lower &lt;code&gt;-proto&lt;/code&gt; level we had a somewhat parallel set of abstractions, so I set
out to move the &lt;code&gt;RuntimeProvider&lt;/code&gt; into &lt;code&gt;-proto&lt;/code&gt; and try to make it the focal
point of abstracting over runtimes and I/O. This work was split over two
PRs, one for &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2464&quot;&gt;UDP&lt;/a&gt; and one for &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2472&quot;&gt;TCP&lt;/a&gt;. I should probably review whether there is
potential for further simplification in the other protocols (H2, QUIC, H3).&lt;/li&gt;
&lt;li&gt;Hickory DNS depends on the &lt;a href=&quot;https://crates.io/crates/resolv-conf&quot;&gt;resolve-conf&lt;/a&gt;
crate in order to find the system DNS configuration (on Unix systems). Unfortunately
the resolv-conf crate has been unmaintained for a while. While attempts to contact
the maintainer didn't lead to any results, Ferrous team member &lt;a href=&quot;https://github.com/listochkin&quot;&gt;Andrei
Listochkin&lt;/a&gt; mentioned that he knew the original
maintainer and could talk to them via Telegram. Soon, the repository and
crate ownership had been transferred to us, so that we can start fixing some
of the outstanding issues soon.&lt;/li&gt;
&lt;li&gt;After reviewing a &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2470&quot;&gt;PR to allow customization of the DNS over HTTP URL path&lt;/a&gt; I noticed that the configuration
for the main Hickory DNS binary crate was distributed over the &lt;code&gt;-server&lt;/code&gt; library crate
and the &lt;code&gt;hickory-dns&lt;/code&gt; binary crate. Some of this didn't really make sense, so I
submitted a collection of &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2480&quot;&gt;config tweaks&lt;/a&gt;
to improve on the situation.&lt;/li&gt;
&lt;li&gt;While reviewing &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2161&quot;&gt;another PR&lt;/a&gt;,
I noticed that the hickory-server crates had a bunch of instances of
&lt;code&gt;Arc&amp;lt;Box&amp;lt;dyn AuthorityObject&amp;gt;&amp;gt;&lt;/code&gt;, which seemed unnecessarily complex. I &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2471&quot;&gt;cleaned these up&lt;/a&gt; so that we use
&lt;code&gt;Arc&amp;lt;dyn AuthorityObject&amp;gt;&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;After we noticed that some tests against the Quad9 name servers kept causing issues in CI, I decided
to &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2467&quot;&gt;kill the quad9 tests&lt;/a&gt;.
We still run tests against Google and Cloudflare to help validate our code.&lt;/li&gt;
&lt;li&gt;A user reported that the Cargo features for the server were pulling in OpenSSL even when that
should be necessary. I submitted a PR to &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2441&quot;&gt;clean up server features&lt;/a&gt; which improved the situation.&lt;/li&gt;
&lt;li&gt;While working on KumoMTA (see below), I noticed that &lt;code&gt;RecordSet::new()&lt;/code&gt; took a
&lt;code&gt;&amp;amp;Name&lt;/code&gt; argument only to clone it. I &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2473&quot;&gt;changed&lt;/a&gt;
it to take a &lt;code&gt;Name&lt;/code&gt; directly so the caller can hand over ownership where possible.&lt;/li&gt;
&lt;li&gt;Made some &lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2450&quot;&gt;minor recursor tweaks&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I reviewed 25 PRs Hickory DNS last month, here are the more notable ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2161&quot;&gt;Chained authority implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2339&quot;&gt;CNAME resolution support for the recursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hickory-dns/hickory-dns/pull/2313&quot;&gt;NSEC3 validation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rustup&quot;&gt;rustup&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://rustup.rs/&quot;&gt;rustup&lt;/a&gt; is the tool most Rust developers to use manage their compiler toolchains; I joined
the team last year after some of the previous members had left, reducing the available
capacity. We're currently gearing up for the beta of &lt;a href=&quot;https://github.com/rust-lang/rustup/pull/4041&quot;&gt;rustup 1.28&lt;/a&gt; which contains some larger changes, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No implicit toolchain installs&lt;/li&gt;
&lt;li&gt;Default to rustls with the rustls-platform-verifier for downloads&lt;/li&gt;
&lt;li&gt;Improved logging based on tracing-rs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In September I &lt;a href=&quot;https://github.com/rust-lang/team/pull/1564&quot;&gt;recruited&lt;/a&gt; &lt;a href=&quot;https://github.com/ChrisDenton&quot;&gt;Chris&lt;/a&gt;
to the team. He had already been helping out a bunch with the Windows parts of rustup in particular, and
we decided it made sense to ask him to join the team, which he happily agreed to.&lt;/p&gt;
&lt;p&gt;Notable changes from last month:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We finally merged a contributed PR to replace &lt;a href=&quot;https://github.com/rust-lang/rustup/pull/3896&quot;&gt;winreg with windows registry&lt;/a&gt;,
after we coordinated with the windows-rs team and Chris on the best way forward. This included scrapping some
&lt;code&gt;unsafe&lt;/code&gt; code from the rustup code base because we can now build on better upstream abstractions.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rustup/pull/3987&quot;&gt;Improve the logging setup&lt;/a&gt; to better integrate tracing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pyrtls&quot;&gt;pyrtls&lt;/h2&gt;
&lt;p&gt;I launched a new project called &lt;a href=&quot;https://github.com/djc/pyrtls&quot;&gt;pyrtls&lt;/a&gt; last month.
pyrtls provides Python bindings to rustls, seeking to expand access to rustls' great
performance and security track record as an alternative to the OpenSSL-based &lt;code&gt;ssl&lt;/code&gt; module
that is a part of the standard library.&lt;/p&gt;
&lt;p&gt;I started working on this intermittently back in 2021 and finally decided to write up some
documentation and &quot;ship&quot; it by announcing the project on social media. At the end of the month,
it earned a mention in last month's &lt;a href=&quot;https://www.feistyduck.com/newsletter/issue_117_smart_tvs_are_watching_you&quot;&gt;issue&lt;/a&gt; of the Feisty Duck Cryptography and Security Newsletter.
I was happy to receive my first contributed PR &lt;a href=&quot;https://github.com/djc/pyrtls/pull/50&quot;&gt;adding a typing stub&lt;/a&gt; a few days later.&lt;/p&gt;
&lt;p&gt;Although the project has managed to earn 70 stars over the past
4 weeks, I've been a little disappointed with the lack of feedback so far. Given that I don't have
a use case for this project myself (since I don't really use Python anymore), I probably won't
spend much more time on it until there is some uptake.&lt;/p&gt;
&lt;h2 id=&quot;kumomta&quot;&gt;KumoMTA&lt;/h2&gt;
&lt;p&gt;I've been doing some consulting work for &lt;a href=&quot;https://kumomta.com/&quot;&gt;KumoMTA&lt;/a&gt;, a startup building
a mail transfer agent (MTA) for enterprise senders. I had connected with their cofounder
&lt;a href=&quot;https://github.com/wez&quot;&gt;Wez&lt;/a&gt; (of &lt;a href=&quot;https://github.com/wez/wezterm&quot;&gt;wezterm&lt;/a&gt; fame) through
issues against rustls and Hickory (both of which KumoMTA uses to build their MTA).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My first issue was to build a Redis rate limiting implementation that doesn't use the &lt;a href=&quot;https://github.com/brandur/redis-cell&quot;&gt;redis-cell&lt;/a&gt;
Redis extension. This &lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/282&quot;&gt;integrated&lt;/a&gt; a Lua
script-based implementation of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Generic_cell_rate_algorithm&quot;&gt;generic cell rate algorithm&lt;/a&gt;
which can be used in deployments where custom Redis extensions are not viable.&lt;/li&gt;
&lt;li&gt;Then, I started working on an implementation of the &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7208&quot;&gt;Sender Policy Framework (SPF)&lt;/a&gt; standard. This will be used in KumoMTA to help
detect spam. Wez had already started on an implementation, so I picked up from
where he had left off and started &lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/292&quot;&gt;implementing&lt;/a&gt;
the core protocol.&lt;/li&gt;
&lt;li&gt;I noticed that the KumoMTA codebase was using both &lt;code&gt;lazy-static&lt;/code&gt; and &lt;code&gt;once_cell&lt;/code&gt;, so I decided
to spend a little time (after getting approval from Wez, of course) cleaning this up and
&lt;a href=&quot;https://github.com/KumoCorp/kumomta/pull/288&quot;&gt;migrating&lt;/a&gt; the entire project to the newly available
&lt;code&gt;OnceLock&lt;/code&gt; and &lt;code&gt;LazyLock&lt;/code&gt; types stabilized in 1.70.0 and 1.80.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quinn&quot;&gt;Quinn&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn&quot;&gt;Quinn&lt;/a&gt; is the most popular Rust implementation of the QUIC transport protocol. Some interesting PRs I
reviewed last month:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1996&quot;&gt;Enabling building quinn-proto for WASM targets&lt;/a&gt; from the folks
at n0 computer, who are building &lt;a href=&quot;https://www.iroh.computer/&quot;&gt;Iroh&lt;/a&gt; on top of Quinn.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1993&quot;&gt;Faster UDP I/O on Apple platforms&lt;/a&gt;, from the Mozilla folks
who are in the process of adopting quinn-udp for Firefox's UDP needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also submitted some PRs of my own:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1987&quot;&gt;Fixed bookkeeping&lt;/a&gt; for datagrams in response to an issue.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1982&quot;&gt;Cleaned up&lt;/a&gt; some new clippy lints.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/quinn-rs/quinn/pull/1977&quot;&gt;Avoided a potential panic&lt;/a&gt; in TLS server config setup.&lt;/li&gt;
&lt;li&gt;Published &lt;a href=&quot;https://github.com/quinn-rs/quinn/releases/tag/quinn-proto-0.11.7&quot;&gt;0.11.7&lt;/a&gt; and
&lt;a href=&quot;https://github.com/quinn-rs/quinn/releases/tag/quinn-proto-0.11.8&quot;&gt;0.11.8&lt;/a&gt; releases for quinn-proto and quinn.
We also investigated a DoS vulnerability that was introduced in quinn-proto 0.11.0 and
published a &lt;a href=&quot;https://github.com/quinn-rs/quinn/security/advisories/GHSA-vr26-jcq5-fjj8&quot;&gt;security advisory&lt;/a&gt;
after 0.11.7 was released.&lt;/li&gt;
&lt;li&gt;Published &lt;a href=&quot;https://github.com/quinn-rs/quinn/releases/tag/quinn-udp-0.5.5&quot;&gt;0.5.5&lt;/a&gt; for quinn-udp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;askama&quot;&gt;Askama&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/djc/askama&quot;&gt;Askama&lt;/a&gt; is a compile-time template engine using a Jinja-like syntax.&lt;/p&gt;
&lt;p&gt;Reviewed some changes to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/askama/pull/1093&quot;&gt;Fix include statements&lt;/a&gt; within block fragments.&lt;/li&gt;
&lt;li&gt;Improve CI to &lt;a href=&quot;https://github.com/djc/askama/pull/1099&quot;&gt;run all tests and packages to completion&lt;/a&gt; even if some fail.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/askama/pull/1097&quot;&gt;Accept a trailing comma&lt;/a&gt; in arrays.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/djc/askama/pull/1095&quot;&gt;Improved the error&lt;/a&gt; in case a Rust operator is used as a
delimiter in a custom syntax, in response to an issue report.&lt;/li&gt;
&lt;li&gt;Applied &lt;a href=&quot;https://github.com/djc/askama/pull/1091&quot;&gt;clippy suggestions&lt;/a&gt; from Rust 1.81 and
fixed dependencies after a new version of Axum was published that uses
&lt;a href=&quot;https://github.com/djc/askama/pull/1098&quot;&gt;tower 0.5&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should really reserve some time to finish the &lt;a href=&quot;https://github.com/djc/askama/issues/1035&quot;&gt;0.13 release&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tokio&quot;&gt;tokio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I &lt;a href=&quot;https://github.com/tokio-rs/tokio/pull/6825&quot;&gt;prepared a tokio-stream release&lt;/a&gt; to support
some work I was doing in tonic to &lt;a href=&quot;https://github.com/hyperium/tonic/pull/1924&quot;&gt;improve newly public API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Although I am only peripherally involved with the tracing-rs project, I spent some time &lt;a href=&quot;https://github.com/tokio-rs/tracing/pull/3069&quot;&gt;cleaning up
all the warnings&lt;/a&gt; that had accumulated over time.&lt;/li&gt;
&lt;li&gt;Reviewed a tracing-opentelemetry &lt;a href=&quot;https://github.com/tokio-rs/tracing-opentelemetry/pull/164&quot;&gt;upgrade to opentelemetry 0.25&lt;/a&gt; and published the 0.26.0 release.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instant-acme&quot;&gt;instant-acme&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/djc/instant-acme&quot;&gt;instant-acme&lt;/a&gt; is a RFC 8555 client for provisioning TLS certificates.&lt;/p&gt;
&lt;p&gt;Reviewed a contributed PR to &lt;a href=&quot;https://github.com/djc/instant-acme/pull/65&quot;&gt;avoid bad nonce errors&lt;/a&gt;
which the Pebble test CA generates to exercise client code. As suggested by the spec, we now retry
requests that trigger a bad nonce error a few times before giving up.&lt;/p&gt;
&lt;h2 id=&quot;on-sustainability&quot;&gt;On sustainability&lt;/h2&gt;
&lt;p&gt;Although I have been reaching out to organizations that I'd hoped would be interested in funding this
kind of work across the Rust ecosystem, so far I have not succeeded in finding any. Although I'm very
grateful to my current sponsors, I'd like to find some companies that can help make my work more
sustainable. Happy to get on a call to discuss how I could help out your team!&lt;/p&gt;
&lt;p&gt;Many thanks to these sponsors (5 USD/month or more):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;astral-sh&lt;/li&gt;
&lt;li&gt;codecov&lt;/li&gt;
&lt;li&gt;thomaseizinger&lt;/li&gt;
&lt;li&gt;stepfunc&lt;/li&gt;
&lt;li&gt;MJDSys&lt;/li&gt;
&lt;li&gt;repi&lt;/li&gt;
&lt;li&gt;sourcegraph&lt;/li&gt;
&lt;li&gt;eightseventhreethree&lt;/li&gt;
&lt;li&gt;paolobarbolini&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	<entry>
		<title>Rust 2019: Ownership without fear</title>
		<link href="https://dirkjan.ochtman.nl/writing/2019/01/01/rust-2019-ownership-without-fear.html" rel="alternate"/>
		<id>tag:dirkjan.ochtman.nl,2019-01-01:/writing/2019/01/01/rust-2019-ownership-without-fear.html</id>
		<published>2019-01-01T00:00:00+01:00</published>
		<updated>2019-01-01T00:00:00+01:00</updated>
		<category term="tech"/>
		<category term="code"/>
		<category term="rust"/>
		<content type="html">&lt;p&gt;Like &lt;a href=&quot;https://dirkjan.ochtman.nl/writing/2018/01/14/rust-in-2018.html&quot;&gt;last year&lt;/a&gt;, the Rust community team &lt;a href=&quot;https://blog.rust-lang.org/2018/12/06/call-for-rust-2019-roadmap-blogposts.html&quot;&gt;asked&lt;/a&gt; community members to write blog
posts &quot;proposing goals and directions for 2019&quot;; this is mine. Like &lt;a href=&quot;https://boats.gitlab.io/blog/post/rust-2019/&quot;&gt;withoutboats'
post&lt;/a&gt; and &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2019/01/07/rust-in-2019-focus-on-sustainability/&quot;&gt;Niko Matsakis' take&lt;/a&gt;, this post will focus on organizational issues.
As such, the &quot;ownership&quot; from the title refers to a leadership principle, not the
technical type system concept we all know and love.&lt;/p&gt;
&lt;h2 id=&quot;finance-without-fear&quot;&gt;Finance without fear&lt;/h2&gt;
&lt;p&gt;I believe the Rust project must figure out how accept donations for the benefit
of the Rust language, compiler and ecosystem. Whether this involves a new legal
entity or not, we should use the corporate money on the table where it could enable
the community to move the ecosystem faster than otherwise possible.&lt;/p&gt;
&lt;p&gt;Even if other communities have run into trouble with this, the focus of the Rust
project on positive-sum outcomes and careful involvement with the community
should make it possible to come up with proposals that are widely supported.
Things like &lt;a href=&quot;https://internals.rust-lang.org/t/homu-queue-woes-and-suggestions-on-how-to-fix-them/8954&quot;&gt;improving the state or scope of CI&lt;/a&gt;, having &lt;a href=&quot;https://internals.rust-lang.org/t/procedural-macros-book/9113&quot;&gt;a procedural macro
book written&lt;/a&gt; or even building custom tooling might all be good ideas.&lt;/p&gt;
&lt;p&gt;So far, the Rust project has preferred existing tools over building our own.
However, I think we run into the limitations of this strategy both in the
example of CI and in the limitations of GitHub issues for some of the more
involved discussions. This is a classic build vs buy discussion -- if we
consider CI and RFC discussions to be a &quot;core business&quot; of the Rust project,
then it might make sense to invest in improving these parts of the project's
process.&lt;/p&gt;
&lt;p&gt;(Is &quot;tooling without terror&quot; too terrible a pun?)&lt;/p&gt;
&lt;h2 id=&quot;foundation-without-fear&quot;&gt;Foundation without fear&lt;/h2&gt;
&lt;p&gt;Setting up a legal entity and governance structure for the Rust project
appears to be a controversial topic in the Rust community. Of course,
it could be a home within an existing foundation: joining Thunderbird
under the umbrella of the Mozilla Foundation, or another entity like
the Software Freedom Conservancy. I would like the increased
transparency and accountability that might come with a more explicit setup
where it concerns how the leadership of the project evolves.&lt;/p&gt;
&lt;p&gt;Since it keeps coming up, it would be good to have an RFC about the
foundation idea; to have a thorough conversation on the benefits and
downsides. If the latter end up outweighing the former, the RFC can serve as
negative space documentation (&lt;a href=&quot;https://graydon2.dreamwidth.org/263429.html&quot;&gt;per Graydon&lt;/a&gt;) for everyone thinking about it.&lt;/p&gt;
&lt;p&gt;In a different vein, I think &lt;a href=&quot;https://www.python.org/dev/peps/pep-8016/&quot;&gt;PEP 8016&lt;/a&gt; is worth exploring as a carefully
considered alternative we could crib ideas from. As an experiment, we
could have part of the core team be elected by a (large cross-section
of) the community.&lt;/p&gt;
&lt;h2 id=&quot;asynchronous-alignment&quot;&gt;Asynchronous alignment&lt;/h2&gt;
&lt;p&gt;I think the Rust project could benefit from an increased sense of the direction
of the project. While the language design and library evolution processes
&quot;just&quot; some adjustments to the increased scale at which we're operating,
other parts of how the project executes are not so well-defined, or happen in
synchronous meetings that are opaque to the community. I'm used to open source
projects where decision making happens exclusively in asynchronous venues, and
the current way Rust teams and working groups function is quite different -- with
a notable exception for the way the compiler team &lt;a href=&quot;https://internals.rust-lang.org/t/compiler-steering-meeting/8588&quot;&gt;documents their work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The yearly roadmap building effort is one great way of doing this, but the
yearly cycle makes it a very coarse-grained check-in. One suggestion I've been
thinking about is to have a community event (maybe with video?) every release
cycle or two where a group of core team members answers crowd-sourced questions
from the community (along the lines of an AMA or Google's TGIF event).&lt;/p&gt;
&lt;p&gt;This could also help cut down on the &quot;Why don't you just&quot; and &quot;Be Heard&quot;
sentiments that I've seen core project team members lament over the past year.
I think those sentiments come from a feeling of powerlessness and being
underinformed. In my mind, more deliberate and continuous communication about
the state of the project could go a long way towards improving on this.&lt;/p&gt;
&lt;h2 id=&quot;careful-conduct&quot;&gt;Careful conduct&lt;/h2&gt;
&lt;p&gt;Although I wholly support the code of conduct and appreciate many aspects of
the way we interact online, there's some things that I think could be
improved. While I've seen people expressing their personal frustration with
a project decision get quickly moderated, I've also seen users who keep
posting vague forum threads or exert significant stop energy on others'
proposals. I wish we could be more openly critical of decisions (not people)
while at the same time more strict towards net-negative participants.&lt;/p&gt;
&lt;p&gt;On a more subtle note, I've felt that core project team members cast the
community as an angry mob at times. Although I realize it is a big job,
I think it's fair to ask project leaders to bring more empathy to the table in
these cases -- to me, that is an important part of leadership. If a significant
part of the community is up in arms about something, there likely is a kernel
of truth to their argument, and the leadership should respond to the sentiment
to prevent it from festering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href=&quot;https://www.reddit.com/r/rust/comments/agdkwm/rust_2019_ownership_without_fear/&quot;&gt;interesting discussion on these topics&lt;/a&gt; on Reddit.&lt;/p&gt;
&lt;h2 id=&quot;taking-the-long-view&quot;&gt;Taking the long view&lt;/h2&gt;
&lt;p&gt;To my taste, too much focus in 2018 was spent on releasing the edition.
We could have spent more time addressing technical and organizational debt
and released the edition 3 or 6 months later to little consequence. The Rust
release process has been carefully engineered to optimize for cautious
movement towards long-term goals -- and the edition process, in setting
a fixed scope and an arbitrary hard deadline, subverted a number of these
goals. This caused issues around the release of the website as well as
problems with tools when 1.31 was released.&lt;/p&gt;
&lt;p&gt;On the one hand, the cautious, deliberate approach to language design and
compiler development have served us well, and will likely continue to do so.
However, we should not forget that this process functions well in part due
to an imposed feedback cycle that gives enough time and space for people
to experiment before casting the new feature in (stable) stone per
&lt;a href=&quot;http://www.hyrumslaw.com/&quot;&gt;Hyrum's law&lt;/a&gt;. In a similar vein, we cannot expect to get our organizational
changes right on the first try, and so we should not be afraid to experiment
and iterate with the way the community works on the Rust project, rather than
taking a long time to get it just right. This is especially true because the
experiment period allows a wider community to participate and interact with
the proposed change, thus reinforcing community alignment and improving feedback.&lt;/p&gt;
&lt;p&gt;In this sense, we might learn from Jeff Bezos when he talks about a bias to action,
saying that we should not spend too much time discussing decisions that
are easy to change after the fact. For Rust, too, we want to remain at
Day 1 for as long as we can -- let's remember the &quot;without stagnation&quot; part.&lt;/p&gt;
&lt;h2 id=&quot;contemplating-cargo&quot;&gt;Contemplating Cargo&lt;/h2&gt;
&lt;p&gt;On a somewhat more technical note, I hope for more attention given to Cargo.
While Cargo is a great tool in many ways, it also suffers from a number of
usability cliffs where the behavior is hard to predict or understand.
When I tried to contribute, I found that there's also a decent amount of
technical debt, and my attempts to improve this through refactoring were
met with such reluctance that I stopped contributing. From
&lt;a href=&quot;https://www.reddit.com/r/rust/comments/ag8vrf/think_twice_before_you_decide_to_contribute_to/&quot;&gt;recent reports&lt;/a&gt;, it seems I'm not the only one.&lt;/p&gt;
&lt;p&gt;Since Cargo is so central to the Rust experience, I think we should not
undervalue it; as one example, the interactions between Cargo and
rustc also influence the perception of those compile times
people keep talking about. I was very happy to see the &lt;a href=&quot;https://internals.rust-lang.org/t/cargo-team-changes/8651&quot;&gt;leadership changes&lt;/a&gt;
and increase of the team's size, and I hope those changes will
lead to further Cargo improvements this year.&lt;/p&gt;
&lt;h2 id=&quot;unused-inventory-redux&quot;&gt;Unused inventory, redux&lt;/h2&gt;
&lt;p&gt;Last year, I wrote &lt;a href=&quot;https://dirkjan.ochtman.nl/writing/2018/01/14/rust-in-2018.html&quot;&gt;at some length&lt;/a&gt; about the concept of unused inventory.
This is still very much on my mind, and I was happy to see Niko talk about
it in very similar terms. I hope we can improve things here.&lt;/p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;I'm still as bullish on the Rust language as ever. Non-lexical lifetimes
and the module system changes have made an already great language even
better, async/await is going to be great. What I most want from Rust, though,
is that more of the software in my life can enjoy its reliability and
efficiency (in performance vs footprint), and for that we need adoption and
sustainability. While the technical side of the project is working well,
I've been concerned about the functioning of the project's governance and processes.
A number of Rust 2019 posts have addressed similar concerns, which
makes me hopeful for 2019.&lt;/p&gt;</content>
	</entry>
</feed>