{"id":13719404,"url":"https://github.com/kevinconway/remouseable","last_synced_at":"2026-03-10T21:32:17.338Z","repository":{"id":44515778,"uuid":"216245996","full_name":"kevinconway/remouseable","owner":"kevinconway","description":"Use a reMarkable tablet as a mouse.","archived":false,"fork":false,"pushed_at":"2024-09-20T04:38:41.000Z","size":473,"stargazers_count":240,"open_issues_count":9,"forks_count":15,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-12-18T20:21:23.612Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","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/kevinconway.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2019-10-19T17:38:15.000Z","updated_at":"2025-12-01T20:57:17.000Z","dependencies_parsed_at":"2025-05-07T11:43:15.933Z","dependency_job_id":null,"html_url":"https://github.com/kevinconway/remouseable","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/kevinconway/remouseable","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinconway%2Fremouseable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinconway%2Fremouseable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinconway%2Fremouseable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinconway%2Fremouseable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kevinconway","download_url":"https://codeload.github.com/kevinconway/remouseable/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinconway%2Fremouseable/sbom","scorecard":{"id":557030,"data":{"date":"2025-08-11","repo":{"name":"github.com/kevinconway/remouseable","commit":"9ad73bb8929f05afc72651b02deb32e4f2c18070"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"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":"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":1,"reason":"Found 2/12 approved changesets -- score normalized to 1","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":"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":10,"reason":"no dangerous workflow patterns detected","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":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-workflow.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/pr-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tag-workflow.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/tag-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tag-workflow.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/tag-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tag-workflow.yaml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/tag-workflow.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tag-workflow.yaml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/tag-workflow.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tag-workflow.yaml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/kevinconway/remouseable/tag-workflow.yaml/master?enable=pin","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pr-workflow.yaml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/tag-workflow.yaml:10","Info: no jobLevel write permissions found"],"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":"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":"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:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE: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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.5.0 not signed: https://api.github.com/repos/kevinconway/remouseable/releases/176027280","Warn: release artifact v0.4.0 not signed: https://api.github.com/repos/kevinconway/remouseable/releases/39499544","Warn: release artifact v0.3.0 not signed: https://api.github.com/repos/kevinconway/remouseable/releases/28530916","Warn: release artifact v0.2.0 not signed: https://api.github.com/repos/kevinconway/remouseable/releases/21922560","Warn: release artifact v0.1.0 not signed: https://api.github.com/repos/kevinconway/remouseable/releases/20828831","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/kevinconway/remouseable/releases/176027280","Warn: release artifact v0.4.0 does not have provenance: https://api.github.com/repos/kevinconway/remouseable/releases/39499544","Warn: release artifact v0.3.0 does not have provenance: https://api.github.com/repos/kevinconway/remouseable/releases/28530916","Warn: release artifact v0.2.0 does not have provenance: https://api.github.com/repos/kevinconway/remouseable/releases/21922560","Warn: release artifact v0.1.0 does not have provenance: https://api.github.com/repos/kevinconway/remouseable/releases/20828831"],"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"28 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2022-0411 / GHSA-3839-6r69-m497 / GHSA-xg2h-wx96-xgxr","Warn: Project is vulnerable to: GO-2022-0635","Warn: Project is vulnerable to: GO-2022-0646","Warn: Project is vulnerable to: GO-2020-0017 / GHSA-w73w-5m7g-f7qc","Warn: Project is vulnerable to: GO-2025-3787 / GHSA-fv92-fjc5-jj9h","Warn: Project is vulnerable to: GO-2025-3372 / GHSA-6wxm-mpqj-6jpf","Warn: Project is vulnerable to: GO-2024-2947 / GHSA-v6v8-xj6m-xwqh","Warn: Project is vulnerable to: GO-2024-2567 / GHSA-fqpg-rq76-99pq","Warn: Project is vulnerable to: GO-2024-2606 / GHSA-mrww-27vc-gghv","Warn: Project is vulnerable to: GO-2021-0077 / GHSA-h6xx-pmxh-3wgp","Warn: Project is vulnerable to: GO-2020-0005 / GHSA-p4g4-wgrh-qrg2","Warn: Project is vulnerable to: GO-2024-2527","Warn: Project is vulnerable to: GHSA-2xhq-gv6c-p224","Warn: Project is vulnerable to: GHSA-wr2v-9rpq-c35q","Warn: Project is vulnerable to: GHSA-wf43-55jj-vwq8","Warn: Project is vulnerable to: GO-2024-2528","Warn: Project is vulnerable to: GO-2024-2529","Warn: Project is vulnerable to: GO-2024-2530","Warn: Project is vulnerable to: GO-2023-1572 / GHSA-qgc7-mgm3-q253","Warn: Project is vulnerable to: GO-2023-1990 / GHSA-j3p8-6mrq-6g7h","Warn: Project is vulnerable to: GO-2023-1989 / GHSA-x92r-3vfx-4cv3","Warn: Project is vulnerable to: GO-2024-2937 / GHSA-9phm-fm57-rhg8","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T12:38:26.462Z","repository_id":44515778,"created_at":"2025-08-20T12:38:26.462Z","updated_at":"2025-08-20T12:38:26.462Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30355637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:55:29.454Z","status":"ssl_error","status_checked_at":"2026-03-10T15:54:58.440Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":[],"created_at":"2024-08-03T01:00:48.100Z","updated_at":"2026-03-10T21:32:17.297Z","avatar_url":"https://github.com/kevinconway.png","language":"C","funding_links":[],"categories":["C","Other"],"sub_categories":["Template Builders"],"readme":"# reMouseable\n\n\u003e Use your reMarkable tablet as a mouse.\n\n- [reMouseable](#remouseable)\n  - [Update From September 19, 2024](#update-from-september-19-2024)\n  - [Overview](#overview)\n  - [Code And Developer Documentation](#code-and-developer-documentation)\n  - [Installation](#installation)\n    - [Windows](#windows)\n    - [OSX](#osx)\n    - [Linux](#linux)\n  - [Usage](#usage)\n    - [reMarkable 2 Tablets](#remarkable-2-tablets)\n    - [Wireless Tablet](#wireless-tablet)\n    - [Advanced SSH Setup](#advanced-ssh-setup)\n    - [All Options](#all-options)\n  - [Common Issues And Solutions](#common-issues-and-solutions)\n    - [OSX Privacy Settings](#osx-privacy-settings)\n    - [Getting \"panic: dial unix: missing address\" On Windows](#getting-panic-dial-unix-missing-address-on-windows)\n  - [Building](#building)\n    - [Linux](#linux-1)\n    - [OSX](#osx-1)\n    - [Windows](#windows-1)\n      - [Windows On Linux](#windows-on-linux)\n  - [How It Works](#how-it-works)\n  - [License](#license)\n  - [Developing](#developing)\n  - [Thanks](#thanks)\n\n## Update From September 19, 2024\n\nI somewhat recently had a one-off need to connect my tablet and run remouseable\nagain. Once my tablet installed the last few years of updates then I hit the\nsame issue as anyone else trying to use this project over the past year and a\nhalf to two years. I'm sharing the fix with folks in case someone finds it\nuseful but **remouseable is still discontinued**.\n\nRemousable was broken for long enough that I expect nearly everyone who once\nused it has moved on. If you start using it again or are considering using it\nfor the first time then I wish you the best. Please understand, though, that I\ndo not have time to support you if you need help or encounter an issue. I've\nleft the GitHub issues enabled so anyone using this can request or offer help to\nothers but I do not monitor the issues and will not respond to them myself.\n\nYou can download the fixed executables from\nhttps://github.com/kevinconway/remouseable/releases and follow this README's\ninstructions on how to install them. However, consider\nhttps://github.com/Evidlo/remarkable_mouse as a replacement that continued\nworking while remouseable was broken and continues to have people contributing\nto it. It also supports more features than this project such as multi-monitor\nsupport.\n\nIf you are a developer and want to add new features then please fork the\nproject. I've added GitHub actions workflows to automate building new\nexecutables and a [devcontainer](https://containers.dev/) to make running a fork\neven easier. If you maintain a fork with newer or better features than mine then\nI'm happy to add a link to your project here.\n\n## Overview\n\nI'm a user of the [reMarkable](https://remarkable.com/) tablet. After using it\nfor a while I started wondering if it could be used as an input for my\ncomputer so I could write and draw on digital whiteboards. It turns out, it can!\n\nThere's a great implementation of this feature written in Python at\n\u003chttps://github.com/Evidlo/remarkable_mouse\u003e. I'm working on this\nimplementation so that I can offer pre-built binaries that don't require a\nspecific language to be installed on the host machine.\n\n## Code And Developer Documentation\n\nThis README contains how-to information for installing, configuration, and using\nthe project. To view the code API documentation check out the\n[godocs](https://godoc.org/github.com/kevinconway/remouseable).\n\nIf you would like to modify the project or add a feature then see the technical\ndocumentation in the `technical-documentation` directory.\n\n## Installation\n\n### Windows\n\nGo to \u003chttps://github.com/kevinconway/remouseable/releases/latest\u003e and download\nthe file named `windows.exe`. Then rename the file to `remouseable.exe`. You\ncan now open the Windows command prompt and start the program with:\n\n```shell\ncd Downloads\nremouseable.exe\n```\n\nIf a new version of the program comes out then you can overwrite your\n`remouseable.exe` with a new version using exactly the same steps.\n\n### OSX\n\nGo to \u003chttps://github.com/kevinconway/remouseable/releases/latest\u003e and download\nthe file named `osx-arm` if using an M series model or `osx-amd` if using a\nmodel older than M1. Then rename the file to `remouseable`. Next, make the\nprogram runnable with by opening a command line prompt and:\n\n```shell\ncd ~/Downloads\nchmod +x remouseable\n```\n\nYou can now run the program by opening a command line prompt and:\n\n```shell\ncd ~/Downloads\n./remouseable\n```\n\nNote that the first time you run the application your system will prompt you\nwith a security notice. The remouseable application works by controlling your\nmouse and OSX does not allow this by default. To enable the application you\nmust grant your command line prompt accessibility settings which allow it to\nmove the mouse. To do this, navigate to\n`System Preferences -\u003e Security \u0026 Privacy -\u003e Privacy -\u003e Accessibility`. You will\nsee your terminal or shell in the list of applications that have requested\naccessibility permissions.\n\nIf you'd like to be able to launch the application through spotlight instead of\nonly the terminal then check out \u003chttps://github.com/isaacwisdom/reMouseableApp\u003e\nwhere another developer has created an Applscript wrapper that makes remouseable\nact more like a typical OSX application.\n\n### Linux\n\nGo to \u003chttps://github.com/kevinconway/remouseable/releases/latest\u003e and download\nthe file named `linux`. Then rename the file to `remouseable`. Next, make the\nprogram runnable with by opening a command line prompt and:\n\n```shell\ncd ~/Downloads\nchmod +x remouseable\n```\n\nYou can now run the program by opening a command line prompt and:\n\n```shell\ncd ~/Downloads\n./remouseable\n```\n\nNote that project only works in an X11 environment. If your system uses Wayland\nthen touching the tablet with the mouse will result in a remote desktop prompt\ndue to something related to Wayland's X11 backwards compatibility choices. Even\nif you allow the connection the application will not work correctly. Some forum\nthreads such as [this](https://discussion.fedoraproject.org/t/fedora-39-keeps-spaming-confirmation-remote-desktop-window/98323)\nor [this](https://discussion.fedoraproject.org/t/getting-spammed-with-remote-desktop-connection-window/115561)\nmay provide some help but Wayland is technically not supported.\n\n## Usage\n\nMost settings default to the correct values. The only value you should need to\nset in the common case is the SSH password for the tablet. This password value\nis found in the settings menu under `Help` and then `Copyrights and licenses`.\nYour password will be near the bottom of the page. If you have an older tablet\nthat has not been updated to the latest software then your password may be\nfound in the `About` tab of the tablet menu at the bottom of the `General\nInformation` section. You may either give the password as text with\n\n```bash\nremouseable --ssh-password=\"XYZ123\"\n```\n\nor you may choose to have a password prompt with:\n\n```bash\nremouseable --ssh-password=\"-\"\n```\n\nRun one of these commands with your device connected over USB and your stylus\nwill become a mouse. The stylus is actually active _before_ it touches the\nscreen. This means you can see your mouse move by hovering the stylus just above\nthe writing surface but without directly touching the tablet. Once you touch the\ntablet surface with the stylus the computer mouse will click and hold down the\nleft mouse button while you write or draw and then release the button when you\nlift the stylus.\n\n### reMarkable 2 Tablets\n\nThe application should work with both reMarkable and reMarkable 2 tablets.\nHowever, the reMarkable 2 requires that you add\n`--event-file /dev/input/event1` when executing because of a slight change in\nwhere the stylus events are written in the new tablets. The full command should\nlook like\n`remousable --ssh-password=\"MYPASSWORD\" --event-file=\"/dev/input/event1\"`.\n\n### Wireless Tablet\n\nThe default expectation is that you will have your tablet connected over USB\nwhich makes the default `10.11.99.1` address available. However, it is also\npossible to access your device over wifi. If you attempt this method then you\nwill need to arrange for a static, or at least consistent, IP address for the\ntablet. This is something you can usually do through configuring your router to\nassign a fixed IP address to the device based on the hardware MAC address.\n\nIf you cannot assign the same `10.11.99.1` address in your setup then you may\noverride the default IP address when running the application:\n\n### Advanced SSH Setup\n\nBy default, the tablet only accepts the root password for authentication. It is\npossible, though, to install a custom public key on the device so that you can\nuse either password-less authentication or use a key pair that is encrypted with\nthe password of your choice rather than the device's default password.\n\nIf you'd like to create a key pair especially for accessing the reMarkable\ntablet then start with a guide like\n\u003chttps://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent\u003e\nthat walks through creating a new key pair and registering it with your SSH\nagent. For even more advanced SSH users, such as those using the gpg-agent as\nthe SSH agent, the remouseable application will talk to any valid SSH agent\nimplementation so long as the `SSH_AUTH_SOCK` value is set correctly.\n\nOnce you have a key pair ready, copy the public key value from `ssh-add -L` for\nthe key you want to use. Then copy the key over to your tablet with:\n\n```bash\nssh root@10.11.99.1 # This will prompt for password.\nmkdir -p ~/.ssh # This directory does not exist by default.\necho 'INSERT YOUR PUBLIC KEY HERE' \u003e\u003e ~/.ssh/authorized_keys\n```\n\nNow future connections over SSH will leverage your key pair and you can omit\nthe usual password flag when running the application.\n\nNote that windows builds cannot use this option due to incompatibilities with\nthe current version of the windows ssh-agent.\n\nNote that if you encounter the `Invalid MIT-MAGIC-COOKIE-1 key` error it means\nthat most likely the ssh fingerprint of the device might have changed to an\nupdate of the tablet OS. Follow the ssh suggestion of removing the outdated\nfingerprint then if you are satisfied that your device is indeed the right one\ntry connecting again.\n\n```bash\nremouseable --ssh-ip=\"192.168.1.110:22\" # or other IP\n```\n\n### All Options\n\n```\n$ remouseable -h\nUsage of remouseable:\n      --debug-events             Stream hardware events from the tablet instead of acting as a mouse. This is for debugging.\n      --disable-drag-event       Disable use of the custom OSX drag event. Only use this drawing on an Apple device is not working as expected.\n      --event-file string        The path on the tablet from which to read evdev events. Probably don't change this. (default \"/dev/input/event0\")\n      --orientation string       Orientation of the tablet. Choices are vertical, right, and left (default \"right\")\n      --pressure-threshold int   Change the click detection sensitivity. 1000 is when the pen makes contact with the tablet. Set higher to require more pen pressure for a click. (default 1000)\n      --screen-height int        The max units per millimeter of the host screen height. Probably don't change this. (default 1080)\n      --screen-width int         The max units per millimeter of the host screen width. Probably don't change this. (default 1920)\n      --ssh-ip string            The host and port of a tablet. (default \"10.11.99.1:22\")\n      --ssh-password string      An optional password to use when ssh-ing into the tablet. Use - for a prompt rather than entering a value. If not given then public/private keypair authentication is used.\n      --ssh-socket string        Path to the SSH auth socket. This must not be empty if using public/private keypair authentication.\n      --ssh-user string          The ssh username to use when logging into the tablet. (default \"root\")\n      --tablet-height int        The max units per millimeter for the hight of the tablet. Probably don't change this. (default 15725)\n      --tablet-width int         The max units per millimeter for the width of the tablet. Probably don't change this. (default 20967)\npflag: help requested\nexit status 2\n```\n\n## Common Issues And Solutions\n\n### OSX Privacy Settings\n\nIf you are using this on an Apple or OSX device then you will need to give the\nterminal or shell you are using permissions to control your mouse. Mouse\npermissions are treated as an accessibility feature. If you are not prompted by\nthe operating system to update your permissions the first time you run the\napplication then you can navigate to\n`System Preferences -\u003e Security \u0026 Privacy -\u003e Privacy -\u003e Accessibility`. You will\nsee your terminal or shell in the list of applications that have requested\naccessibility permissions.\n\n### Getting \"panic: dial unix: missing address\" On Windows\n\nThis error message happens most often when the `--ssh-password` flag is missing\nwhen running the application. On Windows, you must run the application with\neither `remouseable.exe --ssh-password=\"MYPASSWORD\"` or\n`remouseable.exe --ssh-password=\"-\"`.\n\n## Building\n\nThere are pre-built binaries attached to each release that should work for all\n64bit versions of linux, osx, and windows. However, if you prefer to generate\nyour own build then the following sections detail building a binary on\ndifferent platforms.\n\n### Linux\n\nLinux builds are dependent on:\n\n- gcc\n- x11 dev headers\n- xtst dev headers\n- xorg dev headers\n\nThese package will vary by name depending on your chosen linux distro. Debian\nand Ubuntu users can install these with:\n\n```shell\napt-get install -y gcc libc6-dev libx11-dev xorg-dev libxtst-dev\n```\n\nFrom there you run `make build`.\n\n### OSX\n\nOSX builds will require xcode and the xcode command line tools. These must be\ninstalled through the Apple store.\n\nBeyond xcode the build also requires installing support for gnu make if you want\nto use the Makefile for generating a build. Homebrew users can install this\nwith:\n\n```shell\nbrew install make coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep\nexport PATH=\"$(brew --prefix)/opt/make/libexec/gnubin:${PATH}\"\n```\n\nFrom there you run `make build`.\n\n### Windows\n\nWindows builds require a GCC implementation. I recommend\n\u003chttps://jmeubank.github.io/tdm-gcc/\u003e. During installation you will be given the\noption to add the GCC install to your path. If you choose not to then you will\nneed to temporarily add it to your path in PowerShell with:\n\n```shell\n$env:Path += \";C:\\TDM-GCC-64\\bin\\\"\n```\n\nThe included Makefile contains too many bash specific commands to work in\nPowerShell but you can still generate a binary by running:\n\n```shell\ngo build main.go\n```\n\n#### Windows On Linux\n\nIf you want to generate a windows build from a linux machine then you will need\nto install a MinGW implementation. Debian and Ubuntu users can do this with:\n\n```shell\napt-get install -y gcc-multilib gcc-mingw-w64\n```\n\nThe included Makefile does not have a build option for this but you can generate\nthe binary with:\n\n```shell\nCC=x86_64-w64-mingw32-gcc GOOS=windows go build main.go\n```\n\n## How It Works\n\nThe project is implemented as a set of successive layers that turn the tablet\ninto a mouse. It follows as:\n\n-   SSH into the device and start streaming `evdev` data back to the host.\n-   Convert the raw byte stream into structured `evdev` data containers.\n-   Feed all events into a state machine that emits higher level state change\n    events like \"CLICK\" and \"MOVE\".\n-   Use state change events as a trigger for moving or clicking the mouse\n    on the host machine.\n\nEach of these layers has an interface defined in the `pkg/domain.go` file.\n\nThe mouse interactions on the host are performed by using a modified version of\n\u003chttps://github.com/go-vgo/robotgo\u003e. The `pkg/internal/robotgo` directory\ncontains a stripped down version of `robotgo` that contains only the portions\nrequired to detect the screen dimensions and send mouse events. The actual\n`robotgo` project contains support for a much larger set of features such as\ntaking screen shots and controlling windows on the screen. However, each of\nthose additional features comes with additional system dependencies that make\ncreating a portable binary build difficult.\n\n## License\n\n    remouseable is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License version 3 as published\n    by the Free Software Foundation.\n\n    remouseable is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with remouseable.  If not, see \u003chttps://www.gnu.org/licenses/\u003e\n\n## Developing\n\nThis project is go1.16+ compatible. A Makefile is included to make some things\neasier. Some make targets of note:\n\n-   make generate\n\n    Re-generate any automatically generated code. Note that there is a gomock\n    bug making it necessary to manually modify the files after generation\n    because it adds a cyclical import.\n\n-   make test\n\n    Run all the unit tests and generate a coverage report in `.coverage/`.\n\n-   make lint\n\n    Run the golangci-lint suite using the included configuration.\n\n-   make fmt\n\n    Apply `goimports` formatting.\n\n-   make build\n\n    Generate a binary from the current project state.\n\n-   make tools\n\n    Generate a `.bin/` directory that contains a built version of each of the\n    tools used to build and test the project.\n\n-   make update / make updatetools\n\n    Run `go get -u` for the project or for the project tooling.\n\n-   make clean / make cleantools / make cleancoverage\n\n    Remove files generated by the Makefile. The top-level `clean` should remove\n    all artifacts such as `./bin` and `./coverage`. The other are scoped to\n    specific artifacts for cases where, for example, you want to remove old\n    coverage reports and regenerate them.\n\n## Thanks\n\nI used the \u003chttps://github.com/gvalkov/golang-evdev\u003e project as a reference when\nimplementing the `evdev` parser. I didn't use it directly because it is very\nmuch oriented towards directly opening and managing a file descriptor for a\ndevice. This project needs to read data from a remote device.\n\nI used the \u003chttps://github.com/go-vgo/robotgo\u003e project as the basis for\ninteracting with the operating system. I embedded portions of it here instead\nof importing the Go package in order to limit the number of dependencies\nrequired to build the project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinconway%2Fremouseable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkevinconway%2Fremouseable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinconway%2Fremouseable/lists"}