You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
User reported clicking the gear icon (⚙) did nothing. Two real bugs:
1. CSS overrode the HTML hidden attribute.
<div id="settings-modal" class="modal-backdrop" hidden> relied on
user-agent display:none for [hidden], but
.modal-backdrop { display: flex; }
in our stylesheet overrode that default. Toggling modal.hidden from
JS had no visible effect.
Fix: added .modal-backdrop[hidden] { display: none !important } so
the HTML attribute is actually honoured. This hardens every modal
that uses the class (help, connect, file viewer, command palette,
debug, settings).
2. initSettings / initPluginConfig / loadPluginConfig were not
null-safe. Same class of regression that bit initSessions in
v1.16.0 → v1.16.7. One missing element throws TypeError and aborts
the rest of init — including the settings-btn click handler.
Fix: optional chaining (?.) on every addEventListener wire-up,
null-guard on loadPluginConfig's plugin-config-status access.
Port configuration: already wired via FIELD_MAP.port with
bounds-validation and restart-required note. Just needed the modal
to open. Now fully reachable.
Verified: bun run typecheck green, bun test 232/232.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+36Lines changed: 36 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,42 @@ All notable changes to this project will be documented in this file.
4
4
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
7
+
## [1.16.11] — 2026-04-22
8
+
9
+
Fixed — the Settings modal (gear icon) refused to open.
10
+
11
+
### Two problems, both real
12
+
13
+
**1. CSS overrode the `hidden` HTML attribute.** The markup was `<div id="settings-modal" class="modal-backdrop" hidden>`. The `hidden` attribute relies on the user-agent default `display: none`, but `.modal-backdrop { display: flex }` from our stylesheet overrode that default. Result: toggling `modal.hidden = true/false` in JS had no visible effect, since the CSS kept forcing `display: flex`. The modal stayed in whatever visibility state the initial paint left it in.
14
+
15
+
Fix: added `.modal-backdrop[hidden] { display: none !important; }` to `styles.css` so the `hidden` attribute is actually honoured.
16
+
17
+
**2. `initSettings` could be silently aborted.** Same class of regression that hit `initSessions` in v1.16.0 → v1.16.7. Unnecessary `document.getElementById(id).addEventListener(...)` chains throw `TypeError` the moment any ID is missing, and the rest of `initSettings` stops — including the `settings-btn` gear-icon handler.
18
+
19
+
Fix: optional chaining (`?.`) on every `addEventListener` wire-up in `initSettings` and `initPluginConfig`. Also null-guarded `loadPluginConfig` which touches `plugin-config-status` before any work. Any one missing element can no longer stop the rest from wiring.
20
+
21
+
### Port field: already configurable, just couldn't be reached
22
+
23
+
The port field (`#pcf-port`) was already wired in the Connection tab — `FIELD_MAP.port = { id: 'pcf-port', kind: 'int' }`, with bounds-validation, save-via-PATCH `/settings`, and the "restart required" note that appears when you touch fields like `port`, `host`, or `tunnel`. It just needed the modal to actually open.
24
+
25
+
After installing v1.16.11:
26
+
27
+
1. Click the gear (⚙) in the header.
28
+
2. Go to the **Connection** tab.
29
+
3. Change **Port**. The "Changes to these fields require an OpenCode restart" note lights up.
30
+
4. Click **Save**.
31
+
5. Restart OpenCode. The new port takes effect.
32
+
33
+
### Why initSessions didn't teach us to blind initSettings at the same time
34
+
35
+
Good question. v1.16.7 blinded `initSessions` because the crash was visible via the v1.16.6 `bootstrap().catch()`. `initSettings` runs AFTER `initSessions` in the bootstrap order, and as long as `initSessions` completes (which it now does thanks to v1.16.7), `initSettings` was reachable and its IDs all existed — nothing threw during that session. But the class-of-bug was latent: one markup change and it would have reproduced the same symptom. v1.16.11 preemptively closes that door.
36
+
37
+
### Small CSS rule, big payoff
38
+
39
+
The `.modal-backdrop[hidden] { display: none !important; }` rule also hardens the other modals that use the same pattern (help, connect, file viewer, command palette, debug). They all now honour `hidden` as the single source of truth for visibility, regardless of what the class stylesheet says.
40
+
41
+
---
42
+
7
43
## [1.16.10] — 2026-04-22
8
44
9
45
Cleanup release. v1.16.9 confirmed working: user logs showed `[pilot:event-hook] clients=1` + `[pilot:bus-emit] clients=1` during a prompt, and the browser received `[sse] onmessage message.part.updated`, `message.updated`, `session.status`, `session.idle`, `session.updated`, `session.diff` — all in live time. The singleton event bus was the real root cause.
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "@lesquel/opencode-pilot",
3
-
"version": "1.16.10",
3
+
"version": "1.16.11",
4
4
"description": "Remote control web dashboard for OpenCode — multi-project tabs, live SSE streaming, mobile-friendly, push/Telegram notifications, tunnel for phone access from anywhere.",
0 commit comments