{"id":13702041,"url":"https://github.com/mayudev/revcord","last_synced_at":"2026-01-12T14:49:55.781Z","repository":{"id":38417730,"uuid":"468898711","full_name":"mayudev/revcord","owner":"mayudev","description":"A bridge for Discord and Revolt with easy setup through commands","archived":false,"fork":false,"pushed_at":"2025-05-16T15:42:29.000Z","size":560,"stargazers_count":92,"open_issues_count":8,"forks_count":16,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-16T16:44:52.385Z","etag":null,"topics":["bot","bridge","discord","discord-bridge","revolt","revolt-bridge","revolt-chat"],"latest_commit_sha":null,"homepage":"","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/mayudev.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-03-11T21:01:03.000Z","updated_at":"2025-05-16T15:57:07.000Z","dependencies_parsed_at":"2025-05-16T16:39:47.134Z","dependency_job_id":null,"html_url":"https://github.com/mayudev/revcord","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/mayudev/revcord","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mayudev%2Frevcord","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mayudev%2Frevcord/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mayudev%2Frevcord/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mayudev%2Frevcord/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mayudev","download_url":"https://codeload.github.com/mayudev/revcord/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mayudev%2Frevcord/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28340410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["bot","bridge","discord","discord-bridge","revolt","revolt-bridge","revolt-chat"],"created_at":"2024-08-02T21:00:30.288Z","updated_at":"2026-01-12T14:49:55.734Z","avatar_url":"https://github.com/mayudev.png","language":"TypeScript","funding_links":[],"categories":["🤖 Bots"],"sub_categories":["C"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/revcord.png\" width=\"64px\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003erevcord\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/mayudev/revcord?style=for-the-badge\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/mayudev/revcord?style=for-the-badge\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/top/mayudev/revcord?style=for-the-badge\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cb\u003e🌉 A cord to connect your Revolt and Discord servers\u003c/b\u003e\u003c/p\u003e\n\n🔗 A bridge for Discord and [Revolt](https://revolt.chat) with easy setup through commands, written in TypeScript using [revolt.js](https://github.com/revoltchat/revolt.js).\n\n[Features](#features) | [Setup](#setup) | [Configuration](#configuration) | [Troubleshooting](#troubleshooting)\n\n## 📔 Features \u003ca id=\"features\"\u003e\u003c/a\u003e\n\n- [x] Bridge messages between platforms\n- [x] Bridge attachments\n- [x] Bridge replies\n- [x] Bridge message edit and delete\n- [x] Bridge embeds\n- [x] Bridge emoji[^1]\n- [x] Seamlessly display user information\n\n[^1]: Revolt to Discord works, but limited to 3 emojis displayed to stop bombing with links. Animated emojis from Revolt will convert to static due to limits on Revolt's image backend\n\n![Screenshot - Revolt](docs/discord.png) ![Screenshot - Discord](docs/revolt.png)\n\n## 🔩 Setup \u003ca id=\"setup\"\u003e\u003c/a\u003e\n\nYou can use [Docker](#using-docker) as well.\n\n**Node v16.9+ is required!**\n\nImportant: this bot is meant to be used in one server (Discord+Revolt), but can be used in more as long as they share the same admin.\n\n1. Clone this repository, install dependencies and build\n\n```sh\ngit clone https://github.com/mayudev/revcord\ncd revcord\nnpm install\nnpm run build\n```\n\n2. Create a bot in Discord ([Guide](https://discordjs.guide/preparations/setting-up-a-bot-application.html#creating-your-bot)) and Revolt (Open user settings -\u003e `My Bots` -\u003e `Create a bot`)\n3. Place the relevant tokens in environment variables. The easiest way is to create a `.env` file (yes, a file called `.env`):\n\n```\nDISCORD_TOKEN = ...\nREVOLT_TOKEN = ...\n```\n\nOf course, replace ... with tokens.\n\nIf you are running a self-hosted instance of Revolt, additionally set the `API_URL` and `REVOLT_ATTACHMENT_URL` variable:\n\n```\nAPI_URL = https://api.revolt.chat\nREVOLT_ATTACHMENT_URL = https://autumn.revolt.chat\n```\n\n4. **Important!** Make sure to select the following permissions in URL Generator when making an invite for your bot (Your bot in Discord Developers -\u003e `OAuth2` -\u003e `URL Generator`) (or if you're lazy, just select `Administrator`) Note **applications.commands**!\n\n![permissions](docs/permissions.png)\n\n5. Enable the `Message Content Intent` under Bot -\u003e Privileged Gateway Intents. If you forget to do this, the bot will crash with a `Used disallowed intents` message.\n\n![intent](docs/intent.png)\n\n6. **Important!** On Revolt, make sure to add the bot to a role that has the **Masquerade** permission!\n\n![revolt permissions](docs/mask.png)\n\n7. Invite the bot to to a Revolt and Discord server.\n8. Start the bot using `npm start`.\n\nNote: it's recommended to use something like [pm2](https://pm2.keymetrics.io/) or [nodemon](https://nodemon.io/) to run the bot. Make sure to pass the `--experimental-specifier-resolution=node` flag to node manually, otherwise it will not run (it's included in the default start script).\n\n### Using Docker\n\nYou need Docker and docker-compose installed.\n\nFollow the steps above to create a `.env` file[^2]. You do not have to run `npm install` and `npm run build`, obviously. Also, make sure your bots have all the required permissions as explained above.\n\nBefore you run docker-compose, use `touch revcord.sqlite` to create the database file and leave it empty.\n\nThen you should be ready to go.\n\n```\ndocker-compose up -d\n```\n\n[^2]: Alternatively, you can edit the `docker-compose.yml` file appropriately. Make sure to remove `./.env:/app/.env` below `volumes:` so it won't complain when you don't have a `.env` file.\n\n## 🔧 Configuration \u003ca id=\"configuration\"\u003e\u003c/a\u003e\n\n### with commands\n\nYou can use either slash commands on Discord or `rc!` prefix on Revolt (use `rc!help` to show all commands)\n\nTo use the commands, **you** need the `Administrator` permission on Discord. On Revolt, only the server owner can run them (for now).\n\n### Connecting Discord and Revolt channels\n\nFrom **Discord**:\n\n```\n/connect \u003cRevolt channel name or ID\u003e\n```\n\nFrom **Revolt**:\n\n```\nrc!connect \u003cDiscord channel name or ID\u003e\n```\n\nFor example:\n\n```\n# From Discord\n/connect lounge\n/connect 01AB23BC34CD56DE78ZX90WWDB\n\n# From Revolt\nrc!connect general\nrc!connect 591234567890123456\n```\n\n✔️ Send a message to see if it works. Try editing and deleting it.\n\n### Removing the connection\n\nFrom **Discord**:\n\n```\n/disconnect\n```\n\nFrom **Revolt**:\n\n```\nrc!disconnect\n```\n\nYou don't have to specify any channel. It will disconnect the channel the command is sent in.\n\n### Showing connections\n\nFrom **Discord**:\n\n```\n/connections\n```\n\nFrom **Revolt**:\n\n```\nrc!connections\n```\n\n### Toggling bots\n\nYou can toggle whether messages sent by bots should be forwarded. It's enabled by default (it's requied for NQN to work properly).\n\nUse either `rc!bots` or `/bots`\n\n### with mappings.json (not recommended)\n\n#### This is not recommended!\n\n1. Create a `mappings.json` file in the root directory.\n2. Use the following format:\n\n```json\n[\n  {\n    \"discord\": \"discord_channel_id\",\n    \"revolt\": \"revolt_channel_id\"\n  },\n  {\n    \"discord\": \"another_discord_channel_id\",\n    \"revolt\": \"another_revolt_channel_id\"\n  }\n]\n```\n\n## 🔥 Troubleshooting \u003ca id=\"troubleshooting\"\u003e\u003c/a\u003e\n\n### `npm install` takes way too long, or `Please install sqlite3 package manually` (Raspberry Pi / 32-bit arm devices)\n\nThis is an issue with `node-sqlite3` being a native module, but has no prebuilt binaries for 32-bit arm architectures available, therefore falling back to building from source.\n\nHowever, a Raspberry Pi is usually too low powered to finish compiling it.\n\nSo, the only solution would be to use a more powerful device to cross-compile it to arm. For convenience, a prebuilt binary for `armv7l` architecture was provided [here](https://github.com/mayudev/revcord/releases/download/v1.2/node_sqlite3.node)\n\nYou have to place it in `node_modules/sqlite3/lib/binding/napi-v6-linux-glibc-arm/node_sqlite3.node`.\n\nAlternatively, if your device supports it (Raspberry Pi 3 does), you can install a 64-bit distribution.\n\n### Messages sent to Discord have no content!\n\nAs in [setup](#setup) step 5, you need to enable the `Message Content Intent` in Discord bot settings. If this doesn't work, make sure the bot has permissions to read the messages in a channel.\n\n![intent](docs/intent.png)\n\n### Bot doesn't have sufficient permissions in the channel. Please check if the Manage Webhooks permission isn't being overridden for the bot role in that specific channel.\n\nAside from server-wide permissions, there are also channel-specific permissions. This message means that at some point, the bot's permission to manage webhooks is being overridden on the channel level. The easiest fix is to change the override to allow it. Alternatively, you can grant the bot the `Administrator` permission which overrides all channel-specific permissions.\n\nIn channel settings -\u003e Permissions:\n\n![override](docs/override.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmayudev%2Frevcord","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmayudev%2Frevcord","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmayudev%2Frevcord/lists"}