{"id":31882657,"url":"https://github.com/maxbla/gel-o","last_synced_at":"2026-05-17T09:48:47.159Z","repository":{"id":57633410,"uuid":"262454998","full_name":"maxbla/gel-o","owner":"maxbla","description":"Provides a Iterator interface to Linux InputEvents","archived":false,"fork":false,"pushed_at":"2021-07-28T18:54:14.000Z","size":60,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-05T00:43:52.880Z","etag":null,"topics":["evdev","linux","rust-library"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxbla.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-Apache","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-09T00:19:59.000Z","updated_at":"2024-10-26T23:38:50.000Z","dependencies_parsed_at":"2022-08-31T13:22:08.809Z","dependency_job_id":null,"html_url":"https://github.com/maxbla/gel-o","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/maxbla/gel-o","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbla%2Fgel-o","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbla%2Fgel-o/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbla%2Fgel-o/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbla%2Fgel-o/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxbla","download_url":"https://codeload.github.com/maxbla/gel-o/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbla%2Fgel-o/sbom","scorecard":{"id":628935,"data":{"date":"2025-08-11","repo":{"name":"github.com/maxbla/gel-o","commit":"d6fcdd1ea6d59700cecec8a0ae094d8c38bc146d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE-Apache:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE-Apache:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-21T07:17:25.823Z","repository_id":57633410,"created_at":"2025-08-21T07:17:25.823Z","updated_at":"2025-08-21T07:17:25.823Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279014031,"owners_count":26085348,"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-10-13T02:00:06.723Z","response_time":61,"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":["evdev","linux","rust-library"],"created_at":"2025-10-13T02:56:10.659Z","updated_at":"2025-10-13T02:56:17.449Z","avatar_url":"https://github.com/maxbla.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gel-O\n\nGel-O is a library that provides a `std::iter::Iterator` interface over Linux `InputEvent`s. You can map, filter and loop over input events without dealing with the low-level details of obtaining those events.\n\nGel-O is so named for examples/delay.rs, which delays all user input, making a computer feel like Jell-O.\n\n# Stability\n\nGel-O is experimental. Expect many breaking changes to come.\n\n## Similar crates\n\n- [evdev](https://github.com/emberian/evdev)\n    - A pure-rust Iterator over `InputEvents`, with no support for writing to devices (simulating user input).\n- [evdev-rs](https://github.com/ndesh26/evdev-rs)\n    - Low-level safe bindings to [libevdev](https://www.freedesktop.org/wiki/Software/libevdev/). Gel-O is built atop evdev-rs.\n\n## Requirements\n\n- Linux\n    - epoll (Linux 2.6.27+)\n    - kernel supporting evdev (~ 2.4+)\n- Rust toolchain\n    - version 1.40 or higher\n    - cargo\n- Transitive dependencies\n    - C toolchain\n    - autoconf and libtool\n        - `#apt install autoconf libtool`\n        - `#yum install autoconf libtool`\n        - `#pacman -S autoconf libtool`\n\nmacOS and Windows are not supported and support is not planned. BSD support may be easy to add, as evdev was recently added to FreeBSD.\n\n## FAQ\n\n- How does it work?\n    - Gel-O monitors device files in `/dev/input`, reading `InputEvents` lazily only when user code calls `.next()`.\n- Does it work when using the [Wayland Display Server Protocol](https://wayland.freedesktop.org/)?\n    - Yes. Gel-O works everywhere linux does - on Xorg, Wayland, and even the Linux virtual terminal\n- What is the computational overhead of Gel-O?\n    - Gel-O is pretty leightweight. Most of the examples use around 1MB of RAM. Mouse movement is smooth on low-power devices (such as Raspberry Pi) due to efficient epoll-based architecture. On raspberry pi 3, expect Gel-O to use ~2% CPU during rapid mouse movement and 0% otherwise.\n- What devices does Gel-O work with?\n    - Gel-O works with every input device Linux does because Gel-O operates just above the driver level. Gel-O has been tested specifically with mice, keyboards, power buttons and gamepads.\n- What happens if I unplug my device and plug it back in?\n    - Gel-O detects new devices being plugged in, and starts monitoring them. Unplugging and plugging in might mean a few events are lost, but everything will continue smoothly after that loss.\n\n## Limitations\n\n- Requires read/write access to files in `/dev/input` and the file `/dev/uinput`\n    - This can be acomplished by running as root (sudo)\n\n## Developing\n\nDownload the source\n```\ngit clone [this repo]\n```\nCompile the source. You need a rust toolchain and cargo.\n```\ncargo build --release --example delay\n```\nRun the produced binary with root privledges\n```\nsudo ./target/release/examples/delay [number of ms to delay]\n```\nmake changes to source files. Before committing, run `checks.sh` (this checks formatting and for compiler warnings) and test you changes locally\n```\n./checks.sh \u0026\u0026 cargo test --no-run \u0026\u0026 sudo --preserve-env cargo test\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbla%2Fgel-o","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxbla%2Fgel-o","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbla%2Fgel-o/lists"}