{"id":34530667,"url":"https://github.com/alia5/viiper","last_synced_at":"2026-05-31T14:00:43.534Z","repository":{"id":324470530,"uuid":"1097344761","full_name":"Alia5/VIIPER","owner":"Alia5","description":"Virtual Input over IP Emulator - VIIPER is a tool to create virtual input devices using USBIP. (Linux/Windows)","archived":false,"fork":false,"pushed_at":"2026-05-27T12:29:00.000Z","size":2835,"stargazers_count":76,"open_issues_count":4,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-27T14:22:35.312Z","etag":null,"topics":["controller-emulation","usbip","virtual-controller","virtual-input","virtual-usb"],"latest_commit_sha":null,"homepage":"https://alia5.github.io/VIIPER/","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/Alia5.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["Alia5"],"custom":["https://www.buymeacoffee.com/flatspotso7","https://paypal.me/flatspotpics"]}},"created_at":"2025-11-16T01:44:40.000Z","updated_at":"2026-05-27T12:30:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"52349abf-6482-4c75-be74-41abc81edf47","html_url":"https://github.com/Alia5/VIIPER","commit_stats":null,"previous_names":["alia5/viiper"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/Alia5/VIIPER","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alia5%2FVIIPER","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alia5%2FVIIPER/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alia5%2FVIIPER/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alia5%2FVIIPER/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Alia5","download_url":"https://codeload.github.com/Alia5/VIIPER/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alia5%2FVIIPER/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33733754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"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":["controller-emulation","usbip","virtual-controller","virtual-input","virtual-usb"],"created_at":"2025-12-24T05:35:57.663Z","updated_at":"2026-05-31T14:00:43.520Z","avatar_url":"https://github.com/Alia5.png","language":"Go","funding_links":["https://github.com/sponsors/Alia5","https://www.buymeacoffee.com/flatspotso7","https://paypal.me/flatspotpics"],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"docs/viiper.svg\" align=\"right\" width=\"128\"/\u003e\n\u003cbr /\u003e\n\n[![Build Status](https://github.com/alia5/VIIPER/actions/workflows/snapshots.yml/badge.svg)](https://github.com/alia5/VIIPER/actions/workflows/snapshots.yml)\n[![codecov](https://codecov.io/github/Alia5/VIIPER/graph/badge.svg?token=5WTEELM3X3)](https://codecov.io/github/Alia5/VIIPER)\n[![License: GPL-3.0](https://img.shields.io/github/license/alia5/VIIPER)](https://github.com/alia5/VIIPER/blob/main/LICENSE.txt)\n[![Client Libraries: MIT](https://img.shields.io/badge/Client_Libraries-MIT-green)](https://github.com/alia5/VIIPER/blob/main/internal/codegen/common/license.go)\n[![Release](https://img.shields.io/github/v/release/alia5/VIIPER?include_prereleases\u0026sort=semver)](https://github.com/alia5/VIIPER/releases)\n[![Downloads](https://img.shields.io/github/downloads/alia5/VIIPER/total?logo=github)](https://github.com/alia5/VIIPER/releases)\n[![Issues](https://img.shields.io/github/issues/alia5/VIIPER)](https://github.com/alia5/VIIPER/issues)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/alia5/VIIPER/pulls)\n[![npm version](https://img.shields.io/npm/v/viiperclient?logo=npm)](https://www.npmjs.com/package/viiperclient)\n[![npm downloads](https://img.shields.io/npm/dm/viiperclient?logo=npm\u0026label=downloads)](https://www.npmjs.com/package/viiperclient)\n[![NuGet version](https://img.shields.io/nuget/v/Viiper.Client?logo=nuget)](https://www.nuget.org/packages/Viiper.Client/)\n[![NuGet downloads](https://img.shields.io/nuget/dt/Viiper.Client?logo=nuget\u0026label=downloads)](https://www.nuget.org/packages/Viiper.Client/)\n[![crates.io version](https://img.shields.io/crates/v/viiper-client?logo=rust)](https://crates.io/crates/viiper-client)\n[![crates.io downloads](https://img.shields.io/crates/d/viiper-client?logo=rust\u0026label=downloads)](https://crates.io/crates/viiper-client)\n[![C++ Client Library](https://img.shields.io/badge/C++_Client_Library-Header_Only-blue)](https://github.com/Alia5/VIIPER/releases)\n[![Discord](https://img.shields.io/discord/368823110817808384?logo=discord\u0026logoColor=white\u0026label=Discord\u0026color=%23535fe5\n)](https://discord.gg/hs34MtcHJY)\n\n# VIIPER 🐍\n\n**Virtual** **I**nput over **IP** **E**mulato**R**\n\nA **cross-platform virtual USB input framework** for creating virtual USB input devices (game controllers, keyboards, mice and more)\nthat are indistinguishable from real hardware to the operating system and applications.\n\nVIIPER lets developers create and programmatically control virtual USB input devices (using USBIP under the hood),\nenabling seamless integration for gaming, automation, testing and remote control scenarios.\n\n- Runs on Linux and Windows.  \n- _(Optional)_ network support built in: control devices over a network with lower overhead than raw USBIP alone.  \n- VIIPER abstracts away all USB / USBIP details.  \n- VIIPER is portable and runs entirely in userspace.  \n    - Utilizes a generic USBIP kernel mode driver  \n      (built into Linux; on Windows [usbip-win2](https://github.com/vadimgrn/usbip-win2) provides a signed kernel mode driver)  \n      New device types never require touching kernel code.  \n- After installing USBIP once, VIIPER can run without additional dependencies or system-wide installation.  \n\nVIIPER comes in two distinct flavors:\n\n- **VIIPER server**  \n  a self-contained, (no dependencies, statically linked) portable, standalone executable  \n    - exposing a lightweight TCP-API\n    - control devices from any language or machine on the network  \n- **libVIIPER**  \n  a single shared library to embed device emulation directly into your application  \n  See Examples for C and C# [here](./examples/libVIIPER)  \n  or the [libVIIPER documentation](libviiper/overview.md) for details and examples.  \n\nFor why you should pick one over the other see the [FAQ](#why-choose-the-standalone-executable-and-interfacing-via-tcp-over-the-shared-object-libviiper-library)\n\nBeyond device emulation, VIIPER can proxy real USB devices for traffic inspection and reverse engineering.\n\n**Emulatable devices:**\n\n- Xbox 360 controller emulation; see [Devices › Xbox 360 Controller](docs/devices/xbox360.md)\n- HID Keyboard with N-key rollover and LED feedback; see [Devices › Keyboard](docs/devices/keyboard.md)\n- HID Mouse with 5 buttons and horizontal/vertical wheel; see [Devices › Mouse](docs/devices/mouse.md)\n- PS4 controller emulation; see [Devices › DualShock 4 Controller](docs/devices/dualshock4.md)\n- Nintendo Switch 2 Pro Controller emulation; see [Devices › Switch 2 Pro Controller](docs/devices/ns2pro.md)\n- 🔜 Future plugin system allows for more device types (other gamepads, specialized HID)\n\n## 🔌 Requirements\n\n**Linux:**\n\n- **Arch Linux:**\n    - Install: `sudo pacman -S usbip`\n    - Docs: [Arch Wiki: USBIP](https://wiki.archlinux.org/title/USB/IP)\n\n- **Ubuntu:**  \n    - Install: `sudo apt install linux-tools-generic`\n    - Docs: [Ubuntu USBIP Manual](https://manpages.ubuntu.com/manpages/noble/man8/usbip.8.html)\n\n**Windows:**\n\n- [usbip-win2](https://github.com/vadimgrn/usbip-win2) is by far the most complete implementation of USBIP for Windows (comes with a **SIGNED** kernel mode driver).\n\n---\n\n## 🥫 Feeder application development\n\nYou have two options for developing feeder applications that control the virtual devices created by VIIPER:\n\n- Use the standalone VIIPER server and interface via the exposed TCP-API (preferably using one of the available client libraries)\n- Integrate libVIIPER directly into your application.  \n  See [Examples](examples/libVIIPER) for examples in either C or C#.\n\n### 🔌 API\n\nVIIPER includes a lightweight TCP based API for device and bus management, as well as streaming device control.  \nIt's designed to be trivial to drive from any language that can open a TCP socket and send null-byte-terminated commands.  \n\n\u003e [!TIP]\nMost of the time, you don't need to implement that raw protocol yourself, as client libraries are available.  \nSee [Client Libraries](docs/api/overview.md).\n\n- The TCP API uses a string-based request/response protocol terminated by null bytes (`\\0`) for device and bus management.  \n    - Requests have a \"_path_\" and optional payload (sometimes  JSON).  \n    eg. `bus/{id}/add {\"type\": \"keyboard\", \"idVendor\": \"0x6969\"}\\0`  \n    - Responses are often JSON as well!\n    - Errors are reported using JSON objectes similar to [RFC 7807 Problem Details](https://datatracker.ietf.org/doc/html/rfc7807)  \n \u003csup\u003eThe use of JSON allows for future extenability without breaking compatibility ;)\u003csup\u003e\n- For controlling, or feeding, a device a long lived TCP stream is used, with a wire-protocol specific to each device type.  \n  After an initial \"_handshake_\" (`bus/{busId}/{deviceId}\\0`) a _device-specific **binary protocol**_ is used to send input reports and receive output reports (e.g., rumble commands).\n\nVIIPER takes care of all USBIP protocol details, so you can focus on implementing the device logic only.  \nOn `localhost` VIIPER also automatically attached the USBIP client, so you don't have to worry about USBIP details at all.\n\nSee the [API documentation](./docs/api) for details\n\n---\n\n## 🛠️ VIIPER development\n\n### 🧰 Prerequisites\n\n- [Go](https://go.dev/) 1.26 or newer\n- USBIP installed\n- (Optional) [just](https://github.com/casey/just)\n    - Windows: `winget install --id Casey.Just --exact`\n    - Linux/macOS: `cargo install just` or use your package manager\n- Windows compiler (required for `build-libVIIPER`):\n    - `winget install -e --id MartinStorsjo.LLVM-MinGW.UCRT`\n      `--accept-package-agreements --accept-source-agreements`\n\n### 🔄 Building from Source\n\n```bash\ngit clone https://github.com/Alia5/VIIPER.git\ncd VIIPER\njust build Release\n```\n\nThe binary will be in `dist/viiper-\u003cgoos\u003e-\u003cgoarch\u003e` (for example `dist/viiper-windows-amd64.exe`).\n\nFor more build options:\n\n```bash\njust --list            # Show all available targets\njust test              # Run tests\n```\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome!  \nPlease open issues or pull requests on GitHub.  \nSee the [issues page](https://github.com/Alia5/VIIPER/issues) for bugs and feature requests.\n\n---\n\n## ❓ FAQ\n\n### What is USBIP and why does VIIPER use it?\n\nUSBIP is a protocol that allows USB devices to be shared over a network.  \nVIIPER uses it because it's already built into Linux and available for Windows, making virtual device emulation possible without writing custom kernel drivers yourself.\n\n### Why choose the the standalone executable and interfacing via TCP over, and the (shared-object) libVIIPER library\n\n- Flexibility\n    - allows one to use VIIPER as a service on the same host as the USBIP-Client and use the feeder on a different, remote machine.\n    - allows for software written utilizing VIIPER to **not be** licensed under the terms of the GPLv3\n    - **_future versions_**: Users can enhance VIIPER with device plugins, sharing a common wire-protocol, which can be dynamically incorporated.\n\n### Can I use VIIPER for gaming?\n\nYes! VIIPER can create virtual input devices that appear as real hardware to games and applications.  \nThis works with Steam, native Windows games and any other application that supports the emulated device types.\n\n### How is VIIPER different from other controller emulators?\n\nMany controller emulation approaches require writing a custom kernel driver for every device type you want to support.  \nVIIPER uses USBIP to handle the USB protocol layer, so device emulation code lives entirely in userspace.  \n\nUSBIP itself does require a kernel driver.  \nOn Linux, the USBIP driver is built into the kernel.  \nOn Windows, [usbip-win2](https://github.com/vadimgrn/usbip-win2) provides a signed kernel mode driver.  \nThat driver is generic and does not need to know anything about specific device types.  \nAll device-type logic stays in userspace.  \n\nThis makes VIIPER portable, easier to extend and simpler to bundle with applications.  \nAdding a new device type never requires touching kernel code.\n\n### Can I add support for other device types?\n\nYes! VIIPER's architecture is designed to be extensible.  \nCheck the [xbox360 device implementation](./device/xbox360/) as a reference for creating new device types.  \nIn the future there will be a plugin system to load and expose device types dynamically.\n\n### You mentioned proxying USBIP?\n\nVIIPER as a proxy mode that sits between a USBIP client and a USBIP server (like a Linux machine sharing real USB devices).  \nTHis intercepts and logs all URBs passing through, without handling the devices directly.  \nUseful for reverse engineering USB protocols and understanding how devices communicate.\n\n### What about TCP overhead or input latency performance?\n\nEnd-to-end input latency for virtual devices created with VIIPER could be typically well below 1 millisecond on a modern desktop (e.g. Windows / Ryzen 3900X test machine).  \nDetailed methodology and sample runs can be found in [E2E Latency Benchmarks](/docs/testing/e2e_latency.md).  \nHowever, to not stress the CPU excessively, reports get batched and sent every millisecond. So the best you will achive is a 1000Hz update rate, which is more than enough and more than what most real hardware devices provide.  \n_Note_: Actual device polling rates may be lower depending on the device type and configuration.\n\n---\n\n## 📄 License\n\n```license\nVIIPER - Virtual Input over IP EmulatoR\n\nCopyright (C) 2025-2026 Peter Repukat\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n```\n\n## Credits / Inspiration\n\n- [REDACTED-Bus aka ViGEmBus](https://github.com/nefarius/ViGEmBus)  \n  (Retired, but still widely used) Windows kernel-mode driver emulating well-known USB game controllers  \n  Shoutout and thank you to @nefarius for paving the way and always being a super decent guy!\n- [Valve Software](https://www.valvesoftware.com/)  \n  For creating the OG Steam Controller (2015) and Steam Input (and the way it, understandably, works...)  \n  that sent me down this rabbit hole in the first place  \n  \u003csup\u003eI kinda hate you guys... in good way(?) ;)\u003c/sup\u003e\n- **USBIP** without VIIPER would not be possible.\n    - [USBIP](https://usbip.sourceforge.net/)\n    - [USBIP-Win2](https://github.com/vadimgrn/usbip-win2)  \n- [SDL](https://www.libsdl.org/)  \n  For their excellent work on input device handling, reducing reversing efforts to a minimum.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falia5%2Fviiper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falia5%2Fviiper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falia5%2Fviiper/lists"}