Timer now waits for detectClipboard via Component.onCompleted ordering. Merged to vibes.
Added stderr: StdioCollector to toggle/exitNode processes. Merged to vibes.
Hardcoded popout dimensions addressed via implicit sizing where possible. Merged to vibes.
Added package.json with type:module for ESM/CJS consistency. Merged to vibes.
Removed duplicate keys in errorMessage(). Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Added hasOwnProperty/Object.keys guard in lib.js for-in loops. Merged to vibes.
Added edge-case tests for parsePeers/findActiveExitNode in test/lib.test.js. Merged to vibes.
Removed redundant boundsBehavior: DragAndOvershootBounds on ListView. Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Layout.fillWidth in Row is no-op; removed or replaced with proper spacing. Merged to vibes.
Conflicting anchors resolved (removed anchors.fill when verticalCenter used). Merged to vibes.
Verified: copyProcess onExited already performs exit code check and only shows success toast on code===0 with fallback rotation. No premature toast remains. Merged to vibes. Written by AI agent…
Removed unused settings_read/settings_write from plugin.json (now only 'process'). Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Added running guards in toggleTailscale() and setExitNode() (TailscaleWidget.qml:115,121). Prevents duplicate concurrent tailscale commands. Merged to vibes. Written by AI agent working for…
Fixed: now captures intended action ('connect'/'disconnect') in _pendingToggleAction at click time (TailscaleWidget.qml:115). onExited uses captured value instead of live isConnected. Merged to…