Authoring guide
Create a custom View or Room.
Use complete Package v2 for feature-complete delivery and stable updates, a legacy/simple flat ZIP for compatibility, or import a complete panorama directly as a View.
Room v1–v5 · View v1–v2Choose a guided path
Supported imports
| Action | Input | Source |
|---|---|---|
| Import a View | A complete 2:1 equirectangular JPEG, PNG, or HEIC image; a complete Package v2 ZIP containing a View; or a legacy/simple flat View ZIP | Photos for images; Files or a direct public HTTPS URL for images and ZIPs |
| Import a Room | A complete Package v2 ZIP containing a Room; or a legacy/simple flat Room ZIP | Files or a direct public HTTPS URL |
Complete Package v2 import is available in Locus 1.2.1 and later. The 4K minimum for directly imported panorama images, including Browser images, is separate from either ZIP format. Complete packages preserve stable IDs and update semantics. Flat compatibility ZIPs and direct panorama images receive a new UUID on every import.
Try three complete Rooms
With a Locus build that supports Room v5, download any ZIP, save it to Files, then choose Import a Room. These public examples include desk seats and visitor-controlled lights. They match the September 5, 2026 authoring export (Atrium Loft 1.0.14, Courtyard Gallery 1.0.16, Horizon Atelier 1.0.18).
Using an older build? Download a previous compatible version: Atrium Loft, Courtyard Gallery, Horizon Atelier.
Use these examples with Locus under the Locus asset rights.
Try experimental Room animations
Cloud Fan Pavilion is a free Room you can download in Locus Places with a broad-leaf plant moving continuously in the breeze. The animation metadata, playback, Quick Controls and Motion settings, speed, and replay intervals are experimental and may change.
Bring your own Room
Use the modeling, material, and lighting workflow you already know. Locus only requires a self-contained USDZ and explicit metadata for openings, seats, optional tabletop mappings and wall or roof entity references, optional visitor-controlled lights, optional lounge seats and hideable desk groups (Locus 1.1.5), optional seat groups (Locus 1.2.0), and—when you choose to experiment—Room animations.
Canonical complete Package v2
complete-place.zip
├── locusplace.json
└── catalog/
├── destinations/<destination-id>/destination.json
├── spaces/<space-id>/space.json
└── experiences/<experience-id>/experience.json # optionalPut locusplace.json and catalog/ directly at the ZIP root—never inside an outer wrapper folder. Content assets stay under their matching destination, space, or Experience directory. Locus accepts the same ZIP bytes with a .zip or .locusplace filename.
This format preserves authored stable IDs, View media and masks, sourceImage, View-owned USDZ midground scenery and renderer-owned water, View and Room sound, Room animations, video surfaces and seat groups, provenance, and supported bundled Experiences. Its manifest declares packageID, contentVersion, minimumAppVersion, content IDs, file hashes and sizes, and contentHash. Locus validates the exact inventory, safe paths, hashes, resource limits, capabilities, and minimum app version. A malformed complete package is rejected rather than retried as a flat ZIP.
Legacy/simple Room ZIP layout
my-room.zip
├── space.json
├── provenance.json
├── teleport-points.json
├── scene.usdz
├── thumbnail.jpg
├── sound.json # optional, Locus 1.1.4
└── forest-air.m4a # one or more, only with sound.jsonIn this compatibility format, all five files are required at the ZIP root. space.json contains displayName; it does not contain an asset ID, and each import receives a new UUID. Do not add a parent folder, editable source, GLB, source textures, or any other file. Locus does not generate a thumbnail when one is missing. A Room may also carry its own sound: add sound.json and its audio files at the root, described in the format reference. Every audio file must be named by a source in sound.json, and audio without it is rejected.
Legacy/simple View ZIP layout
my-view.zip
├── view.json
├── provenance.json
├── panorama.jpg
├── thumbnail.jpg
├── lighting.jpg # optional
├── sound.json # optional, Locus 1.1.4
└── waterfall.m4a # one or more, only with sound.jsonThe panorama must be a complete 2:1 equirectangular image. A packaged View can set starting direction, brightness, contrast, saturation, Room lighting, horizon pitch, and optional sunlight in view.json. A user can change these later with Edit View. A View may also carry its own sound on the same terms as a Room, described in the format reference.
Adjust a View in Locus
Edit View provides View Brightness, Contrast, Color, Room Lighting, Add Sunlight, Sun Position, Sunlight Strength, and Turn the View. The settings are saved for that View.
View appearance fields
| Field | Use |
|---|---|
panorama.initialYawDegrees | Starting direction. |
environment.skyGainEV | Visible View brightness. |
environment.exposureEV | Room-lighting intensity. |
environment.horizonPitchDegrees | Horizon adjustment. |
environment.colorGrade.contrast | Contrast from 0.5 to 2.0; 1.0 is neutral. |
environment.colorGrade.saturation | Saturation from 0 to 2.0; 1.0 is neutral. |
environment.directSun | Optional sun direction and strength. |
environment.condition | View v2 suggestion for the Room Lights switch: day, dusk, night, or overcast. |
Provenance
Every Room and View needs provenance.json. Record the creator or agency, rights, requested credit, changes, and AI use truthfully. Supply exactly one of license or rights, as described in the format reference. When aiGenerated is true, include aiProvider; when false, omit it. The license describes rights in the asset; an App Store EULA is not an asset license. See Locus asset rights for Locus-authored examples.
Pack and validate a compatibility ZIP
The current public Python tools only build and validate the legacy/simple flat format; they do not validate complete Package v2. Keep the five Room files or four required View files in one directory. Run the included tools on macOS:
python3 tools/pack_locus_asset.py /absolute/path/to/asset /absolute/path/to/asset.zip
python3 tools/validate_locus_asset.py /absolute/path/to/asset.zipThe Room validator uses Xcode's usdchecker. A valid result checks the archive and machine-readable assets; it does not replace importing the exact ZIP and trying every seat.