Rust & AI Weekly #13: the counters looked fine

The counters looked fine. The queue told another story.
A service at AWS was falling over at 90% CPU. Tokio's metrics showed idle workers and full queues. Russell Cohen built dial9 to see what happened between those measurements.
This week's Rust & AI Weekly covers dial9's 0.5 release, a warning about attacks on Rust maintainers, and five more dependency evaluations. Each crate has a verdict, release status, and the caveats I would check before using it.
Public signals checked September 22, 2026. Stars and downloads are approximate.
Six entries this week: three new and three updates. The radar now covers 80 tools: 14 Adopt, 33 Trial, 31 Assess and 2 Hold. Explore the interactive version.
The week's anchor
On September 17, Adam Harvey published Be alert: targeted attacks on prominent Rustaceans for the crates.io team and security response working group. Attackers are targeting rust-lang members and owners of popular crates to compromise their machines and publish malware through their accounts.
The approach starts with a video call about a job, contract, or collaboration. During the call, the target is asked to install a “missing audio codec” or run a command placed on their clipboard. The attackers create plausible company profiles, including a LinkedIn presence, to survive a cursory check.
The post links Matt Mastracci's June account of similar attempts and notes that August's arrayref compromise used a similar route. Whether these belong to one campaign is unknown. The pattern is documented as DPRK tradecraft and crosses ecosystems; Go Weekly carried the alert on September 18.
For maintainers, the Rust team's advice is concrete:
- Set up the call yourself, on a platform you already use.
- Recheck MFA and account login history.
- Report concerns to help@crates.io or security@rust-lang.org.
The supply-chain tools covered in recent issues, including cargo-vet, cargo-acl and publish-age delays, operate on releases and builds. They do not protect a maintainer's machine during a call.
For consumers, the controls from issue #10 still help: delay fresh releases and check build-time capabilities. They can limit exposure to a compromised release, including an unexpected socket opened by a build script.
Pick of the week
dial9 0.5.1 — a flight recorder for Tokio. Trial.
Cohen's AWS investigation found an 18-millisecond gap between Tokio asking the kernel to wake worker 47 and the worker being scheduled. The event trace exposed a delay the aggregate metrics could not explain.
dial9 records poll starts and stops, worker park and unpark events with kernel timestamps, and wake causality. It also captures sampled allocations and liveset tracking, frame-pointer CPU profiles, tracing spans, getrusage, and TCP accept-queue depth. Output goes to a rotating disk or memory buffer, or S3.
The project's March introduction described overhead as typically under 5%. That is the project's measurement; I have not independently verified it for another workload.
What changed in 0.5
Version 0.5.0 shipped on August 26. The crate was renamed from dial9-tokio-telemetry to dial9, and Tokio became one Source among several. The profilers no longer depend on Tokio.
- Native spans:
dial9_span!and a Tower layer can record spans without going through your tracing subscriber. - Trigger mode: keep a ring buffer and flush when your code detects a problem.
- Multi-trace analysis: aggregate flamegraphs and span histograms across files and hosts, then compare slow operations with fast ones.
The 0.5.1 release notes, dated September 17, add system information in trace segments, FreeBSD telemetry, and off-CPU and spawn-to-first-poll points of interest. Fixes cover task dumps, rotation, and liveset reallocations.
There is also API migration work: RecorderSourceExt methods are deprecated in favour of inherent RecorderBuilder methods. Sealing the extension traits is marked as breaking.
Running without unstable hooks
dial9 0.5 works without tokio_unstable, with reduced coverage. Task spawn and terminate events and per-worker queue depth still need runtime hooks. Poll coverage is limited to tasks started through dial9's own spawn helpers.
That gives a platform team a way to evaluate it without a rustflags exception. Check those coverage limits against the incident you need to investigate.
Cohen's Principles for fast Tokio applications, written after the RustConf Unconf and listed in TWiR 669, is the companion read. Start from a real metric, inspect schedule latency, batch for throughput, and yield for latency. Keep contended std mutex sections short, such as a hashmap update, and reserve cores for the runtime.
His mini-Redis example reports p99 falling from 2.548 ms to 0.320 ms after yielding every four consecutive ready reads. Those are the author's results. The post is a first draft and accepts PRs.
- Maintenance: Russell Cohen and Jess Izen, with Carl Lerche also a crates.io co-owner. Eighteen named contributors on 0.5, including David Tolnay. Apache-2.0; about 500 stars and 534 commits.
- Latest: 0.5.1, September 17. About 750k downloads under the old crate name.
- Adoption: Trial. AWS services were early adopters; Ditto runs the CPU profiler on production Android behind a flag. Budget for the 0.3-to-0.5 migration and
force-frame-pointersfor profiling. Exit cost is low because telemetry is outside the application's data path.
Codecs
zenjpeg 0.8.4 — TWiR 669's Crate of the Week, suggested by Kornel. Assess.
Lilith River at Imazen started with a port of Google's jpegli, then rewrote it six times into an independent pure-Rust JPEG encoder and decoder. It uses #![forbid(unsafe_code)], with SIMD through archmage's safe-token API.
For an image-ingestion service, the useful features are single-pass streaming with bounded memory, decode limits on pixels and bytes, and cooperative cancellation. The codec also supports parallel decoding with restart markers, adaptive and trellis quantization, XYB, UltraHDR gain maps, and JPEG-to-JPEG recompression.
Performance and licence
The author publishes a pinned-commit reproduction on a Ryzen 9 7950X. I have not rerun these benchmarks:
- Baseline decode: 0.94x libjpeg-turbo.
- Progressive decode: 1.35x faster, attributed to the fused pipeline.
- Parallel decode of a 4096px image: 13% of the C implementation's time.
- Encode: beats mozjpeg at matched file size on 81% of a 337-photo corpus.
The README discloses development with Claude and more than 930 tests against the C++ reference.
zenjpeg is AGPL-3.0 or commercial. The commercial offer includes a $1 startup licence for businesses under $1M revenue with fewer than five employees, then a sliding-scale subscription. Read LICENSE-COMMERCIAL for eligibility and obligations.
River has maintained the broader Imazen ecosystem full-time since 2011; the dual licence funds that work. For a company evaluation, the licensing decision comes before the benchmark comparison. The decoder API is also marked prerelease, with breaking changes expected.
- Maintenance: actively developed, effectively solo but funded, by Lilith River / Imazen. 2,599 commits; 15 stars.
- Latest: 0.8.4, June 1, 2026; the fourteenth GitHub release. Formerly published as jpegli-rs.
- Adoption: Assess. Check commercial terms and tolerance for decoder API changes. zune-jpeg, with 0.5.16-rc2 released September 8, and the image crate remain permissively licensed alternatives.
SIMD
fearless_simd 1.0.0 — final 1.0 shipped September 21, alongside fearless_simd_macros 0.1.0. Trial, unchanged from issue #8.
The August 0.7 post targeted early September if no API concerns emerged. It expected no further breaking changes, but did not promise an API freeze. Two breaking release candidates followed: rc.1 on September 13 and rc.2 on September 19, released by LaurenzV with Shnatsel writing nearly every change.
Migration from 0.7
- rc.1:
NbecameLEN; theas_arrayfamily now followsstd::simd;absmoved toSimdBase, making it available for integers. - Reductions:
reduce_sum,reduce_product,reduce_minandreduce_max, plus precise min/max variants. Floating-point sum and product use a fixed evaluation order and agree across backends for the same vector type and lane count, except for NaN bit patterns. - Fused arithmetic:
mul_add_preciseguarantees single rounding, including without hardware FMA. - rc.2:
witness()becametoken()on the newExtractTokensupertrait. The companion macros crate adds#[simd]to run a generic function body with the appropriate target features.
Two support commitments are worth including in an evaluation. Vector storage representation is documented and will change only with a semver major. From 1.0, the latest release for each MSRV receives security backports for at least three years after that Rust version shipped.
- Maintenance: Linebender; Shnatsel writing, LaurenzV releasing. About 458 stars; MIT OR Apache-2.0.
- Latest: 1.0.0, September 21. Requires Rust 1.89.
- Adoption: Trial. Evaluate final 1.0 and test the 0.7 migration against the API changes above. This closes the 1.0 carry-over from issue #11.
Concurrency
tokio_rcu 0.2.1 — Roee Shoshani shipped 0.2.0 on September 15 and 0.2.1 on September 17. Assess.
The commit history and versioned docs clarify what changed. rcu_block_on and enable_rcu already existed in 0.1.3. The API rename was rcu_ptr::RcuPtr to rcu_box::RcuBox.
Version 0.2 removed per-thread live-guard reader bookkeeping and added include_calling_thread to synchronize_rcu. Version 0.2.1 tightened RcuBox's Sync bound to require T: Send + Sync, fixed a stall involving blocking tasks, and added branch hints.
Reading the new benchmarks
The refreshed i7-12700 table reports mean read-only times of 2.166–3.496 ms for RcuBox, versus 23.87–132.9 ms for arc-swap, across 1, 8, 16, 32 and 64 tasks. The README describes reads as 9–40 times faster and writes as twice as slow.
These are the author's results; I have not rerun them. Last week's three-times-faster figure came from the previous README. The new table compares against arc-swap, so it does not establish a 9–40-times gain over 0.1.3.
PR 6 renamed existing Divan benchmark functions after the implementation changed. That diff preserved their workloads; it did not introduce a new harness.
The 0.2.1 docs still require tokio_unstable. Unlike dial9's optional telemetry hooks, tokio_rcu relies on on_after_task_poll for its correctness argument. That keeps it at Assess.
- Maintenance: new, solo project by Roee Shoshani; MIT. Stars rose from 8 to 38 and commits from 157 to 226 this week.
- Latest: 0.2.1, September 17.
- Adoption: Assess, unchanged. The required hook remains unstable; a Tokio team answer to last week's question is still unverified.
GUI
Slint 1.18 — the toolkit covered in issue #3 released 1.18.0 on September 16, listed in TWiR 669. Trial.
FlexboxLayout brings wrapping items and a CSS-familiar layout API into the Slint DSL. The rest of the release covers several parts of a native app:
- Layout and motion: runtime z-order changes, spring animations, and animation and orientation along a path.
- Models and windows: array and model
push,removeandinsert, custom struct-field defaults, andWindowMoveAreafor custom title bars. - Accessibility and rendering: screen-reader support for text inputs and an experimental Vello renderer.
- Performance: leaner compiler output for faster builds and smaller binaries, plus faster large-text rendering and editing.
Slint's built-in MCP server lets an agent drive a running UI. That remains its relevance here for embedded and desktop applications. The tri-licence still needs a legal read.
- Maintenance: SixtyFPS GmbH, with NLnet-funded features. About 23.9k stars.
- Latest: 1.18.1, September 21. The features above arrived in 1.18.0 on September 16.
- Adoption: Trial, unchanged from issue #3.
Data plumbing
html2text 0.17.1 — Chris Emerson's Rust HTML-to-text converter, maintained since 2016. Trial.
It parses with html5ever and runs a layout pass: tables keep their columns, lists keep their structure, links receive numbered footnotes, and text wraps to a chosen width. Rich and coloured output modes serve terminals.
For RAG ingestion, that can preserve information a text flattener loses. A pricing table rendered as aligned columns retains relationships between plans and prices.
Go Weekly 618 listed k3a/html2text 1.5, a zero-dependency Go converter. That prompted this Rust pairing. The draft's separate lib.rs trending claim remains unverified: html2text is absent from the current list.
- Maintenance: Chris Emerson / jugglerchris, with other contributors; one primary maintainer. MIT; about 245 stars.
- Latest: 0.17.1, April 19, 2026. About 6.1 million all-time crates.io downloads and about 521,000 per month on lib.rs.
- Adoption: Trial. Account for reliance on one primary maintainer and API changes between 0.x minor versions.
Language watch
Allocator is close to stabilization. PR 156882 by nia-e finished its final comment period with a disposition to merge, but remained open on September 22. The trait supports custom allocators for Box, Vec and related types and has been unstable since 2020. It would make last week's allocator survey relevant beyond nightly.
Merged
core::mem::DropGuard: PR 161520, Yoshua Wuyts, September 13. Closes last week's FCP item.Vec::from_fn: PR 162685, September 12.unsafe_cell_access: PR 162504, September 14.- RISC-V
dandftarget features: PR 161385, Ralf Jung, September 13. cargo installuses the packaged lockfile by default: PR 17388, also confirmed in TWiR's Cargo list.
Separately, Thread::os_id merged September 9 in PR 160219 as an unstable API. It was not stabilized.
In final comment period
funnel_shifts, includingconst: PR 161015.Result::into_okandinto_err: PR 161712.- WebAssembly
wide-arithmetic: PR 160877, Alex Crichton. - Cargo's
build.profileandinstall.profileconfig keys: PR 17215, Ed Page. These allow a custom default profile without a command wrapper.
The 8-byte RawWakerVTable alignment guarantee, PR 158186, finished FCP with disposition merge and remained unmerged.
Kobzol's September 14 compiler-performance triage reports zero primary regressions and 199 primary improvements, with mean instruction counts down 0.7%. Several improvements revert earlier regressions. PR 162422 brings Polonius closer to the old NLL borrow checker's speed.
In brief
-
Rust is a Tier-1 language at Microsoft — Victor Ciura's September 10 post places Rust alongside C++, C# and TypeScript for internal development. The
rustc_codegen_utcbackend emits through MSVC, has been production-ready since early 2026 and self-hosting since Rust 1.90, and is used by more than 100 Microsoft repositories. Rust Bytes #136 also covered it. -
Solana Foundation and NVIDIA join the Rust Foundation as Platinum members — announced September 9, during the RustConf week of NVIDIA's CUDA Rust commitment.
-
Developing provably correct Rust code with Verus — Bryan Parno on the SMT-backed verifier listed as “under review” in issue #11's std-verification coverage.
-
Optimizing a single Clippy lint by 3133x, Alejandra González. Also linked in Rust Bytes #136.
-
Shipping Rust static libraries without symbol collisions, Stephan Eckes at ai-coustics. Their Rust audio SDK hit bundled-symbol collisions; the draft's specific
ringattribution remains unverified. -
CO3: Toward the Optimal FFI, mversic.
-
Why building a Rust LSP is hard, the Rust Glancer project.
-
A visual guide to Rust async, Henrik Åkesson. A pairing for dial9's principles post.
-
Operators of death: checked arithmetic in Rust, John Arundel.
-
Rust generics: from static to dynamic dispatch, Sylvain Kerkour.
-
Trying to make a loop auto-vectorize, jsgroth. Read alongside fearless_simd.
-
One Lock to Rule Them All, FlakM, on a PostgreSQL advisory-lock wrapper inspired by sqlx migrations.
The draft also listed wasmtime, clap, crypto-bigint, cudarc, syd, picoserve, postcard-rpc and vello from lib.rs's notable releases. That historical list remains unverified; the live list changed, and I did not check those releases individually.
Elsewhere
Native editors
Go Weekly 618 led its tools section with Rune, Ernest Romero Climent's native IDE on a fork of Ebitengine. It is now GPLv3, with about a thousand stars. The engineering write-up describes bringing its integrated terminal close to Alacritty and Ghostty speed without cgo on the hot path.
The Rust pairing is Zed, at Adopt since issue #1. Its GPUI renderer serves the same role through a different implementation.
Wasm translated to native source
goccy/wasm2go, by Masaaki Goshima, translates a Wasm binary into standalone Go source plus amd64 and arm64 assembly. The older ncruces/wasm2go powers cgo-free go-sqlite3. Both address shipping a C library built with the WASI SDK without bundling a Wasm engine.
The Rust project checked here is hirosassa's wasm2rs, at 0.1.1 from August with a few dozen downloads. A mature Rust counterpart remains an unverified research lead: checking these projects does not establish the absence of alternatives.
Newsletter coverage
Go Weekly 618 carried the Rust maintainer alert on September 18 and the Go html2text pairing covered above.
Rust Bytes #136, dated September 15, led with the debugging survey and spotlighted rust-smallvec. Its roundup included Microsoft Tier-1, Cargo team changes, Rustls, Dioxus and the Clippy optimization. It remained the latest issue in the archive on September 22.
Its full body contained none of this issue's six crate entries or the dial9 principles post. It also predates the September 17 maintainer alert, so that omission says nothing about how quickly Rust readers heard the warning.
A thought for the week
dial9's AWS example is a reason to test event recording before an incident. Start with a service where schedule latency matters. Measure the recorder's overhead and check what trigger mode retains when the service slows down.
Two dependency-review tasks follow from this issue: read the actual licence terms for zenjpeg or Slint, and include fearless_simd's written security-backport window in the maintenance evaluation. A registry badge alone does not answer either question.
For maintainers with publish rights, the Rust team's immediate recommendation is to arrange unsolicited calls yourself on a platform you already use.
Before I go
The fearless_simd 1.0 carry-over is closed. tokio_rcu's required hook remains unstable, and a Tokio team response is still unverified.
RustConf recordings were not published where I could find them during this check. Melih Elibol's and Joe Birr-Pixton's talks remain the pairings to add when available.
I'd like to hear from readers running dial9 in production, especially outside AWS: what overhead did you measure, and did trigger mode change how much you keep?
If your team evaluated an AGPL-or-commercial Rust dependency, what did legal need, and how long did the review take? Reply with that experience, or a Rust+AI crate to consider for next week.
Keep shipping, Decebal
