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
FromRequest
andIntoResponse
bodies - Server-only
FromRequest
extractors - A new
HttpError
type and accompanying trait for returning proper Axum responses - Support for
anyhow::Error
type as a return type from server functions - Addition of a Server-Sent-Events (SSE) type
- Addition of a
Websocket
type and reactiveuse_websocket
hook 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::Request
type 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
window
by @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 opaque writer types by @ealmloff in #4684
- Fix fullstack serialization order for adjacent components by @ealmloff in #4600
- fix: use floats for pointer events by @Tumypmyp in #4708
- Fix hydration with empty spread attributes by @ealmloff in #4647
- fix: save cli config as a toml file by @omar-mohamed-khallaf in #4652
- Fix route hydration with ssg without early chunk commit by @ealmloff in #4654
- Fix #4504 where
dx fmt
fails on eval of JS that contains empty line. by @nilswloewen in #4506 - Sync ReadSignal and Store by @ealmloff in #4608
- Improve use_hook_did_run docs by @mcmah309 in #4554
- Improve use_server_future docs by @mcmah309 in #4558
- Look for strip settings in inherited profiles and global configs by @ealmloff in #4645
- move
ScopeId
methods to the runtime by @jkelleyrtp in #4723 - Fix Sse keepalive build error by @fasterthanlime in #4725
- fix: hotpatching fullstack by @jkelleyrtp in #4730
- Propagate linker failure by @mohe2015 in #4728
- Update gradle wrapper by @mohe2015 in #4726
- Upgrade to Blitz v0.2.0 by @nicoburns in #4731
- FIX: web.https configuration - error: no process-level CryptoProvider available by @tgrushka in #4736
- More fullstack fixes by @jkelleyrtp in #4737
- Fix ReadOnlySignal alias without storage by @ealmloff in #4735
New Contributors
- @emmanuel-ferdman made their first contribution in #4570
- @priezz made their first contribution in #4563
- @ktechhydle made their first contribution in #4575
- @dabrahams made their first contribution in #4542
- @d-corler made their first contribution in #4476
- @snatvb made their first contribution in #4650
- @omar-mohamed-khallaf made their first contribution in #4651
- @kristoff3r made their first contribution in #4695
- @Tumypmyp made their first contribution in #4708
- @nilswloewen made their first contribution in #4506
- @fasterthanlime made their first contribution in #4725
- @tgrushka made their first contribution in #4736
Full Changelog: v0.7.0-rc.0...v0.7.0-rc.1