{"id":26530020,"url":"https://github.com/serena1432/katheryne","last_synced_at":"2026-04-12T05:31:59.271Z","repository":{"id":283611515,"uuid":"941341035","full_name":"Serena1432/Katheryne","owner":"Serena1432","description":"A Discord BOT that supports connecting, gaming, and remote computer management via Discord. Currently, it only supports Linux.","archived":false,"fork":false,"pushed_at":"2025-03-21T06:13:11.000Z","size":206,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T06:31:31.823Z","etag":null,"topics":["computer-management","discord","discord-bot","discord-js","linux","nodejs","remote-control","remote-execution","remote-play","remote-play-together","steam-remote-play"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/Serena1432.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}},"created_at":"2025-03-02T03:51:13.000Z","updated_at":"2025-03-21T06:13:15.000Z","dependencies_parsed_at":"2025-03-21T06:41:38.344Z","dependency_job_id":null,"html_url":"https://github.com/Serena1432/Katheryne","commit_stats":null,"previous_names":["serena1432/katheryne"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serena1432%2FKatheryne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serena1432%2FKatheryne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serena1432%2FKatheryne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serena1432%2FKatheryne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Serena1432","download_url":"https://codeload.github.com/Serena1432/Katheryne/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244837602,"owners_count":20518660,"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":["computer-management","discord","discord-bot","discord-js","linux","nodejs","remote-control","remote-execution","remote-play","remote-play-together","steam-remote-play"],"created_at":"2025-03-21T17:29:04.318Z","updated_at":"2025-12-30T22:29:30.963Z","avatar_url":"https://github.com/Serena1432.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Katheryne\n\n**Katheryne** is a work-in-progress Discord BOT designed for remote gameplay, computer management, and connectivity via Discord.\n\nCurrently, it only supports Linux and Windows, which the latter is still in the early stage.\n\n## ⚠️ Disclaimer\n\nThis BOT prioritizes simplicity and convenience over security and is intended for personal or small-scale use (e.g., providing a \"cloud computer\" for friends or remotely managing your own device). **It is not suitable for large public servers, as I cannot guarantee security at scale.**\n\nOnly grant permissions to trusted individuals. **USE THIS PROGRAM AT YOUR OWN RISK. I am not responsible for any damage resulting from its use.**\n\n## 🎯 Purpose\n\nI originally created this BOT in 2023 to let my friends easily connect to my computer and use features remotely without relying on traditional remote control applications. It also allows me to manage my own computer while away.\n\nThe initial implementation worked well, but I lost the original code recently. To prevent this from happening again, I decided to rebuild it and make it open-source.\n\nIn October 2025, I began to let my friend play in Windows because of instability (and restrictions) in Linux (because most of their games are Windows-exclusive). Therefore, I decided to port Katheryne into Windows (one more time).\n\n## 🙋‍♂️ Who is this for?\n\nKatheryne is intended for **power users** who want to remotely manage or share a gaming PC via Discord - with full control over sessions, user isolation, and system behavior.\n\nIt's best suited for:\n\n- Self-hosters running a shared or personal \"cloud gaming\" setup\n- Users comfortable with command-line configuration\n- Developers or tinkerers interested in Discord-based automation\n\nThis project is **not recommended** for casual users, public servers, or non-Linux systems. This is a personal tool made open-source for learning and experimentation.\n\n## 💻 Support\n\n* Katheryne works best with **KDE Plasma 6 on Linux** but is compatible with any distribution using X11 or Wayland.\n\n* **Windows support is still in a very early stage**. Features are not guaranteed to work flawlessly, and bugs/glitches may happen anytime. However, most of the basic features still work as if it's running on Linux.\n\nIntel CPUs + NVIDIA GPUs are also recommended. I haven't tested AMD CPUs/GPUs, so be prepared for potential issues.\n\n### Supported Remote Play Applications\n\nCurrently, I only write some supporting features for **Steam Link / Remote Play**.\n\nMoonlight and other tools can be launched via remote execution but are **not officially supported**, so you have to run the commands manually.\n\n### Will there be support for macOS?\n\nNo chance. macOS is clearly not designed for gaming, and playing Windows games on macOS is absolutely a nightmare.\n\n## ✨ Features\n\nThese features can be used directly in a Discord server, provided you have the required permissions.\n\nMost of the features work best on Linux.\n\n- [X] Run whitelisted applications remotely using commands/built-in integrations\n- [X] Take screenshots and monitor system stats\n- [X] Auto-send in-game screenshots to a Discord channel\n- [X] Lock the physical keyboard/mouse to prevent interference (I made that as my kids usually interrupt gameplay when my friends are playing)\n- [X] Turn off the physical display and mute audio (for the same reason as above)\n- [X] Send notifications (on-screen messages) to the computer from Discord\n- [X] Refocus the game window if it minimizes unexpectedly\n- [X] Remotely shut down the computer (only if the owner is away or explicitly allows it)\n- [X] Remotely execute any commands on the computer (for BOT owner only)\n- [X] Notify when the computer isn't plugged in, the battery is low, temperature is high or a driver error, requiring physical intervention\n- [X] Check the connection between the user and computer through Steam Remote Play (experimental, may not work on some devices)\n- [X] [LocalStorage/Config folder separation support for each user](#localstorageconfig-data-separation-support)\n- [X] [Assigning different Steam account for each Discord user](#assigning-a-different-steam-account-for-each-user)\n\n\u003e [!NOTE]\n\u003e Any changes with computer settings (physical input lock, brightness, volume, etc.) will be back to normal after restarting the computer. So if you encounter any errors when using the BOT, you just need to restart the computer.\n\n### Platform commands coverage\n\n#### By operating systems\n\n| Feature | Linux (X11) | Linux (Wayland) | Windows |\n| --- | --- | --- | --- |\n| Take screenshots | ✅ | ⭕ | ✅ (1) |\n| View computer stats | ✅ | ✅ | ✅ (2) |\n| Lock/disable physical input | ✅ | 🔴 | ❌ |\n| Change screen brightness | 🔴 | 🔴 | ✅ (3) |\n| Mute the host audio | ✅ | ✅ | ✅ |\n| Refocus the game window | ✅ | ❌ | ✅ |\n| Remotely shutdown the computer | 🔴 | 🔴 | ✅ |\n| Set the fan speed | 🔴 | 🔴 | ❌ |\n| Set the CPU governor | 🔴 | 🔴 | ❌ |\n| Check the running process | ✅ | ✅ | ✅ |\n\n* (1) May experience cropping issues if display size is set to over than 100% (e.g. 125% or 150%).\n* (2) Viewing Intel GPUs' statistics isn't supported yet.\n* (3) It's impossible (for me) to turn off the display completely on Windows. I'm using `nircmd` to handle the display toggle, but the display will be automatically on when moving the mouse or pressing a key.\n\n✅ Fully supported without root permissions\u003cbr\u003e\n🔴 Supported but requires root permissions\u003cbr\u003e\n⭕ Supported but not tested\u003cbr\u003e\n❌ Totally not supported\n\n\u003e [!TIP]\n\u003e On Windows, running the BOT with administrator permissions is **recommended, but not required**.\n\nCurrently, AMD CPUs/GPUs are not properly supported as I don't have any AMD computers.\n\n*To protect privacy, some features will only be available when a **whitelisted game/application is running**.*\n\n### Running root commands (Linux)\n\nTo run commands that require root permissions, you can do one of these ways below:\n\n* Grant the permissions for specific commands used by the BOT (recommended)\n* Running the BOT with `sudo` permissions\n    * Using this way may cause some unexpected errors, proceed at your own risk.\n    * Steam and some games will have some glitches, and tends to have a higher ping when Katheryne is running as root (idk why but it's what it is)\n* Or don't use these commands at all\n\n#### List of root commands (Linux)\n\nThis is the list of commands requiring root permissions:\n\n* **Intel GPU stats:**\u003cbr\u003e`intel_gpu_top`\n* **Set display brightness:**\u003cbr\u003e`brightnessctl set ${pc}%`\n* **Set CPU governor:**\u003cbr\u003e`echo \"${governor}\" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor`\n* **Set fan speed:**\u003cbr\u003e`nbfc set -s ${pc}`\n* **Physical input locking (Wayland):**\u003cbr\u003e`evtest --grab /dev/input/event${id} \u003e/dev/null`\n* **Physical input device listing (Wayland):**\u003cbr\u003e`libinput list-devices`\n\nFor security reasons, you have to find a way to allow these commands for your user by yourself.\n\n## 📦 Required applications\n\n### Linux\n\n#### General\n\n* `brightnessctl` (for brightness control)\n* `scrot` (for X11 screenshot)\n* `wmctrl` (for X11 window focusing)\n* `nbfc-linux` (for fan control)\n* `libinput-tools` (for input devices management)\n* `evtest` (for Wayland physical input locking)\n* `rfkill` (for enabling/disabling Bluetooth)\n\n#### Taking screenshots in Wayland\n\n* `gnome-screenshot` (for GNOME-based desktop environments)\n* `spectacle` (for KDE Plasma)\n* `grim` (for other desktop environments)\n\n#### Intel GPUs\n\n* `intel-gpu-tools`\n\n### Windows\n\nNothing for now besides Node.js and maybe Git. `nircmd` will be automatically installed upon setting up the BOT.\n\n## 🚀 Usage\n\n### 🧰 Installation\n\n* Clone this BOT using this command below or [download the latest source code](../../archive/refs/heads/main.zip).\n\n```sh\ngit clone https://github.com/Serena1432/Katheryne.git\n```\n\n* Change the current directory to the source folder:\n\n```sh\ncd Katheryne\n```\n\n* Install all the dependencies:\n\n```sh\nnpm install\n```\n\n* Install all required applications listed in the **Required applications** section above, depends on your distro and your need.\n\n### ⚙️ Configuration\n\n* Copy the `.env.sample` file to a new one and rename it to `.env`, then edit the file and specify the token with the `TOKEN` variable.\n\n* Copy the `config.sample` folder into a new one, and rename it to `config`. After that, config the BOT yourself to your liking based on the instructions below.\n\nYou can view the example of all configurations in the `config.sample` folder.\n\n#### `config/main.json`\n\nContains the main BOT configuration.\n\n| Property | Type | Description |\n| --- | --- | --- |\n| language | `string` | BOT language. Make sure that `strings/${language}.json` exists in the BOT folder. |\n| owner_id | `string` | BOT owner's Discord ID. |\n| prefix | `string` | BOT prefix for message content based commands. |\n| whitelist | `object` | An object with each property as the user ID (key) paired with the Steam account (value), for example `{\"693107293516070944\": \"nicolevianth\"}`. See [`config.sample/main.json`](config.sample/main.json) for example. |\n\n#### `config/computer.json`\n\nContains the computer configuration.\n\n| Property | Type | Description |\n| --- | --- | --- |\n| close_processes | `string[]` | List of processes to be closed upon starting an application. |\n| start_processes | `string[]` | List of processes to be started after exitting applications. |\n| auto_mute | `boolean` | Automatically mute the physical speakers upon starting. |\n| auto_bluetooth_off | `boolean` | Automatically turn off Bluetooth upon starting. |\n| auto_performance_governor | `boolean` | Automatically set the CPU govenor to `performance` upon starting. |\n| auto_max_fan_speed | `boolean` | Automatically set the fan speed to maximum upon starting. |\n| auto_lock_input | `boolean` | Automatically lock the physical inputs upon starting. |\n| evtest_on_x11 | `boolean` | Use `evtest` instead of `xinput --disable` to lock the physical input on X11. This way is more stable than xinput but it will require root access. |\n| lock_timer | `boolean` | If `true`, the BOT will rerun the physical input lock/set brightness commands each 10 seconds to further prevent external interference. |\n\n#### `config/steam.json`\n\nContains the Steam configuration.\n\n| Property | Type | Description |\n| --- | --- | --- |\n| executable | `string` | Steam executable path. Usually required if you use Windows, otherwise use `steam` which is set up in `PATH` instead. |\n| default_user | `string` | Default Steam user to be logged in when using the `steam` command. Leave empty to manually select the user upon starting. |\n| wayland_enable_pipewire | `boolean` | Enable PipeWire screen capture when connecting to Steam Remote Play on Wayland. |\n| detach | `boolean` | If `true`, Steam will keep running even when the BOT stops working. |\n\n#### `config/whitelisted_apps.json`\n\nContains a list of whitelisted apps for all users to run anytime they want.\n\nIs a JSON array containing objects with these properties:\n\n| Property | Type | Description |\n| --- | --- | --- |\n| process | `string` | Process name (will be used to detect if the app is running or not) |\n| name | `string` | Display name to be displayed in the BOT status and statistics |\n| alias | `string` | Shortened alias for members to use with the `start` command |\n| command | `object` | An object with each property containing the target Steam account (key) with assigned start command (value), for example `{\"default\": \"/home/murasame/StartGenshin.sh\"}`. Use `default` to assign the default command. See [`config.sample/whitelisted_apps.json`](config.sample/whitelisted_apps.json) for more information. |\n| screenshot | `string` | In-game screenshot folder to be monitored. Leave empty if not supported. |\n| localStorage | `string` | The game's LocalStorage/config folder for separating by Steam account username. See [LocalStorage/Config data separation support](#localstorageconfig-data-separation-support) for more information. |\n| channel | `string` | Discord channel ID for in-game screenshots. Unused if `screenshot` isn't set. |\n\n#### `config/logging.json`\n\nContains the logging configuration.\n\n| Property | Type | Description |\n| --- | --- | --- |\n| log_channel | `string` | Discord channel ID to receive logs. Leave empty if you don't want logging. |\n| steam_connection | `string` | Whether to send a log when there's a new Steam Remote Play connection. |\n| high_temperature | `string` | Whether to send a log when the computer temperature is high. |\n| low_battery | `string` | Whether to send a log when the computer battery is low. |\n\n### 🔧 Starting\n\n#### Running Katheryne as normal user\n\n```sh\nnpm start\n```\n\n#### Enable further debugging\n\nYou can enable further debugging logs that contain all of the command the BOT uses to run by running one of these commands below instead of `npm start`. Remember that further debugging can output some personal information, and you should be cautious when running it in public.\n\nThis is also required when reporting an issue related to the BOT.\n\nFor writing the logs directly to the console window, run this command:\n\n```sh\nnpm run debug\n```\n\nFor writing the logs to `journal` on Linux (useful for debugging serious crashes):\n\n```sh\nnpm run debug_journal\n```\n\n#### Running Katheryne as root on Linux (not recommended)\n\n```sh\nsudo -E npm start\n```\n\n#### Autostart\n\nYou can of course use your Desktop Environment's Autostart settings (or Task Scheduler on Windows) to start Katheryne automatically after boot.\n\n`pm2` is not recommended in my opinion due to it invoking the BOT before starting the DE, so it may cause some unwanted issues.\n\n### 🧩 Special features\n\nThese are advanced features that require additional understanding and specific command arguments.\n\n#### Assigning a different Steam account for each user\n\n\u003e [!IMPORTANT]\n\u003e You must log in to all assigned Steam accounts **before** running the BOT. If an account isn't logged in, Steam will prompt for login when a user runs the `steam` command!\n\u003e\n\u003e Don't worry — users won't be able to switch to any account other than the one assigned to them, as long as Steam is started using the specified command (`steam -user ${username}`). The BOT handles this automatically.\n\nWhen a different Discord user runs the `steam` command, the BOT can launch Steam using a specific account assigned to that user. To enable this, you need to map each Discord user ID to a Steam account in the configuration.\n\nFor example, to assign the `nicolevianth` Steam account to user ID `693107293516070944` (this is my Discord ID!), edit your `config/main.json` file like this:\n\n```json\n{\n    \"language\": \"en\",\n    \"owner_id\": \"693107293516070944\",\n    \"prefix\": \"!\",\n    \"whitelist\": {\n        \"693107293516070944\": \"nicolevianth\" // \u003c---- This!\n    }\n}\n```\n\nOnly users listed in the `whitelist` object can use the BOT. If you don’t want to assign a specific Steam account to a user, leave the value empty. The BOT will fall back to using the default Steam account defined in `config/steam.json`.\n\n#### LocalStorage/Config data separation support\n\n\u003e [!IMPORTANT]\n\u003e Because the BOT separates data by Steam account username, **you must assign a Steam account to each Discord user** (even if they don’t use Steam directly).\n\u003e\n\u003e You need to specify the correct folder that switches the user account when its contents are different (that will require some research from yourself).\n\nSome games store user data and settings in a shared folder within the game directory — even if you use separate Wine prefixes, which can prevent user-specific login information from being properly applied.\n\nTo make switching between accounts seamless for users, the BOT allows you to isolate the `LocalStorage` or any config folder for each account.\n\n- Define the target config folder using the `localStorage` property for each whitelisted app in `config/whitelisted_apps.json`. For example:\n\n```json\n{\n    \"process\": \"GenshinImpact.exe\",\n    \"name\": \"Genshin Impact\",\n    \"alias\": \"genshin\",\n    \"command\": {\n        \"default\": \"/home/murasame/StartGenshin.sh\"\n    },\n    \"screenshot\": \"/mnt/GenshinImpact/ScreenShot\",\n    \"localStorage\": \"/mnt/GenshinImpact/GenshinImpact_Data/SDKCaches/HoYoPass\", // \u003c---- This!\n    \"channel\": \"1191968934635774034\"\n}\n```\n\n- When a user starts a game using the `steam` or `start` command, the BOT:\n  1. Backs up the current contents of the specified folder to `database/${alias}_localStorage_.tar`.\n  2. Extracts the user-specific `database/${alias}_localStorage_${steamUsername}.tar` file to that folder.\n\n\u003e [!NOTE]\n\u003e If the user has no previously backed-up data, the BOT will first copy the original folder. The user can then log in to their account and the game will modify the contents, which will subsequently be backed up separately as usual.\n\n- When the session ends (via `exit`, `steam exit`, or `shutdown`), the BOT:\n  1. Backs up the current folder contents to the user-specific `.tar` file.\n  2. Restores the original data from `database/${alias}_localStorage_.tar`, returning the game to the computer owner’s default configuration.\n\n#### Starting a session on behalf of another user\n\n\u003e [!NOTE]\n\u003e This feature is available to BOT (computer) owners only.\n\nSometimes users may not know how to use the BOT, or you may want to launch a session for them manually.\n\n- Copy the user's Discord ID, then run the `steam ${discordID}` or `start ${alias} ${discordID}` command with that copied Discord ID. For example:\n  \n```\n!steam 693107293516070944\n\nor\n\n!start genshin 693107293516070944\n```\n\n- The BOT will reply with something like:\n  \n```\nStarting with s1432_nbhz's specified information.\n```\n\n- The BOT will use the user's assigned Steam account and other relevant settings. That user will also be granted the permission to stop the session or shut down the system, as if they started the session themselves.\n\n\u003e [!TIP]\n\u003e You can also use `steam ${steamUsername}` or `start ${alias} ${steamUsername}` to start a session with a specific Steam account, even without a linked Discord account. However, only you (the owner) will be able to stop the session or shut down the computer in that case.\n\n#### Permissive mode\n\nAdd the `-permissive` argument to the startup command to allow **all whitelisted users** to stop the session. This is useful when a session is shared among multiple users.\n\n## 🐞 Known issues\n\nI'm not a skilled expert, so issues are unable to avoid. These are the known issues that I've experienced myself, and I'm not sure if these also work for you.\n\n### Windows-specific\n\nThere are some known issues which only happen on Windows, but I haven't found the solutions yet:\n\n* Physical security features such as turning off the display completely or locking the physical input doesn't work on Windows. This is due to Windows' harsh restrictions.\n* I haven't found a way to set the CPU/GPU fan speed in Windows yet.\n* The captured screenshots will be cropped if the user sets the Display Size (DPI) to over 100%.\n* Some values in the `stats` and other statistics command will be undefined.\n* `exec` command will also output some gibberish characters (which are in fact, indication characters to set the command window colors).\n* Killing `steam.exe` alone without killing running games will have a big chance to have Steam auto restarting itself.\n\n### Computer crashes after starting game while BOT is running\n\nTry setting `high_temperature` in `config/logging.json` to `false` to disable high temperature warning. This logging may cause crashes on some devices and requires a force restart.\n\n### Game crashes when locking/unlocking physical inputs on X11\n\nThe `xinput` commands used on X11 can be unstable on some devices, therefore it crashes the game when executing.\n\nTry setting `evtest_on_x11` in `config/computer.json` to let the lock/unlock commands use `evtest` instead of `xinput`. It's more stable but it will require root permissions.\n\n### Original LocalStorage/Config data won’t be restored if shutdown without using Katheryne\n\nYou just need to make the computer run `npm run shutdown_hook` before shutting down the computer. For example:\n\n* Create a shell script running the shutdown hook first, for example `/usr/local/bin/katheryne-shutdown-hook.sh`:\n\n```sh\n#!/bin/bash\ncd path/to/Katheryne\n/usr/bin/npm run shutdown_hook\n```\n\n* Save it and make the `.sh` executable:\n\n```sh\nchmod +x /usr/local/bin/katheryne-shutdown-hook.sh\n```\n\n* Create a systemd service in `/etc/systemd/system`, for example `katheryne-shutdown-hook.service`:\n\n```ini\n[Unit]\nDescription=Katheryne shutdown hook\nDefaultDependencies=no\nBefore=poweroff.target shutdown.target reboot.target halt.target\n\n[Service]\nType=oneshot\nExecStart=/usr/local/bin/katheryne-shutdown-hook.sh\nRemainAfterExit=true\n\n[Install]\nWantedBy=poweroff.target shutdown.target reboot.target halt.target\n```\n\n\u003e [!IMPORTANT]\n\u003e If the localStorage folder is in an external mounted drives, you have to include them in `katheryne-shutdown-hook.service`, for example:\n\u003e\n\u003e ```ini\n\u003e [Unit]\n\u003e Description=Katheryne shutdown hook\n\u003e DefaultDependencies=no\n\u003e Before=umount.target poweroff.target shutdown.target reboot.target halt.target\n\u003e RequiresMountsFor=/mnt/secondarydrive\n\u003e ```\n\n* Save it, reload the daemon (or restart the computer) and enable the service:\n\n```sh\nsudo systemctl daemon-reexec\nsudo systemctl daemon-reload\nsudo systemctl enable katheryne-shutdown-hook.service\n```\n\n* You can test by restarting the computer and checking if it runs properly:\n\n```sh\njournalctl -b -1 -u katheryne-shutdown-hook.service\n```\n\n## 🧩 Contributing\n\nThis project is open for **learning, exploration, and improvement**. While Katheryne is primarily a personal project, contributions are welcome as long as they respect its purpose and limitations.\n\nIf you’d like to contribute fixes, improvements, or documentation, please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines before submitting a pull request.\n\n## 📝 License\n\nThis BOT is licensed under the **MIT License**. You are free to use, modify, and distribute it, including for commercial purposes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserena1432%2Fkatheryne","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserena1432%2Fkatheryne","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserena1432%2Fkatheryne/lists"}