base on A Rust crate for cooking up terminal user interfaces (TUIs) 👨‍🍳🐀 https://ratatui.rs <details> <summary>Table of Contents</summary> - [Quickstart](#quickstart) - [Documentation](#documentation) - [Templates](#templates) - [Built with Ratatui](#built-with-ratatui) - [Alternatives](#alternatives) - [Contributing](#contributing) - [Acknowledgements](#acknowledgements) - [License](#license) </details> ![Demo](https://github.com/ratatui/ratatui/blob/87ae72dbc756067c97f6400d3e2a58eeb383776e/examples/demo2-destroy.gif?raw=true) <div align="center"> [![Crate Badge]][Crate] [![Repo Badge]][Repo] [![Docs Badge]][Docs] [![License Badge]][License] \ [![CI Badge]][CI] [![Deps Badge]][Deps] [![Codecov Badge]][Codecov] [![Sponsors Badge]][Sponsors] \ [Ratatui Website] · [Docs] · [Widget Examples] · [App Examples] · [Changelog] \ [Breaking Changes] · [Contributing] · [Report a bug] · [Request a Feature] </div> [Ratatui][Ratatui Website] (_ˌræ.təˈtu.i_) is a Rust crate for cooking up terminal user interfaces (TUIs). It provides a simple and flexible way to create text-based user interfaces in the terminal, which can be used for command-line applications, dashboards, and other interactive console programs. ## Quickstart Ratatui has [templates] available to help you get started quickly. You can use the [`cargo-generate`] command to create a new project with Ratatui: ```shell cargo install --locked cargo-generate cargo generate ratatui/templates ``` Selecting the Hello World template produces the following application: ```rust use color_eyre::Result; use crossterm::event::{self, Event}; use ratatui::{DefaultTerminal, Frame}; fn main() -> Result<()> { color_eyre::install()?; let terminal = ratatui::init(); let result = run(terminal); ratatui::restore(); result } fn run(mut terminal: DefaultTerminal) -> Result<()> { loop { terminal.draw(render)?; if matches!(event::read()?, Event::Key(_)) { break Ok(()); } } } fn render(frame: &mut Frame) { frame.render_widget("hello world", frame.area()); } ``` ## Documentation - [Docs] - the full API documentation for the library on docs.rs. - [Ratatui Website] - explains the library's concepts and provides step-by-step tutorials. - [Ratatui Forum] - a place to ask questions and discuss the library. - [Widget Examples] - a collection of examples that demonstrate how to use the library. - [App Examples] - a collection of more complex examples that demonstrate how to build apps. - [ARCHITECTURE.md] - explains the crate organization and modular workspace structure. - [Changelog] - generated by [git-cliff] utilizing [Conventional Commits]. - [Breaking Changes] - a list of breaking changes in the library. You can also watch the [EuroRust 2024 talk] to learn about common concepts in Ratatui and what's possible to build with it. ## Templates If you're looking to get started quickly, you can use one of the available templates from the [templates] repository using [`cargo-generate`]: ```shell cargo generate ratatui/templates ``` ## Built with Ratatui [![Awesome](https://awesome.re/badge-flat2.svg)][awesome-ratatui] Check out the [showcase] section of the website, or the [awesome-ratatui] repository for a curated list of awesome apps and libraries built with Ratatui! ## Alternatives - [Cursive](https://crates.io/crates/cursive) - a ncurses-based TUI library. - [iocraft](https://crates.io/crates/iocraft) - a declarative TUI library. ## Contributing [![Discord Badge]][Discord Server] [![Matrix Badge]][Matrix] [![Forum Badge]][Ratatui Forum] Feel free to join our [Discord server](https://discord.gg/pMCEU9hNEj) for discussions and questions! There is also a [Matrix](https://matrix.org/) bridge available at [#ratatui:matrix.org](https://matrix.to/#/#ratatui:matrix.org). We have also recently launched the [Ratatui Forum]. We rely on GitHub for [bugs][Report a bug] and [feature requests][Request a Feature]. Please make sure you read the [contributing](./CONTRIBUTING.md) guidelines before [creating a pull request][Create a Pull Request]. If you'd like to show your support, you can add the Ratatui badge to your project's README: ```md [![Built With Ratatui](https://ratatui.rs/built-with-ratatui/badge.svg)](https://ratatui.rs/) ``` [![Built With Ratatui](https://ratatui.rs/built-with-ratatui/badge.svg)](https://ratatui.rs/) ## Acknowledgements Ratatui was forked from the [tui-rs] crate in 2023 in order to continue its development. None of this could be possible without [Florian Dehau] who originally created [tui-rs] which inspired many Rust TUIs. Special thanks to [Pavel Fomchenkov] for his work in designing an awesome logo for the Ratatui project and organization. ## License This project is licensed under the [MIT License][License]. [Repo]: https://github.com/ratatui/ratatui [Ratatui Website]: https://ratatui.rs/ [Ratatui Forum]: https://forum.ratatui.rs [Docs]: https://docs.rs/ratatui [Widget Examples]: https://github.com/ratatui/ratatui/tree/main/ratatui-widgets/examples [App Examples]: https://github.com/ratatui/ratatui/tree/main/examples [ARCHITECTURE.md]: https://github.com/ratatui/ratatui/blob/main/ARCHITECTURE.md [Changelog]: https://github.com/ratatui/ratatui/blob/main/CHANGELOG.md [git-cliff]: https://git-cliff.org [Conventional Commits]: https://www.conventionalcommits.org [Breaking Changes]: https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md [EuroRust 2024 talk]: https://www.youtube.com/watch?v=hWG51Mc1DlM [Report a bug]: https://github.com/ratatui/ratatui/issues/new?labels=bug&projects=&template=bug_report.md [Request a Feature]: https://github.com/ratatui/ratatui/issues/new?labels=enhancement&projects=&template=feature_request.md [Create a Pull Request]: https://github.com/ratatui/ratatui/compare [Contributing]: https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md [Crate]: https://crates.io/crates/ratatui [tui-rs]: https://crates.io/crates/tui [Sponsors]: https://github.com/sponsors/ratatui [Crate Badge]: https://img.shields.io/crates/v/ratatui?logo=rust&style=flat-square&color=E05D44 [Repo Badge]: https://img.shields.io/badge/repo-ratatui/ratatui-1370D3?style=flat-square&logo=github [License Badge]: https://img.shields.io/crates/l/ratatui?style=flat-square&color=1370D3 [CI Badge]: https://img.shields.io/github/actions/workflow/status/ratatui/ratatui/ci.yml?style=flat-square&logo=github [CI]: https://github.com/ratatui/ratatui/actions/workflows/ci.yml [Codecov Badge]: https://img.shields.io/codecov/c/github/ratatui/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST&color=C43AC3 [Codecov]: https://app.codecov.io/gh/ratatui/ratatui [Deps Badge]: https://deps.rs/repo/github/ratatui/ratatui/status.svg?path=ratatui&style=flat-square [Deps]: https://deps.rs/repo/github/ratatui/ratatui?path=ratatui [Discord Badge]: https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square&color=1370D3&logoColor=1370D3 [Discord Server]: https://discord.gg/pMCEU9hNEj [Docs Badge]: https://img.shields.io/badge/docs-ratatui-1370D3?style=flat-square&logo=rust [Matrix Badge]: https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix&color=C43AC3 [Matrix]: https://matrix.to/#/#ratatui:matrix.org [Forum Badge]: https://img.shields.io/discourse/likes?server=https%3A%2F%2Fforum.ratatui.rs&style=flat-square&logo=discourse&label=forum&color=C43AC3 [Sponsors Badge]: https://img.shields.io/github/sponsors/ratatui?logo=github&style=flat-square&color=1370D3 [templates]: https://github.com/ratatui/templates/ [showcase]: https://ratatui.rs/showcase/ [awesome-ratatui]: https://github.com/ratatui/awesome-ratatui [Pavel Fomchenkov]: https://github.com/nawok [Florian Dehau]: https://github.com/fdehau [`cargo-generate`]: https://crates.io/crates/cargo-generate [License]: ./LICENSE ", Assign "at most 3 tags" to the expected json: {"id":"3548","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"