{"id":51115352,"url":"https://github.com/mikolajbadyl/ruxlet","last_synced_at":"2026-06-24T21:30:25.044Z","repository":{"id":366115212,"uuid":"1274656486","full_name":"mikolajbadyl/ruxlet","owner":"mikolajbadyl","description":"A GUI framework for Rust, powered by Flutter.","archived":false,"fork":false,"pushed_at":"2026-06-20T11:02:47.000Z","size":10745,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T11:11:39.828Z","etag":null,"topics":["cross-platform","dart-ffi","declarative-ui","desktop","elm","elm-architecture","ffi","flutter","gui","gui-framework","rust","rust-lang"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mikolajbadyl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-19T18:44:50.000Z","updated_at":"2026-06-20T11:02:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mikolajbadyl/ruxlet","commit_stats":null,"previous_names":["mikolajbadyl/ruxlet"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mikolajbadyl/ruxlet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikolajbadyl%2Fruxlet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikolajbadyl%2Fruxlet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikolajbadyl%2Fruxlet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikolajbadyl%2Fruxlet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mikolajbadyl","download_url":"https://codeload.github.com/mikolajbadyl/ruxlet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikolajbadyl%2Fruxlet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34750952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"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":["cross-platform","dart-ffi","declarative-ui","desktop","elm","elm-architecture","ffi","flutter","gui","gui-framework","rust","rust-lang"],"created_at":"2026-06-24T21:30:24.524Z","updated_at":"2026-06-24T21:30:25.033Z","avatar_url":"https://github.com/mikolajbadyl.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ruxlet\n\n[![ruxlet](https://img.shields.io/crates/v/ruxlet?label=ruxlet)](https://crates.io/crates/ruxlet)\n[![ruxlet-cli](https://img.shields.io/crates/v/ruxlet-cli?label=ruxlet-cli)](https://crates.io/crates/ruxlet-cli)\n[![CI](https://github.com/mikolajbadyl/ruxlet/actions/workflows/ci.yml/badge.svg)](https://github.com/mikolajbadyl/ruxlet/actions/workflows/ci.yml)\n[![License](https://img.shields.io/crates/l/ruxlet)](LICENSE)\n\n**Build desktop apps in pure Rust, rendered by Flutter.**\n\nruxlet gives you an Elm-style app model: your state, messages, views and side\neffects all live in Rust. Flutter runs behind the scenes as the renderer, so you\nget native-quality widgets without writing any Dart.\n\n```text\nRust app -\u003e UiNode\u003cMsg\u003e -\u003e ruxlet runtime -\u003e Flutter renderer -\u003e desktop window\n```\n\n- State lives in Rust.\n- Messages are typed Rust enums.\n- Views are `UiNode\u003cMsg\u003e` trees.\n- Side effects return `Cmd\u003cMsg\u003e`.\n\n## Quick start\n\nInstall the CLI, then scaffold and run an app:\n\n```sh\ncargo install ruxlet-cli\nruxlet new counter\ncd counter\nruxlet run\n```\n\nThe CLI installs a single `ruxlet` command. The first run builds your app,\ndownloads the matching renderer bundle and opens the window. You need a stable\nRust toolchain plus `curl` and `tar` for the renderer download.\n\n## Example\n\nA complete counter app:\n\n```rust\nuse ruxlet::{App, Cmd, UiNode};\n\n#[derive(Default)]\nstruct CounterApp {\n    count: i32,\n}\n\n#[derive(Clone)]\nenum Msg {\n    Increment,\n    Decrement,\n}\n\nimpl App for CounterApp {\n    type Msg = Msg;\n\n    fn view(\u0026self) -\u003e UiNode\u003cMsg\u003e {\n        UiNode::column(vec![\n            UiNode::text(format!(\"Count: {}\", self.count)),\n            UiNode::row(vec![\n                UiNode::button(\"-\", Msg::Decrement),\n                UiNode::button(\"+\", Msg::Increment),\n            ]),\n        ])\n    }\n\n    fn update(\u0026mut self, msg: Msg) -\u003e Cmd\u003cMsg\u003e {\n        match msg {\n            Msg::Increment =\u003e self.count += 1,\n            Msg::Decrement =\u003e self.count -= 1,\n        }\n        Cmd::none()\n    }\n}\n\nfn app() -\u003e CounterApp {\n    CounterApp::default()\n}\n\nruxlet::export_c_abi!(app);\n```\n\nApp crates build as dynamic libraries:\n\n```toml\n[lib]\ncrate-type = [\"cdylib\"]\n\n[dependencies]\nruxlet = \"0.2\"\n```\n\n## Features\n\n- Elm-style `App` with `view`, `update`, lifecycle hooks and typed message mapping.\n- Async commands (`Cmd\u003cMsg\u003e`) and timer subscriptions (`Sub\u003cMsg\u003e`).\n- A full widget set: layout, controls, display, styling and themes.\n- Diffed UI updates with stable keys, so focus and cursor position survive rebuilds.\n- Keyboard, pointer, hover, text input and control-change events.\n- A single declarative window with title, size, resize limits and close control.\n- Reusable components and composite widgets.\n\nSee [Widgets](docs/guide/widgets.md) for the full catalog.\n\n## Documentation\n\n- [Getting Started](docs/guide/getting-started.md)\n- [Architecture](docs/guide/architecture.md)\n- [Widgets](docs/guide/widgets.md)\n- [Window](docs/guide/window.md)\n- [Diagnostics](docs/guide/diagnostics.md)\n\nAPI reference: [docs.rs/ruxlet](https://docs.rs/ruxlet).\n\nFor installing from git or a local checkout, updating, and renderer cache\nmanagement, see [Getting Started](docs/guide/getting-started.md).\n\n## CLI\n\n```sh\nruxlet new \u003cname\u003e      # scaffold a new app\nruxlet run             # build and launch the app\nruxlet build           # produce a standalone app directory\nruxlet update          # update the renderer bundle\nruxlet renderer ...    # inspect or install renderer bundles\n```\n\n`ruxlet --help` lists every command and flag.\n\n## Platform status\n\n| Platform     | Status                    |\n| ------------ | ------------------------- |\n| Linux x64    | Released renderer bundle  |\n| Windows x64  | Released renderer bundle  |\n| macOS x64    | Released renderer bundle  |\n| macOS arm64  | Released renderer bundle  |\n\n## Repository layout\n\n- `crates/ruxlet`: public Rust API, runtime, protocol and bridge.\n- `crates/ruxlet-cli`: scaffolding, running, packaging and renderer cache.\n- `crates/example_app`: a workspace example exercising the framework.\n- `flutter_renderer`: the generic renderer shared by every ruxlet app.\n\nRun the example from a checkout:\n\n```sh\ncargo run -p ruxlet-cli -- run --package example_app\n```\n\n## Contributing\n\nContributor rules live in [CLAUDE.md](CLAUDE.md). Before sending changes:\n\n```sh\ncargo fmt --check\ncargo clippy --all-targets\ncargo test\n```\n\nFlutter is only needed when working on `flutter_renderer` (`flutter analyze`).\n\n## License\n\nApache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikolajbadyl%2Fruxlet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikolajbadyl%2Fruxlet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikolajbadyl%2Fruxlet/lists"}