dioxus-fullstack — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dioxus-fullstack (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Comprehensive Dioxus 0.7 framework expertise for building modern fullstack applications with Rust. Covers desktop, web, and mobile app development with seamless Rust integration.
src/
├── main.rs # Main application entry
├── app.rs # Root app component
├── components/ # Reusable UI components
├── pages/ # Route/page components
├── hooks/ # Custom hooks
├── server/ # Server-only code (fullstack)
├── assets/ # Static assets
└── routes/ # Route definitions (new in 0.7)# Use dx add to install dependencies:
dx add dioxus --features fullstack
dx add dioxus-router
dx add dioxus-desktop
dx add dioxus-mobile
dx add serde --features derive
dx add reqwest
dx add tokio --features full
dx add sqlx --features "runtime-tokio-rustls,postgres"
dx add dioxus-logger # New logging systemuse_signal, use_effect)children for compositioncx.render for conditional renderingfn Component(cx: Scope) -> Element syntaxuse_signal hook (preferred over use_state)#[server] macrouse dioxus_router::prelude::*;
#[derive(Clone, Routable, Debug, PartialEq)]
enum Route {
#[route("/")]
Home {},
#[route("/blog/:id")]
BlogPost { id: u32 },
#[route("/about")]
About {},
#[nest("/admin")]
#[route("/dashboard")]
AdminDashboard {},
#[end_nest]
#[route("/:..route")]
NotFound { route: Vec<String> },
}
fn App(cx: Scope) -> Element {
render! {
Router::<Route> {}
}
}use dioxus::prelude::*;
#[server]
async fn get_user(id: u32) -> Result<User, ServerFnError> {
// Database logic here
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1")
.bind(id)
.fetch_one(&db)
.await?;
Ok(user)
}
// Client usage
fn UserComponent(cx: Scope, id: u32) -> Element {
let user = use_resource(cx, || async move { get_user(id).await });
render! {
div {
match &*user.read() {
Some(Ok(user)) => rsx! { "Hello, {user.name}" },
Some(Err(e)) => rsx! { "Error: {e}" },
None => rsx! { "Loading..." },
}
}
}
}dioxus-css or dioxus-free-componentsdioxus-tailwinduse_memo for expensive computationsuse_callback for stable event handlersResult types throughoutErrorBoundaryuse_error_boundarydioxus-testing# New project with templates
dx create my-app --template fullstack
dx create my-app --template desktop
dx create my-app --template mobile
# Development server with hot reload
dx serve
# Add dependencies (preferred over manual Cargo.toml editing)
dx add dioxus-logger
dx add sqlx --features postgres
dx add reqwest --features json
# Build for production
dx build --platform web
dx build --platform desktop
dx build --platform mobile
# Generate deployment bundle
dx build --release
# Run tests
dx test
# Check project status
dx check#[component]
fn LoginForm(cx: Scope) -> Element {
let mut email = use_signal(cx, || "".to_string());
let mut password = use_signal(cx, || "".to_string());
let mut errors = use_signal(cx, Vec::<String>::new);
let on_submit = move |_| {
// Validation and submission logic
if email.read().is_empty() {
errors.write().push("Email is required".to_string());
}
};
render! {
form { onsubmit: on_submit,
input {
type: "email",
value: "{email}",
oninput: move |e| email.set(e.value())
}
input {
type: "password",
value: "{password}",
oninput: move |e| password.set(e.value())
}
for error in errors.read() {
div { class: "error", "{error}" }
}
button { type: "submit", "Login" }
}
}
}#[server]
async fn create_post(title: String, content: String) -> Result<Post, ServerFnError> {
// Validate input
if title.is_empty() {
return Err(ServerFnError::ServerError("Title cannot be empty".to_string()));
}
// Database insertion
let post = sqlx::query_as::<_, Post>(
"INSERT INTO posts (title, content) VALUES ($1, $2) RETURNING *"
)
.bind(&title)
.bind(&content)
.fetch_one(&db)
.await?;
Ok(post)
}
// Usage in component
#[component]
fn PostForm(cx: Scope) -> Element {
let mut title = use_signal(cx, || "".to_string());
let mut content = use_signal(cx, || "".to_string());
let create_post = use_server_future(cx, (title(), content()), |(title, content)| async move {
create_post(title, content).await
});
render! {
form {
input {
value: "{title}",
oninput: move |e| title.set(e.value())
}
textarea {
value: "{content}",
oninput: move |e| content.set(e.value())
}
button { onclick: move |_| create_post.restart(), "Create Post" }
match create_post.read() {
Some(Ok(post)) => rsx! { div { "Created: {post.title}" } },
Some(Err(e)) => rsx! { div { "Error: {e}" } },
None => rsx! { div { "Creating..." } },
}
}
}
}#[hook]
pub fn use_api<T: Clone + 'static>(
cx: Scope,
endpoint: String
) -> UseResource<Result<T, reqwest::Error>> {
use_resource(cx, || async move {
reqwest::get(&endpoint).await?.json::<T>().await
})
}
#[hook]
pub fn use_debounce(cx: Scope, value: String, delay_ms: u64) -> Signal<String> {
let debounced = use_signal(cx, || value.clone());
use_effect(cx, (value,), |(value,)| {
spawn(async move {
tokio::time::sleep(Duration::from_millis(delay_ms)).await;
debounced.set(value.clone());
});
|| ()
});
debounced
}This skill provides the essential knowledge and patterns for building robust, performant fullstack applications with Dioxus 0.7 while maintaining Rust's safety and ergonomics throughout the entire development lifecycle.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.