{"id":13648624,"url":"https://github.com/MoonZoon/MoonZoon","last_synced_at":"2025-04-22T11:33:02.896Z","repository":{"id":37314965,"uuid":"301493003","full_name":"MoonZoon/MoonZoon","owner":"MoonZoon","description":"Rust Fullstack Framework","archived":false,"fork":false,"pushed_at":"2024-10-09T17:23:41.000Z","size":15611,"stargazers_count":1790,"open_issues_count":25,"forks_count":82,"subscribers_count":28,"default_branch":"main","last_synced_at":"2024-10-29T15:35:29.567Z","etag":null,"topics":["framework","fullstack","moonzoon","rust","virtual-actors","wasm"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MoonZoon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":["MartinKavik"]}},"created_at":"2020-10-05T17:49:11.000Z","updated_at":"2024-10-18T05:55:18.000Z","dependencies_parsed_at":"2023-10-10T20:26:06.845Z","dependency_job_id":"7718e3e0-d09e-45c0-b529-35baaeda1e12","html_url":"https://github.com/MoonZoon/MoonZoon","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoonZoon%2FMoonZoon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoonZoon%2FMoonZoon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoonZoon%2FMoonZoon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoonZoon%2FMoonZoon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MoonZoon","download_url":"https://codeload.github.com/MoonZoon/MoonZoon/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223896470,"owners_count":17221441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["framework","fullstack","moonzoon","rust","virtual-actors","wasm"],"created_at":"2024-08-02T01:04:24.371Z","updated_at":"2024-11-09T23:30:28.163Z","avatar_url":"https://github.com/MoonZoon.png","language":"Rust","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"branding/MoonZoon_logo_both_texts_light_on_black.svg\" width=\"630\" title=\"MoonZoon logo\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://discord.gg/eGduTxK2Es\"\u003e\n  \u003cimg src=\"https://discordapp.com/api/guilds/797429007683158046/widget.png?style=banner2\" title=\"MoonZoon Discord\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n### _\"We don't want to lose time and money due to millions of unnecessary technical micro-decisions.\"_\n\n---\n\n**MoonZoon** is a Rust Fullstack Framework to build Web and Desktop apps with Multithreading and Durable Computing. No HTML, CSS or JS needed.\n\n---\n\n# Code example\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/counter_demo.gif\" width=\"559\" title=\"MoonZoon logo\"\u003e\n\u003c/p\u003e\n\n```rust\nuse zoon::*;\n\nfn main() {\n    start_app(\"app\", root);\n}\n\nstatic COUNTER: Lazy\u003cMutable\u003ci32\u003e\u003e = lazy::default();\n\nfn root() -\u003e impl Element {\n    Row::new()\n        .s(Align::center())\n        .s(Gap::new().x(15))\n        .item(counter_button(\"-\", -1))\n        .item_signal(COUNTER.signal())\n        .item(counter_button(\"+\", 1))\n}\n\nfn counter_button(label: \u0026str, step: i32) -\u003e impl Element {\n    let (hovered, hovered_signal) = Mutable::new_and_signal(false);\n    Button::new()\n        .s(Width::exact(45))\n        .s(RoundedCorners::all_max())\n        .s(Background::new()\n            .color_signal(hovered_signal.map_bool(|| color!(\"#edc8f5\"), || color!(\"#E1A3EE\", 0.8))))\n        .s(Borders::all(\n            Border::new()\n                .width(2)\n                .color(color!(\"oklch(0.6 0.182 350.53 / .7\")),\n        ))\n        .on_hovered_change(move |is_hovered| hovered.set(is_hovered))\n        .label(label)\n        .on_press(move || *COUNTER.lock_mut() += step)\n}\n```\n\n# Demos\n\n## New Project Template [on Netlify](https://moonzoon-new-project.netlify.app/) | [Template](https://github.com/MoonZoon/MoonZoon/tree/main/crates/mzoon/new_project)\n   - Used by the command `mzoon new` (see the section [Create \u0026 Run project](#create--run-project) below)\n\n## Chat\n   - Repo: [examples/chat](examples/chat)\n   - Related blog post: _\"Chat example, MoonZoon Cloud [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-5-chat-example-moonzoon-cloud-5de4) / [MD](docs/articles/dev_news_5.md)]_.\n\n      ![Chat example](docs/images/chat_example.gif)\n\n---\n\n# Create \u0026 Run project\n\n1. Install the latest stable [Rust](https://www.rust-lang.org/tools/install). (Or upgrade with `rustup update stable`.)\n1. Install the web assembly target `rustup target add wasm32-unknown-unknown`\n1. `cargo install mzoon --git https://github.com/MoonZoon/MoonZoon --locked`\n1. `mzoon new my_counter`\n1. `cd my_counter`\n1. `mzoon start --open`\n\n   ![mzoon start --open](docs/images/mzoon_start_open.png)\n\n---\n\n# Deploy project\n\n## Both Frontend \u0026 Backend\n\nI use [Coolify](https://coolify.io/) on [Hetzner](https://www.hetzner.com/) with this `Dockerfile`:\n\n```dockerfile\nFROM rust:1\nWORKDIR /app\n\nRUN rustup target add wasm32-unknown-unknown\n# NOTE: Set `--rev` to the commit you use in your project\nRUN --mount=type=cache,target=/usr/local/cargo,from=rust,source=/usr/local/cargo \\\n    cargo install mzoon --git https://github.com/MoonZoon/MoonZoon --rev ccc15d043e78a6656d68a60d46de1f540724e093 --locked\n\nCOPY . .\n\nRUN --mount=type=cache,target=/usr/local/cargo,from=rust,source=/usr/local/cargo \\\n    --mount=type=cache,target=target \\\n    /usr/local/cargo/bin/mzoon build -r\n\nRUN --mount=type=cache,target=target \\\n    [\"cp\", \"./target/release/backend\", \"/usr/local/bin/moon_app\"]\n\nENTRYPOINT [\"moon_app\"]\n```\n\nMoonZoon app was successfully deployed to other services like [Heroku](https://www.heroku.com/) ([buildpack](https://github.com/MoonZoon/heroku-buildpack-moonzoon)), [Clever Cloud](https://www.clever-cloud.com/), [CapRover](https://caprover.com/) or [Fly.io](https://fly.io/). \n\n## Frontend-only\n\n1. `mzoon build --release --frontend-dist netlify` \n   - Hosting name (`netlify`) is optional. It creates files like `netlify.toml`.\n1. _[optional]_ Test it with a dev server like [miniserve](https://crates.io/crates/miniserve):\n   ```bash\n   cargo install miniserve\n   \n   miniserve --port 8079 --index index.html --spa frontend_dist\n   ```\n1. Drag \u0026 drop the `frontend_dist` directory to [Netlify](https://www.netlify.com/). \n\n   ![moonzoon-new-project on Netlify](docs/images/moonzoon-new-project_netlify.png)\n\n---\n\n# Examples\n\n- [**Examples**](examples) in the repo [See [development.md](docs/development.md) for instructions how to run them.]\n\n- [Raytracer on MoonZoon](https://github.com/MartinKavik/ray_tracer) [Not maintained)\n\n- [Voting system](https://github.com/MartinKavik/voting-solana-moonzoon) on the [Solana](https://solana.com/) blockchain. [Not maintained)\n\n   ![Voting system example](docs/images/voting_system_example.png)\n\n---\n\n# Blog\n\n- Cure for Web Development [[Medium](https://martinkavik.medium.com/cure-for-web-development-65003afb701f) / [dev.to](https://dev.to/martinkavik/cure-for-web-development-nnn) / [MD](docs/articles/cure_for_web_development.md)]\n\n- Rust on the Frontend and Backend [[Always Bet on Rust](https://blog.abor.dev/p/moonzoon)]\n\n- Interview with Martin about MoonZoon [[console.substack.com](https://console.substack.com/p/console-114)]\n\n### Dev News\n\n1. CLI, Build pipeline, Live-reload, HTTPS [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-1-cli-build-pipeline-live-reload-https-1ba6) / [MD](docs/articles/dev_news_1.md)]\n\n1. Live demo, Zoon, Examples, Architectures [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-2-live-demo-zoon-examples-architectures-2oem) / [MD](docs/articles/dev_news_2.md)]\n\n1. Signals, React-like Hooks, Optimizations [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-3-signals-react-like-hooks-optimizations-39lp) / [MD](docs/articles/dev_news_3.md)]\n\n1. Actix, Async CLI, Error handling, Wasm-pack installer [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-4-actix-async-cli-error-handling-wasm-pack-installer-57cp) / [MD](docs/articles/dev_news_4.md)]\n\n1. **Chat example, MoonZoon Cloud [[dev.to](https://dev.to/martinkavik/moonzoon-dev-news-5-chat-example-moonzoon-cloud-5de4) / [MD](docs/articles/dev_news_5.md)]**\n\n---\n\n# Documentation\n\n### 1. [Philosophy \u0026 Non-Goals](docs/philosophy_and_non_goals.md).md\n\n### 2. [Frontend](docs/frontend.md).md\n\n### 3. [Backend](docs/backend.md).md\n\n### 4. [CLI](docs/cli.md).md\n\n### 6. [Development](docs/development.md).md\n\n---\n\n# Size \u0026 Speed\n\n![Benchmark example size](docs/images/demo_size_small.png)\n\n[![Benchmark example speed](docs/images/frontend_frameworks_benchmark_1.png)](https://raw.githubusercontent.com/MoonZoon/MoonZoon/main/docs/images/frontend_frameworks_benchmark_screen.png)\n\n- [MartinKavik/js-framework-benchmark](https://github.com/MartinKavik/js-framework-benchmark/tree/framework/moonzoon)\n\n---\n\n# Sponsors\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://NLnet.nl\"\u003e\n        \u003cimg src=\"docs/images/nlnet_logo.png\" width=\"269\" alt=\"Logo NLnet\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/sponsors/MartinKavik\"\u003e\n        \u003cimg src=\"docs/images/github_sponsors_logo.png\" width=\"300\" alt=\"Logo GitHub Sponsors\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nThank you for reading! We are waiting for you on [Discord](https://discord.gg/eGduTxK2Es).\n","funding_links":["https://github.com/sponsors/MartinKavik"],"categories":["Rust","framework","Web Framework"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMoonZoon%2FMoonZoon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMoonZoon%2FMoonZoon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMoonZoon%2FMoonZoon/lists"}