# UI and relay review — 2.2.0 Reviewed against origin/main at ae6a36f, with PRs #1, #8 and #10 inspected. Work is on feature/ui-and-relay-polish in a separate checkout. The original working directory and its uncommitted files were preserved. No production deployment or main merge was performed. ## Current architecture - The hub is vanilla HTML/CSS/JavaScript, using Ultraproxi, the supplied logo layers and icon sheets, and Simple Icons for website logos. Preferences, links, imported HTML games, notes and favorites use browser storage. - Scramjet and its controller adapt websites inside the relay iframe. The same-origin Bare v3 endpoint keeps browser authentication separate from remote relay credentials. - Cloudflare handles static files, the passphrase session, destination validation and WebSockets. Discord-family HTTP can use Render; Jimmy is opt-in, with GET/HEAD-only fallback to Render. The current checked-in configuration leaves Jimmy disabled. No secret was copied to this checkout. - The separate Wisp + libcurl experiment binds to localhost:3100 and permits only its documented public destinations and local origins. It is not a production relay. - The single-file builder embeds hub styles, font, artwork and JavaScript. Relay mode embeds the hosted /embed entry, so it still requires internet and the hosted server. ## Changes - A selected-item panel follows the user's shop layout. Clicking card artwork selects it; the Open button launches it. Favorites, relay mode, editing and removal are available in the panel. - Cards retain straight black borders, restrained stripes, green controls and the supplied icon sets. Compact mode now changes card size, including mobile padding. - Settings are grouped in collapsible panels. Custom colors have a hex field and readable button text. Shortcut editing preserves its ID and favorites. - Search has a clear empty state and recovery button. Category filtering avoids showing duplicate active filters. Imported games remain sandboxed. - The browser engine loads only when a relay opens. The hub no longer requests unused Google Fonts stylesheets or preloads both icon sheets during loading. - Relay status distinguishes loading, a page opening, warnings and errors. Retry is available; duplicate startup attempts are ignored. Keepalive stops when returning to the hub. - The response-header timeout fix from open PR #10 is included locally with its regression tests. A healthy response body is no longer aborted merely because the original header deadline expires. This does not establish Discord compatibility. ## Verification - Baseline: 86 project tests passed before changes. - Updated project suite: 96 tests passed, including the two PR #10 stream lifetime tests and added library-view/custom-color checks. - Separate Wisp policy suite: 5 passed. The historical “default is not a function” failure did not reproduce. - Type checking passed. Worker dry-run build and single HTML integrity/syntax checks passed. The rebuilt standalone hub was also served over HTTP: its calculator returned 12 for 12/3+2*4, and relay mode assigned the hosted embed URL inside its iframe, with direct/tab fallbacks and a working return button. - Browser checked: card selection, calculator result 14 for 2*(3+4), search/empty-state recovery, shortcut create/edit/delete, favorite persistence, custom accent and icon set persistence, compact mode, light theme, loading disabled across reload, and top-bar hide/restore. - A test HTML game imported and rendered; clicking its sandboxed Score button changed 0 to 1. Closing removed the game iframe. Test data was removed. - Public example.com opened through the local Bare relay. Retry worked; the status reached “Page opened.” Exactly two engine scripts were requested only after relay use. No account credentials were entered. - Desktop side-panel layout checked at 1280×900. Phone layout checked at 390×844: content width and scroll width both 375 px after the scrollbar gutter; cards and controls fit. ## Outstanding issues and limits - Render/Jimmy deployments, production credentials, authenticated Discord messaging, calls, and full-site compatibility have not been exercised in this checkout. Existing configuration and access policies remain intact. - Direct file:// execution remains unverified because the browser tool blocks that protocol. The generated file is checked and tested when served over HTTP. Browser file storage and embedded session policies can differ. - The local Wisp origin policy allows localhost:8787 only. This isolated UI preview uses 8788, so its Wisp option is not a successful Wisp compatibility test. The Wisp policy suite runs independently. - An iframe load event confirms that a document opened; it does not establish that all scripts, sign-in or interactive features succeeded. ## Next priorities 1. Review this feature branch and PR #10's overlapping stream fix before merging either. 2. Verify a preview Worker with privately configured Render/Jimmy secrets using public assets, checking complete JavaScript transfers and recovery after backend failures. 3. Test single-file opening and embedded sessions in the actual target browsers. 4. Test Wisp public pages on its authorized localhost:8787 origin; assess each site's features separately. ## 2.3.0 navigation and relay readiness Replaced the sidebar with Home/Games/Apps/Tools/Favorites navigation, removed duplicate category filters, made card art launch directly, and moved the preview into optional Details. Preserved shortcut editing, settings, imports, favorites, logo assets and accent choices. Added a simpler responsive card grid and separate mobile layout. Hosted Wisp is now the default; ?transport=bare is retained for explicit comparison. An authenticated same-origin POST /api/relay/wake checks only the configured Render /healthz, with 45-second connection attempts and a bounded browser wait. It checks on launch, not a background keep-awake schedule. No login submissions are replayed. Verification: 105 automated tests, TypeScript check and dry-run build passed. Hosted preview navigation, Details, card-to-calculator launch, and 390px mobile width were checked (no horizontal overflow). Initial Render startup exceeded the original 12-second attempt; after increasing the timeout, the hosted relay launch reached Discord's login form without a query parameter. Full account sign-in was not repeated. Main-site production deployment remains unchanged.