{"id":48542202,"url":"https://github.com/ribirx/ribir","last_synced_at":"2026-04-08T05:02:44.704Z","repository":{"id":65258048,"uuid":"232596294","full_name":"RibirX/Ribir","owner":"RibirX","description":"Non-intrusive GUI framework for Rust/WASM","archived":false,"fork":false,"pushed_at":"2026-04-01T08:06:47.000Z","size":27108,"stargazers_count":1678,"open_issues_count":36,"forks_count":37,"subscribers_count":23,"default_branch":"master","last_synced_at":"2026-04-01T10:21:56.964Z","etag":null,"topics":["cross-platform","declarative","gui","native","non-intrusive","reactive","rust","ui","webassembly"],"latest_commit_sha":null,"homepage":"https://ribir.org","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/RibirX.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2020-01-08T15:36:57.000Z","updated_at":"2026-04-01T08:06:51.000Z","dependencies_parsed_at":"2023-10-02T05:30:25.040Z","dependency_job_id":"ab591ed3-d8d4-4d14-a577-bf0fb1b2e9f7","html_url":"https://github.com/RibirX/Ribir","commit_stats":{"total_commits":856,"total_committers":9,"mean_commits":95.11111111111111,"dds":0.2628504672897196,"last_synced_commit":"9891d3c6177a62ea1b2bc0ec4ef57ed8c0063bf4"},"previous_names":[],"tags_count":79,"template":false,"template_full_name":null,"purl":"pkg:github/RibirX/Ribir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RibirX%2FRibir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RibirX%2FRibir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RibirX%2FRibir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RibirX%2FRibir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RibirX","download_url":"https://codeload.github.com/RibirX/Ribir/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RibirX%2FRibir/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31540827,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"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","declarative","gui","native","non-intrusive","reactive","rust","ui","webassembly"],"created_at":"2026-04-08T05:02:30.851Z","updated_at":"2026-04-08T05:02:44.694Z","avatar_url":"https://github.com/RibirX.png","language":"Rust","readme":"\u003ch1 align=\"center\"\u003e\nRibir - Non-intrusive GUI Framework for Rust\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\u003ca href=\"https://ribir.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n\u003cimg src=\"static/logo.svg\" alt=\"Ribir-logo\"  width = \"128px\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nUse Rust to build multi-platform applications from a single codebase.\n\u003c/p\u003e\n\u003cdiv align=\"center\"\u003e\n\n[![CI](https://github.com/RibirX/Ribir/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/RibirX/Ribir/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/RibirX/Ribir/branch/master/graph/badge.svg)](https://codecov.io/gh/RibirX/ribir)\n[![Crates.io](https://img.shields.io/crates/v/ribir)](https://crates.io/crates/ribir)\n[![Crates.io](https://img.shields.io/crates/d/ribir)](https://crates.io/crates/ribir)\n[![Discord](https://img.shields.io/discord/699900144002269226?label=discord)](https://discord.gg/7p3pSrUvmq)\n[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ribir_x\n)](https://twitter.com/intent/user?screen_name=ribir_x)\n\n\n[Website] | [Documents] | [中文文档] | [Web Demo]| [Examples] | [Changelog] | [Releases] | [Roadmap]\n\u003c/div\u003e\n\n![](./static/hero-banner.png)\n\n## What's Ribir?\n\nRibir is a Rust GUI framework that helps you build beautiful and native multi-platform applications from a single codebase.\n\nExperience a novel approach to UI development that's directly based on your data structure APIs. Any data mutation will trigger a precise UI update. Your focus should be on designing your data structure and its APIs. Then, you can describe your data's UI without intruding on its logic.\n\n## At First Glance\n\nA simple example of a counter:\n\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd style=\"padding:10px\"\u003e\n      \u003cdiv\u003e\n\n``` rust no_run\nuse ribir::prelude::*;\n\nfn main() {\n  App::run_with_data(\n    || Stateful::new(0),\n    move |cnt: \u0026'static Stateful\u003ci32\u003e| {\n      button! {\n        x: AnchorX::center(),\n        y: AnchorY::center(),\n        on_tap: move |_| *$write(cnt) += 1,\n        @pipe!($read(cnt).to_string())\n      }\n    }\n  );\n}\n```\n\u003c/div\u003e\n    \u003c/td\u003e\n      \u003ctd style=\"padding:10px\"\u003e\n        \u003cimg src=\"./static/counter_demo.gif\" width=\"320px\"/\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n**To use Ribir without DSL**:\n\n```rust no_run\nuse ribir::prelude::*;\nfn main() {\n  App::run_with_data(\n    || Stateful::new(0),\n    move |cnt: \u0026'static Stateful\u003ci32\u003e| {\n      let c_cnt = cnt.clone_writer();\n      let mut btn = Button::declarer();\n      btn\n        .on_tap(move |_| *c_cnt.write() += 1)\n        .with_x(AnchorX::center())\n        .with_y(AnchorY::center());\n      btn.finish().with_child(pipe!($read(cnt).to_string()))\n    });\n}\n```\n\nMore [Examples]\n\n## Features\n\n- **Declarative language** It doesn't introduce a completely new language. Instead, it provides a set of Rust macros for easier interaction. You can choose to use it or not.\n- **Widgets compose system** has four kinds of widgets to support you can implement your widget in different ways:\n  - function widget and `Compose`, from other widgets composition.\n  - `Render`, implement your layout and paint anything you want.\n  - `ComposeChild`, control the compose logic between parent and child widgets and specify the template of child widgets.  \n- **Non-intrusive state** converts your data to a listenable state and updates the view according to the change of the state.\n- **Layout system** learning and inspired by [Flutter] Sublinear layout, but not the same.\n- **Event system** is a composition event system, that supports event bubbling and capture. Allow to compose with any widget, and exists only if you use it.\n- **Theme System**: Supports using different themes for various parts of the sub-tree and enables theme modifications at runtime.\n- **Painter** converts the view to 2D paths.\n- **GPU render** is a backend of the **Painter**, do path tessellation so that you can easily render the triangles in any GPU render engine. A [wgpu] implementation is provided as the default GPU render engine. Tessellation base on [lyon].\n- **Text** support basic text typography and IME input, in a usable but rough stage.\n- **Widgets** library provides 20+ basic widgets, but all are in a rough stage, and the API is not stable yet.\n\n## Architecture overview\n\n![](./docs/en/assets/architecture.svg)\n\n## Support Platform \n\n|Platform|Support situation|\n|---|---|\n|Linux|✅|\n|Windows|✅|\n|macOS|✅|\n|iOS|🚧 Not yet|\n|Android|🚧 Not yet|\n|Web|✅|\n\nRibir is actively being developed and tested on desktop platforms, with both desktop and web platforms integrated into our CI/CD pipeline.\n\nWhile the framework can compile and run on mobile platforms, we haven't fully tested or adapted the user interface for them yet. We plan to focus on mobile support once the core framework is stable and a production-ready widget library is released.\n \n## Love Ribir?\n\nIf you like Ribir, give our repo a [⭐ STAR ⬆️](https://github.com/RibirX/Ribir) and [WATCH 👀](https://github.com/RibirX/Ribir/subscription) our repository to stay updated with the latest developments!\n\nEvery encouragement and feedback can support us to go further.\n\n## Contributing\n\nWe are grateful to the community for contributing bug fixes and improvements.\n\n**😎 New to Ribir?**\n\nStart learning about the framework by helping us improve our [documentation](https://ribir.org/docs/introduction). Feel free to open a [new \"Documentation\" issue](https://github.com/RibirX/Ribir/issues/new/choose). We are also very welcome:\n* Point out to us where our document has misunderstandings\n* Pull requests which improve test coverage\n* Add undocumented code (e.g. built-in widget)\n* Report typo \n\nFor more information please read：\n* [Contributing Guide](./CONTRIBUTING.md)\n* [Writing a Good Issue](https://developers.google.com/blockly/guides/contribute/get-started/write_a_good_issue)\n\n**🤔 Confused about something?**\n\nFeel free to go to Discussions and open a [new \"Q\u0026A\"](https://github.com/RibirX/Ribir/discussions/new/choose) to get help from contributors. Often questions lead to improvements to the ergonomics of the framework, better documentation, and even new features!\n\n**😱 Found a bug?**\n\nPlease [report all bugs](https://github.com/RibirX/Ribir/issues/new/choose)! We are happy to help support developers fix the bugs they find if they are interested and have the time.\n\n\n## Thanks\n\nThis project exists thanks to all the people who contributed:\n\n\u003ca href=\"https://github.com/RibirX/Ribir/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=RibirX/Ribir\" height=\"50px\"\u003e\n\u003c/a\u003e\n\n\u003cbr/\u003e\n\nWe also found inspiration from the following frameworks:\n\n* [Flutter]\n* [QML]\n\n## License\nRibir is [MIT-licensed](./LICENSE)\n\n[Website]: https://ribir.org\n[Changelog]: ./CHANGELOG.md\n[Releases]: ./dev-docs/release-system/00-release-strategy.md\n[Roadmap]: ./ROADMAP.md\n[Flutter]: https://flutter.dev/\n[QML]: https://doc.qt.io/qt-6/qtqml-index.html\n[Examples]: ./examples/\n[Documents]: https://ribir.org/docs/next/introduction\n[中文文档]: https://ribir.org/zh/docs/next/introduction\n[wgpu]: https://github.com/gfx-rs/wgpu\n[Web Demo]: https://ribir.org/wordle_game/\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fribirx%2Fribir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fribirx%2Fribir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fribirx%2Fribir/lists"}