{"id":13461581,"url":"https://github.com/maxmcd/webtty","last_synced_at":"2025-12-14T23:28:44.107Z","repository":{"id":33270670,"uuid":"156137543","full_name":"maxmcd/webtty","owner":"maxmcd","description":"Share a terminal session over WebRTC","archived":false,"fork":false,"pushed_at":"2024-12-11T22:46:02.000Z","size":1864,"stargazers_count":2788,"open_issues_count":18,"forks_count":147,"subscribers_count":47,"default_branch":"master","last_synced_at":"2025-10-11T03:15:26.407Z","etag":null,"topics":["golang","pion-webrtc","tty","tunnel","webrtc","webrtc-experiments","xtermjs"],"latest_commit_sha":null,"homepage":"https://maxmcd.github.io/webtty/","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/maxmcd.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}},"created_at":"2018-11-05T00:06:08.000Z","updated_at":"2025-10-10T13:45:52.000Z","dependencies_parsed_at":"2024-01-06T01:03:18.691Z","dependency_job_id":"94715998-3038-4b2c-907d-e41612a72ae0","html_url":"https://github.com/maxmcd/webtty","commit_stats":{"total_commits":45,"total_committers":10,"mean_commits":4.5,"dds":"0.28888888888888886","last_synced_commit":"61c30d00e701b2721906494aae244563d9f4c195"},"previous_names":["maxmcd/webrtty"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/maxmcd/webtty","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxmcd%2Fwebtty","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxmcd%2Fwebtty/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxmcd%2Fwebtty/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxmcd%2Fwebtty/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxmcd","download_url":"https://codeload.github.com/maxmcd/webtty/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxmcd%2Fwebtty/sbom","scorecard":{"id":629749,"data":{"date":"2025-08-11","repo":{"name":"github.com/maxmcd/webtty","commit":"0be9e2457ecf6cbe34b972bd421db3c5962cc3f9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Code-Review","score":3,"reason":"Found 7/22 approved changesets -- score normalized to 3","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yaml:1","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":"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":"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/test.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/maxmcd/webtty/test.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/maxmcd/webtty/test.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/maxmcd/webtty/test.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/maxmcd/webtty/test.yaml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/test.yaml:46","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand 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":"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: MIT License: 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.1 not signed: https://api.github.com/repos/maxmcd/webtty/releases/64666071","Warn: release artifact v0.4.1 not signed: https://api.github.com/repos/maxmcd/webtty/releases/35890594","Warn: release artifact v0.3.0 not signed: https://api.github.com/repos/maxmcd/webtty/releases/22228272","Warn: release artifact v0.2.0 not signed: https://api.github.com/repos/maxmcd/webtty/releases/18000421","Warn: release artifact v0.5.1 does not have provenance: https://api.github.com/repos/maxmcd/webtty/releases/64666071","Warn: release artifact v0.4.1 does not have provenance: https://api.github.com/repos/maxmcd/webtty/releases/35890594","Warn: release artifact v0.3.0 does not have provenance: https://api.github.com/repos/maxmcd/webtty/releases/22228272","Warn: release artifact v0.2.0 does not have provenance: https://api.github.com/repos/maxmcd/webtty/releases/18000421"],"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 24 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":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"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-21T07:30:09.125Z","repository_id":33270670,"created_at":"2025-08-21T07:30:09.125Z","updated_at":"2025-08-21T07:30:09.125Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27739142,"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-12-14T02:00:11.348Z","response_time":56,"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":["golang","pion-webrtc","tty","tunnel","webrtc","webrtc-experiments","xtermjs"],"created_at":"2024-07-31T11:00:45.501Z","updated_at":"2025-12-14T23:28:44.084Z","avatar_url":"https://github.com/maxmcd.png","language":"Go","readme":"![](https://raw.githubusercontent.com/maxmcd/webtty/70f7911f4e69dffe3eb3cfd6ad9dd8060dc10dd5/out.gif)\n\n## WebTTY\n\nWebTTY allows you to share a terminal session from your machine using WebRTC. You can pair with a friend without setting up a proxy server, debug servers behind NATs, and more. WebTTY also works in-browser. You can connect to a WebTTY session from this static page:  [https://maxmcd.github.io/webtty/](https://maxmcd.github.io/webtty/)\n\n### Status\n\nThere are a handful of bugs to fix, but everything works pretty well at the moment. Please open an issue if you find a bug.\n\n### Installation\n\nDownload a binary from the releases page: https://github.com/maxmcd/webtty/releases\n\nOr, install directly with Go. WebTTY requires Go version 1.9 or higher.\n\nFor Go versions below 1.7:\n```bash\ngo get -u github.com/maxmcd/webtty\n```\n\nFor Go versions 1.7 and up:\n```bash\ngo install github.com/maxmcd/webtty@latest\n```\n\n\nThere were recent breaking api changes in the pion/webrtc library. Make sure to run `go get -u github.com/pion/webrtc` if you're running into any installation errors.\n\n### Running\n\n```shell\n\u003e webtty -h\nUsage of webtty:\n  -cmd\n        The command to run. Default is \"bash -l\"\n        Because this flag consumes the remainder of the command line,\n        all other args (if present) must appear before this flag.\n        eg: webtty -o -v -ni -cmd docker run -it --rm alpine:latest sh\n  -ni\n        Set host to non-interactive\n  -non-interactive\n        Set host to non-interactive\n  -o    One-way connection with no response needed.\n  -s string\n        The stun server to use (default \"stun:stun.l.google.com:19302\")\n  -v    Verbose logging\n```\n\n#### On the host computer\n\n```shell\n\u003e webtty\nSetting up a WebTTY connection.\n\nConnection ready. Here is your connection data:\n\n25FrtDEjh7yuGdWMk7R9PhzPmphst7FdsotL11iXa4r9xyTM4koAauQYivKViWYBskf8habEc5vHf3DZge5VivuAT79uSCvzc6aL2M11kcUn9rzb4DX4...\n\nPaste it in the terminal after the webtty command\nOr in a browser: https://maxmcd.github.io/webtty/\n\nWhen you have the answer, paste it below and hit enter.\n```\n\n#### On the client computer\n\n```shell\n\u003e webtty 25FrtDEjh7yuGdWMk7R9PhzPmphst7FdsotL11iXa4r9xyTM4koAauQYivKViWYBskf8habEc5vHf3DZge5VivuAT79uSCvzc6aL2M11kcUn9rzb4DX4...\n\n```\n\n### Terminal Size\n\nBy default WebTTY forces the size of the client terminal. This means the host size can frequently render incorrectly. One way you can fix this is by using tmux:\n\n```bash\ntmux new-session -s shared\n# in another terminal\nwebtty -ni -cmd tmux attach-session -t shared\n```\nTmux will now resize the session to the smallest terminal viewport.\n\n### One-way Connections\n\nOne-way connections can be enabled with the `-o` flag. A typical webrtc connection requires an SDP exchange between both parties. By default, WebTTY will create an SDP offer and wait for you to enter the SDP answer. With the `-o` flag the initial offer is sent along with a public url that the receiver is expected to post their response to. This uses my service [10kb.site](https://www.10kb.site). The host then polls the url continually until it gets an answer.\n\nI think this somewhat violates the spirit of this tool because it relies on a third party service. However, one-way connections allow you to do very cool things. Eg: I can have a build server output a WebTTY connection string on error and allow anyone to attach to the session.\n\nSDP descriptions are encrypted when uploaded and encryption keys are shared with the connection data to decrypt. So presumably the service being compromised is not problematic.\n\nVery open to any ideas on how to enable trusted one-way connections. Please open an issue or reach out if you have thoughts. For now, the `-o` flag will print a warning and link to this explanation.\n","funding_links":[],"categories":["Go","DataChannel","Go (531)","Tools","后端 \u003ca name=\"backend\"\u003e\u003c/a\u003e","webrtc","Support","\u003ca id=\"1d9dec1320a5d774dc8e0e7604edfcd3\"\u003e\u003c/a\u003e工具-新添加的"],"sub_categories":["Go","Video Conference","\u003ca id=\"8f1b9c5c2737493524809684b934d49a\"\u003e\u003c/a\u003e文章\u0026\u0026视频"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxmcd%2Fwebtty","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxmcd%2Fwebtty","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxmcd%2Fwebtty/lists"}