- Add xclip to install.sh dependencies (was missing entirely — root cause)
- Poll both CLIPBOARD and PRIMARY X11 selections (Electron button-click
copies often use PRIMARY)
- Add xsel as fallback if xclip unavailable
- Log xclip errors with stderr instead of silently swallowing
- Add startup diagnostic test for clipboard connectivity
- Replace silent clipboard write with visible toast notification:
on HTTPS auto-copies and shows brief "Copied" confirmation,
on HTTP shows "Click to copy" button (user gesture enables clipboard)
- Toast auto-dismisses after 8s, styled to match Atlus theme
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- After window discovery, activate, move to (0,0), and resize to
fill the 1280x1024 Xvfb display so the app is fullscreen
- Add windowactivate --sync before click events so the window
receives focus in X11 before mouse input
- Add windowfocus --sync before key events so keyboard input
goes to the correct window
- Make canvas fill the entire app panel area (width/height 100%)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Capture stderr from GUI apps and show meaningful exit reasons (signal names,
error messages) instead of generic "Application exited"
- Add /api/display/discover-apps endpoint that scans .desktop files for
installed GUI apps, replacing manual-only app configuration
- Settings > Applications now shows discoverable apps with one-click Add,
with manual form available as fallback
- Fix WiFi: start wpa_supplicant before bringing interface up, handle rfkill
blocks, add retry logic and error messages to scan results
- Fix WiFi scan frontend bug: response is {networks:[...]} not a bare array
- Add iw and wpasupplicant to install.sh dependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each configured GUI app (e.g. Nextcloud) gets its own dock icon and
opens as a regular Atlus tab. Under the hood: Xvfb virtual display,
ImageMagick captures individual window pixmaps as JPEG, streams over
WebSocket to a canvas element, with xdotool forwarding mouse/keyboard
input back to the X11 window. Apps persist in background when tab is
closed, and streaming pauses when no viewers are attached.
New files: backend/display.py (DisplayManager + ManagedGuiApp),
backend/routers/display.py (WebSocket + REST), frontend display.js/css.
Config: gui_apps array in settings for registered applications.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>