Repository navigation
feat: Tether v1 — logged-in Chrome as HTTP proxy + WebDriver - #1
Merged
Merged
Conversation
…point Tether turns a real, already-logged-in Chrome into a network-accessible browser over the Chrome DevTools Protocol. No extension, no cloud, one static binary. - Session core: one session per Chrome tab, resolved by X-Tether-Tab-ID header, then tether_tab cookie, then one default tab per registrable domain (Public Suffix List). Idle reaping, explicit close, 410 tab_gone for dead tabs, adoption of existing tabs. - HTTP/HTTPS forward proxy: GET/HEAD navigate and return the rendered DOM (or raw bytes); other methods run as same-origin fetch() in the tab. HTTPS via a local CA. JavaScript evaluation via Runtime.evaluate. - W3C WebDriver common command set on the same sessions. - Security defaults: loopback bind, refuse public bind without a token, bearer/basic auth, loopback Host/Origin guard, domain allowlist policy seam, redacted logs. - MCP and remote-UI faces stubbed on the shared core. - Sprint Zero: Makefile, golangci-lint, CI, CodeQL, Dependabot, GoReleaser (archives, checksums, Docker, Homebrew), community docs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X9CEjRcHsJmgWdtz6ZTKsk
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
Addresses CodeQL go/log-injection alerts: method, path, tab ID, domain, session source and error text now pass through logx.Clean, and SafeURL cleans its output. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X9CEjRcHsJmgWdtz6ZTKsk
adeelahmad
marked this pull request as ready for review
October 11, 2026 03:08
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Adeel · project thread
Before: an empty repository.
After:
tether serveattaches to a real Chrome over CDP (or launches one with--launch) and exposes it as an HTTP/HTTPS forward proxy, a W3C WebDriver endpoint, and a small control API, all sharing one tab-session core. No extension.How
internal/cdp: a thin CDP layer (go-rod's websocket client plus our own message types) withBrowser/Tabinterfaces, endpoint discovery (auto, port,ws://,DevToolsActivePort), andLaunch.internal/session: one session per tab. Requests resolve byX-Tether-Tab-ID, then thetether_tabcookie, then one tab per eTLD+1 (Public Suffix List). Includes idle reaping, explicit close,410 tab_gone, and adopting existing tabs.internal/core:Dohandles requests. GET/HEAD navigate and return the rendered DOM, or raw bytes on request. Other methods run as a same-originfetch()in the tab. Also hasEvalviaRuntime.evaluate, thePolicyseam (--allow-domains), and header hygiene.internal/proxy: HTTP plus CONNECT, with TLS interception by a local CA.internal/webdriver: the common Selenium command set, documented indocs/WEBDRIVER.md.--tokenor--insecure-allow-publicis set. Supports bearer/basic auth, a loopback Host/Origin guard against DNS rebinding, and redacted logs.internal/mcpandinternal/remoteare documented 501 stubs on the same core ("four faces on one core", seedocs/ARCHITECTURE.md).Verified locally
-race; coverage is 78% including the real-Chrome integration test.goreleaser checkand a snapshot release both succeed.Notes
docs/demo.gifis rendered from real captured output. It is a stand-in for an asciinema recording.HOMEBREW_TAP_GITHUB_TOKENsecret and anadeelahmad/homebrew-taprepo. Without them the cask step is skipped.🤖 Generated with Claude Code
https://claude.ai/code/session_01X9CEjRcHsJmgWdtz6ZTKsk
Generated by Claude Code