Changelog
All notable changes to tauri-plugin-widgets and tauri-plugin-widgets-api.
0.8.0
Added
- Live activities:
startActivity/updateActivity/endActivity/listActivities, templates with data-only updates (registerActivityTemplate), push tokens, state and content events. iOS Lock Screen and Dynamic Island, Android ongoing notifications. - Desktop Dynamic Island: a live activity as a pill at the camera notch on macOS, and the same pill on Windows and Linux (
activitySurface: "island"); compact around the notch, expanded on hover. - Local state:
statedefaults andsetonbutton/toggle/link("$toggle","$inc","$dec") change the widget in place without the app;setWidgetState/getWidgetState,widget-state-changedevent. - Data without the layout:
setWidgetData(widgetId, data)with{{data.path}}bindings;sourcelets the widget fetch JSON from a URL itself. - Dynamic content:
whenconditions,repeatlists from arrays, reusabletemplates/use, localizedstrings,requiresfor newer configs on older apps. - Scheduled entries (
entries: [{ at, small, … }]) switched without the app, and thetransitionhint (opacity,slide,numeric). - Instances: one widget placed several times with its own config and data (
setWidgetInstances,getActiveWidgets, Apple "Edit Widget" choice). - Android: widget scheduler, configuration activity, loading / error / preview layouts, Samsung widget info.
getWidgetPushTokenfor widget push updates on iOS.- Docs: Features section with recordings, a standalone widget constructor page, animated home page.
Changed
- The resolve contract (bindings, conditions, state) is shared and tested across Rust, TS, Swift and Kotlin (contract v3).
- Windows Adaptive Cards: exact colours, unique ids, progress bars, shape and image sizes, ZStack sizing closer to the other renderers.
- Element types (
ContentMode,ChartType, …) are generated from the schema (guest-js/generated);ContentModeaddsstretch/center,ChartTypeaddspoint.
Fixed
- Rendering differences between platforms found by golden screenshots on iOS, Android, macOS, Windows, Linux and the desktop renderer.
0.7.0
Breaking
- Rust:
WidgetsPluginConfig::transportisOption<TransportKind>(unset = platform default). - macOS: with
transportunset the host writes into the widget extension's container (widgetContainer), not the App Group. Sandboxed Mac App Store hosts set"transport": "appGroup". - Android:
WidgetActionReceiverremoved (taps go through the action callback queue).
Setup is simpler
- No
plugins.widgetsblock needed:appGroupdefaults togroup.<identifier>,transporttowidgetContaineron macOS andappGroupon iOS. JSgroupis optional (defaults to the App Group),widgetIddefaults to"default". init-macoswritestauri.macos.conf.json(Linux / Windows builds no longer runbuild-widget.sh); the Swift package path is resolved on every build instead of baked intoproject.yml.init-iosadds the widget extension target and the TauriWidgets package togen/apple/project.yml(XcodeGen) and keeps app entitlements: no manual Xcode steps. Widget code lives insrc-tauri/ios-widget.initdetects platforms from the host OS andgen/apple;--platformsoverrides.
Fixed
- macOS: Developer ID builds showed "No configuration" (the sandboxed extension cannot open a
group.*container without a provisioning profile). Default transport is nowwidgetContainer. - Widget taps lost or delivered twice: cross-process lock on the Apple store; Android queues every tap and notifies a running app (
widget-action-pending); Windows clears drained actions on disk. - iOS widget pinned to a stale copy in its own container.
- Android: plugin commands off the UI thread (remote images loaded, no
NetworkOnMainThreadException); reload throttle removed; builds with AGP 9 / Kotlin 2 apps from the currenttauri android init; button labels centered. - Images downsampled before decode (Swift, Android); image prefetch walks
List.children, caches failures, evicts old entries. set_widget_configno longer blocks the main thread;set_widget_config_from_pathreads regular files up to 4 MB only.createWidgetWindow: works withoutgroup, reuses a window with the same label.- Linux layer-shell window closes with
closeWidgetWindow. - Trace JSON fields are camelCase (matched the TS types).
startWidgetUpdater: several updaters per widget, throwing handlers no longer drop the batch.- Render library: several
renderWidgethosts no longer share timers and handlers. - CLI: Windows data paths (Roaming),
cleancovers Linux and the macOS container,preview --openon Windows, runs from insidesrc-tauri, readstauri.conf.json5/ platform confs.
Changed
- Docs site moved from VitePress to Nuxt (Nuxt UI + Nuxt Content), same URLs. JS reference, Tauri commands, permissions and changelog pages are generated from the sources at build time; diagrams are committed SVGs instead of client-side mermaid. Element anchors are now
#vstack(was#el-vstack).
0.6.2
Fixed
tauri-widgets --versionreadspackage.json(was hardcoded0.5.0)exportsexposes./schemas/*;./renderhas CJS +defaultrenderWidgetno longer readslocation.search/#rootat import;group/widgetIdare session optionstauri-widgets toolserrors on npm installs (scripts/is not published)
Changed
- npm package description covers all host platforms
0.6.1
Fixed
- Keep
gtk0.18 as a direct Linux dependency (layer-shell remap, GTK main-thread checks, CIlibgtk-3-dev). Do not bump to 0.19:gtk-syslinks = "gtk-3"clashes with Tauri 2. - Guest
@tauri-apps/apirange is^2again (wide Tauri 2 support; not>=2.12.1). - Playwright desktop tests pin
locale+timezoneIdsodate-timergeometry does not depend on the host TZ.
Changed
- Compatible lock/tooling bumps (Tauri 2.12.1, TypeScript 5.9, Playwright, Rollup, mermaid 12). TypeScript 7 skipped (
@rollup/plugin-typescript). Breaking crates (base640.23,resvg0.48,schemars1,ureq3,x11rb0.14) left on current majors.
0.6.0
Added
- JS render library:
tauri-plugin-widgets-api/render(renderWidgetin a host div, no Tauri) - Docs widget constructor (schema inspector, click-to-insert outline, Up/Down/Duplicate)
set_widget_config_from_path/setWidgetConfigFromPath(permission inwidgets:default)ListElement.childrenin generated TS / schema (rich list rows)- Stress / probe visual cases and light-theme goldens
Changed
- Desktop
widget-srcsplit: library host vs chrome IIFE (widget.html) - Docs Playground/Constructor render in-page; dropped iframe sandbox copy pipeline
- VitePress 2 + mermaid renderer
0.5.0
Mega-refactor toward one IR SoT and aligned renderers.
Added
- Host-side
normalize()before store write (textStyle, semantic colors, stack spacing defaults, capability degradations) - Desktop widget sources as TypeScript (
widget-src/) bundled intowidget.html - Consumer CLI (
tauri-widgets) withtoolsproxy to maintainer stands - Wire catalogs: Swift
Generated/WireCatalog.swift, AndroidWireTypes.ktviagen-native - Measured
schemas/capabilities.coverage.json(CI; omitted from publish) - Light-theme visual cases (desktop / iOS / macOS)
Changed
- Split renderers into layout/text/media/data/interactive/spacing groups (Android Glance, SwiftUI, Adaptive Cards, desktop HTML)
- Split
guest-jsintoapi/*barrel; docs generator intoscripts/.../generate/* - Publish packaging: npm schemas whitelist; crates.io excludes goldens/docs/scripts (~10 MB → ~1.4 MB)
Fixed
- Desktop theme resolution (
?theme=→data-theme→matchMedia) - Android unit tests via JDK 17 wrapper (
scripts/sh/android-gradle.sh)
0.4.3
Fixes
- docs.rs build: stop passing
--cfg docsrsviarustc-args(it infected dependencies and brokewinnowon current nightly); detect docs.rs viaDOCS_RSinbuild.rs
0.4.1
Breaking (Apple host transport)
- macOS host no longer fan-outs writes across three channels at runtime
- Choose one driver in
plugins.widgets.transport:appGroup|userDefaults|widgetContainer|auto - Require
plugins.widgets.appGroup; wrong/missing config fails plugin init (loud) - Override with
WIDGET_TRANSPORT; iOS acceptsappGrouponly - Unchanged
setItemsvalues skip disk write / nonce bump
Cleanup
- Removed Mac-side SVG Adaptive Cards compositor (
gen-windows-goldens) and faketests/golden/windows/*.png; keeptests/snapshots/adaptive/+ PreviewHost for real WinUI3 pixels rasterizeno longer in default features (opt-in resvg)- Dropped empty Cargo features
windows/macos/ios/android/all-platforms— backends followtarget_os gtkis optional under featurelinux- Removed dead Kotlin helpers (
sparkline,countRenderableChildren,maxRenderableItems)
0.4.0
First public cut of the redesign (unpublished drafts were never released separately).
Breaking (data / identity / actions)
- Required
widgetIdonsetWidgetConfig,getWidgetConfig,startWidgetUpdater, and built-increateWidgetWindow - Storage keys:
config:{widgetId},pending_actions,__meta_nonce__,__meta_updated_at__ - Action envelope:
{ action, payload?, ts, widgetId, group } - iOS rejects groups that do not start with
group. OptionIR fields omitnullon serialize (skip_serializing_if)startWidgetUpdaterdefaultintervalMsis 5000- No public Rust fluent
buildermodule — author via JS / serde JSON - Removed unused
WidgetItemtype
IR SoT / DX
- Rust
models.rsis IR source of truth; TS types fromIR_SPECemitter (pnpm codegen) - Capability matrix (Core vs Extended) +
validate_configwarnings on config change - JSON Schema
schemas/widget-config.v1.json; golden fixtures + core layout snapshots
Transport / platforms
- Config hash per
(group, widgetId); Apple multi-transport fan-out + freshest-by-nonce read - iOS
pollPendingActions; mobile drains pending actions onReady/Resumed; updater also polls - Android: live
setWidgetConfig, image preprocess,appWidgetId → widgetIdmapping, targeted Glance sync - Desktop
poll_pending_actions; transparent widget windows (macOS needsmacos-private-api)
Render parity (selected)
- Android: spacer flex, canvas density, gauge aspect, bar baseline, zstack alignment, capsule
2s×s, textStyle>fontSize, list caps - Swift/HTML: vertical divider in hstack, text alignment, frame-before-background, zstack alignment, timer cleanup
Tooling
- CI:
cargo test --lib, android/ioscargo check --lib, codegen drift,pnpm build - Dropped library
[profile.release]override;android/.gradle/local.propertiesgitignored
Known / deferred
- macOS UserDefaults transport still write-mostly;
{app_id}.widgetkitown-container hardcode; 500ms macOS action poller redesign