Releases: DioxusLabs/dioxus
Dioxus v0.7.0
Hot-Patching, Native Renderer, Axum Integration, Bundle Splitting, Radix-UI, more!
Welcome back to another Dioxus release! Dioxus (dye • ox • us) is a framework for building cross-platform apps in Rust. We make it easy to ship full-stack web, desktop, and mobile apps with a single codebase.
Dioxus 0.7 delivers on a number of promises we made to improve Rust GUI, and more broadly, what we call “high level Rust.” Rust has excelled as a tool for building foundational software, but we hope with Dioxus 0.7, it’s one step closer to being suitable for rapid, high-level development.
In this release, we’re shipping some incredible features. The highlights of this release include:
- Subsecond: Hot-patching of Rust code at runtime
- Dioxus Native: WGPU-based HTML/CSS renderer for Dioxus
- Fullstack: Revamp of Server Functions with full Axum integration
- WASM-Split: Code splitting and lazy loading for WebAssembly
- Stores: A new primitive for nested reactive state
- Dioxus Primitives: first-party radix-primitives implementation for Dioxus
Dioxus 0.7 also brings a number of other exciting new features:
- Automatic tailwind: zero-setup tailwind support built-in!
- LLMs.txt: first-party context file to supercharge AI coding models
- Blitz: our modular HTML/CSS renderer powering Dioxus Native, available for everyone!
- Fullstack WebSockets: websockets in a single line of code
- Integrated Debugger Support: open CodeLLDB with a single keystroke
- Fullstack error codes: Integration of status codes and custom errors in fullstack
- Configurable Mobile Builds: Customize your AndroidManifest and Info.plist
Plus, a number of quality-of-life upgrades:
- one-line installer (
curl https://dioxus.dev/install.sh | sh) dx self-updateand update notifications- automatically open simulators
- Improved log coloring
- desktop and mobile toasts
- HTML streaming now waits for the router to render
- Axum 0.8 and Wry 52 upgrade
- Android + iOS device support
- More customization of iOS and Android projects
- Hash Router Support for dioxus-web
- Multi-package serve:
dx serve @client --package xyz @server --package xyz - Support for dyib bundling
- wasm32 support for fullstack
- Hashless assets
- /public dir
- And many, many bugs fixed!
Rust Hot-patching with Subsecond
The biggest feature of this release: Dioxus now supports hot-patching of Rust code at runtime! You can now edit your Rust code and see changes without losing your app’s state.
We’ve been working on this feature for almost an entire year, so this is a very special release for us. The tool powering this hot-patching is called Subsecond and works across all major platforms: Web (WASM), Desktop (macOS, Linux, Windows), and even mobile (iOS, Android):
hotpatch-android.mp4
ios-binarypatch.mp4
You can now iterate on your app’s frontend and backend simultaneously without skipping a beat.
hotpatch-wasm-complete.mp4
Subsecond works in tandem with the Dioxus CLI to enable hot-patching for any Rust project. Simply run dx serve on your project and all subsecond::call sites will be hot-patched. For example, here’s Subsecond working with a Ratatui app:
subsecond-tui.mp4
The infrastructure to support Subsecond is quite complex. Currently, we plan to only ship the Subsecond engine within the Dioxus CLI itself with a long-term plan to spin the engine out into its own crate. For now, we still want the ecosystem to experience the magic of Subsecond, so we’ve made the CLI compatible with non-dioxus projects and removed “dioxus” branding when not serving a dioxus project.
Hot-patching Rust code is no simple feat. To achieve a segfault-free experience, we recommend framework authors to tie into Subsecond’s minimal runtime. For application developers, you can simply use subsecond::call(some_fn) at clean integration points to take advantage of hot-patching. If you use Dioxus, hot-patching comes directly integrated with components and server functions.
pub fn launch() {
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
subsecond::call(|| tick());
}
}
fn tick() {
println!("edit me to see the loop in action!!!!!!!!! ");
}While in theory we could implicitly override calls to tick with function detouring, we instead chose explicit integration points. The first version of subsecond modified process memory externally, but we struggled with issues where the program would be stuck in a task with no way to “resurface”. For this example, the program would always be waiting for IO, making our edits not take effect:
fn main() {
loop {
let next_event = wait_for_io();
do_thing();
}
}Instead, the explicit runtime integration provides a simple “synchronization point” where the framework can handle things like closing TCP connections, re-instancing state, dropping event listeners, etc. If you add or remove a field of a struct between hot-patches, Subsecond does not automatically migrate your state for you. Libraries like bevy-reflect make this easier - and we might integrate reflection at some point - but for now, frameworks should take care to either dispose or safely migrate structs that change.
We expect folks to use Subsecond outside of Dioxus, namely in web development, so we’ve provided a few starter-integrations for popular libraries:
- Axum
- Bevy
- Ratatui
Subsecond has already made its way into popular projects like Bevy and Iced. Right now, you can git pull the latest Bevy and Iced repositories and start hot-patching with zero setup:
bevy-hotpatch.mp4
Hot-patching covers nearly every case in Dioxus. Many tasks that were previously massively burdensome are now a breeze:
- Adding a new
asset!()call - Editing strongly-typed interfaces on components like icon variants or links
- Dynamically adding children to a component
- Modifying backend server function code
- Modifying event handler logic - ie
onclickoronmouseover - Loading resources and async values
- Refactoring rsx into components
Under the hood, we implemented a form of incremental linking / binary patching tailored for running apps. This is not too distant from the idea laid out by Andrew Kelley for Zig.
Dioxus Native and Blitz
We’re extremely excited to announce the first-ever version of Dioxus Native: our new renderer that paints Dioxus apps entirely on the GPU with WGPU.
Out of the box, it already supports a huge number of features
- Accessibility integration
- Event handling
- Asset fetching and loading.
Dioxus Native required a monumental amount of work, pushing forward
- HTML/CSS layout and rendering
- High quality text painting
We’re extremely excited to release Blitz: our modular HTML/CSS rendering engine.
Blitz combines a number of exciting projects to bring customizable HTML rendering engine to everyone. Blitz is a result of collaboration across many projects: Firefox, Google, Servo, and Bevy. We’re leveraging a number of powerful libraries:
- Taffy: our high-performance flexbox layout engine
- Stylo: Firefox and Servo’s shared CSS resolution engine
- Vello: Linebender’s GPU compute renderer
Blitz is an extremely capable renderer, often producing results indistinguishable from browsers like Chrome and Safari:
Not every CSS feature is supported yet, with some bugs like incorrect writing direction or the occasional layout quirk. Our support matrix is here: https://blitz.is/status/css
The samples that Blitz can create are quite incredible. Servo’s website:
Hackernews:
The BBC:
We even implemented basic <form /> support, making it possible to search Wikipedia without a full browser:
Screen_Recording_2025-05-24_at_16.21.05.mov
Do note that Blitz is still very young and doesn’t always produce the best outputs, especially on pages that require JavaScript to function properly or use less-popular CSS features:
Blitz also provides a pluggable layer for interactivity, supporting actions like text inputs, pluggable widgets, form submissions, hover styling, and more. Here’s Dioxus-Motion working alongside our interactivity layer to provide high quality animations:
Screen_Recording_2025-01-05_at_7.46.14_PM.mov
Bear in mind that Blitz is still considered a “work in progress.” We have not focused on performance
Dioxus Fullstack Overhaul
We completely revamped Dioxus Fullstack, bringing in a new syntax and a whole host of new features.
To start, we've introduced a new dioxus::serve entrypoint for server apps that en...
v0.7.0-rc.4
What's Changed
- Fix the info message for the dx components subcommand by @ealmloff in #4832
- Native: implement hot-reloading of stylesheets by @nicoburns in #4830
- fix(hotpatch): Gracefully handle missing '-flavor' flag during WASM link by @luckybelcik in #4833
- Readable and Writable helpers for String, HashMap and HashSet by @ealmloff in #4834
- Skip emitting a transposed type if the original type is entirely generic by @ealmloff in #4838
- fix(cli): correct Android toolchain target for 32-bit arm architectures by @atty303 in #4837
- Pin tauri-macos-sign by @ealmloff in #4845
- fix: tokio rt is not set when calling handlers by @jkelleyrtp in #4850
- use
CapturedErrorasdioxus::Ok()so resources still function as expected by @jkelleyrtp in #4851 - Fullstack: Fix missing query string on
#[get]server functions by @bwskin in #4827 - restore the extract function for server functions by @ealmloff in #4849
- Add option_asset! to match asset! by @tekacs in #4791
- feat: set windows subsytem to windows for gui apps by @jkelleyrtp in #4855
- Pipe Android/ADB logs into CLI by @wheregmis in #4853
- Fix updating components and local components by @ealmloff in #4856
- multiple fullstack nits/cleanups before release by @jkelleyrtp in #4852
- Relax asset resolver bounds and document resolving folder assets by @ealmloff in #4859
- Expand relative assets to a placeholder if we are running in rust analyzer by @ealmloff in #4860
- Add some functions to read/write request header for server functions by @javierEd in #4823
- Feat: eager loading of assets by @omar-mohamed-khallaf in #4653
- fix: dx not recognizing [web, server] in default by @jkelleyrtp in #4865
New Contributors
- @luckybelcik made their first contribution in #4833
- @bwskin made their first contribution in #4827
- @javierEd made their first contribution in #4823
Full Changelog: v0.7.0-rc.3...v0.7.0-rc.4
Dioxus 0.7.0-rc.3
This release is hopefully the final pre-release before the full 0.7 release!
In this release we:
- Fixed a critical issue with custom axum routers not injecting wasm/js bootstrap code
- Added support for
/public/dir, allowing assets without the manganis asset system - Added a
componentscommand for a shadcn-like components experience - Fixed some bugs to unlock hot-patching on the new dioxus playground
- Moved to pinning dioxus dependencies within the workspace to make it easier to manually upgrade release candidates.
That's about it - hoping to see 0.7 either late this week or early next week!
What's Changed
- Elements: add autocorrect attribute to and <textarea> by @fasterthanlime in #4797
- resolve the index before rendering by @jkelleyrtp in #4806
- 👩🏫 Add support for
default-membersby @Jasper-Bekkers in #4811 - Removed wasm rel-preload link from bundle index.html to save bandwidth for Safari users by @RickWong in #4796
- follow up to serveconfig by @jkelleyrtp in #4820
- Support
publicdir by @tekacs in #4783 - DX components command by @ealmloff in #4669
- CLI fixes for hotpatching the playground by @ealmloff in #4715
New Contributors
- @Jasper-Bekkers made their first contribution in #4811
- @RickWong made their first contribution in #4796
Full Changelog: v0.7.0-rc.2...v0.7.0-rc.3
0.7.0-rc.2
This pre-release ships a number of bug fixes for Dioxus 0.7 as well as a handful of new features.
- File Dialogs and Drag Events have been fixed after being broken in rc-1
- The Dioxus JS glue is now independent of the window, making it possible to bootstrap webworkers with the primary dioxus wasm bundle
- A number of fixes related to wasm hot-patching
- A number of fixes related to mobile and native hotpatching
- Ability to set response status and headers from within the SSR app
- Ability to capture errors during SSR and render a fallback UI
- Fixes for SSR and hydration
- Middleware support for server functions with
#[middleware]attribute use_loadernow serializes its contents for hydrationdrag_and_dropAPI for web and related xample
What's Changed
- Fix: File dialogs that are not part of a form by @Klemen2 in #4752
- Don't rely on
windowPart 2 by @mohe2015 in #4757 - native: disable debug logs by default by @nicoburns in #4740
- Handle wasm-bindgen wbg_cast helper in wasm hotpatching by @tekacs in #4748
- redirects, middleware,
Transport, set/capture error status by @jkelleyrtp in #4751 - Fix wasm hotpatching for zero-sized data symbols by @tekacs in #4747
- Fix base path for wasm splitting by @mohe2015 in #4770
- fix collect2 ld error with hotpatching by @jkelleyrtp in #4771
- use
queue_eventsinstead ofprocess_eventsto fix ssr issue by @jkelleyrtp in #4772 - Fix on NixOS by @mohe2015 in #4776
- Don't rely on
windowby @mohe2015 in #4775 - Feat: "dx new" check if given project name is available in filesystem by @thyseus in #4773
- fix: server function custom errors set status codes by @jkelleyrtp in #4782
- Prevent hot patch from leaving devserver in BuildError state by @tekacs in #4784
- more fullstack cleanups: loaders serialize, ServeConfig only by @jkelleyrtp in #4785
- remove --docs cfg to fix docsrs building by @jkelleyrtp in #4788
- datatransfer object, drag_and_drop example, fix drag-and-drop by @jkelleyrtp in #4789
New Contributors
Full Changelog: v0.7.0-rc.1...v0.7.0-rc.2
v0.7.0-rc.1
Today, we’re releasing Dioxus 0.7.0-rc.1 - the second pre-release of Dioxus 0.7.
This release unfortunately took much longer to ship than we expected. While fixing bugs related to dioxus fullstack, we stumbled across a handful of critical issues in our integration with the server_fn crate. Coupled with changes in the dioxus CLI, these issues prevented a large swath of user projects from compiling.
As such, we re-implemented the server function crate, but this time exclusively tailored for Dioxus and Axum. This rewrite was originally planned as a major feature of Dioxus 0.8, but given the severity of the issues, we decided to pull it forward to 0.7. The rewrite unlocks tons of new functionality including things like SSE, flexible error types, custom axum routers, simple websockets, and a rocket-like endpoint definition system.
Here's a quick sneak peek:
use dioxus::prelude::*;
fn main() {
dioxus::launch(|| {
let mut message = use_action(get_message);
rsx! {
h1 { "Server says: "}
pre { "{message:?}"}
button { onclick: move |_| message.call("world".into(), 30), "Click me!" }
}
});
}
/// you can now encode query and path parameters in the macro!
#[get("/api/{name}/?age")]
async fn get_message(name: String, age: i32) -> Result<String> {
Ok(format!("Hello {}, you are {} years old!", name, age))
}Rust-Conf keynote
I gave a keynote talk at Rust Conf! Check it out! It covers the various projects we've been working on to push Rust forward, including subsecond hot-patching, progress on autoclones in Rust, and more.
Changes to Fullstack
We completely overhauled dioxus-fullstack, fixing a huge number of long-standing bugs and adding tons of new functionality.
These include:
- New macros for annotating API endpoints (
#[get("/api/route")],#[post("/api/:path?query¶m")]) - Accept pure axum handlers that take
FromRequestandIntoResponsebodies - Server-only
FromRequestextractors - A new
HttpErrortype and accompanying trait for returning proper Axum responses - Support for
anyhow::Errortype as a return type from server functions - Addition of a Server-Sent-Events (SSE) type
- Addition of a
Websockettype and reactiveuse_websockethook for handling websocket connections - Addition of a MultipartFormData type that works across web and native
- Addition of a
Streaming<T, E>type without needing to specify an encoding attribute - Support for custom encoding types
- Access to the full
axum::extract::Requesttype in server functions - Support for pure SSR apps with hot-reloading powered by subsecond
- Support for custom axum routers with
dioxus::serve - Support for
Lazy<T>type for lazy async initializers
As mentioned earlier, the fullstack overhaul was originally planned for Dioxus 0.8, but we decided to pull it forward into 0.7, causing a substantial delay.
To get a feel for the new APIs, take a look at the fullstack examples folder. We will be updating fullstack docs this week to prep for the full 0.7 release soon.
Breaking changes to Events: FormData and FileData
Our Form and File APIs have been clumsy for quite a while. In order to support ergonomics improvements with server functions, we revisited our FormData and FileData APIs to make them more consistent with the web platform.
We replaced the old FilesEngine abstraction with a new FileData type with an API that matches the browser.
In addition, we changed how to read the field names and values from forms. Previously, .values() return a HashMap of form values, but now, .values() returns a Vec of form values - again, to better match web APIs.
Breaking changes to dioxus::core APIs
A number of APIs were moved from ScopeId to the Runtime in dioxus_core. This shouldn't impact most users, but anyone building a renderer around Dioxus will notice that some methods no longer exist.
These were changed to reduce our API surface area outside of core types like Runtime and to make it easier to understand where runtime-related errors were occurring.
Updates to Blitz
Blitz saw massive improvements over the past few weeks, notably with the addition of incremental tree construction which makes Blitz substantially faster. Now, Blitz performance is on-par with the Rust GUI ecosystem.
What's Changed
- fix platform unification by @jkelleyrtp in #4536
- Clarify telemetry paragraph about rollups by @Andrew15-5 in #4539
- Bump Blitz to 0.1.0-rc.3 (+dangerous_inner_html + style ns attrs) by @nicoburns in #4538
- Allow specifying min_sdk_version in dioxus config for Android. by @rhaskia in #4549
- Don't output escape codes for the cursor when the tui isn't active by @ealmloff in #4556
- Improve use_server_cached docs by @mcmah309 in #4557
- Fix hotdog asset by @emmanuel-ferdman in #4570
- Fix integration of SSL libs into non-ARM64 Android builds. by @priezz in #4563
- Fix store macro with struct bounds by @ealmloff in #4572
- Fix hydration of link element by @ealmloff in #4561
- Remove must_use from Resource by @mcmah309 in #4551
- Add '.zed' folder for Zed-related development by @ktechhydle in #4575
- Bump tmp from 0.2.1 to 0.2.5 in /packages/extension by @dependabot[bot] in #4524
- Correct misleading string content. by @dabrahams in #4542
- Bump actions/checkout from 4 to 5 by @dependabot[bot] in #4574
- fix: select best match from --device by @jkelleyrtp in #4581
- Fix the server extension on windows server bundles by @ealmloff in #4555
- show panics in the toast in wasm by @jkelleyrtp in #4582
- fix: automatic rebuilds, num_threads for localpools by @jkelleyrtp in #4583
- ensure wasm-split has lto and debug enabled by @jkelleyrtp in #4584
- bump android min-sdk up to 28 by @jkelleyrtp in #4585
- fix lints on rust 1.89 by @jkelleyrtp in #4587
- feat: add subsecond serve by @jkelleyrtp in #4588
- Deprecate ReadOnlySignal by @mcmah309 in #4552
- Fix empty borrow location warnings by @ealmloff in #4593
- Add cancel event by @d-corler in #4476
- feat: add dx print command, drive hotpatching engine directly. by @jkelleyrtp in #4602
- Improve placeholder hash error message by @ealmloff in #4615
- Upgrade Blitz to v0.1.0 by @nicoburns in #4619
- Remove transitions from todomvc stylesheet by @nicoburns in #4620
- Rebuild router on every hot reload message by @s3bba in #4537
- Fixed client config macro by @snatvb in #4650
- fix: feature gate tokio and tracing by @omar-mohamed-khallaf in #4651
- Implement copy for eval by @ealmloff in #4655
- Add GlobalStore to the prelude by @ealmloff in #4662
- Allow relative assets in rust > 1.88 by @ealmloff in #4658
- Pin serde in the CLI by @ealmloff in #4663
- Remove usage of private syn modules by @ealmloff in #4664
- Fix opening in new tab with internal links by @ealmloff in #4677
- Don't rely on
windowby @mohe2015 in #4697 - Fix the root error boundary during suspense in ssr by @ealmloff in #4710
- Fix hydration error suspense by @ealmloff in #4640
- native: open links in default webbrowser by @nicoburns in #4623
- Bump tar-fs from 2.1.3 to 2.1.4 in /packages/extension by @dependabot[bot] in #4702
- codify "platform" into resolution logic, server-fn/fullstack overhaul by @jkelleyrtp in #4596
- Fix chained attribute if statements with static strings by @ealmloff in #4721
- Don't try launching a tokio runtime if we are already within one by @mohe2015 in #4699
- Fix splitting logic for serve args by @kristoff3r in #4695
- Fix stores with vec index method and expose o...
Dioxus 0.7.0-rc.0
Final Preparation for Dioxus 0.7!
In this final pre-release, we fixed a number of bugs and made a number of improvements in preparation for Dioxus 0.7 release.
The only things left for release are:
- release video
- (time-willing) wire up the playground to the subsecond hotpatching engine.
In this release, we fixed a number of issues and add a few new features:
- The new Stores API adds wrappers for
Signal<Vec>,Signal<HashMap>, and custom "store" structs for simpler state management. - Many new pages of docs related to building UIs and reactivity.
- Hotpatching is now more reliable, allowing you to break the rules of hooks during development
- New shorthands for platforms. IE
dx serve --iosinstead ofdx serve --platform ios - You can select different renderers (native vs webview) from the CLI
- A new example showcasing how to embed dioxus-native in a bevy app
- We removed the
dioxus-libcrate due to low adoption in favor ofdioxuswith the"lib"feature - A new nix flake makes installing dx easier on nix platforms
- We manage openssl prebuilt when targetting android to make it easier for windows users to build android apps
- Blitz has been updated to support named grid sections and other new features
- RSX autoformatting respects comments in many more situations including expressions
- Many bug fixes related to subsecond hotpatching
- New methods for loading assets from the application bundle directly
- We renamed
.dioxusto.dxin prep for the DX spin-out - Linux asset bundling is fixed after changes to the underlying appimage bundler broke
- The CLI now collects crash-reports and some basic opt-out anonymized telemetry
Expect the full 0.7 release either this week or next!
v0.7.0-alpha.3
Lots of bug fixes, prep for 0.7 release
This release fixes a huge number of bugs (around 50-60!) and brings better stability to Dioxus in prep for the 0.7 release.
We're finishing up release materials and have a few more small items for rc-0, but 0.7 is feature-complete and thoroughly tested.
What's Changed
- fix: allow to name module
stdin project by @davidB in #4353 - Add a bevy-texture example based on wgpu-texture by @jerome-caucat in #4360
- Native: Accept
winit::WindowAttributesas a config value by @nicoburns in #4364 - Fix router state after client side navigation by @ealmloff in #4383
- Native: Split
dioxus-native-domcrate out ofdioxus-nativeby @nicoburns in #4366 - Add PartialEq and Eq derives to ServerFnError by @Himmelschmidt in #4393
- fix(bundle): add serde defaults to prevent deserialization errors by @rennanpo in #4398
- prevent_default must be called synchronously or it will have no effect by @LilahTovMoon in #4386
- final 0.7 fixes: xcode 15/16 hybrid, auto openssldir for android, include_*! tracking hotpatch, fix /assets/ brick at high opt levels, windows linker file, etc by @jkelleyrtp in #4376
- Fixed touch input it will now serialize the touchlist by @bananabit-dev in #4406
- updated the dependencies - maintaining compatibility and tests by @debanjanbasu in #4363
- Reconnect the edits websocket if it disconnects by @ealmloff in #4391
- fix link opening on mobile by @jkelleyrtp in #4415
- Warn about assets being stripped if strip is true and the current package depends on manganis by @ealmloff in #4400
- Example of rendering a dioxus-native app to a texture by @nicoburns in #4365
- fix unicode characters in line printing by @jkelleyrtp in #4420
- Prevent desktop reloads at the wry level by @ealmloff in #4422
- Capture the rustc environment and project it into
runby @jkelleyrtp in #4421 - fix: don't eat comments in more situations by @jkelleyrtp in #4423
- Avoid the accidental removal of comments inside expressions by dx fmt by @jjvn84 in #4410
- clean up prelude by @jkelleyrtp in #4416
New Contributors
- @davidB made their first contribution in #4353
- @jerome-caucat made their first contribution in #4360
- @Himmelschmidt made their first contribution in #4393
- @rennanpo made their first contribution in #4398
- @LilahTovMoon made their first contribution in #4386
- @bananabit-dev made their first contribution in #4406
- @debanjanbasu made their first contribution in #4363
Full Changelog: v0.7.0-alpha.2...v0.7.0-alpha.3
Dioxus v0.7.0-alpha.2
Fixes, full Radix Primitives, --device support, --offline/--locked, wry 0.52, LLVM20, hashless assets
Sorry for the delay! Went on a meditation retreat for 10 days 😊
This release fixes a huge number of bugs and improves ergonomics in a bunch of areas.
Notably:
- Upgraded to the latest wry, which solves many upstream issues
- Fixing wasm-related issues caused by breaking upstream changes in Rust 1.87 with LLVM20
- Support for
dx serveonto iOS devices - Finished the entire set of Radix Primitives and uploaded to the docsite https://dioxuslabs.com/components
- Fix issues with some memory leaks
- Fix a number of bugs with subsecond hot-patching
- Added support for WGPU canvas in dioxus-native
- Add a
dx runcommand with better CI integration - Add a hash history option for dioxus-web
- Unbrand
dxwhen not serving dioxus projects (good for folks using dx just for subsecond)
Demos
Dioxus-native canvas:
Screen_Recording_2025-06-14_at_02.16.49.mp4
Unbrand dx:
Dioxus Primitives:
What's Changed
- Fix url encoding query and implement FromQueryArgument for Option by @ealmloff in #4213
- Allow changing the base path from a cli arg by @ealmloff in #4242
- white-list .rcgu.o files in the linking phase, otherwise dump them into the normal linking pile by @jkelleyrtp in #4246
- chore(deps): bump tar-fs from 2.1.2 to 2.1.3 in /packages/extension by @dependabot in #4243
- Always download wasm opt from the binary by @ealmloff in #4247
- Only
use std::sync::Arcwhen needed:debug_assertionsenabled by @flba-eb in #4261 - Upgrade Blitz to
0.1.0-alpha.3and add Dioxus-Native WGPU Canvas Integration by @nicoburns in #4286 - Fix
--argsand handle merging in@serverand@clientby @ealmloff in #4212 - Switch to owned listener type by @ealmloff in #4289
- Allows desktop apps to open mailto links by @jjvn84 in #4282
- Translate position to account for the display scaling factor. by @pythoneer in #4275
- feat: Opt-out
htmlindioxus-routerby @marc2332 in #4217 - update and improve chinese README.md by @Yuhanawa in #4254
- Fix router hydration by @ealmloff in #4209
- Use different release profiles for desktop and server builds, adhoc profiles by @ealmloff in #3693
- Make new_window asynchronous by @ealmloff in #4297
- properly respect rustflags, fix x86-sim issue by @jkelleyrtp in #4295
- Fixes issue with the file dialog showing only folders and not files by @jjvn84 in #4177
- Fix base path by @ealmloff in #4276
- tell user about basepath by @jkelleyrtp in #4298
- Cache hashed assets forever in fullstack by @ealmloff in #3928
- Remove invalid global data attribute by @navyansh007 in #4270
- Improve server macro documentation by @Nathy-bajo in #3403
- Allow a borrowed key to move into children by @Threated in #4277
- Implement Into for the default server function error type by @ealmloff in #4205
- Restore SSG serve logic by @ealmloff in #4111
- Add better error handling for wasm-opt and prevent file truncation on error by @mohe2015 in #4313
- Avoid fingerprint busting during builds by @hecrj in #4244
- use
dx runfor playwright tests, properly abort if error occurs, don't ddos github releases, split apt-cache by os/target in matrix by @jkelleyrtp in #4315 - Add initial version of hash history by @mohe2015 in #4311
- fix(cli, breaking): Align Android applicationId with user's
bundle.identifierby @fontlos in #4103 - Remove broken links in
examples/README.mdby @StudioLE in #4318 - add
--offline,--locked, removedioxusbranding if dioxus is not being used explicitly by @jkelleyrtp in #4155 - Create SECURITY.md by @wiseaidev in #4136
- Fix docs.rs build for
dioxus-libcrate by @nicoburns in #4321 - fix "multiple" attribute by @jkelleyrtp in #4323
- Don't use inline scripts and function constructor by @mohe2015 in #4310
- Fix hotpatched assets by @ealmloff in #4326
- Upgrade to Blitz
0.1.0-alpha.4by @nicoburns in #4335 - Handle panics in main on android by @mohe2015 in #4328
- Pass android linker to cargo by @mohe2015 in #4332
- Intentionally shadow module to prevent accidential use by @mohe2015 in #4327
- fix ios codesign on device by @jkelleyrtp in #4339
- Hashless assets by @ealmloff in #4312
- chore: update readme - reference Yew SSR by @wiseaidev in #4075
- Fix form submission on native if there is an onclick handler somewhere by @mohe2015 in #4329
- Save logical position when restoring on macos by @clouds56 in #4061
- chore(deps): upgrade wry from 0.45.0 to v0.52.0, switch to websocket instead of longpoll by @Plebshot in #4255
- fix issue: Routable doesn't work with component in a core module. #4331 by @zhiyanzhaijie in #4350
- feat: close behaviour for specific window by @Klemen2 in #3754
- fix multiwindow due to mounts not dropping in virtualdom by @jkelleyrtp in #4351
- Reclaim element id for all removed nodes by @gammahead in #3782
New Contributors
- @pythoneer made their first contribution in #4275
- @Yuhanawa made their first contribution in #4254
- @navyansh007 made their first contribution in #4270
- @Nathy-bajo made their first contribution in #3403
- @Threated made their first contribution in #4277
- @mohe2015 made their first contribution in #4313
- @hecrj made their first contribution in #4244
- @StudioLE made their first contribution in #4318
- @zhiyanzhaijie made their first contribution in #4350
- @gammahead made their first contribution in #3782
Full Changelog: v0.7.0-alpha.1...v0.7.0-alpha.2
Dioxus v0.7.0-alpha.1
Fixes, blitz update, and subsecond custom linker setup
This release fixes a number of issues found in Dioxus v0.7.0-alpha.0.
A few updates include
- better support for custom linkers with the subsecond hotpatching engine
- updating to blitz 0.1-alpha.1 which fixes bugs, performance, and adds more CSS compatibility
- arm64 linux binstall builds
- component library demo site (http://dioxuslabs.github.io/components/)
- fix wasm-opt with rust 1.87
- fix vcs in dx new
- add support for dylib/so/dll bundling
- fix tls binding across hotpatch boundaries
- fix lld/mold flags with subsecond
- hash assets outside the asset!() macro, instead during
dx build
Random updates
- The bevy team has started a PR integrating subsecond with bevy itself bevyengine/bevy#19309
- There's now a 3rd party bevy-subsecond integration https://github.com/TheBevyFlock/bevy_simple_subsecond_system
- The new blitz is much faster and has better CSS support!
TODOs before final release
Dioxus v0.7.0-alpha.0
Note
These release notes are a draft for the full release and thus are incomplete. Not all features might be merged yet!
We are releasing v0.7.0-alpha.0 with many docs and features incomplete, please be patient while we fill everything out.
The current most recent alpha is alpha-3, available at https://github.com/DioxusLabs/dioxus/releases/tag/v0.7.0-alpha.3
Hot-patching, Native, Bundle Splitting, Radix-UI, more!
Welcome back to another Dioxus release! If you’re new here, Dioxus (dye • ox • us) is a framework for building cross-platform apps in Rust. We make it easy to ship fullstack web, desktop, and mobile apps with a single codebase.
Dioxus 0.7 delivers on a number of promises we made to expand the capabilities of Rust GUI. Mature frameworks like Flutter and React Native sport capable hot-reload systems, popular component frameworks, and render natively. Now, Dioxus is on par with the “state of the art”, and in many ways, is even better.
In this release, we’re shipping some incredible features. The highlights of this release include:
- Dioxus Native: WGPU-based HTML/CSS Dioxus renderer built on Firefox’s Gecko engine
- Subsecond: Hot-patching of Rust code at runtime
- WASM-Split: Code splitting and tree shaking for WebAssembly
- Dioxus-UI: Shadcn-UI implementation for Dioxus
Dioxus 0.7 also brings a number of other exciting new features:
- Automatic tailwind: zero-setup tailwind support built-in!
- LLMs.txt: first-party context file to supercharge AI coding models
- MCP Server: add context, resources, and tools to VSCode, Cursor, and Claude
- Blitz: our modular HTML/CSS renderer powering Dioxus Native, available for everyone!
- Dioxus Playground: online WASM/WASI playground with integrated hot-patching
- Fullstack WebSockets: websockets in a single line of code
- Integrated Debugger Support: open CodeLLDB or nvim DAP with a single keystroke
- Fullstack status codes: Integration of status codes and custom errors in fullstack
- Configurable Mobile Builds: Customize your AndroidManifest and Info.plist
Plus, a number of quality-of-life upgrades:
- one-line installer (
curl -sSL http://dioxus.dev/install.sh | sh) dx self-updateand update notifications- automatically open simulators
dxcompatibility with non-dioxus projects- Better log coloring
- desktop and mobile toasts
- improved website landing page and migration to http://dioxus.dev hostname
- Reduced flicker on CSS hot-reloads
- HTML streaming now waits for the router to render
- Axum 0.8 upgrade
And many, many bugs fixed:
- Issues with synchronous multi-window
- Tab focusing
- Hot-reloaded assets not being re-processed
Note from the author
Dioxus 0.7 marks the second anniversary of me (Jonathan Kelley) going full time on Dioxus. How time flies! In the past two years we shipped so much:
- Template Hot-Reloading and Autoformatting
- Migration to Signals
- First-party Android and iOS tooling
- Server Function integration
- Linker-based asset system
- and so much more!
The road here has been long and frankly, lots of work. When we started out, the Rust ecosystem had very few good solutions to the basic problems in application development. Even now, the Rust hotpatching and native renderers - while incredible achievements on their own - are just “par for the course” for application development.
With Dioxus 0.7, I feel like the Dioxus foundations are finally solid. We have excellent developer tools, lightning-fast hotpatching, a great asset system, a solid RPC solution, bundle splitting, automatic optimizations, autocomplete, autoformatting, a capable state management solution, comprehensive docs, and funding for the foreseeable future. It’s always nice to see that decisions to adopt industry-standard tech pay-off (Rust GUIs in 2025 article).
What of the future? I finally feel like we’re on the “other side” of the once-impossible problems. With hot-patching and the native renderer behind us, we’re quite free to work on smaller projects. We could definitely use better marketing, more tutorial videos, better starter templates, and ecosystem growth (native APIs in 0.8!). Thanks for all the support so far!
Rust Hot-patching
The biggest feature of this release: Dioxus now supports hot-patching of Rust code at runtime! You can now iterate on your app’s frontend and backend simultaneously without skipping a beat.
We’ve been working on this feature for almost an entire year, so this is a very special release for us. The tool powering this hot-patching is called Subsecond and works across all major platforms: Web (WASM), Desktop (macOS, Linux, Windows), and even mobile (iOS, Android):
ios-binarypatch.mp4
hotpatch-android.mp4
Subsecond works in tandem with the Dioxus CLI to enable hot-patching for any Rust project. Simply run dx serve on your project and all subsecond::call sites will be hot-patched. For example, here’s Subsecond working with a Ratatui app:
subsecond-tui.mp4
The infrastructure to support Subsecond is quite complex; consequently, we plan to only ship the Subsecond engine within the Dioxus CLI itself. However, we still want the ecosystem to experience the magic of Subsecond, so we’ve done two things:
- Make
dxa standalone runner, not tied to Dioxus - Integrated hotpatching with our new Dioxus Playground
Hot-patching Rust code is no simple feat. To achieve a segfault-free experience, we recommend framework authors to tie into Subsecond’s minimal runtime. For application developers, you can simply use subsecond::call(some_fn) at clean integration points to take advantage of hot-patching. If you use Dioxus, hot-patching comes directly integrated with components and server functions.
pub fn launch() {
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
subsecond::call(|| tick());
}
}
fn tick() {
println!("edit me to see the loop in action!!!!!!!!! ");
}While in theory we could implicitly override calls to tick with function detouring, we instead chose explicit integration points. Hot-patching encounters a significant challenge with changes to struct layout and alignment, and implicit patching exacerbates these safety issues. Explicit integration provides an opportunity frameworks to “re-instance” changed structs and guarantees a segfault-free experience at the cost of losing some runtime state.
We expect folks to use Subsecond outside of Dioxus, namely in web development, so we’ve provided a few starter-integrations for popular libraries:
- Axum
- Bevy
- Ratatui
Hot-patching covers nearly every case in Dioxus - there’s so much you can hot-reload:
Under the hood, we implemented a form of incremental linking / binary patching tailored for running apps. This is not too distant from the idea laid out by Andrew Kelley for Zig. We have yet to release an in-depth technical writeup about how Subsecond works, but if you’re really interested, come join us at the Seattle RustConf and learn about it during our talk!
Dioxus Native
WASM Bundle Splitting and Lazy Loading
bundle-split.mp4
Component Library: Radix Primitives and ShadCN-UI
LLMs.txt, Cursor Rules, MCP Server, and Vibe-Coding
vibe-code-2.mp4
Automatic Tailwind
dxnow detects atailwind.cssfile in the root of your crate- customize the input and output files in your dioxus.toml
- Automatically downloads the tailwind binary in the background
tailwind-inline.mp4
Blitz 0.1
We’re extremely excited to release Blitz: our modular HTML/CSS rendering engine.
Blitz combines a number of exciting projects to bring customizable HTML rendering engine to everyone. Blitz is a result of collaboration across many projects: Firefox, Google, Servo, and Bevy. We’re leveraging a number of powerful libraries:
- Taffy: our high-performance flexbox layout engine
- Stylo: Firefox and Servo’s shared CSS resolution engine
- Vello: Google’s GPU compute renderer
Blitz is an extremely capable renderer, often producing results indistinguishable from browsers like Chrome and Safari:
Not every CSS feature is supported yet, with some bugs like incorrect writing direction or the occasional layout quirk. Our support matrix is here: https://blitz-website.fly.dev/support-matrix
The samples that Blitz can create are quite incredible. Servo’s website:
The BBC:
Do note that Blitz is still very young and doesn’t always produce the best outputs, especially on pages that require JavaScript to function properly or use less-popular CSS features:
Blitz also provides a pluggable layer for interactivity, supporting actions like text inputs, pluggable widgets, form submissions, hover styling, and more. Here’s Dioxus-Motion working alongside our interactivity layer to provide high quality animations:
Bear in mind that Blitz is still considered a “work in progress.” We have not focused on performance
Integrated Debugger
To date, debugging Rust ...


