base on A code driven low-code builder, develop low-code app on your codebase. <p align="center"> <img width="200" src="https://p6.music.126.net/obj/wonDlsKUwrLClGjCm8Kx/30218210645/b186/3974/338b/2ddfa3cd042cf988ca452686552f8462.png" /> </p> <h1 align="center">Tango LowCode Builder</h1> <div align="center"> A source code based low-code builder. [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/NetEase/tango/blob/main/LICENSE) [![NPM version](https://img.shields.io/npm/v/@music163/tango-designer.svg?style=flat-square)](http://npmjs.org/package/@music163/tango-designer) <img src="https://p6.music.126.net/obj/wonDlsKUwrLClGjCm8Kx/30108735057/7ba9/dced/9ac3/420f6e04b371dd47de06e7d71142560d.gif" alt="preview" /> </div> English | [简体中文](/README.zh-CN.md) ## 📄 Documentation You can view the detailed usage guide through the following links: - Document site: <https://netease.github.io/tango-site/> - Playground application: <https://tango-demo.musicfe.com/designer/> ## ✨ Features - Tested in the production environment of NetEase Cloud Music, can be flexibly integrated into low-code platforms, local development tools, etc. - Based on source code AST, with no private DSL and protocol Real-time code generation capability, supporting source code in and source code out - Out-of-the-box front-end low-code designer, providing flexible and easy-to-use designer React components - Developed using TypeScript, providing complete type definition files ## 💡 Examples You can use tango to build lowcode builders, for example: | Preview | Description | | ---------------------------------------------------------------------------------------------- | ----------------------- | | ![image](https://github.com/NetEase/tango/assets/6984035/56a71741-4536-4336-803a-d81d51128a76) | Internal App Builder | | ![dashboard app](public/dashboard-builder.png) | Dashboard App Builder | | ![image](https://github.com/NetEase/tango/assets/6984035/790d88e1-d716-4f99-868a-31dda25e9fb1) | Mobile App Builder | | ![rn app](public/rn-builder.png) | ReactNative App Builder | | ![mail app](public/mail-builder.png) | Email Builder | ## 🌐 Compatibility - Modern browsers(Chrome >= 80, Edge >= 80, last 2 safari versions, last 2 firefox versions) ## 💻 Development ### Environment - Node `>= 18` - Yarn `>= 1.22 && < 2` ### Development Quick Start ```bash # clone the repo git clone https://github.com/NetEase/tango.git # enter the project root cd tango # install dependencies yarn # start the designer playground app yarn start ``` ### Local Https certificate If you need to use https in the local development environment, you can use the following command to generate a certificate: ```bash brew install mkcert # install the local certificate mkcert -install # enter the playground app directory cd apps/playground # generate a certificate mkcert local.netease.com # or change to your own domain name ``` ## 💬 Community Join NetEase Tango Community to share your ideas, suggestions, or questions and connect with other users and contributors. - Discord: <https://discord.gg/B6hkGTe4Rz> - [Usage Trends](https://npm-compare.com/@music163/tango-helpers,@music163/tango-context,@music163/tango-core,@music163/tango-setting-form,@music163/tango-sandbox,@music163/tango-ui,@music163/tango-designer) ## 🤝 Contributing Please read the [github contribution guide](https://docs.github.com/en/get-started/quickstart/contributing-to-projects) first。 - Clone the repository - Create a branch - Commit and push your code - Open a Pull Request ## 💗 Acknowledgments Thanks to the NetEase Cloud Music Front-end team, Public Technology team, Live Broadcasting Technology team, and all the developers who participated in the Tango project. Thank you to CodeSandbox for providing the [Sandpack](https://sandpack.codesandbox.io/) project, which provides powerful online code execution capabilities for Tango. ## 📣 Product Promotion ![](https://p5.music.126.net/obj/wonDlsKUwrLClGjCm8Kx/31629770956/da9e/3a74/4e00/7c69cf46a713f1b008bd1243b5b1ab1c.png) Don't waste your time restoring the UI, try the NetEase Cloud Music "Seal D2C" development tool! Easily turn your design into code, support React, RN, Vue, WeChat apps and other multi-end scenarios, what you see is what you get! Experience "Seal D2C" now: - I'm a Figma user: <https://www.figma.com/community/plugin/1174548852019950797/seal-figma-to-code-d2c/> - I'm a MasterGo user: <https://mastergo.com/community/plugin/98956774428196/> ## 📄 License This project is licensed under the terms of the [MIT license](./LICENSE) ", Assign "at most 3 tags" to the expected json: {"id":"1906","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"