{"id":18413732,"url":"https://github.com/sterlingbutters/ip-kvm-interface","last_synced_at":"2026-03-11T12:49:10.665Z","repository":{"id":53954749,"uuid":"149011810","full_name":"SterlingButters/ip-kvm-interface","owner":"SterlingButters","description":"DIY IP-KVM for Remote Desktop Access","archived":false,"fork":false,"pushed_at":"2024-06-19T17:09:42.000Z","size":15266,"stargazers_count":79,"open_issues_count":25,"forks_count":15,"subscribers_count":11,"default_branch":"dev","last_synced_at":"2025-06-30T07:48:30.148Z","etag":null,"topics":["browser","css","html5","interface","ipmi","javascript","kvm","raspberry-pi","remote","remote-control","vnc"],"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/SterlingButters.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":"2018-09-16T16:02:16.000Z","updated_at":"2025-03-28T23:32:54.000Z","dependencies_parsed_at":"2024-11-01T10:31:40.182Z","dependency_job_id":null,"html_url":"https://github.com/SterlingButters/ip-kvm-interface","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SterlingButters/ip-kvm-interface","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SterlingButters%2Fip-kvm-interface","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SterlingButters%2Fip-kvm-interface/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SterlingButters%2Fip-kvm-interface/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SterlingButters%2Fip-kvm-interface/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SterlingButters","download_url":"https://codeload.github.com/SterlingButters/ip-kvm-interface/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SterlingButters%2Fip-kvm-interface/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30381729,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T06:09:32.197Z","status":"ssl_error","status_checked_at":"2026-03-11T06:09:17.086Z","response_time":84,"last_error":"SSL_read: 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":["browser","css","html5","interface","ipmi","javascript","kvm","raspberry-pi","remote","remote-control","vnc"],"created_at":"2024-11-06T03:47:25.380Z","updated_at":"2026-03-11T12:49:10.648Z","avatar_url":"https://github.com/SterlingButters.png","language":"JavaScript","funding_links":["https://paypal.me/sterlingbutters"],"categories":[],"sub_categories":[],"readme":"# IP-KVM-InterFace ![](https://img.shields.io/badge/version-1.2.0-yellow.svg)\n\n![alt text](https://github.com/SterlingButters/ip-kvm-interface/blob/master/Examples/Example.gif)\n\n# About\nThis project creates a web-accessable IPMI / IP KVM system utilizing any OTG enabled\nRaspberry Pi device (theoretically - testing only done on RPi4) that provides full keyboard and mouse control,\nmonitor view, and the ability to reboot computers with standard motherboards\nremotely (WOL \u0026 GPIO-Relay). This projects intends to also create an interface with consistent\nand minimal programmatic requirements (i.e. use of web stack languages only) with modularity and organization.\nThis project is EXTREMELY light weight and easy to install and configure. Additionally, this allows further\ndevelopment with minimal orientation overhead.\n\nThe project's working features (with caveats):\n#### 1) Keyboard\n  - Future Work: Send shortcuts via HTML button interface\n#### 2) Mouse\n  - Future Work: Scroll wheel support\n#### 3) Video Source (selection/refresh) (e.g. `/dev/video0`, etc)\n  - Future Work: Try HLS stream\n#### 4) Mass Storage Emulation\n  - Future Work: Verify detachability\n  - Future Work: Perform `.img` test\n  - Future Work: Support `licomposite` \"stall\"\n  - Future Work: Add a `dd` file converter and/or alter `accept` attribute of file `input` tag\n#### 5) GPIO Interface (must initialize pins manually in `app.js`)\n  - Future Work: Identification of GPIO pin configuration for support of the following:\n        - Relay Channel [IOT](https://www.amazon.com/gp/product/B00WV7GMA2/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8\u0026psc=1)\n        - Upstream USB Switch [YKUP](https://www.yepkit.com/product/300114/YKUP)\n        - USB Switchable Hub [YKUSH3](https://www.yepkit.com/product/300110/YKUSH3)\n        - LIRC Transmitter/Receiver [ENER314-IR](https://www.amazon.co.uk/dp/B00T9JPA4O/ref=pe_3187911_185740111_TE_item)\n#### 6) WOL\n  - Future Work: Configure `/network/interfaces` for user\n  - Future Work: Detect MAC addresses with button\n#### 7) Terminal\n  - Future Work: Add \"Copy Command\" button to fork process output\n#### 8) Authentication \n  - Future Work: Twilio-based multi-factor authentication\n  - Future Work: PAM authentication || equivalent\n#### 9) Remote Access\n  - Future Work: Link/iFrame to gateway address (for port forwarding configuration)\n  - Future Work: no-ip2 API DDNS support in interface\n  - Future Work: VPN configuration information\n  - Future Work: Embedded VNC Client using noVNC\n  - ~~Future Work: Dataplicity \"Wormhole\" Instruction~~ video stream is \"insecure\" content\n#### 10) ~~Installation Script~~ (`/configuration/install.sh`\n  - Future Work: Configure as `systemd` service\n  - Future Work: Add `dtoverlay=dwc2` to `/boot/config.txt`\n\n## Configuration\n#### Setup\n![alt text](https://github.com/SterlingButters/ip-kvm-interface/blob/dev/configuration/setup.png)\n\n**Image needs updating to show possible GPIO configurations\n\n#### Installation\n1) Enable the dwc2 dtoverlay in `/boot/config.txt` on your Pi4\n\n2) Install node/npm/pip in \u003cproject-directory\u003e\n\n3) Run `npm install`\n\n4) Run `sudo bash \u003c project-directory \u003e/configuration/composit-gadget-setup_v1.sh`\n\n5) Run `sudo node app.js`\n\n6) Navigate to `http://localhost:3000` in your browser\n\n7) See below for remote access instruction\n\n**Post issue for installation guidance (or look at `/configuration/install.sh`)\n\n#### DDNS and Port Forwarding:\n1) Log into router\n\n2) Set up up port forwarding to \u003cRPi-ipAddress\u003e:port that is chosen for the Interface during install\n  [3000 recommended]\n\n3) Sign up for DDNS: [![](https://img.shields.io/badge/No--IP-signup-ff69b4.svg)](https://www.noip.com)\n\n4) Create a hostname (no-ip client to be set up in install)\n\n## Shopping List:\n  - Raspberry Pi4 (Starter Kit)[$89.99]:\n  [![](https://img.shields.io/badge/amazon-buy-blue.svg)](https://www.amazon.com/CanaKit-Raspberry-4GB-Basic-Starter/dp/B07VYC6S56/ref=sr_1_1?keywords=rpi+4+starter+kit\u0026qid=1574491331\u0026s=electronics\u0026sr=1-1)\n\n  - Capture Card Options:\n    - LinkStable (verified)[$99.99]:\n    [![](https://img.shields.io/badge/amazon-buy-blue.svg)](https://www.amazon.com/LinkStable-Streaming-Recorder-Gameplayer-Compatible/dp/B073PXDKFR/ref=sr_1_3?s=electronics\u0026ie=UTF8\u0026qid=1539175400\u0026sr=1-3\u0026keywords=linkstable+capture+card)\n\n    - PenGo [4K] (experimental)[$149.99]:\n    [![](https://img.shields.io/badge/amazon-buy-blue.svg)](https://www.amazon.com/gp/product/B07BGXVGLS/ref=ox_sc_act_title_1?smid=A39P3WP927BTL5\u0026psc=1)\n\n  - Cables:\n    - USB to USB-C [comes in Pi4 starter kit]\n    - HDMI x2 [~$5.99]\n    - Ribbon Cables [~$7.50]:\n    [![](https://img.shields.io/badge/amazon-buy-blue.svg)](https://www.amazon.com/Kuman-Breadboard-Arduino-Raspberry-Multicolored/dp/B01BV3Z342/ref=sr_1_8_sspa?s=electronics\u0026ie=UTF8\u0026qid=1539227097\u0026sr=1-8-spons\u0026keywords=rpi+ribbon+cable+variety+pack\u0026psc=1)\n\n## Troubleshooting\n- Ensure all cables are data-transfer capable\n\n## Cost-Cutting\n  - Cheaper capture cards exist; the one chosen allows for throughput of video to a display\n  - The complete RPi4 starter kit might be a bit overkill but easy one-stop-shop for beginner\n\n## Collaboration \u0026 Support\nDonate with PayPal:\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/sterlingbutters)\n\nJoin me on Discord:\n[![Discord](https://img.shields.io/discord/102860784329052160.svg)](https://discord.gg/uSTr7DZ)\n\n## Note to developers\nThis project hosts a node-generated server on an OTG-capable Raspberry Pi device. The install script creates the libcomposite device on the Pi. The code then transcribes the information that is fed through the browser and relays it to the target computer using socket.io. Video is achieved using JSMPEG (would like to find something even faster like WebRTC maybe). There are likely many approaches to current solutions. For instance, the mouse report descriptor is that for a generic mouse with basic functions. It might be possible to create a report descriptor that generates output reports from the mouse to provide absolute position on the screen. Additionally, it might be possible to detect the display resolution and calibrate the mouse movement. Currently, it doesn't seem that that level of rigor is worth it. Other improvements like this could likely be made as well.\n\nI do plan on going back and cleaning up this code to be more readable but we will see if that happens anytime soon.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsterlingbutters%2Fip-kvm-interface","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsterlingbutters%2Fip-kvm-interface","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsterlingbutters%2Fip-kvm-interface/lists"}