2026-05-03

Weekly open source: libwallet's last mile, OxideAV's document stack

Two-track week: libwallet finishing the last fraction of a percent before going live, and OxideAV continuing to fill out a long-term vision.

libwallet: the last mile

libwallet is 99.9% ready to go live. The fixes shipping now are the kind you only find by actually using the wallet against real chains — edge cases in the field, not features designed at a desk. v0.4.5 → v0.4.15 over the week.

Bitcoin got the heaviest pass:

  • In-memory UTXO tracker so back-to-back sends don't double-spend while a previous tx is still propagating.
  • Filter spent txos before coin selection — fixes a flow that was picking already-spent outputs.
  • Dry-run preview for unsigned bitcoin transfers (wlttx/simulate), used by the UI to show "what would this cost" before asking the user to sign.
  • Account:listUTXOs + a Dart utxos field for manual UTXO selection, plus per-input vsize accounting.
  • Spend across both m/0 and m/1 derivation branches, not just receiving. xpub queries route through modchain_lookupTxoBIP32.

EVMSignAndSend now auto-validates, so fees / nonce / gas parameters land correctly without the caller filling in the right shape upfront.

AccountAccount:addressFormats exposes a multi-shape address picker (legacy / segwit / native segwit on Bitcoin, taproot, etc.). FindAccount falls back to the current-network derived address when the input doesn't match any indexed record.

The pattern across all of these: not new abstractions, just the right behaviour at the boundaries real users hit.

OxideAV: the long-term vision

The goal of OxideAV is to merge ffmpeg and ImageMagick into a single pure-Rust process that's safe to run on untrusted input.

The case for one project covering both is technical, not just ergonomic: modern image formats are essentially video codecs applied to single frames. WebP is a VP8 intra-frame in a RIFF container. HEIC / HEIF are HEVC intra-frames in ISOBMFF. AVIF is AV1 intra-frames the same way. The distance between "image" and "video" has shrunk to the point where splitting them across two separate projects — each with its own decade-deep pile of CVEs and C dependencies — is the legacy choice, not the inevitable one.

Beyond absorbing the existing use cases, OxideAV is building toward things neither tool does well today. Vector PDF → vector SVG conversion is one example, where paths and gradients stay as paths and gradients across the round-trip instead of being flattened to raster. There's more in that direction.

That's the goal. Today, OxideAV is not yet usable — v0.0.x / v0.1.x across the board, the kind of multi-year build that doesn't pay back until late.

This week's progress, by area.

Document stack

The scene model from W17 was scaffolded for PDF / livestream / NLE but had no real building blocks. This week they landed:

  • oxideav-ttf — TrueType parser, with COLR/CPAL vector colour-emoji layer stacks (v0 + v1), Apple-style sbix PNG/JPEG bitmap colour glyphs, and TTC collection sub-fonts.
  • oxideav-otf — OpenType / CFF parser (sfnt + CFF + Type 2 charstrings, cubic-Bezier outlines).
  • oxideav-scribe — font rasterizer + shaper + layout. Refactored mid-week to vector- only; the pixel pipeline got dropped because the rest of the document stack wants vectors all the way down.
  • oxideav-raster — vector → raster rendering kernel, with Lanczos2 (4×4 windowed sinc) image resampling.
  • oxideav-pdf — PDF reader and writer where vectors stay vectors. Paths stay paths, gradients stay gradients, no rasterisation along the way. Bytes → Scene round-trip in the top-level walker.
  • oxideav-svg — SVG reader and writer. <text> / <tspan> through scribe's vector-first API. <mask> / <clipPath> with multi-shape clip and SoftMask compositing. <filter> passes through gracefully.

Plus image-format coverage: oxideav-tiff (TIFF 6.0) and oxideav-pbm (Netpbm — PBM/PGM/PPM/PNM/PAM).

Lossless sweep

Seven new lossless decoders for archival and editing workflows: TTA (True Audio), Ut Video, Shorten, HuffYUV / FFVHuff, Lagarith, MagicYUV, and WavPack.

Long tail + modern niches

Legacy: Cinepak (CVID), Indeo 2 (RT21/IV20), SVQ1 (Sorenson), Cook (RealAudio), WMA, Musepack, aptX (classic + HD Bluetooth), MIDI (with a SoundFont 2 / SFZ / DLS soft-synth scaffold).

Modern: EVC (MPEG-5), JPEG XS (low-latency for production / IP video), DTS (Core + EXSS / XCH / XXCH / X96 / XLL extensions).

Synthetic media

oxideav-generator — sine waves, gradients, fractals, test patterns. Usable as a generate:// URI source or as a zero-input filter. Plus label — text-to-image via scribe.

Also this week

Mostly background:

  • goro (PHP in Go) — in optimization stage. Cached literal *ZVal at compile time, wrapper-free ZVal.SetVal fast path, fewer allocs in operatorMath.
  • goro-rs (PHP in Rust) — substantial PCRE regex engine rewrite. Currently around 50% on the PHP test suite.
  • cterm — streaming input RPC with batched fallback for low-latency typing.
  • klbslog + rest — twin fix to reset request body on retry / token-renewal retry.

Next week

A VM lands in goro. libwallet's go-live work continues.