{"id":21358647,"url":"https://github.com/alinuxperson/dip","last_synced_at":"2026-05-18T18:40:28.026Z","repository":{"id":172590800,"uuid":"649480984","full_name":"ALinuxPerson/dip","owner":"ALinuxPerson","description":"Discord IPC Proxy: Discord Rich Presence without having Discord on!","archived":false,"fork":false,"pushed_at":"2023-06-06T10:26:22.000Z","size":83,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-22T18:36:15.917Z","etag":null,"topics":["discord","discord-ipc","discord-proxy","discord-rpc","discord-rust","ipc","named-pipe","named-pipes","rpc","rust","rust-discord","rust-lang","unix-socket","unix-socket-ipc","unix-sockets"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/ALinuxPerson.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":"2023-06-05T00:54:07.000Z","updated_at":"2023-06-06T09:59:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"9a28644c-3a16-4081-aeb9-0dcf72c7da8d","html_url":"https://github.com/ALinuxPerson/dip","commit_stats":null,"previous_names":["alinuxperson/dip"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALinuxPerson%2Fdip","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALinuxPerson%2Fdip/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALinuxPerson%2Fdip/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALinuxPerson%2Fdip/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ALinuxPerson","download_url":"https://codeload.github.com/ALinuxPerson/dip/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243830954,"owners_count":20354856,"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":["discord","discord-ipc","discord-proxy","discord-rpc","discord-rust","ipc","named-pipe","named-pipes","rpc","rust","rust-discord","rust-lang","unix-socket","unix-socket-ipc","unix-sockets"],"created_at":"2024-11-22T05:20:58.339Z","updated_at":"2026-05-18T18:40:27.983Z","avatar_url":"https://github.com/ALinuxPerson.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **D**iscord **I**PC **P**roxy\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n[![Made with Rust][rust-shield]][rust-url]\n\n\u003e Discord Rich Presence (and other features) without having Discord on!\n\n# Table of Contents\n\n- [Why?](#why)\n- [Getting Started](#getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Instructions](#instructions)\n- [Configuration](#configuration)\n- [OS Support](#os-support)\n- [Usage](#usage)\n  - [Host](#host)\n  - [Remote](#remote)\n- [Advanced Usage](#advanced-usage)\n  - [Logging](#logging)\n- [Compilation](#compilation)\n  - [Prerequisites](#prerequisites-1)\n  - [Instructions](#instructions-1)\n- [Terminologies](#terminologies)\n- [License](#license)\n\n# Why?\n\nI occasionally run memory intensive applications on my computer. Unfortunately, I often can't run Discord simultaneously\nwith these application without the risk of running out of memory. However, I still want my friends to be aware of what \nI'm currently doing or playing. Since I have a second computer it *would* be theoretically possible to redirect or proxy\nall the requests sent to the IPC socket to my computer. I tried looking online to see if someone has already implemented\nsomething akin to this project, but, alas, I've found none. Due to this, I decided to develop my own.\n\n# Getting Started\n\n## Prerequisites\n\n* A second computer capable of running a Discord client (not the website).\n\n## Instructions\n\n1. Go to releases and download the package meant for your operating system (or [compile it manually](#compilation)).\n    * There are two binaries packaged for each operating system, the host and remote. Here is information as to which\n      program is meant to be run on which computer.\n     \n      * **Host**: This is meant to be run on the computer which isn't running Discord. \n      * **Remote**: This is meant to be run on the computer which is running Discord. \n    \n      For more information, see the terminologies section.\n2. Link up your host computer and remote computer.\n   * First, ensure that the two computers are on the same local area network.\n   * Then, launch `dip_remote` on your remote. It should tell you the remote address (both IPv4 and IPv6). Try the IPv4\n     address first, and if it doesn't work, use the IPv6 address. Make sure Discord is open!\n   * Launch `dip_host` on your host, then pass the remote address onto the host. There are two ways to do this:\n     * Pass it as an argument like so: `dip_host -r REMOTE_ADDRESS` or `dip_host --remote-address REMOTE_ADDRESS`.\n       Here's an example:\n       ```bash\n       $ dip_host -r 192.168.86.31 # if the remote address uses the default port 49131, it can be elided\n       $ dip_host --remote-address 192.168.86.31:20800\n       ```\n     * Through a configuration file. See the section below on how to configure the host and remote.\n3. You're all good to go!\n\n## Configuration\n\nThe configuration resolves in the following order: arguments passed, configuration files.\n\nThe location of the configuration file is told when the `RUST_LOG` environment variable is set to `DEBUG` on both the \nhost and remote binary:\n\n```\n2023-06-06T09:02:09.085950Z DEBUG dip_common: config file location is /home/alp/.config/dip/host.toml // \u003c-- config file location\n2023-06-06T09:02:09.086546Z  INFO dip_host: socket path is /run/user/1000/discord-ipc-0\n2023-06-06T09:02:09.086563Z  INFO dip_host: remote address to connect to remote_address=192.168.86.32:49131\n2023-06-06T09:02:09.086577Z  INFO dip_host: successfully resolved configuration\n2023-06-06T09:02:09.086661Z DEBUG dip_host::utils: destroy path /run/user/1000/discord-ipc-0 on termination\n2023-06-06T09:02:09.086682Z DEBUG dip_common::serve: start serving connections\n```\n\nHere are the locations of `host.toml` and `remote.toml` depending on operating system. **Note that Windows is not \nsupported yet (although it is being worked on), and macOS is untested.** See [OS Support](#os-support) section for more \ndetails.\n\n* Linux\n  * **host.toml**: `$XDG_CONFIG_HOME/dip/host.toml` or `$HOME/.config/dip/host.toml`, example is \n                     `/home/alp/.config/dip/host.toml`\n  * **remote.toml**: `$XDG_CONFIG_HOME/dip/remote.toml` or `$HOME/.config/dip/remote.toml`, example is\n                     `/home/alp/.config/dip/remote.toml`\n* macOS\n    * **host.toml**: `$HOME/Library/Application Support/ALinuxPerson.DIP/host.toml`, example is\n      `/Users/AMacPerson/Library/Application Support/ALinuxPerson.DIP/host.toml`\n    * **remote.toml**: `$HOME/Library/Application Support/ALinuxPerson.DIP/remote.toml`, example is\n      `/Users/AMacPerson/Library/Application Support/ALinuxPerson.DIP/remote.toml`\n* Windows\n    * **host.toml**: `{FOLDERID_RoamingAppData}\\ALinuxPerson\\DIP\\config\\host.toml`, example is\n                     `C:\\Users\\AWindowsPerson\\AppData\\Roaming\\ALinuxPerson\\DIP\\config\\host.toml`\n    * **remote.toml**: `{FOLDERID_RoamingAppData}\\ALinuxPerson\\DIP\\config\\remote.toml`, example is\n                     `C:\\Users\\AWindowsPerson\\AppData\\Roaming\\ALinuxPerson\\DIP\\config\\remote.toml`\n\nExample configurations of `host.toml` and `remote.toml` can be found here: [host.toml](host/host.toml), [remote.toml](remote/remote.toml)\n\n# OS Support\n\n* Linux\n\nLinux is officially supported as the author of this project uses Linux as their daily driver. If a specific distro were\nto be given more support though, it would be Arch Linux for the same reason why Linux is officially supported.\n\n* macOS\n\nmacOS *theoretically* should be compatible, as it uses a Unix base just like Linux. However, it is untested, so use at \nyour own risk.\n\n* Windows\n\nWindows is currently not compatible due to a fundamental difference on how Discord implements IPC on Windows compared to\nUnix based platforms.\n\nOn Windows, Discord uses named pipes for IPC. On Unix based platforms however, Unix Sockets are used. There isn't any\nsupport yet for named pipes, but it is being worked on.\n\n# Usage\n\n`dip_remote` should be launched first on the remote computer, then `dip_host` can be launched on the host computer.\n\n## Host\n\nLaunch `dip_host` with remote address passed in either the arguments (through -r / --remote-address) or configuration\nfile. It must match the address given by `dip_remote`. \n\n`dip_host` will tell you what remote address will be used to connect. See this sample log output to find out where it \nis:\n\n```\n2023-06-05T13:29:26.121833Z  INFO dip_host: socket path is /run/user/1000/discord-ipc-0\n2023-06-05T13:29:26.121846Z  INFO dip_host: remote address to connect to remote_address=192.168.86.32:49131 // \u003c-- this is the remote address\n2023-06-05T13:29:26.121851Z  INFO dip_host: successfully resolved configuration\n```\n\n## Remote\n\nLaunch `dip_remote`. It should not take any arguments. If you want to set a port, you can pass the -p or --port \nargument.\n\nUpon launch, `dip_remote` should tell you the remote address which will be used by `dip_host`. It will be given in IPv4,\nand IPv6 if possible. Use the IPv4 address first, then use IPv6. See this sample log output to find out where it is:\n\n```\n2023-06-05T13:32:21.774508Z  INFO dip_remote: socket path is /run/user/1000/discord-ipc-0\n2023-06-05T13:32:21.774534Z  INFO dip_remote: port to listen on port=49131\n2023-06-05T13:32:21.774540Z  INFO dip_remote: successfully resolved configuration\n2023-06-05T13:32:21.774694Z  INFO dip_remote: remote ipv4 address is 192.168.86.32:49131 // \u003c---------- use these two\n2023-06-05T13:32:21.774744Z  INFO dip_remote: remote ipv6 address is [::ffff:192.168.86.32]:49131 // \u003c- addresses\n```\n\n# Advanced Usage\n\n## Logging\n\nBoth the host and remote binary use `tracing_subscriber`'s environment filter, which utilizes the `RUST_LOG` \nenvironment variable to base what to log on. Basic values which can be used are `TRACE`, `DEBUG`, `INFO`, `WARN`, and \n`ERROR`. For more information on the syntax, see the [`tracing-subscriber` documentation][tracing-subscriber-docs-url].\n\n# Compilation\n\n## Prerequisites\n\n* Rust \u003e=1.70\n* Git\n\n## Instructions\n\n1. Clone this repository.\n\n    ```bash\n    $ git clone https://github.com/ALinuxPerson/dip.git\n    ```\n\n2. Enter the project directory.\n\n    ```bash\n    $ cd dip\n    ```\n\n3. Build the project.\n\n    ```bash\n   $ cargo build --release\n    ```\n\n4. Enter the `target/release` directory. The built binaries are named `dip_host` and `dip_remote`.\n\n    ```bash\n   $ cd target/release\n   $ ls\n   [...] dip_host [...] dip_remote [...]\n    ```\n\n# Terminologies\n\n**Host**: The computer which will receive all requests from the virtual socket and forward them to the remote through TCP. \n          This is the computer which doesn't have Discord open.\n\n**Remote**: The computer which will receive all requests from the host and relay them to a real socket. Responses from\n            the real socket will be sent to the host through TCP. This is the computer which has Discord open.\n\n**Host Computer**: The computer which will run the host binary.\n\n**Remote Computer**: The computer which will run the remote binary.\n\n**Virtual Socket**: The fake socket created by the host binary which will forward all requests to the remote. Responses\n                    coming from the remote will be sent to this socket as well.\n\n**Real Socket**: The real Discord IPC socket created by a running Discord client. The remote connects to this socket and\n                 forwards all requests from the host to this socket. Responses coming from this socket will be sent to\n                 the host.\n\n# License\n\nDistributed under the MIT license. See [`LICENSE`](LICENSE) for more information.\n\n[contributors-shield]: https://img.shields.io/github/contributors/ALinuxPerson/dip.svg?style=for-the-badge\n[contributors-url]: https://github.com/ALinuxPerson/dip/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/ALinuxPerson/dip.svg?style=for-the-badge\n[forks-url]: https://github.com/ALinuxPerson/dip/network/members\n[stars-shield]: https://img.shields.io/github/stars/ALinuxPerson/dip.svg?style=for-the-badge\n[stars-url]: https://github.com/ALinuxPerson/dip/stargazers\n[issues-shield]: https://img.shields.io/github/issues/ALinuxPerson/dip.svg?style=for-the-badge\n[issues-url]: https://github.com/ALinuxPerson/dip/issues\n[license-shield]: https://img.shields.io/github/license/ALinuxPerson/dip.svg?style=for-the-badge\n[license-url]: https://github.com/ALinuxPerson/dip/blob/master/LICENSE.txt\n[tracing-subscriber-docs-url]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives\n[rust-shield]: https://img.shields.io/badge/made%20with%20rust-e43d3f?style=for-the-badge\u0026logo=rust\u0026logoColor=white\n[rust-url]: https://www.rust-lang.org","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falinuxperson%2Fdip","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falinuxperson%2Fdip","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falinuxperson%2Fdip/lists"}