{"id":44205567,"url":"https://github.com/laanwj/remote-uinput-rs","last_synced_at":"2026-02-09T22:35:21.575Z","repository":{"id":334532181,"uuid":"1141739710","full_name":"laanwj/remote-uinput-rs","owner":"laanwj","description":"Bridge evdev events from one system to another, minimizing latency","archived":false,"fork":false,"pushed_at":"2026-01-25T12:59:51.000Z","size":15,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-26T01:36:09.316Z","etag":null,"topics":["evdev","linux","networking","remote-control"],"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/laanwj.png","metadata":{"files":{"readme":"README.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-25T10:50:09.000Z","updated_at":"2026-01-25T12:59:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/laanwj/remote-uinput-rs","commit_stats":null,"previous_names":["laanwj/remote-uinput-rs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/laanwj/remote-uinput-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laanwj%2Fremote-uinput-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laanwj%2Fremote-uinput-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laanwj%2Fremote-uinput-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laanwj%2Fremote-uinput-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laanwj","download_url":"https://codeload.github.com/laanwj/remote-uinput-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laanwj%2Fremote-uinput-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29283757,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-09T21:57:15.303Z","status":"ssl_error","status_checked_at":"2026-02-09T21:57:11.537Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["evdev","linux","networking","remote-control"],"created_at":"2026-02-09T22:35:20.745Z","updated_at":"2026-02-09T22:35:21.563Z","avatar_url":"https://github.com/laanwj.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# remote-uinput-rs\n\nBridge Linux evdev events from one system to another, minimizing latency.\n\nThe bridge consists of two components, `remote-uinput-server` and `remote-uinput-client`. The client sends evdev events coming from the device to the server, which makes the evdev device available to local applications.\n\nInput events are exchanged between the client and server as tiny UDP packets. The device descriptors aren't sent over the network. These can be generated by the client, and need to be manually provided to the server as a JSON configuration file.\n\n## Example\n\nOn the client side, generate configuration for the devices to be shared, and copy it to the server:\n\n```sh\n$ target/release/remote-uinput-client list-devices\n⋮\n045e:0008 /dev/input/event0: usb-xhci-hcd.1-2.2/input0: Microsoft Microsoft SideWinder Precision Pro (USB)\n⋮\n# you can either use\n#   --device-by-usbid 045e:0008\n#   --device-by-path /dev/input/event0\n#   --device-by-phys usb-xhci-hcd.1-2.2/input0\n#   --device-by-name \"Microsoft Microsoft SideWinder Precision Pro (USB)\"\n$ remote-uinput-client --generate-config --device-by-usbid 045e:0008 \u003e remote-uinput-config.json\n$ scp remote-uinput-config.json server:\n```\nIf the device you want to share doesn't appear in `list-devices` output, make sure that the user you're running it has access to it. You can also check with the utility `evtest`.\n\nStart server side. The default, when no `--bind` is specified, is to bind on port 9002 on any interface. The server generally needs to be run as root to be allowed to create uevent devices:\n\n```sh\n$ RUST_LOG=\"info\" remote-uinput-server -c remote-uinput-config.json\n```\n\nStart client side (replace `192.168.1.2` with the server address):\n\n```sh\n$ RUST_LOG=\"info\" remote-uinput-client --destination 192.168.1.2:9002 --device-by-usbid 045e:0008\n```\n\n## Components\n\n### remote-uinput-server\n\nThe server receives events from the network, and makes the evdev device(s) available to local applications.\n\n```\n$ target/release/remote-uinput-server --help\nUsage: remote-uinput-server [OPTIONS] --config \u003cCONFIG\u003e\n\nOptions:\n  -c, --config \u003cCONFIG\u003e  Path to JSON config file\n  -b, --bind \u003cBIND\u003e      Bind address [default: 0.0.0.0:9002]\n  -h, --help             Print help\n  -V, --version          Print version\n```\n\nSpecifying a configuration file is mandatory. Normally, this is generated on the client side (see Example section above). The configuration is a simple JSON list of device descriptors,\n\n\u003cdetails\u003e\n\u003csummary\u003eremote-uinput-config.json\u003c/summary\u003e\n\n```json\n[\n    {\n        \"name\": \"Microsoft Microsoft SideWinder Precision Pro (USB)\",\n        \"vendor\": 1118,\n        \"product\": 8,\n        \"version\": 256,\n        \"capabilities\": {\n            \"4\": [\n                4\n            ],\n            \"3\": [\n                0,\n                1,\n                5,\n                6,\n                16,\n                17\n            ],\n            \"1\": [\n                288,\n                289,\n                290,\n                291,\n                292,\n                293,\n                294,\n                295,\n                296\n            ]\n        },\n        \"abs_info\": {\n            \"1\": {\n                \"value\": 0,\n                \"minimum\": -512,\n                \"maximum\": 511,\n                \"fuzz\": 3,\n                \"flat\": 63,\n                \"resolution\": 0\n            },\n            \"5\": {\n                \"value\": 1,\n                \"minimum\": -32,\n                \"maximum\": 31,\n                \"fuzz\": 0,\n                \"flat\": 3,\n                \"resolution\": 78\n            },\n            \"17\": {\n                \"value\": 0,\n                \"minimum\": -1,\n                \"maximum\": 1,\n                \"fuzz\": 0,\n                \"flat\": 0,\n                \"resolution\": 0\n            },\n            \"16\": {\n                \"value\": 0,\n                \"minimum\": -1,\n                \"maximum\": 1,\n                \"fuzz\": 0,\n                \"flat\": 0,\n                \"resolution\": 0\n            },\n            \"0\": {\n                \"value\": 30,\n                \"minimum\": -512,\n                \"maximum\": 511,\n                \"fuzz\": 3,\n                \"flat\": 63,\n                \"resolution\": 0\n            },\n            \"6\": {\n                \"value\": 7,\n                \"minimum\": -64,\n                \"maximum\": 63,\n                \"fuzz\": 0,\n                \"flat\": 7,\n                \"resolution\": 0\n            }\n        },\n        \"properties\": []\n    }\n]\n```\n\n\u003c/details\u003e\n\n### remote-uinput-client\n\nThe client sends evdev events coming from selected device(s) over the network to the specified destination.\n\n```\n$ target/release/remote-uinput-client --help\nUsage: remote-uinput-client [OPTIONS] [COMMAND]\n\nCommands:\n  list-devices  List available input devices\n  help          Print this message or the help of the given subcommand(s)\n\nOptions:\n  -d, --destination \u003cDESTINATION\u003e        Destination IP:port (e.g., 127.0.0.1:9002)\n  -p, --device-by-path \u003cDEVICE_BY_PATH\u003e  Forward device with the given device path (can specify multiple)\n  -n, --device-by-name \u003cDEVICE_BY_NAME\u003e  Forward device with the given name (can specify multiple)\n      --device-by-phys \u003cDEVICE_BY_PHYS\u003e  Forward device with the given physical path (can specify multiple)\n      --device-by-usbid \u003cDEVICE_BY_USBID\u003e Forward device with the given USB ID e.g. 1234:5678 (can specify multiple)\n  -e, --exclusive                        Grab the device for exclusive input\n  -g, --generate-config                  Generate server configuration for selected devices\n  -h, --help                             Print help\n  -V, --version                          Print version\n```\n\nWhen there are multiple devices that match a selection like `--device-by-name`, they will all be shared. If this is unwanted use a more specific selection like `--device-by-path` or `--device-by-phys`.\n\nIt is intentionally possible to specify missing devices. These will be skipped, but will reserve an internal index slot. This makes it possible to specify devices at the server side that are not currently connected to the client.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaanwj%2Fremote-uinput-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaanwj%2Fremote-uinput-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaanwj%2Fremote-uinput-rs/lists"}