Repository navigation
What's new
A stability-focused release: runtime teardown and threading fixes, rendering fixes on iOS and Android, faster hot paths, and Xcode 27 support.
Runtime stability
- Hardened runtime teardown at app termination: JS dispatch is refused once the JS queue is torn down, visibility observers are no longer flushed into a destroyed context, and the native context stays retained across in-flight Java calls.
- Deadline-bounded synchronous JS calls now fail fast while the JS thread is stalled instead of blocking the caller.
- Fixed a race in the initial auto-render publication on Android.
- Promises handed to native code are no longer reported as unhandled.
- QuickJS
dumpMemoryStatisticsis now O(1), removing a source of JS-thread stalls. - iOS arm64e: ObjC block invoke pointers are authenticated with the block ABI.
- Android: avoid a legacy reflection crash in function lookup.
- Null image-download cancellation handles are handled safely.
Rendering and views
- iOS views with layout callbacks are now recyclable.
- iOS text views redraw on resize instead of stretching a stale bitmap.
- Dashed and dotted iOS borders animate with the corner radius.
- Image views reuse images that JS already preloaded; Android skips drawing recycled bitmaps.
- Pickers re-measure when their value changes.
- Attributed-text tap recognizers are removed when a label switches to plain text.
- Android: selectable text inputs restore their movement method when they become editable.
- New iOS
DateFormattingmodule so Valdi-formatted times honor the system 24-Hour Time setting.
Performance
- Removed per-render allocations and global-lock interning from hot paths.
- Module loading skips an always-missing source map lookup.
- View pool hits, misses, and drops are reported per module.
- Added headless microbenchmarks for layout, render, and runtime init.
Compiler and code generation
- Generated C++ int enums now carry their TypeScript values.
- Vue template attributes are emitted in source order.
Build and tooling
- Xcode 27 / macOS 27 builds are supported.
- Maven dependencies are pinned with lock files, avoiding Maven Central rate-limit (429) failures during builds.
com_android_dexis fetched from the AOSP GitHub mirror.- The Linux Swift toolchain is no longer fetched on macOS.
- Web: build-system groundwork for the web target (no renderer changes yet).
Docs and project
- New
VERSIONING.mdand an RFC process; refreshedROADMAP.md. - Contribution rules, governance, and support docs; PR expectations in
CONTRIBUTING.md; YAML issue forms. SECURITY.mdscope clarified; clean MITLICENSE.- Setup docs and codelab fixes, including an Xcode 26.5/27 support note.
Valdi_Widgets
CoreTextFieldcan now shrink inside fixed-width parents (Snapchat/Valdi_Widgets#23).- The release branch pins
rules_android0.6.5 to match Valdi.
Community contributions
Thank you to everyone who contributed to this release:
- @bjdodson-openai: portable ClientSQL runtime and debugger (#181)
- @tx3stn:
ArrayBuffertyping fix for TypeScript 5.7+ (#186) - @tx3stn:
createDirectorySyncno longer reports success without creating the directory (#187) - @kwy404:
spawnCliCommandno longer re-prints accumulated output (#190)
Upgrading
- Install or update the CLI:
npm i -g @snap/valdi@1.2.1. New projects fromvaldi bootstrappin Valdi and Valdi_Widgets tobeta-0.2.1. - Existing projects: set
VALDI_TAG = "beta-0.2.1"inMODULE.bazel(update the integrity hash), and point the registry in.bazelrcathttps://raw.githubusercontent.com/Snapchat/Valdi/beta-0.2.1/registry. - Valdi_Widgets users: use the
beta-0.2.1tag (from therelease/beta-0.2.1branch). - If you build with Xcode 27, upgrade: beta-0.2.0 (the CLI 1.2.0 default) does not build there.
- CLI 1.2.1 fixes
valdi install ios --simulator, which was inverted and built for a device.
Known issues
//valdi:valdi_ios_objc_testcan abort intermittently on macOS due to a Hermes ES6 class transform bug (#195). This predates beta-0.2.0.