SPA-fallback static hosts return 200 HTML for /api/version, which falsely triggered same-origin mode. Now validate the body parses as JSON with a string version field before switching to a relative base.
- Server serves frontend verbatim (drop window.PYSIM_EMBEDDED injection) - Frontend probes /api/version once; res.ok -> relative base + cleared URL input, otherwise fall back to http://127.0.0.1:8080 - sw.js: never intercept/cache /api/* (live card data)
- Move PWA into frontend/; server package at pysim_otaman_server/ - Server now serves the PWA (same origin -> no CORS/PNA): static file handler + --web-dir flag + injects window.PYSIM_EMBEDDED marker into index.html - Frontend defaults to relative API base when embedded (pysimBase = '') - Version 1.7.0 aligned: server.py VERSION, pyproject.toml, PWA header - SW cache bump otaman-v7 -> otaman-v8 - Docs: combined README + docs/api.md endpoint reference; update links - Fix stale package.json repository URL