{"id":39357104,"url":"https://github.com/codeitlikemiley/fullstack-axum-dioxus","last_synced_at":"2026-01-18T02:38:41.466Z","repository":{"id":258866354,"uuid":"875821072","full_name":"codeitlikemiley/fullstack-axum-dioxus","owner":"codeitlikemiley","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-20T01:40:43.000Z","size":25,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-20T03:28:32.351Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codeitlikemiley.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-20T22:47:48.000Z","updated_at":"2025-09-20T01:40:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"305f398a-5337-4f92-b1af-08843cf689a7","html_url":"https://github.com/codeitlikemiley/fullstack-axum-dioxus","commit_stats":null,"previous_names":["codeitlikemiley/axum-dioxus-island-architecture","codeitlikemiley/fullstack-axum-dioxus"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/codeitlikemiley/fullstack-axum-dioxus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeitlikemiley%2Ffullstack-axum-dioxus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeitlikemiley%2Ffullstack-axum-dioxus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeitlikemiley%2Ffullstack-axum-dioxus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeitlikemiley%2Ffullstack-axum-dioxus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codeitlikemiley","download_url":"https://codeload.github.com/codeitlikemiley/fullstack-axum-dioxus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeitlikemiley%2Ffullstack-axum-dioxus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28526583,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-18T02:38:41.352Z","updated_at":"2026-01-18T02:38:41.410Z","avatar_url":"https://github.com/codeitlikemiley.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dioxus Fullstack (Island Architecture)\n\n## TODO :\n- see if we can use rsx on `components` crate so we dont have to write web-sys to access DOM elements\n\n\u003cdetails\u003e\n\u003csummary\u003eScreenshot\u003c/summary\u003e\n\n\u003cimg width=\"1512\" alt=\"Screenshot 2024-10-21 at 6 48 22 AM\" src=\"https://github.com/user-attachments/assets/19fb1262-78d9-426a-93d8-34dce0c61149\"\u003e\n\n\u003c/details\u003e\n\n## Requirements\n\n- geni cli\n- dx cli\n- wasm-bindgen-cli\n- wasm-pack\n- cargo-runner\n\n## Initialize the app\n\n1. mkdir hexagonal\n2. ws init\n3. add new members on `Cargo.toml`\n\n```toml\n[workspace]\nresolver = \"2\"\nmembers = [\"server\", \"components\", \"pages\"]\n```\n\n4. copy [`.gitignore` ](https://gist.github.com/codeitlikemiley/f4b405d7afe8b76d7ce799c1732649db)\n5. generate crates\n\n```\ncargo new server\ncargo new components --lib\ncargo new pages --lib\n```\n\n6. init\n\n## Set migrations\n\n1. export DATABASE_URL=postgres://postgres:postgres@localhost:5432/hexagonal\n\n2. geni create\n\n3. geni new create_users_table\n\n4. geni up\n\n## Add DB Queries\n\n1. cargo init --lib db\n2. cd db\n3. mkdir queries\n4. add initial queries\n\ne.g. `users.sql`\n\n```\n--: User()\n\n--! get_users : User\nSELECT \n    id, \n    email\nFROM users;\n```\n\n5. touch build.rs\n\n\u003cdetails\u003e \n\u003csummary\u003ebuild.rs\u003c/summary\u003e\n\n```rust\nuse std::env;\nuse std::path::Path;\n\nfn main() {\n    // Compile our SQL\n    cornucopia();\n}\n\nfn cornucopia() {\n    // For the sake of simplicity, this example uses the defaults.\n    let queries_path = \"queries\";\n\n    let out_dir = env::var_os(\"OUT_DIR\").unwrap();\n    let file_path = Path::new(\u0026out_dir).join(\"cornucopia.rs\");\n\n    let db_url = env::var_os(\"DATABASE_URL\").unwrap();\n\n    // Rerun this build script if the queries or migrations change.\n    println!(\"cargo:rerun-if-changed={queries_path}\");\n\n    // Call cornucopia. Use whatever CLI command you need.\n    let output = std::process::Command::new(\"cornucopia\")\n        .arg(\"-q\")\n        .arg(queries_path)\n        .arg(\"--serialize\")\n        .arg(\"-d\")\n        .arg(\u0026file_path)\n        .arg(\"live\")\n        .arg(db_url)\n        .output()\n        .unwrap();\n\n    // If Cornucopia couldn't run properly, try to display the error.\n    if !output.status.success() {\n        panic!(\"{}\", \u0026std::str::from_utf8(\u0026output.stderr).unwrap());\n    }\n}\n```\n\u003c/details\u003e\n\n6. Add `db` dependencies\n\n```sh\ncargo add cornucopia_async@0.6\ncargo add tokio-postgres@0.7\ncargo add deadpool-postgres@0.12\ncargo add postgres-types@0.2\ncargo add tokio@1 --features macros,rt-multi-thread\ncargo add futures@0.3\ncargo add serde@1 --features derive\n```\n\n7. modify `lib.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003elib.rs\u003c/summary\u003e\n\n```rust\nuse std::str::FromStr;\n\npub use cornucopia_async::Params;\npub use deadpool_postgres::{Pool, PoolError, Transaction};\npub use tokio_postgres::Error as TokioPostgresError;\npub use queries::users::User;\n\npub fn create_pool(database_url: \u0026str) -\u003e deadpool_postgres::Pool {\n    let config = tokio_postgres::Config::from_str(database_url).unwrap();\n    let manager = deadpool_postgres::Manager::new(config, tokio_postgres::NoTls);\n    deadpool_postgres::Pool::builder(manager).build().unwrap()\n}\n\ninclude!(concat!(env!(\"OUT_DIR\"), \"/cornucopia.rs\"));\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[tokio::test]\n    async fn load_users() {\n        let db_url = std::env::var(\"DATABASE_URL\").unwrap();\n        let pool = create_pool(\u0026db_url);\n\n        let client = pool.get().await.unwrap();\n        //let transaction = client.transaction().await.unwrap();\n\n        let users = crate::queries::users::get_users()\n            .bind(\u0026client)\n            .all()\n            .await\n            .unwrap();\n\n        dbg!(users);\n    }\n}\n```\n\u003c/details\u003e\n\n8. build the crate and run the tests using cargo-runner\n\n\n## Set up server crate\n\n1. cd server\n2. touch src/config.rs\n\n\u003cdetails\u003e\n\u003csummary\u003econfig.rs\u003c/summary\u003e\n\n```rust\n#[derive(Clone, Debug)]\npub struct Config {\n    pub database_url: String,\n}\n\nimpl Config {\n    pub fn new() -\u003e Config {\n        let database_url = std::env::var(\"DATABASE_URL\").expect(\"DATABASE_URL not set\");\n\n        Config { database_url }\n    }\n}\n```\n\u003c/details\u003e\n\n3. touch src/errors.rs\n\n\u003cdetails\u003e\n\u003csummary\u003eerrors.rs\u003c/summary\u003e\n\n```rust\nuse axum::{\n    http::StatusCode,\n    response::{IntoResponse, Response},\n};\nuse db::{PoolError, TokioPostgresError};\nuse std::fmt;\n\n#[derive(Debug)]\npub enum CustomError {\n    FaultySetup(String),\n    Database(String),\n}\n\n// Allow the use of \"{}\" format specifier\nimpl fmt::Display for CustomError {\n    fn fmt(\u0026self, f: \u0026mut fmt::Formatter) -\u003e fmt::Result {\n        match *self {\n            CustomError::FaultySetup(ref cause) =\u003e write!(f, \"Setup Error: {}\", cause),\n            //CustomError::Unauthorized(ref cause) =\u003e write!(f, \"Setup Error: {}\", cause),\n            CustomError::Database(ref cause) =\u003e {\n                write!(f, \"Database Error: {}\", cause)\n            }\n        }\n    }\n}\n\n// So that errors get printed to the browser?\nimpl IntoResponse for CustomError {\n    fn into_response(self) -\u003e Response {\n        let (status, error_message) = match self {\n            CustomError::Database(message) =\u003e (StatusCode::UNPROCESSABLE_ENTITY, message),\n            CustomError::FaultySetup(message) =\u003e (StatusCode::UNPROCESSABLE_ENTITY, message),\n        };\n\n        format!(\"status = {}, message = {}\", status, error_message).into_response()\n    }\n}\n\nimpl From\u003caxum::http::uri::InvalidUri\u003e for CustomError {\n    fn from(err: axum::http::uri::InvalidUri) -\u003e CustomError {\n        CustomError::FaultySetup(err.to_string())\n    }\n}\n\nimpl From\u003cTokioPostgresError\u003e for CustomError {\n    fn from(err: TokioPostgresError) -\u003e CustomError {\n        CustomError::Database(err.to_string())\n    }\n}\n\nimpl From\u003cPoolError\u003e for CustomError {\n    fn from(err: PoolError) -\u003e CustomError {\n        CustomError::Database(err.to_string())\n    }\n}\n```\n\u003c/details\u003e\n\n4. Add dependencies\n\n```sh\ncargo add axum@0.7 --no-default-features -F json,http1,tokio\ncargo add tokio@1 --no-default-features -F macros,fs,rt-multi-thread\ncargo add --path ../db\n```\n\n5. update `main.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003emain.rs\u003c/summary\u003e\n\n```rust\nmod config;\nmod errors;\n\nuse crate::errors::CustomError;\nuse axum::{extract::Extension, response::Json, routing::get, Router};\nuse db::User;\nuse std::net::SocketAddr;\n\n#[tokio::main]\nasync fn main() {\n    let config = config::Config::new();\n\n    let pool = db::create_pool(\u0026config.database_url);\n\n    // build our application with a route\n    let app = Router::new()\n        .route(\"/\", get(users))\n        .layer(Extension(config))\n        .layer(Extension(pool.clone()));\n\n    // run it\n    let addr = SocketAddr::from(([0, 0, 0, 0], 3000));\n    println!(\"listening on {}\", addr);\n    let listener = tokio::net::TcpListener::bind(\u0026addr).await.unwrap();\n    axum::serve(listener, app.into_make_service())\n        .await\n        .unwrap();\n}\n\nasync fn users(Extension(pool): Extension\u003cdb::Pool\u003e) -\u003e Result\u003cJson\u003cVec\u003cUser\u003e\u003e, CustomError\u003e {\n    let client = pool.get().await?;\n\n    let users = db::queries::users::get_users().bind(\u0026client).all().await?;\n\n    Ok(Json(users))\n}\n```\n\u003c/details\u003e\n\n6. run the server\n\n\n## Set up Pages crate\n\n1. cargo init --lib pages\n2. cd pages\n3. install dependencies\n\n```sh\ncargo add dioxus \ncargo adddioxus-ssr\ncargo add --path ../db\n```\n\n4. create `src/layout.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003elayout.rs\u003c/summary\u003e\n\n```rust\n#![allow(non_snake_case)]\n\nuse dioxus::prelude::*;\n\n#[component]\npub fn Layout(title: String, children: Element) -\u003e Element {\n    rsx!(\n        head {\n            title { \"{title}\" }\n            meta { charset: \"utf-8\" }\n            meta { \"http-equiv\": \"X-UA-Compatible\", content: \"IE=edge\" }\n            meta {\n                name: \"viewport\",\n                content: \"width=device-width, initial-scale=1\"\n            }\n        }\n        body { {children} }\n    )\n}\n```\n\u003c/details\u003e\n\n5. create `src/users.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003eusers.rs\u003c/summary\u003e\n\n```rust\nuse crate::layout::Layout;\nuse db::User;\nuse dioxus::prelude::*;\n\n// Define the properties for IndexPage\n#[derive(Props, Clone, PartialEq)] // Add Clone and PartialEq here\npub struct IndexPageProps {\n    pub users: Vec\u003cUser\u003e,\n}\n\n// Define the IndexPage component\n#[component]\npub fn IndexPage(props: IndexPageProps) -\u003e Element {\n    rsx! {\n        Layout { title: \"Users Table\",\n            table {\n                thead {\n                    tr {\n                        th { \"ID\" }\n                        th { \"Email\" }\n                    }\n                }\n                tbody {\n                    for user in props.users {\n                        tr {\n                            td {\n                                strong { \"{user.id}\" }\n                            }\n                            td { \"{user.email}\" }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n```\n\u003c/details\u003e\n\n6. update `src/lib.rs`\n\n\u003cdetails\u003e \n\n\u003csummary\u003elib.rs\u003c/summary\u003e\n\n```rust\nmod layout;\npub mod users;\nuse dioxus::prelude::*;\n\npub fn render(mut virtual_dom: VirtualDom) -\u003e String {\n    virtual_dom.rebuild_in_place();\n    let html = dioxus_ssr::render(\u0026virtual_dom);\n    format!(\"\u003c!DOCTYPE html\u003e\u003chtml lang='en'\u003e{}\u003c/html\u003e\", html)\n}\n```\n\u003c/details\u003e\n\n7. cd to `server` crate\n\n8. update dependencies\n\n```sh\ncargo add dioxus\ncargo add --path ../pages\n```\n\n9. update `main.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003emain.rs\u003c/summary\u003e\n\n```rust\nmod config;\nmod errors;\nuse crate::errors::CustomError;\nuse axum::response::Html;\nuse axum::{extract::Extension, routing::get, Router};\nuse dioxus::dioxus_core::VirtualDom;\nuse pages::{\n    render,\n    users::{IndexPage, IndexPageProps},\n};\nuse std::net::SocketAddr;\n\n#[tokio::main]\nasync fn main() {\n    let config = config::Config::new();\n\n    let pool = db::create_pool(\u0026config.database_url);\n\n    // build our application with a route\n    let app = Router::new()\n        .route(\"/\", get(users))\n        .layer(Extension(config))\n        .layer(Extension(pool.clone()));\n\n    // run it\n    let addr = SocketAddr::from(([0, 0, 0, 0], 3000));\n    println!(\"listening on... {}\", addr);\n    let listener = tokio::net::TcpListener::bind(\u0026addr).await.unwrap();\n    axum::serve(listener, app.into_make_service())\n        .await\n        .unwrap();\n}\n\npub async fn users(Extension(pool): Extension\u003cdb::Pool\u003e) -\u003e Result\u003cHtml\u003cString\u003e, CustomError\u003e {\n    let client = pool.get().await?;\n\n    let users = db::queries::users::get_users().bind(\u0026client).all().await?;\n\n    let html = render(VirtualDom::new_with_props(\n        IndexPage,\n        IndexPageProps { users },\n    ));\n\n    Ok(Html(html))\n}\n```\n\u003c/details\u003e\n\n10. run the server\n\n## Set up `assets` crate for static files\n\n1. cargo init --lib assets\n2. cd assets\n3. mkdir images\n4. create an `avatar.svg` file on `images` folder\n\n\u003cdetails\u003e\n\n\u003csummary\u003eavatar.svg\u003c/summary\u003e\n\n```svg\n\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\n    \u003cpath fill=\"#fff\" d=\"M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM160 256c0-53 43-96 96-96h64c53 0 96-43 96-96s-43-96-96-96H160zm0 96c0 53 43 96 96 96h64c53 0 96-43 96-96s-43-96-96-96H160zm0 96c0 53 43 96 96 96h64c53 0 96-43 96-96s-43-96-96-96H160z\"/\u003e\n\u003c/svg\u003e\n```\n\u003c/details\u003e\n\n5. touch `build.rs`\n\n6. update `build.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003ebuild.rs\u003c/summary\u003e\n\n```rust\nuse ructe::{Result, Ructe};\n\nfn main() -\u003e Result\u003c()\u003e {\n    let mut ructe = Ructe::from_env().unwrap();\n    let mut statics = ructe.statics().unwrap();\n    statics.add_files(\"images\").unwrap();\n    ructe.compile_templates(\"images\").unwrap();\n\n    Ok(())\n}\n```\n\n\u003c/details\u003e\n\n7. add dependencies\n\n```sh\ncargo add mime@0.3\ncargo add --build ructe@0.17 --no-default-features -F mime03\n```\n\n8. update `lib.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003elib.rs\u003c/summary\u003e\n\n```rust\ninclude!(concat!(env!(\"OUT_DIR\"), \"/templates.rs\"));\n\npub use templates::statics as files;\n```\n\u003c/details\u003e\n\n9. cd to `server` crate\n\n10. create `static_files.rs`\n\n11. update `static_files.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003estatic_files.rs\u003c/summary\u003e\n\n```rust\nuse assets::templates::statics::StaticFile;\nuse axum::body::Body;\nuse axum::extract::Path;\nuse axum::http::{header, HeaderValue, Response, StatusCode};\nuse axum::response::IntoResponse;\n\npub async fn static_path(Path(path): Path\u003cString\u003e) -\u003e impl IntoResponse {\n    let path = path.trim_start_matches('/');\n\n    if let Some(data) = StaticFile::get(path) {\n        Response::builder()\n            .status(StatusCode::OK)\n            .header(\n                header::CONTENT_TYPE,\n                HeaderValue::from_str(data.mime.as_ref()).unwrap(),\n            )\n            .body(Body::from(data.content))\n            .unwrap()\n    } else {\n        Response::builder()\n            .status(StatusCode::NOT_FOUND)\n            .body(Body::empty())\n            .unwrap()\n    }\n}\n```\n\u003c/details\u003e\n\n12. modify `main.rs` to add the new route for static files\n\n\u003cdetails\u003e\n\u003csummary\u003emain.rs\u003c/summary\u003e\n\n```rust\n// load module\nmod static_files;\n\nlet app = Router::new()\n    .route(\"/\", get(users))\n    .route(\"/static/*path\", get(static_files::static_path)) // add this line\n    .layer(Extension(config))\n    .layer(Extension(pool.clone()));\n... \n```\n\n13. cargo add --path ../assets\n\n14. use the static files on `pages/src/users.rs`\n\n\u003cdetails\u003e\n\u003csummary\u003eusers.rs\u003c/summary\u003e\n\n```rust\n// use avatar\nuse assets::files::avatar_svg;\n\n...\n\n// access the static file\nimg {\n    src: format!(\"/static/{}\", avatar_svg.name),\n    width: \"16\",\n    height: \"16\"\n}\n```\n\n15. run the server\n\n## Set up Components crate\n\n1. cargo init --lib components\n\n2. add dependencies\n\n```toml\ndioxus = \"0.5.6\"\njs-sys = \"0.3.72\"\nwasm-bindgen = \"0.2.93\"\nweb-sys = { version = \"0.3.72\", features = [\"Document\", \"Element\", \"HtmlElement\", \"Window\", \"console\"] }\n```\n\n3. set the crate type to `cdylib` and `rlib`\n\n4. add example code to test on `src/lib.rs`\n\n\u003cdetails\u003e\n\n\u003csummary\u003elib.rs\u003c/summary\u003e\n\n```rust\nuse js_sys::Math;\nuse wasm_bindgen::prelude::*;\nuse web_sys::{console, window, Element};\n\n#[wasm_bindgen]\npub fn say_hello() {\n    let random_number = Math::random();\n    let message = format!(\"Hello from Rust! Random number: {}\", random_number);\n\n    // Log to the browser console\n    console::log_1(\u0026\"Logging to console from Rust!\".into());\n    console::log_1(\u0026format!(\"Generated random number: {}\", random_number).into());\n\n    // Show alert\n    web_sys::window()\n        .unwrap()\n        .alert_with_message(\u0026message)\n        .unwrap();\n}\n\n#[wasm_bindgen(start)]\npub fn start() -\u003e Result\u003c(), JsValue\u003e {\n    // Access the DOM window object\n    let window = window().unwrap();\n    let document = window.document().unwrap();\n\n    // Get the button element by ID\n    let button: Element = document.get_element_by_id(\"alert-btn\").unwrap();\n\n    // Set an event listener for the button click\n    let closure = Closure::wrap(Box::new(move || {\n        // Call the Rust function say_hello\n        say_hello();\n    }) as Box\u003cdyn Fn()\u003e);\n\n    // Set an event listener for the button click\n    button\n        .dyn_ref::\u003cweb_sys::HtmlElement\u003e()\n        .unwrap()\n        .set_onclick(Some(closure.as_ref().unchecked_ref()));\n\n    // We need to keep the closure alive, so we store it in memory.\n    closure.forget();\n\n    Ok(())\n}\n```\n\n\u003c/details\u003e\n\n4. cd to assets crate\n5. create `js/pages/users` folder\n6. go back to `components` crate\n7. generate assets using command\n\n```sh\nwasm-pack build --target web --out-dir ../assets/js/pages/users\n```\n\n8. Use the generated asset on `pages/src/users.rs`\n\n\n```rust\n            script {\n                r#type: \"module\",\n                dangerous_inner_html: r#\"\nimport init from '/static/components.js';\ninit();\n\"#\n            }\n```\n\n### Feature gating for wasm components\n\nwe need to use feature gating to only include components that are needed\n\n```sh\nwasm-pack build --target web --out-dir ../assets/js/pages/${feature} --features ${feature}\n```\n\ne.g.\n\n```toml\n[features]\ndefault = []\nusers = []\nfeaturex = []\n\n```\n\non rust code we can do \n\n```rust\n#[cfg(feature = \"feature1\")]\n#[wasm_bindgen]\nfn some_function() {\n    // Implementation for feature1\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeitlikemiley%2Ffullstack-axum-dioxus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodeitlikemiley%2Ffullstack-axum-dioxus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeitlikemiley%2Ffullstack-axum-dioxus/lists"}