This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+8 more
Affected surfaces
ReleasePort's take
Light signalGDD v1.8.0 introduces several new commands and flags while altering the behavior of `gdd_type`. Notably, `maxlength` enforcement now applies to typed inputs.
Why it matters: Severity 70 breaking changes affect `gdd_type`; maxlength is enforced for all inputs starting in this release.
Summary
AI summaryUpdates Breaking, phone/card/date, and DEPLOY-RAILWAY.md across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | High |
`gdd_type` no longer dispatches a manual `change` event; change now fires on blur. `gdd_type` no longer dispatches a manual `change` event; change now fires on blur. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Breaking | High |
`maxlength` attribute is now enforced for `gdd_type` input. `maxlength` attribute is now enforced for `gdd_type` input. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`gdd_type` now presses actual keys via CDP `Input.dispatchKeyEvent`. `gdd_type` now presses actual keys via CDP `Input.dispatchKeyEvent`. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`gdd_press` tool added for single keys and shortcuts. `gdd_press` tool added for single keys and shortcuts. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`gdd_set_headers` tool added for response header rewriting. `gdd_set_headers` tool added for response header rewriting. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`--stealth-max` flag adds enhanced headless/datacenter evasions. `--stealth-max` flag adds enhanced headless/datacenter evasions. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`--stealth` flag and `GDD_STEALTH` env variable now configurable at runtime. `--stealth` flag and `GDD_STEALTH` env variable now configurable at runtime. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`GDD_PROXY`, `GDD_PROXY_USER`, and `GDD_PROXY_PASS` variables route all traffic through an upstream proxy. `GDD_PROXY`, `GDD_PROXY_USER`, and `GDD_PROXY_PASS` variables route all traffic through an upstream proxy. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
`GDD_CHROME_CHANNEL` variable launches a real Chrome build when installed. `GDD_CHROME_CHANNEL` variable launches a real Chrome build when installed. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Feature | Low |
Railway deployment recipe (`Dockerfile.railway`) added for remote MCP server hosting. Railway deployment recipe (`Dockerfile.railway`) added for remote MCP server hosting. Source: llm_adapter@2026-07-17 Confidence: high |
— |
| Bugfix | Low |
Fixed `gdd_set_location` failure under `--stealth-max` when timezone already set. Fixed `gdd_set_location` failure under `--stealth-max` when timezone already set. Source: granite4.1:30b@2026-07-17-audit Confidence: low |
— |
| Bugfix | Low |
CDP events outside the built‑in list now fire on Playwright engines. CDP events outside the built‑in list now fire on Playwright engines. Source: granite4.1:30b@2026-07-17-audit Confidence: low |
— |
| Bugfix | Low |
`ICdpEventSubscription.Dispose()` now properly detaches handlers on Playwright engines. `ICdpEventSubscription.Dispose()` now properly detaches handlers on Playwright engines. Source: granite4.1:30b@2026-07-17-audit Confidence: low |
— |
Full changelog
Added
- Real keyboard input —
gdd_typenow presses actual keys — typing goes through CDPInput.dispatchKeyEventinstead of the nativevaluesetter, so every character produces a trusted event (isTrusted: true) and the fullkeydown → keypress → beforeinput → input → keyupchain. Input masks (phone/card/date), autocomplete/combobox widgets (react-select, downshift, MUI) andmaxlengthnow behave exactly as they do for a real user, andcontenteditableeditors (ProseMirror, Slate, Quill, TipTap) — which the old path silently never typed into — work. New options:humanize(per-key jitter),delay(fixed per-key ms), andpaste(one-shotInput.insertTextfor bulk text or emoji). Clearing an already-empty field is now a no-op, so no spurious delete event fires gdd_press— single key & keyboard shortcuts (39th tool) — press a named key (Enter,Tab,Escape,Backspace,Delete,ArrowUp/Down/Left/Right,Home,End,PageUp,PageDown,Insert,Space,F1–F12) or a single character, optionally with modifiers (Control,Alt,Shift,Meta) and a repeatcount. For submitting forms, triggering shortcuts (e.g.Ctrl+A), tab navigation and dismissing dialogs. Real trusted keystrokes on all three editionsgdd_set_headers— response header rewriting (38th tool) —allow_framing=truestripsX-Frame-Optionsand the CSPframe-ancestorsdirective, so a site that refuses to be embedded can be loaded in an iframe (the rest of its CSP is left alone). Also takesstrip_response/set_responsefor arbitrary header edits, scoped byurl_pattern. Only document responses are intercepted, so media and XHR are untouched; a failure lets the request through rather than leaving it hanging. Works on all three editions--stealth-max/GDD_STEALTH_MAX— everything--stealthdoes plus the headless/datacenter evasions: coherent UA client-hints metadata over CDP (which also fixes theHeadlessChromeuser-agent leaking from worker contexts), a plausible WebGL vendor/renderer instead of SwiftShader, realistic core/memory counts, non-empty media devices, WebRTC non-proxied-UDP blocking, and no--enable-automationswitch. On a headless container this halved CreepJS's headless score (67% → 33%)--stealthflag andGDD_STEALTHenv — stealth was config-file-only before, which containers can't setGDD_PROXY(+GDD_PROXY_USER/GDD_PROXY_PASS) — route every player through an upstream proxyGDD_CHROME_CHANNEL— launch a real Chrome build instead of bundled Chromium when one is installed- Railway deployment recipe —
Dockerfile.railwayruns GDD.Headless behind a Caddy bearer-token proxy so it can be hosted as a remote MCP server; see DEPLOY-RAILWAY.md
Breaking
gdd_typeno longer dispatches a manualchangeevent. The old path firedchangeinline right afterinput; real keystrokes let the browser firechangeon blur, as it does for a human. Code that relied onchangefiring without the field losing focus must now move focus away (e.g.gdd_press(Tab)or focusing another element) to trigger itmaxlengthis now enforced. Because typing presses real keys, a field withmaxlength="5"accepts at most 5 characters — the old native-setter path bypassed the limit and could leave a longer string in the field. Tests that asserted on an over-length value were passing on state a real user could never produce and will now see the truncated value
Fixed
gdd_set_locationfailed under--stealth-max— the stealth context set a timezone of its own, and Chromium rejects a second timezone override with "already in effect", so matching a player's geo to a proxy exit silently errored- CDP events outside the built-in list never fired on the Playwright engines —
SubscribeToCdpEventonly mapped six hand-picked names onto Playwright's own page events; everything else returned a subscription that stayed silent forever. Unmapped events now reach the real CDP session, so any domain is usable ICdpEventSubscription.Dispose()did nothing on the Playwright engines — it now detaches the handler
Breaking Changes
- `gdd_type` no longer dispatches a manual `change` event; change now fires on blur only.
- `maxlength` attribute is enforced for fields typed with `gdd_type`.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About GDD
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]