NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2565 most downloaded on pub.dev
Run JavaScript widgets as Flutter widgets using QuickJS (VM) or Web Workers (web).
Last release today
07 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 months old
148 releases · first in 2026
One column per month.
Host build hooks + decoration fixes: JsonWidgetBuildHooks (effectiveN…
Host build hooks + decoration fixes: JsonWidgetBuildHooks (effectiveN…
JsonWidgetBuildHooks lets an embedding renderer interpose on
child traversal and node finishing WITHOUT forking the node builders — jsr stays the
single source of truth for node semantics (the yoclip renderer now hosts only its
media/text domain through these hooks):
effectiveNode merges host edits (Studio overrides) before dispatch; returning the
same instance keeps the widget memo cache effective.stampChild/skipChild let the host stamp ids and hide layers during traversal
(stack positioned wrappers included); the memo stays keyed on the RAW child map.finishNode runs between the node builder and the universal-effects pass, so a host
wrap pipeline can apply and strip props before jsr would double-apply them.hideText flag: PPTX background-patch mode — text keeps its layout footprint but
paints no ink (a tiny non-zero alpha that does not poison headless layer capture).{type, positioned, child}) is now
built whole — dropping it used to discard its color/padding/size and leave only the
content (bare {positioned, child} wrappers still work).Container content centering: {width, height, alignment: 'center', child: {type: 'row'|'column'}} now centers the flex child's content (min main axis)
{width, height, alignment: 'center', child: {type: 'row'|'column'}} now centers the flex child's content (min main axis) instead of letting a default max-size row/column stretch across the box and pin children to the start edge. Explicit mainAxisSize wins. Key kAlignContentMinMainAxis is exported so the yoclip renderer can mirror the contract.chore: bump version to 0.4.156 [pub bump]
chore: bump version to 0.4.156 [pub bump]
chore: bump version to 0.4.155 [pub bump]
chore: bump version to 0.4.155 [pub bump]
chore: bump version to 0.4.153 [pub bump]
chore: bump version to 0.4.153 [pub bump]
chore: bump version to 0.4.152 [pub bump]
chore: bump version to 0.4.152 [pub bump]
chore: bump version to 0.4.151 [pub bump]
chore: bump version to 0.4.151 [pub bump]
chore: bump version to 0.4.150 [pub bump]
chore: bump version to 0.4.150 [pub bump]
chore: bump version to 0.4.149 [pub bump]
chore: bump version to 0.4.149 [pub bump]
chore: bump version to 0.4.148 [pub bump]
chore: bump version to 0.4.148 [pub bump]
chore: bump version to 0.4.147 [pub bump]
chore: bump version to 0.4.147 [pub bump]
chore: bump version to 0.4.146 [pub bump]
chore: bump version to 0.4.146 [pub bump]
chore: bump version to 0.4.145 [pub bump]
chore: bump version to 0.4.145 [pub bump]
- Automated patch bump.
- Automated patch bump.
chore: bump version to 0.4.142 [pub bump]
chore: bump version to 0.4.142 [pub bump]
chore: bump version to 0.4.140 [pub bump]
chore: bump version to 0.4.140 [pub bump]
chore: bump version to 0.4.139 [pub bump]
chore: bump version to 0.4.139 [pub bump]
chore: bump version to 0.4.138 [pub bump]
chore: bump version to 0.4.138 [pub bump]
chore: bump version to 0.4.137 [pub bump]
chore: bump version to 0.4.137 [pub bump]
chore: bump version to 0.4.136 [pub bump]
chore: bump version to 0.4.136 [pub bump]
chore: bump version to 0.4.135 [pub bump]
chore: bump version to 0.4.135 [pub bump]
chore: bump version to 0.4.134 [pub bump]
chore: bump version to 0.4.134 [pub bump]
chore: bump version to 0.4.133 [pub bump]
chore: bump version to 0.4.133 [pub bump]
chore: bump version to 0.4.132 [pub bump]
chore: bump version to 0.4.132 [pub bump]
chore: bump version to 0.4.131 [pub bump]
chore: bump version to 0.4.131 [pub bump]
chore: bump version to 0.4.130 [pub bump]
chore: bump version to 0.4.130 [pub bump]
chore: bump version to 0.4.129 [pub bump]
chore: bump version to 0.4.129 [pub bump]
Widget JS can photograph itself at the exact moment of its logic:
Widget JS can photograph itself at the exact moment of its logic:
jsr.capture({name: 'city'}).then(function (shot) {
console.log('SELFIE ' + shot.path);
});
Core bridge channel (__jsr_capture) with an optional
JsRuntimeConfig.captureHandler; hosts without one reject the promise
(voxel.attach-style graceful degradation). The channel is
fire-and-forget ON PURPOSE: an awaited capture would starve
__jsr_event_done and wedge every subsequent callEvent, and resolving
from the tester zone re-enters the QuickJS runtime from a
native-callback context (isolate-wide deadlock). The CLI therefore
resolves immediately with the future path (voxel.mesh sync pattern)
and rasterizes the tree snapshot in its testWidgets phase — PNGs land
under --capture-dir, listed in the --json report captures[].
This closes the loop for agent widget-authors whose only tool is
jsr_widget test: it now produces both logic evidence and visual
evidence. Also: parseJsrToolArgs/defaultQuickjsLibEnv/loadWidgetSource
and JsVoxelChunk.fromDynamic decomposed under the CRAP-12 ratchet, with
tests for the cache walk, usage errors and manifest fallbacks.
Documented in the authoring skill (jsr API + §8.3) and AGENTS.md.
jsr.capture(opts?) — widgets can photograph their own rendered
tree from inside their JS ({name} option names the file). Core
bridge channel, host-dependent: the jsr_widget CLI implements it —
--capture-dir <dir> writes the PNGs and the --json report lists
them under captures[], so agent-authored widgets self-screenshot at
the exact moment of their logic mid-event. Hosts without a handler
reject the promise (graceful degradation). Fire-and-forget channel:
a slow/unavailable capture can never stall the message queue.chore: bump version to 0.4.127 [pub bump]
chore: bump version to 0.4.127 [pub bump]
Agents authoring widgets in the Fa ecosystem need to verify their work without hand-writing Dart tests. Two commands, both runnable from any project d
Agents authoring widgets in the Fa ecosystem need to verify their work
without hand-writing Dart tests. Two commands, both runnable from any
project depending on the package:
Implementation: lib/src/tooling/ holds the Flutter-free core (arg
parsing, spec JSON, matchers, pub-cache QuickJS discovery);
tool/jsr_widget_harness*.dart run as a flutter test with a JSR_TOOL_SPEC
env contract; bin/jsr_widget.dart wraps it (flutter discovery, package
root resolution via package_config.json, report extraction).
Also documents the manifest i18n keys and the dart.library.js_interop
web marker in the skills.
jsr_widget CLI for headless widget verification by agents and
humans: dart run bin/jsr_widget.dart test <widget-dir> runs the
widget's real JavaScript on the QuickJS backend with NO rendering —
dispatch events (--event, repeatable), seed storage, inject
fetchJson fixtures, assert the final jsr.exportState (deep-subset
match) and console output; --json prints a machine report and the
exit code is 0/1. ... screenshot <widget-dir> pumps the rendered
tree through the production renderer and writes a PNG (width/height/
scale/theme, --freeze-clock for determinism). Works from any project
depending on the package; the QuickJS native library is auto-discovered
from the pub cache when JSR_QUICKJS_LIB is unset. Documented in the
authoring skill section 8.3.chore: bump version to 0.4.125 [pub bump]
chore: bump version to 0.4.125 [pub bump]
chore: bump version to 0.4.124 [pub bump]
chore: bump version to 0.4.124 [pub bump]
chore: bump version to 0.4.123 [pub bump]
chore: bump version to 0.4.123 [pub bump]
Release 0.4.122: agent memory store refresh (no API changes)
Release 0.4.122: agent memory store refresh (no API changes)
Release 0.4.121: video onError, tolerant manifest parsing, i18n compat
Release 0.4.121: video onError, tolerant manifest parsing, i18n compat
video node: new onError: '<actionId>' prop — host playback failures
(controller init, network, codec) arrive as {value: message} instead of a
silent black box. Backed by the optional JsMediaController.errorStream
(default null — existing hosts stay source-compatible); the reference
video_player host publishes errorDescription + init failures, the web
host the element error event. A synchronously throwing
createVideoController no longer crashes the build — it fires onError.WidgetManifest.fromStorage parses tolerantly: a wrong-typed legacy field
(e.g. a localization map under name) degrades that field to its fallback
instead of discarding the whole manifest. Additive i18n keys
(nameI18n/descriptionI18n) parse without loss — compat tests lock the
host-side i18n schema contract.video-player example widget (1.0.7) wires onError to an inline error
banner and exports videoError for headless tests/CLI.chore: bump version to 0.4.120 [pub bump]
chore: bump version to 0.4.120 [pub bump]
path node: JsPathPainter supports pure vertical/horizontal strokes with
zero-width bounds (previously rendered nothing).chore: bump version to 0.4.119 [pub bump]
chore: bump version to 0.4.119 [pub bump]
chore: bump version to 0.4.118 [pub bump]
chore: bump version to 0.4.118 [pub bump]
chore: bump version to 0.4.117 [pub bump]
chore: bump version to 0.4.117 [pub bump]
chore: bump version to 0.4.116 [pub bump]
chore: bump version to 0.4.116 [pub bump]
New declarative shape nodes from the Motion-Canvas port (yoclip#1): rect ({width, height, radius?, fill, stroke?, strokeWidth?, opacity?}), circle ({s
rect ({width, height, radius?, fill, stroke?, strokeWidth?, opacity?}),
circle ({size, fill, stroke?, strokeWidth?, opacity?}), line
({x1, y1, x2, y2, stroke, strokeWidth? (default 2), opacity?}) and
polygon ({points, fill, stroke?, strokeWidth?, opacity?} — points is
a FLAT [x1, y1, x2, y2, ...] array). rect/circle size to their box
with inside strokes; line/polygon size to the tight geometry bounds
plus stroke inset. Pure CustomPaint — no web-view or SVG parsing.Add jsr.motion builtins + extended jsr.ease (Motion-Canvas port, yocl…
Add jsr.motion builtins + extended jsr.ease (Motion-Canvas port, yocl…
jsr.motion builtins for declarative, Motion-Canvas-style animation
(agreed with the yoclip port, IstiN/yoclip#1): tween(ms, startMs, durMs, from, to, easing?) — eased scalar clamped to from/to outside its
window so results drop straight into the tree; mapRange(v, inMin, inMax, outMin, outMax, easing?) with clamped input; clamp(v, min, max); and
wave(ms, periodMs, amplitude, phase?) — a zero-centered sine for
beat-synced motion. All times are elapsed milliseconds; easing? accepts
a function or a jsr.ease name string (default linear).jsr.ease: new curves easeInOutCubic, easeInOutQuart,
easeOutExpo, plus canonical-name aliases easeOutBack/easeOutBounce/
easeOutElastic (the original short names stay), and
cubicBezier(x1, y1, x2, y2) — a factory for arbitrary CSS-style timing
curves (Newton-Raphson solve with a bisection fallback, overshoot-safe).chore: bump version to 0.4.113 [pub bump]
chore: bump version to 0.4.113 [pub bump]
video: honor the node's fit when the parent reserved a fixed box (aspectRatio/sizedBox w+h/stack -> tight constraints). The unconditional natural-aspe
video node: fit now actually maps the picture when the parent reserved
a fixed box (aspectRatio/sizedBox w+h/stack → tight constraints).
Previously the surface was always wrapped in a natural-aspect
AspectRatio, so contain/cover/fill rendered identically
(everything letterboxed) and fit buttons looked dead. Loose parents
(column/row children) keep the natural-shape behavior.video node: real fullscreen — the transport controls gain a fullscreen
button (hidden with fullscreenButton: false) that pushes an in-app
fullscreen route reusing the SAME media controller, so playback continues
seamlessly and position/volume survive the round trip.Honor width/height on text and flex nodes; fixes yoclip deck caption …
Honor width/height on text and flex nodes; fixes yoclip deck caption …
text nodes honor width/height: the text box gets exactly that size,
so textAlign: 'center' centers across the requested box instead of the
intrinsic label width, at any nesting depth (CSS-style box semantics).column/row/stack/wrap nodes honor width/height (SizedBox cap,
same loose-constraint semantics as container): siblings center across the
requested span instead of the parent's full width. Reported via the yoclip
deck renderer, where scenes place width + textAlign: 'center' on
captions nested in columns.Hosted flame_3d 0.3.0 no longer compiles against the flutter_gpu API shipped with Flutter 3.47 stable (ShaderLibrary is async-loaded, bind calls no lo
Hosted flame_3d 0.3.0 no longer compiles against the flutter_gpu API
shipped with Flutter 3.47 stable (ShaderLibrary is async-loaded, bind
calls no longer take counts), which broke every downstream host building
on current stable — published packages cannot use git deps, so the
flame-engine/flame#3995 backport (IstiN/flame fad05ce) is vendored:
No public API changes; all 540 tests and local gates pass on 3.47.1.
flame_3d sources (lib/src/flame_3d_vendor, see
VENDOR.md) carrying the flutter_gpu API fix (flame-engine/flame#3995
backport) instead of hosted flame_3d: ^0.3.0, which no longer compiles
against the Flutter 3.47 flutter_gpu API. No public API changes; createJs3dHost,
createFlame3dHost, and the shader assets keep working unchanged.environment.flutter >=3.47.0); CI moved from
the 3.44.4 pin to 3.47.1 and the flame-3.47 branch/automerge workflow are
retired.chore: bump version to 0.4.109 [pub bump]
chore: bump version to 0.4.109 [pub bump]
chore: bump version to 0.4.108 [pub bump]
chore: bump version to 0.4.108 [pub bump]
chore: bump version to 0.4.107 [pub bump]
chore: bump version to 0.4.107 [pub bump]
chore: bump version to 0.4.100 [pub bump]
chore: bump version to 0.4.100 [pub bump]
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
- Automated patch bump.
chore: bump version to 0.4.87 [pub bump]
chore: bump version to 0.4.87 [pub bump]
Your coding agent can read these notes before it upgrades. Set up the MCP server →