{"id":31103459,"url":"https://github.com/jurkovic-nikola/OpenLinkHub","last_synced_at":"2025-09-17T02:04:41.209Z","repository":{"id":239231314,"uuid":"797987515","full_name":"jurkovic-nikola/OpenLinkHub","owner":"jurkovic-nikola","description":"Open source interface for iCUE LINK Hub and other Corsair AIOs, Hubs for Linux. Manage RGB lighting, fan speeds, system metrics, as well as keyboards, mice, headsets via a web dashboard.","archived":false,"fork":false,"pushed_at":"2025-09-10T18:54:48.000Z","size":11801,"stargazers_count":520,"open_issues_count":11,"forks_count":39,"subscribers_count":26,"default_branch":"main","last_synced_at":"2025-09-10T22:49:03.230Z","etag":null,"topics":["corsair","corsair-aio","corsair-keyboards","corsair-linux","corsair-psu","fan-controller","lcd-controller","lcd-screens","liquid-cooling","rgb-controller"],"latest_commit_sha":null,"homepage":"https://openlinkhub.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jurkovic-nikola.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"docs/supported-devices.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"jurkovic-nikola","custom":["https://buymeacoffee.com/jurkovicni1"]}},"created_at":"2024-05-08T21:46:33.000Z","updated_at":"2025-09-10T18:54:51.000Z","dependencies_parsed_at":"2025-04-24T20:25:23.236Z","dependency_job_id":"0ab8cf89-cc22-4f9b-bb65-b6b43e2f44d1","html_url":"https://github.com/jurkovic-nikola/OpenLinkHub","commit_stats":null,"previous_names":["jurkovic-nikola/openicuelinkhub","jurkovic-nikola/openlinkhub"],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/jurkovic-nikola/OpenLinkHub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurkovic-nikola%2FOpenLinkHub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurkovic-nikola%2FOpenLinkHub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurkovic-nikola%2FOpenLinkHub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurkovic-nikola%2FOpenLinkHub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jurkovic-nikola","download_url":"https://codeload.github.com/jurkovic-nikola/OpenLinkHub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurkovic-nikola%2FOpenLinkHub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275521497,"owners_count":25479612,"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","status":"online","status_checked_at":"2025-09-17T02:00:09.119Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["corsair","corsair-aio","corsair-keyboards","corsair-linux","corsair-psu","fan-controller","lcd-controller","lcd-screens","liquid-cooling","rgb-controller"],"created_at":"2025-09-17T02:01:57.921Z","updated_at":"2025-09-17T02:04:41.199Z","avatar_url":"https://github.com/jurkovic-nikola.png","language":"Go","funding_links":["https://github.com/sponsors/jurkovic-nikola","https://buymeacoffee.com/jurkovicni1"],"categories":["Go"],"sub_categories":[],"readme":"# OpenLinkHub interface for Linux\nAn open-source Linux interface for iCUE LINK Hub and other Corsair AIOs, Hubs.\nManage RGB lighting, fan speeds, system metrics, as well as keyboards, mice, headsets via a web dashboard.\n\n![Build](https://github.com/jurkovic-nikola/OpenLinkHub/actions/workflows/go.yml/badge.svg)\n[![](https://dcbadge.limes.pink/api/server/https://discord.gg/mPHcasZRPy?style=flat)](https://discord.gg/mPHcasZRPy)\n\n## Features\n\n- Web-based UI accessible at `http://localhost:27003`\n- Control AIO coolers, fans, hubs, pumps, LCDs and RGB lighting\n- Manage keyboards, mice and headsets\n- Support for DDR4 and DDR5 memory\n- Custom fan profiles, temperature sensors and RGB editor\n- If you need system tray menu - https://github.com/jurkovic-nikola/openlinkhub-tray\n- [Supported device list](docs/supported-devices.md)\n\n![Web UI](https://github.com/jurkovic-nikola/OpenLinkHub/blob/main/static/img/ui.png?raw=true)\n\n## Info\n- This project was created out of own necessity to control fans and pumps on workstations after switching everything to Linux.\n- I take no responsibility for this code at all. Use this at your own risk. \n- Most of the devices are actually tested on live hardware.\n- Take care and have fun!\n- This project is not an official Corsair product.\n\n## Installation (automatic)\n1. Download either .deb or .rpm package from the latest Release, depends on your Linux distribution\n2. Open terminal\n3. Navigate to the folder where the package is downloaded\n```bash\n# Debian Based (deb)\n$ sudo apt install ./OpenLinkHub_?.?.?_amd64.deb \n\n# RPM based (rpm)\n$ sudo dnf install ./OpenLinkHub-?.?.?-1.x86_64.rpm\n```\n\n## Installation (PPA)\n```bash\n$ sudo add-apt-repository ppa:jurkovic-nikola/openlinkhub\n$ sudo apt update\n$ sudo apt-get install openlinkhub\n```\n\n## Installation (Copr)\n```bash\n$ sudo dnf copr enable jurkovic-nikola/OpenLinkHub\n$ sudo dnf install OpenLinkHub\n```\n\n## Installation (manual)\n### 1. Requirements\n- libudev-dev\n- usbutils\n- go 1.23.8 - https://go.dev/dl/\n```bash\n# Required packages (deb)\n$ sudo apt-get install libudev-dev\n$ sudo apt-get install usbutils\n\n# Required packages (rpm)\n$ sudo dnf install libudev-devel\n$ sudo dnf install usbutils\n```\n### 2. Build \u0026 install\n```bash\n$ git clone https://github.com/jurkovic-nikola/OpenLinkHub.git\n$ cd OpenLinkHub/\n$ go build .\n$ chmod +x install.sh\n$ sudo ./install.sh\n```\n\n### 3. Installation from compiled build\n```bash\n# Download latest build from https://github.com/jurkovic-nikola/OpenLinkHub/releases/latest\n$ wget \"https://github.com/jurkovic-nikola/OpenLinkHub/releases/latest/download/OpenLinkHub_$(curl -s https://api.github.com/repos/jurkovic-nikola/OpenLinkHub/releases/latest | jq -r '.tag_name')_amd64.tar.gz\"\n$ tar xf OpenLinkHub_?.?.?_amd64.tar.gz\n$ cd /home/$USER/OpenLinkHub/\n$ chmod +x install.sh\n$ sudo ./install.sh\n```\n### 4. Immutable distributions (Bazzite OS, SteamOS, etc...)\n```bash\n# Do not install RPM or DEB packages on immutable distributions, they will not work.\n# This same procedure may be followed to update an existing installation.\n# Download the latest tar.gz from the Release page, or use the following command to download the latest release.\n$ wget \"https://github.com/jurkovic-nikola/OpenLinkHub/releases/latest/download/OpenLinkHub_$(curl -s https://api.github.com/repos/jurkovic-nikola/OpenLinkHub/releases/latest | jq -r '.tag_name')_amd64.tar.gz\"\n\n# Extract package to your home directory\n$ tar xf OpenLinkHub_?.?.?_amd64.tar.gz -C /home/$USER/\n\n# Go to extract folder\n$ cd /home/$USER/OpenLinkHub\n\n# Make install-immutable.sh executable\n$ chmod +x install-immutable.sh\n\n# Run install-immutable.sh. Enter your password for sudo when asked to copy 99-openlinkhub.rules file\n$ ./install-immutable.sh\n\n# Restart \n$ systemctl reboot\n```\n\n### 5. Configuration\n```json\n{\n  \"debug\": false,\n  \"listenPort\": 27003,\n  \"listenAddress\": \"127.0.0.1\",\n  \"cpuSensorChip\": \"k10temp\",\n  \"manual\": false,\n  \"frontend\": true,\n  \"metrics\": true,\n  \"resumeDelay\": 15000,\n  \"memory\": false,\n  \"memorySmBus\": \"i2c-0\",\n  \"memoryType\": 4,\n  \"exclude\": [],\n  \"decodeMemorySku\": true,\n  \"memorySku\": \"\",\n  \"logFile\": \"\",\n  \"logLevel\": \"info\",\n  \"enhancementKits\": [],\n  \"temperatureOffset\": 0,\n  \"amdGpuIndex\": 0,\n  \"amdsmiPath\": \"\",\n  \"cpuTempFile\": \"\",\n  \"graphProfiles\": false,\n  \"ramTempViaHwmon\": false,\n  \"nvidiaGpuIndex\": [0],\n  \"defaultNvidiaGPU\": 0\n}\n```\n- listenPort: HTTP server port.\n- listenAddress: Address for HTTP server to listen on.\n- cpuSensorChip: CPU sensor chip for temperature. `k10temp` or `zenpower` for AMD and `coretemp` for Intel\n- manual: set to true if you want to use your own UI for device control. Setting this to true will disable temperature monitoring and automatic device speed adjustments. \n- frontend: set to false if you do not need WebUI console, and you are making your own UI app. \n- metrics: enable or disable Prometheus metrics\n- resumeDelay: amount of time in milliseconds for program to reinitialize all devices after sleep / resume\n- memory: Enable overview / control over the memory\n- memorySmBus: i2c smbus sensor id\n- memoryType: 4 for DDR4. 5 for DDR5\n- exclude: list of device ids in uint16 format to exclude from program control\n- decodeMemorySku: set to false to manually define `memorySku` value.\n- memorySku: Memory part number, e.g. (CMT64GX5M2B5600Z40)\n- You can find memory part number by running the following command: `sudo dmidecode -t memory | grep 'Part Number'`\n- logFile: custom location for logging. Default is empty.\n  - Defining `-` for logFile will send all logs to standard console output.\n  - If you change the location of logging, make sure the application username has permission to write to that folder.\n- logLevel: log level to log in console or file.\n- enhancementKits: DDR4/DDR5 Light Enhancement Kits addresses. \n- If your kit is installed in first and third slot, value would be: `\"enhancementKits\": [80,82],`. This value is byte value converted from hexadecimal output in `i2cdetect`\n  - When kits are used, you need to set `decodeMemorySku` to `false` and define `memorySku`\n- temperatureOffset: Temperature offset for AMD Threadripper CPUs\n- amdGpuIndex: GPU device index. You can find your GPU index via `amd-smi static --asic --json`\n- amdsmiPath: Manual path to amd-smi binary (not recommended). Better way is to define `amd-smi` path in `$PATH` variable if missing.\n- cpuTempFile: custom hwmon temperature input file, e.g. tempX_input. Use in combination with `cpuSensorChip`.\n- graphProfiles: Setting this value to `true` will enable graph based temperature profiles on `/temperature` endpoint and enable temperature interpolation.\n- ramTempViaHwmon: Switch to true if you want to monitor RAM temperature via hwmon system. With this option, you don't have to unload modules to get temperature. (Require 6.11+ kernel)\n- nvidiaGpuIndex: NVIDIA multi gpu setup. \n- defaultNvidiaGPU: default index of NVIDIA gpu, default is 0.\n  - If you use vfio-pci/pass-through, you have to set it to -1 to avoid conflits with nvidia modules.\n\n### 6. Progressive Web App (PWA) UI\nThe web UI supports installation as a progressive web app (PWA). With a supported browser, this allows the UI to appear as a standalone application.\nChromium-based based browsers support PWAs, Firefox currently does not.\nGNOME 'Web,' also known as 'Epiphany' is a good option for PWAs on GNOME systems.\n\n### 7. OpenRGB Integration\n[See details](openrgb/README.md)\n\n## Uninstall\n```bash\n# Stop service\nsudo systemctl stop OpenLinkHub.service\n\n# Remove application directory\nsudo rm -rf /opt/OpenLinkHub/\n\n# Remove systemd file (file location can be found by running sudo systemctl status OpenLinkHub.service)\nsudo rm /etc/systemd/system/OpenLinkHub.service\n# or\nsudo rm /usr/lib/systemd/system/OpenLinkHub.service\n\n# Reload systemd\nsudo systemctl daemon-reload\n\n# Remove udev rules\nsudo rm -f /etc/udev/rules.d/99-openlinkhub.rules\nsudo rm -f /etc/udev/rules.d/98-corsair-memory.rules\n\n# Reload udev\nsudo udevadm control --reload-rules\nsudo udevadm trigger\n```\n## Running in Docker\nAs an alternative, OpenLinkHub can be run in Docker, using the Dockerfile in this repository to build it locally. A configuration file has to be mounted to /opt/OpenLinkHub/config.json\n```bash\n$ docker build . -t openlinkhub\n$ # To build a specific version you can use the GIT_TAG build argument\n$ docker build --build-arg GIT_TAG=0.1.3-beta -t openlinkhub .\n\n$ docker run --privileged openlinkhub\n\n# For WebUI access, networking is required\n$ docker run --network host --privileged openlinkhub\n```\n\n## LCD\n- LCD images / animations are located in `/opt/OpenLinkHub/database/lcd/images/`\n## Dashboard\n- Device Dashboard is accessible by browser via link `http://127.0.0.1:27003/`\n- Device Dashboard allows you to control your devices.\n## RGB\n- RGB configuration is located at `database/rgb/your-device-serial.json` file\n- RGB can be configured via RGB Editor in Dashboard\n\n## API\n- OpenLinkHub ships with built-in HTTP server for device overview and control.\n- Documentation is available at `http://127.0.0.1:27003/docs`\n\n## Memory - DDR4 / DDR5\n- By default, memory overview and RGB control are disabled in OpenLinkHub. \n- To enable it, you will need to switch `\"memory\":false` to `\"memory\":true` and set proper `memorySmBus` value. \n- Things to consider prior:\n  - If you are using any other RGB software that can control your RAM, do not set `\"memory\":true`. \n  - Two programs cannot write to the same I2C address at the same time. \n  - If you do not know what `acpi_enforce_resources=lax` means, do not enable this.\n```bash\n# Install tools\n$ sudo apt-get install i2c-tools\n\n# Enable loading of i2c-dev at boot and restart\necho \"i2c-dev\" | sudo tee /etc/modules-load.d/i2c-dev.conf\n\n# List all i2c, this is AMD example! (AM4, X570 AORUS MASTER (F39d - 09/02/2024)\n# If everything is okay, you should see something like this, especially first 3 lines. \n$ sudo i2cdetect -l\ni2c-0\tsmbus     \tSMBus PIIX4 adapter port 0 at 0b00\tSMBus adapter\ni2c-1\tsmbus     \tSMBus PIIX4 adapter port 2 at 0b00\tSMBus adapter\ni2c-2\tsmbus     \tSMBus PIIX4 adapter port 1 at 0b20\tSMBus adapter\ni2c-3\ti2c       \tNVIDIA i2c adapter 1 at c:00.0  \tI2C adapter\ni2c-4\ti2c       \tNVIDIA i2c adapter 2 at c:00.0  \tI2C adapter\ni2c-5\ti2c       \tNVIDIA i2c adapter 3 at c:00.0  \tI2C adapter\ni2c-6\ti2c       \tNVIDIA i2c adapter 4 at c:00.0  \tI2C adapter\ni2c-7\ti2c       \tNVIDIA i2c adapter 5 at c:00.0  \tI2C adapter\ni2c-8\ti2c       \tNVIDIA i2c adapter 6 at c:00.0  \tI2C adapter\ni2c-9\ti2c       \tNVIDIA i2c adapter 7 at c:00.0  \tI2C adapter\n\n# If you do not see any smbus devices, you will probably need to set acpi_enforce_resources=lax\n# Before setting acpi_enforce_resources=lax please research pros and cons of this and decide on your own!\n\n# In most of the cases, memory will be registered under SMBus PIIX4 adapter port 0 at 0b00 device, aka i2c-0. Lets validate that.\n# DDR4 example:\n$ sudo i2cdetect -y 0 # this is i2c-0 from i2cdetect -l command\n     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n00:                         08 -- -- -- -- -- -- -- \n10: 10 -- -- 13 -- 15 -- -- 18 19 -- -- -- -- -- -- \n20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- \n30: 30 31 -- -- 34 35 -- -- -- -- 3a -- -- -- -- -- \n40: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- -- -- \n50: 50 51 52 53 -- -- -- -- 58 59 -- -- -- -- -- -- \n60: -- -- -- -- -- -- -- -- 68 -- -- -- 6c -- -- -- \n70: 70 -- -- -- -- -- -- --\n\n# Set I2C permission\n$ echo 'KERNEL==\"i2c-0\", MODE=\"0600\", OWNER=\"openlinkhub\"' | sudo tee /etc/udev/rules.d/98-corsair-memory.rules\n# Reload udev rules\n$ sudo udevadm control --reload-rules\n$ sudo udevadm trigger\n```\n- Modify `\"memorySmBus\": \"i2c-0\"` if needed.\n- Set `\"memory\":true` in config.json file.\n- Set `\"memoryType\"` in config.json\n  - `4` if you have a DDR4 platform\n  - `5` if you have a DDR5 platform\n- Restart OpenLinkHub service.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjurkovic-nikola%2FOpenLinkHub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjurkovic-nikola%2FOpenLinkHub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjurkovic-nikola%2FOpenLinkHub/lists"}