# Foldoria public 3D-world test site This directory is a complete static hosting fixture for Foldoria's public, read-only 3D internet viewer. It contains: - `index.html`, `app.js`, and `styles.css`: a small hosting and test page; - `world-a.foldoria`: media, nested folders, paging, a door, and a poster; - `world-b.foldoria`: a second linked world and download test; - `not-a-world.foldoria`: an intentionally invalid rejection fixture; - `deployment.json`: the exact public URLs embedded in the packages; - `build_example_worlds.py`: a standard-library Python package builder; - `check_examples.py`: deterministic rebuild and validation checks; and - `assets/cc0-test-video.webm`: a small CC0 video fixture. The production build is live at `https://foldoria.org`; its initial world URL is `https://foldoria.org/world-a.foldoria`. The committed packages remain hostname-neutral test artifacts, while production receives a separately built copy with the canonical URLs embedded. See the [production deployment guide](../deploy/README.md) for the exact allowlist and server procedure. Both examples are 50 × 50 metres with their interactive content centred around the entry area. World A uses blue tones; World B uses green tones. In a current Foldoria build, `M` opens the in-place read-only map and `I` opens only the trusted global settings while either example is active. ## Build for the final public URL Foldoria internet links are absolute HTTPS URLs. Rebuild both packages for the directory URL they will have after upload: ```bash python3 public/build_example_worlds.py \ --base-url https://worlds.example/foldoria/public ``` The builder rejects HTTP, credentials, queries, fragments, localhost, IP-literal hosts, and dot-path segments. It updates `world-a.foldoria`, `world-b.foldoria`, `not-a-world.foldoria`, and `deployment.json`. The committed files deliberately use: ```text https://example.com/foldoria-public-test ``` They validate structurally but their onward links cannot work until rebuilt for the real public host. ## Validate before upload Run the repository check: ```bash python3 public/check_examples.py ``` It: - validates both worlds with the bundled package validator; - confirms the invalid fixture is rejected; - rebuilds the committed artifacts byte-for-byte; - rebuilds for a second hostname and checks every embedded link; - checks required media signatures, the CC0 video checksum, nested content, and the 27-entry paging fixture. For one package directly: ```bash python3 scripts/validate_world_package.py public/world-a.foldoria ``` ## Host Upload the complete `public/` directory to any static webserver with: - a public DNS hostname and HTTPS; - anonymous access to the `.foldoria` files; - no rewriting of package bytes; and - `application/octet-stream` or `application/zip` for `.foldoria` files. CORS is not required because Foldoria's trusted Rust client performs the request. Do not test with localhost, a private address, an IP-literal URL, or plain HTTP: the application intentionally rejects those destinations. Open the hosted `index.html` in an ordinary browser. Its status badge confirms whether `deployment.json` matches the current directory URL and shows the exact World A URL to configure on a local Foldoria door or public-world poster. ## Test route 1. Enter World A through a local 3D door or poster. 2. Open `Start here.txt` and the blue media library. 3. Test inert text, PNG, PDF, WAV, WebM, nested folders, and the paging folder. 4. Save the HTML or binary file and confirm native Save As never auto-opens it. 5. Use the linked door to enter green World B. 6. Return with the violet portal or `Esc`, then repeat with the wall poster. 7. Cancel a pending transition and confirm the current world remains. 8. Link to `not-a-world.foldoria` and confirm rejection without replacement. 9. While online, confirm local editing, Explorer, native programs, and local source actions remain unavailable. Windows 11 manual testing is still required for WebView2 PDF/media decoding, pointer lock, the native Save As dialog, atomic file replacement, and immediate temporary-directory cleanup. ## Media license The video fixture and its provenance are documented in [assets/LICENSES.md](assets/LICENSES.md). All other generated example content was created for this repository.