Some checks failed
Demo images / Build & push demo images (push) Has been cancelled
A published port no longer implies a web UI. The package scanner used to synthesize interfaces.main.ui="true" for any container with a port or onion address, so headless backends — including self-deployed compose stacks like podsteadr — showed up as launchable apps. New ui_detection module decides instead: a manifest interfaces declaration (catalog overlay first, disk second) is definitive; undeclared apps get a short HTTP probe of the launch port (HTML page, redirect, or browser auth wall = UI; JSON APIs, raw TCP, dead ports = service), with cached verdicts and probes gated on running containers. Frontend canLaunch now refuses curated services outright and only treats a bare runtime address as launchable for curated known apps. Works identically for manifest apps and containers deployed by hand outside the orchestrator. ui_detection tests 6/6, frontend suite 696/696. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>