Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OpenUdon Browser Driver

This repository provides the trusted Playwright process for udon.browser-driver.v2, additive udon.browser-driver.v3, and the closed registration-only udon.browser-driver.v4. One process lives for one Udon workflow execution, so an explicit uws.browser-authentication-call.1.0 operation can establish a named in-memory session and later uws.browser.1.5 actions can consume it. V3 adds UWS 1.8 authentication 1.1 followed by browser 1.5 main-page, browser 1.6 popup/frame replay, or UWS 1.9 browser 1.7 typed accessibility outputs, while v2 continues to execute the unchanged UWS 1.7 contracts. V4 consumes the published UWS browser-registration 1.0 profile and call controls in one fresh headed context; it never creates a named session.

The driver accepts only reviewed, closed browser macros. Credentials are read from environment-variable names mapped by Udon; values never appear in UWS, arguments, reports, or failure messages. MFA is mediated by Udon's local terminal or authenticated challenge API. Sessions are not persisted by default. An operator may provide an opaque reference for reuse together with a private driver-owned storage directory; cookies and Playwright storage state never cross the protocol.

Build

Node.js 24 is required. Playwright is pinned to 1.62.1.

npm ci --ignore-scripts
npm test
npx playwright install chromium

The executable is dist/index.js after npm run build. Configure Udon with an absolute executable wrapper or the generated executable file and protocol v2:

udon \
--workflow ./workflow.uws.yaml \
--browser-driver /absolute/path/to/openudon-browser-driver \
--browser-driver-protocol v2 \
--browser-credential-env member_username=MEMBER_USERNAME \
--browser-credential-env member_password=MEMBER_PASSWORD \
--approve-browser-authentication authenticate_member

Use --browser-driver-protocol v3 with Udon's UWS 1.8/1.9 lowering. V3 requires authentication 1.1 and the internal action v2 envelope, which may carry browser 1.5, 1.6, or 1.7; browser 1.7 adds locale-free scalar conversion and is rejected by the v2 session path.

Use --headed as a trusted driver argument when WebAuthn or operator-visible browser interaction requires a window.

Registration requires --headed and Udon protocol v4. Credential values are resolved only from the inherited environment names in the request. Human registration checkpoints and the distinct pre-submit approval accept only Continue or Deny; no verification value crosses NDJSON. The optional trusted --registration-checkpoint-timeout 5m argument changes the default 120-second bound. Every registration context closes before its fixed Boolean/status result is emitted and is never entered in the named-session map.

Reusable sessions require the trusted --session-store /absolute/private/dir driver argument. The store contains Playwright storage-state JSON under the SHA-256 digest of the opaque reference (<digest>.json); files are regular, non-symlink entries no larger than 1 MiB. Udon sends only the opaque reference, and the driver performs the lookup locally.

Security boundary

  • Exact application and identity-provider origins are enforced across all redirects.
  • V3 also enforces declared origins for child-frame and popup navigations, requires one uniquely resolved frame, and accepts one popup only when an explicit opensContext click declares it.
  • Every cached page/frame is revalidated before reuse and at authentication or action completion; closure, detachment, origin/identity drift, renewed ambiguity, or an incomplete/extra inventory fails closed.
  • Authentication locators are accessibility-only. Browser-action CSS remains limited to a reviewed output fallback already allowed by uws.browser.1.5.
  • Driver-controlled exception text is collapsed to a closed failure code.
  • CAPTCHA is detected and rejected; bypass is not supported.
  • Named contexts, cookies, and storage remain process memory only.
  • Push, number matching, TOTP, SMS/email/voice OTP, passkeys, and security keys are explicit flow choices. The driver never guesses an MFA alternative.
  • V4 registration accepts only the closed registration macro, exact reviewed origins, accessibility locators, symbolic environment bindings, and fixed call controls. It permits GET/HEAD plus exactly one POST in the sole submit window. Submit approval is the irreversible boundary: a later failure is registration_indeterminate, and the operation/source pair is not retried.
  • Registration emits no URL, page value, identifier, cookies, storage, session, request body, or browser state. Cleanup remains a separately selected disposition and is not performed by the driver.

See docs/protocol.md for the private process contract.

About

Trusted Playwright browser driver for UWS browser-profile and browser-authentication execution

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages