{"id":13772096,"url":"https://github.com/owulveryck/goMarkableStream","last_synced_at":"2025-05-11T04:31:13.545Z","repository":{"id":38886477,"uuid":"323294781","full_name":"owulveryck/goMarkableStream","owner":"owulveryck","description":"A utility to stream (and record) from a Remarkable2 without hack or third party dependencies","archived":false,"fork":false,"pushed_at":"2025-03-03T14:29:46.000Z","size":26994,"stargazers_count":647,"open_issues_count":27,"forks_count":26,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-04-05T02:07:56.776Z","etag":null,"topics":["golang","hacktoberfest","remarkable-tablet"],"latest_commit_sha":null,"homepage":"","language":"Go","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/owulveryck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":["owulveryck"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2020-12-21T09:54:37.000Z","updated_at":"2025-04-04T17:53:03.000Z","dependencies_parsed_at":"2022-09-01T12:21:09.916Z","dependency_job_id":"3eab8632-04ef-4ad8-ae77-ce71d1a9dfd5","html_url":"https://github.com/owulveryck/goMarkableStream","commit_stats":{"total_commits":350,"total_committers":8,"mean_commits":43.75,"dds":0.0714285714285714,"last_synced_commit":"087878dfbd8d7f432c6010f5d260f99fae2fa916"},"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owulveryck%2FgoMarkableStream","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owulveryck%2FgoMarkableStream/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owulveryck%2FgoMarkableStream/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owulveryck%2FgoMarkableStream/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/owulveryck","download_url":"https://codeload.github.com/owulveryck/goMarkableStream/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253518941,"owners_count":21921074,"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","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":["golang","hacktoberfest","remarkable-tablet"],"created_at":"2024-08-03T17:00:59.933Z","updated_at":"2025-05-11T04:31:08.528Z","avatar_url":"https://github.com/owulveryck.png","language":"Go","funding_links":["https://github.com/sponsors/owulveryck"],"categories":["remarkable-tablet","Screen Sharing/Streaming","Go"],"sub_categories":["Template Builders"],"readme":"[![Go](https://github.com/owulveryck/goMarkableStream/actions/workflows/go.yml/badge.svg)](https://github.com/owulveryck/goMarkableStream/actions/workflows/go.yml)\n![Static Badge](https://img.shields.io/badge/reMarkable-Compatible_with_FW_3.9-green)\n\n# goMarkableStream\n\n![poster](docs/goMarkableStream.png)\n\n## Overview\n\nThe goMarkableStream is a lightweight and user-friendly application designed specifically for the reMarkable tablet.\n\nIts primary goal is to enable users to stream their reMarkable tablet screen to a web browser without the need for any hacks or modifications that could void the warranty.\n\n## Version support\n\n- reMarkable with firmware \u003c 3.4 may use goMarkableStream version \u003c 0.8.6\n- reMarkable with firmware \u003e= 3.4 and \u003c 3.6 may use version \u003e= 0.8.6 and \u003c 0.11.0\n- reMarkable with firmware \u003e= 3.6 may use version \u003e= 0.11.0\n\n## Features\n\n- **No Warranty Voiding**: Operates within the reMarkable tablet's intended functionality without unauthorized modifications.\n- **No Subscription Required**: Completely free to use, with no subscription fees or recurring charges.\n- **No Client-Side Installation**: Access the screen streaming feature directly through a web browser, with no need for additional software or plugins.\n- **Color Support**: Enhanced streaming experience with color support.\n- **High Performance**: Utilizes WebGL for smooth and efficient performance.\n- **Laser Pointer**: Features a laser pointer that activates on hovering.\n- **Gesture Support**: Full integration with Reveal.js, allowing slide switching directly from the reMarkable.\n- **Overlay Feature**: Allows overlaying over existing websites that support iframe embedding.\n- **Built-in Ngrok**: Enables streaming over different networks easily.\n- **Live Parameter Tweaking**: Side menu for live adjustments, including screen rotation.\n\n## Quick Start\n\n```bash\nlocalhost\u003e ssh root@remarkable\n```\n\nFor version \u003e= 3.6 \n\n```bash\nexport GORKVERSION=$(wget -q -O - https://api.github.com/repos/owulveryck/goMarkableStream/releases/latest | grep tag_name | awk -F\\\" '{print $4}')\nwget -q -O - https://github.com/owulveryck/goMarkableStream/releases/download/$GORKVERSION/goMarkableStream_${GORKVERSION//v}_linux_arm.tar.gz | tar xzvf - -O goMarkableStream_${GORKVERSION//v}_linux_arm/goMarkableStream \u003e goMarkableStream\nchmod +x goMarkableStream\n./goMarkableStream\n```\n\nfor version \u003c 3.6\n\n```bash\nexport GORKVERSION=$(curl -s https://api.github.com/repos/owulveryck/goMarkableStream/releases/latest | grep tag_name | awk -F\\\" '{print $4}')\ncurl -L -s https://github.com/owulveryck/goMarkableStream/releases/download/$GORKVERSION/goMarkableStream_${GORKVERSION//v}_linux_arm.tar.gz | tar xzvf - -O goMarkableStream_${GORKVERSION//v}_linux_arm/goMarkableStream \u003e goMarkableStream\n~/chmod +x goMarkableStream\n./goMarkableStream\n```\n\nthen go to [https://remarkable.local.:2001](https://remarkable.local.:2001) and login with `admin`/`password` (can be changed through environment variables or disable authentication with `-unsafe`)\n\n_note_: _remarkable.local._ may work from apple devices (mDNS resolution).\nPlease note the `.` at the end.\nIf it does not work, you may need to replace `remarkable.local.` by the IP address of the tablet.\n\n_note 2_: you can use this to update to a new version (ensure that you killed the previous version before with `kill $(pidof goMarkableStream)`)\n\n## Setup goMarkableStream as a systemd service\n\nThis section explains how to set up goMarkableStream as a system service that will stay running through\ndevice restart and sleep. Note, however, this setup script will need to be executed \nfor any reMarkable system update/installation. \n\nFirst, we'll write the script, saving it to the home directory. Then, we'll execute the script which performs all\nsetup necessary to register goMarkableStream as a system service. It can be executed after every system update.\nNote, this script assumes the goMarkableStream executable exists in the home directory.\n\n```bash\nlocalhost\u003e ssh root@remarkable\n```\n\nCreate a bash script under the home directory:\n```bash\ntouch setupGoMarkableStream.sh\nchmod +x setupGoMarkableStream.sh\n```\n\nThen open the file in nano:\n```bash\nnano setupGoMarkableStream.sh\n```\n\nFinally, paste (ctrl-shift-v) the following into the nano editor. Then save and quit (ctrl-X, Y, [enter]).\n```bash\npushd /etc/systemd/system\ntouch goMarkableStream.service\n\ncat \u003c\u003cEOF\u003egoMarkableStream.service\n[Unit]\nDescription=Go Remarkable Stream Server\n\n[Service]\nExecStart=/home/root/goMarkableStream\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsystemctl enable goMarkableStream.service\nsystemctl start goMarkableStream.service\nsystemctl status goMarkableStream.service\npopd\n```\n\nExecuting setupGoMarkableStream.sh will register the goMarkableStream executable as a systemd service!\n\n## Configurations\n\n### Device Configuration\nConfigure the application via environment variables:\n- `RK_SERVER_BIND_ADDR`: (String, default: `:2001`) Server bind address.\n- `RK_SERVER_USERNAME`: (String, default: `admin`) Username for server access.\n- `RK_SERVER_PASSWORD`: (String, default: `password`) Password for server access.\n- `RK_HTTPS`: (True/False, default: `true`) Enable or disable HTTPS.\n- `RK_COMPRESSION`: (True/False, default: `false`) Enable or disable compression.\n- `RK_DEV_MODE`: (True/False, default: `false`) Enable or disable developer mode.\n\n### Endpoint Configuration\nAdd query parameters to the URL (`?parameter=value\u0026otherparameter=value`):\n- `color`: (true/false) Enable or disable color.\n- `portrait`: (true/false) Enable or disable portrait mode.\n- `rate`: (integer, 100-...) Set the frame rate.\n- `flip`: (true/false) Enable or disable flipping 180 degree.\n\n## Tunneling\nTunneling with built-in Ngrok allows for streaming across different networks.\nThis feature is particularly useful for remote presentations or collaborative sessions.\nTo set up tunneling, simply enable Ngrok in the tool's settings and follow the instructions provided in the user interface.\n\nIf your reMarkable is on a different network than the displaying device, you can use the `ngrok` builtin feature for automatic tunneling.\nTo utilize this tunneling, you need to sign up for an ngrok account and [obtain a token from the dashboard](https://dashboard.ngrok.com/get-started/your-authtoken).\nOnce you have the token, launch reMarkable using the following command:\n\n`NGROK_AUTHTOKEN=YOURTOKEN RK_SERVER_BIND_ADDR=ngrok ./goMarkableStream`\n\nThe app will start, displaying a message similar to:\n\n`2023/09/29 16:49:20 listening on 72e5-22-159-32-48.ngrok-free.app` \n\nThen, connect to `https://72e5-22-159-32-48.ngrok-free.app` to view the result.\n\n\n## Presentation Mode\n`goMarkableStream` introduces an innovative experimental feature that allows users to set a presentation or video in the background, enabling live annotations using a reMarkable tablet.\nThis feature is ideal for enhancing presentations or educational content by allowing dynamic, real-time interaction.\n\n### How It Works\n\n- To use this feature, append `?present=https://url-of-the-embedded-file` to your streaming URL.\n- This action will embed your chosen presentation or video in the stream's background.\n- You can then annotate or draw on the reMarkable tablet, with your input appearing over the embedded content in the stream.\n\n### Usage Example\n\n- **Live Presentation Enhancement**: For instance, using Google Slides, you can leave spaces in your slides or use a blank slide to write additional content live.\nThis feature is perfect for educators, presenters, and anyone looking to make their presentations more interactive and engaging.\n\n![](docs/gorgoniaExample.png)\n\n### Compatibility\n\n- The feature works with any content that can be embedded in an iframe.\nThis includes a variety of presentation and video platforms.\n- Ensure that the content you wish to embed allows iframe integration.\n\n`goMarkableStream` is fully integrated with Reveal.js, making it a perfect tool for presentations.\nSwitch slides or navigate through your presentation directly from your reMarkable tablet.\nThis seamless integration enhances the experience of both presenting and viewing, making it ideal for educational and professional environments.\n\nHowto: add the `?present=https://your-reveal-js-presentation`\n\n_note_: due to browser restrictions, the URL mus\n\n### Limitations and Performance\n\n- **Screen Size**: Currently, the drawing screen size on the tablet is smaller than the presentations, which may affect how content is displayed.\n- **Control**: There is no way to control the underlying presentation directly from the tablet.\nUsers must use the side menu for navigation and control.\n- This feature operates seamlessly, with no additional load on the reMarkable tablet, as all rendering is done in the client's browser.\n\n### Feedback and Contributions\n\n- As this is an experimental feature, your feedback is crucial for its development.\nPlease share your experiences, suggestions, and any issues encountered using the GitHub issues section of this repository.\n\n---\n\n## Technical Details\n\nThis tool suits my need and is an ongoing development. You can find various informations about the journey on my blog:\n- [Streaming the reMarkable 2](https://blog.owulveryck.info/2021/03/30/streaming-the-remarkable-2.html)\n- [Evolving the Game: A clientless streaming tool for reMarkable 2](https://blog.owulveryck.info/2023/07/25/evolving-the-game-a-clientless-streaming-tool-for-remarkable-2.html)\n\n### Remarkable HTTP Server\n\nThis is a standalone application that runs directly on a Remarkable tablet.\nIt does not have any dependencies on third-party libraries, making it a completely self-sufficient solution.\nThis application exposes an HTTP server with two endpoints:\n### Endpoints \n\n- `/`: This endpoint serves an embedded HTML and JavaScript file containing the necessary logic to display an image from the Remarkable tablet on a client's web browser.\n\n- `/stream`: This endpoint streams the image data from the Remarkable tablet to the client continuously.\n- `/events`: This endpoint streams the pen input events via websockets\n- `gestures`: This endpoints streams the touch events in binary\n\n**Caution**: the API may change over time\n\n### Implementation\n\nThe image data is read directly from the main process's memory as a byte array.\nA simple Run-Length Encoding (RLE) compression algorithm is applied on the tablet to reduce the amount of data transferred between the tablet and the browser.\n\nThe CPU footprint is relatively low, using about 10% of the CPU for a frame every 200 ms.\nYou can increase the frame rate, but it will consume slightly more CPU.\n\nOn the client side, the streamed byte data is decoded and displayed on a canvas by addressing the backend array through WebGL.\n\nAdditionally, the application features a side menu which allows users to rotate the displayed image.\nAll image transformations utilize native browser implementations, providing optimized performance.\n\n## Compilation\n\n```bash\nGOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=0 go build -v -trimpath -ldflags=\"-s -w\" .\n```\n\nto install and run, you can then execute:\n\n```bash\nscp goMarkableStream root@remarkable:\nssh root@remarkable ./goMarkableStream\n```\n\n## Contributing\n\nI welcome contributions from the community to improve and enhance the reMarkable Screen Streaming Tool.\nIf you have any ideas, bug reports, or feature requests, please submit them through the GitHub repository's issue tracker.\n\n## License\n\nThe reMarkable Screen Streaming Tool is released under the [MIT License](https://opensource.org/licenses/MIT) .\nFeel free to modify, distribute, and use the tool in accordance with the terms of the license.\n\n## Tipping\n\nIf you plan to buy a reMarkable 2, you can use my [referal program link](https://remarkable.com/referral/PY5B-PH8U).\nIt will provide a discount for you and also for me.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowulveryck%2FgoMarkableStream","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fowulveryck%2FgoMarkableStream","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowulveryck%2FgoMarkableStream/lists"}