# Blockers — desktop extraction, 2026-08-21 Decisions taken without asking, and things that stop this being finished. Written as they were hit. ## 1. Host setup cannot be expressed by a manifest — left manual `setup/setup-desktop.sh` installs `ubuntu-desktop` and `gdm3`, rewrites `/etc/gdm3/custom.conf` to force Xorg (x11vnc cannot mirror Wayland), enables auto-login so a session owns `:0`, installs Brave from its own apt repository, removes GNOME Keyring, and needs a **reboot**. `osDependencies` installs packages. It cannot reconfigure a display manager, and nothing in the plugin contract can. So the manifest declares only `x11vnc` — the one honest package check — and the script is shipped for the owner to run by hand. **This is the agreed next piece of plugin architecture**, deferred deliberately: the shape of a declared, sudo-run, reboot-aware setup step should be designed against a real case rather than guessed at, and this is that case. Until then the plugin installs and starts, and the desktop it mirrors has to exist already. ## 2. The websocket is not mounted, and a plugin cannot mount one `api/websocket.ts` moved with everything else and is **dormant**. A plugin contributes `api/router.ts` (HTTP) and a sidecar; there is no way for it to claim a WebSocket provider — `pluginPermissions` in mount.ts sets `api` and `routes` and never `ws`, and `server.tsx`'s handler map is a literal. It was already switched off in the platform (commented out since 2026-08-13), so nothing regressed. But `/desktop` cannot work again until either the plugin contract grows sockets or this is rewritten onto the sidecar proxy. Recorded rather than worked around. ## 3. No artwork `assets/icon.png` and `assets/splash.png` are absent — I cannot draw them, and the marketplace and dock fall back to the manifest's `icon` glyph (`MonitorSmartphone`) plus `color`. The OfficerIcons repository has a `OffDesktop`-shaped gap too. Marked here so it is a known absence rather than a broken image. ## 4. The permission changed shape, deliberately It was `kind: 'execution'` in the platform registry, meaning "runs as the server owner and cannot be shared". A plugin permission has no `kind` and the manifest contract refuses one, on the grounds that a permission nobody can delegate is a contradiction. So it is expressed as `ownerOnly: ['/']` instead — every path under the plugin refused to anyone but the owner, which is the same answer by a different route. That mechanism landed the same day (`docs/plugin-route-authorization.md`) and this is its first real use. The property being protected is real: x11vnc mirrors the single physical display the owner is logged into. Two accounts granted this would see the *same* screen, which is the owner's.