# Security model This public Space accepts untrusted images, sends normalized image content to a configured external LLM provider, and renders generated procedural code in a visitor's browser. The controls and remaining limitations are explicit below. ## Upload boundary `app/image_guard.py` and `app/main.py` enforce: - A 10 MiB default byte cap while reading, before image decode. - Pillow content sniffing; filename, extension, and declared MIME type are not treated as proof of format. - PNG, JPEG, WebP, GIF (first frame), and BMP only. SVG is rejected because it is scriptable XML. - Pillow decompression-bomb protection, a 40 MP default pixel cap, and an 8192 px longest-side decode cap. - EXIF orientation normalization followed by RGB PNG re-encoding, which strips original metadata. The normalized image is downscaled to at most 1024 px before forge/LLM processing. - Server-generated job IDs and artifact names. The artifact route uses an explicit filename allowlist and verifies that the resolved file remains directly inside its job directory. - Community publication is opt-out and disclosed before submission. It copies only the normalized reference and the generated artifact allowlist; original filenames and image metadata are not retained. The normalized image is sent to the operator-configured LLM endpoint. Users must treat that provider as a data processor; this Space does not make a local model privacy claim. ## Generated code and browser isolation - The LLM authors JSON spec values, not executable TypeScript. A deterministic vendored generator emits code and JSON-escapes spec-derived literals. - The hosted compiler accepts only its implemented primitive allowlist and rejects parent cycles. Generation fails if a TODO fallback is detected; an unsupported primitive is never silently represented as a placeholder box. - The interactive viewer runs in `