{"id":13455148,"url":"https://github.com/urban-bot/urban-bot","last_synced_at":"2025-05-16T03:05:34.941Z","repository":{"id":39629508,"uuid":"249490395","full_name":"urban-bot/urban-bot","owner":"urban-bot","description":"🤖 The universal chatbot library based on React. Write once, launch Telegram, Discord, Facebook, ... every messenger with chatbots","archived":false,"fork":false,"pushed_at":"2024-09-18T17:37:46.000Z","size":12203,"stargazers_count":572,"open_issues_count":37,"forks_count":34,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-05-11T04:01:46.890Z","etag":null,"topics":["bot","bot-framework","chatbot","chatbots","discord","discord-bot","discord-js","facebook-messenger-bot","mobx","react","reactjs","redux","slack-bot","telegram","telegram-bot"],"latest_commit_sha":null,"homepage":"https://urban-bot.now.sh","language":"TypeScript","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/urban-bot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2020-03-23T16:53:50.000Z","updated_at":"2025-04-25T06:30:00.000Z","dependencies_parsed_at":"2023-02-13T00:00:34.200Z","dependency_job_id":"79009e75-2e18-4564-b8b7-b5ead26e99eb","html_url":"https://github.com/urban-bot/urban-bot","commit_stats":{"total_commits":646,"total_committers":9,"mean_commits":71.77777777777777,"dds":"0.10526315789473684","last_synced_commit":"d9200597f3a69d398c4e0fbb1cc2ff2114bc5c7f"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/urban-bot%2Furban-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/urban-bot%2Furban-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/urban-bot%2Furban-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/urban-bot%2Furban-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/urban-bot","download_url":"https://codeload.github.com/urban-bot/urban-bot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459088,"owners_count":22074605,"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":["bot","bot-framework","chatbot","chatbots","discord","discord-bot","discord-js","facebook-messenger-bot","mobx","react","reactjs","redux","slack-bot","telegram","telegram-bot"],"created_at":"2024-07-31T08:01:01.770Z","updated_at":"2025-05-16T03:05:29.926Z","avatar_url":"https://github.com/urban-bot.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","Chatbot"],"sub_categories":[],"readme":"![](files/banner.jpg)\n\n![Build](https://github.com/urban-bot/urban-bot/workflows/Node.js%20CI/badge.svg)\n[![Community Chat](https://img.shields.io/badge/Community-Chat-blueChat?style=flat-square\u0026logo=telegram)](https://t.me/urbanbotjs)\n\n# Urban Bot\n\nThe universal chatbot library based on [React](https://github.com/facebook/react).\n\n* **Declarative.** You don't need to know any messenger API, just write simple react components.\n* **Multiplatform.** Write once, launch any messenger.\n* **Reusable.** Easy share logic between different chatbots or just use common parts.\n* **Session.** App renders unique for every chat, so just write your app as if it is client-side rendering.\n* **Types.** Full typescript support.\n\n**Platforms we are supporting**\n\n[![](files/telegram-logo.svg)](https://telegram.org/)\n [![](files/discord-logo.svg)](https://www.discord.com/)\n [![](files/slack-logo.svg)](https://slack.com/)\n [![](files/facebook-logo.svg)](https://www.messenger.com/)\n \n \n**Soon**\n\n[![](files/whatsapp-logo.svg)](https://www.whatsapp.com/)\n [![](files/vk-logo.svg)](https://www.vk.com/)\n [![](files/viber-logo.svg)](https://www.viber.com/)\n\n## [Get Started](https://urban-bot.now.sh/docs/intro.html)\n## [API](https://urban-bot.now.sh/docs/components.html)\n## Tutorials\n* [How to create Todo List in Telegram](https://medium.com/@heresliker/how-to-create-todo-list-telegram-bot-with-react-js-f9f77d22cc49)\n* [Как создать Todo List в Telegram](https://medium.com/@heresliker/%D0%BA%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-todo-list-%D1%87%D0%B0%D1%82-%D0%B1%D0%BE%D1%82%D0%B0-%D0%B2-telegram-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-react-js-d8a3c238ca91)\n\n## Installation\nPlease use our zero configuration [starter](https://github.com/urban-bot/urban-bot-starter-typescript).\n#### typescript\n```\nnpx create-urban-bot my-app\n```\n#### javascript\n```\nnpx create-urban-bot my-app --template js\n```\n\nOr install manually:\n```bash\nnpm i react @urban-bot/core @urban-bot/telegram @urban-bot/facebook ...\n```\n\n## Example\n![](files/telegram-gif.gif)\n![](files/slack-gif.gif)\n```javascript\nimport React from 'react';\nimport { render, Route, Router, Root, Text, ButtonGroup, Button, useText } from '@urban-bot/core';\nimport { UrbanBotTelegram } from '@urban-bot/telegram';\nimport { UrbanBotSlack } from '@urban-bot/slack';\n\nfunction Echo() {\n    const [text, setText] = React.useState('Say something');\n\n    useText(({ text }) =\u003e {\n        setText(text);\n    });\n\n    return (\n        \u003cText\u003e\n            \u003ci\u003e{text}\u003c/i\u003e\n        \u003c/Text\u003e\n    );\n}\n\nfunction Counter() {\n    const [count, setCount] = React.useState(0);\n\n    const increment = () =\u003e setCount(count + 1);\n    const decrement = () =\u003e setCount(count - 1);\n\n    return (\n        \u003cButtonGroup title={count} isNewMessageEveryRender={false}\u003e\n            \u003cButton onClick={increment}\u003e+1\u003c/Button\u003e\n            \u003cButton onClick={decrement}\u003e-1\u003c/Button\u003e\n        \u003c/ButtonGroup\u003e\n    );\n}\n\nfunction App() {\n    return (\n        \u003cRouter\u003e\n            \u003cRoute path=\"/echo\"\u003e\n                \u003cEcho /\u003e\n            \u003c/Route\u003e\n            \u003cRoute path=\"/counter\"\u003e\n                \u003cCounter /\u003e\n            \u003c/Route\u003e\n        \u003c/Router\u003e\n    );\n}\n\nconst urbanBotTelegram = new UrbanBotTelegram({\n    token: 'telegramToken',\n});\n\nconst urbanBotSlack = new UrbanBotSlack({\n    signingSecret: 'slackSigningSecret',\n    token: 'slackToken',\n});\n\nrender(\n    \u003cRoot bot={urbanBotTelegram}\u003e\n        \u003cApp /\u003e\n    \u003c/Root\u003e\n);\n\nrender(\n    \u003cRoot bot={urbanBotSlack}\u003e\n        \u003cApp /\u003e\n    \u003c/Root\u003e\n);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Furban-bot%2Furban-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Furban-bot%2Furban-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Furban-bot%2Furban-bot/lists"}