360 Shaders
Write GLSL on the sphere, import a panorama, or share the look as a .hexshader
Last updated: 2026-10-05
Alpha: 360 Shaders is Alpha — available for testing and feedback. The workshop and limits can change.
360 Shaders opens from Create as the Shader Workshop. Write GLSL on the sphere. The look stays on while you move. Import writes that view to a native panorama on your GPU. Export a .hexshader when you want to share the look.
See the marketing overview at /features/360-shaders.
Where you meet it
- Open Create and choose 360 Shaders. The landing stays inside Create. It shows an ALPHA pill, Enter Shader Workshop, and Shader Library.
- Select Enter Shader Workshop. The sphere fills the window. The look stays on while you move.
- Exit Workshop leaves the workshop and keeps your unsaved draft on the landing. Exit does not Import.
With a Project open, new shaders land on the Project shelf. My Library holds shaders outside a Project. Built-in starters are read-only until you fork one.
In the workshop
The code sits in the left panel. The sphere uses the rest of the window. Hide code hides only the editor. The controls stay.
- Check & Preview sends the edit you are working on to the sphere. Until that check finishes, the sphere keeps the last good look. The status line names the working revision and the preview revision.
- Parameters are the sliders for values in the shader. Select a number in the code and choose Expose Selection to turn it into a control. Dragging a slider updates the look. Add Parameter adds a control you can wire up.
- 360 Doctor lists seam and pole notes in Diagnostics. The notes are advice. A repair still needs Check & Preview.
- Named Looks sit with the parameters. Save Look keeps the current values under a name. Apply Look puts that look back. You can rename or delete a look. A look is not a second shader.
- Variation Board opens on the Board tab when an assistant proposes several takes, up to four, beside the current look. Compare shows a take on the sphere. Accept keeps that take. Fork saves it as another shader. Discard drops a take. You Accept. The agent cannot Accept. Nothing on the board is Imported until you Import.
Import
Import is on the workshop and on the landing Output card. It mints an equirectangular panorama from the pose you are flying. While it runs, the label moves through Rendering… and Importing…. When it finishes you can open the new render. If you Import a revision you have not previewed, the workshop asks you to confirm.
Files and one program
A complete portable Shader stores real GLSL in shaders/<stable-shader-id>/workspace/source.glsl and declared helper files such as lib/noise.glsl or atmosphere/clouds.glsl. Folder names have no special meaning. authoring.json is metadata only: configuration, title/tags and inventories of source, Looks, provenance and originals. Saved schema-4 snapshots likewise keep source in real files, not GLSL bodies in JSON.
The root owns one fragment entry. A file-scope #include "lib/noise.glsl" expands a declared helper into that one program. Includes resolve relative to the including file, expand once, and share a GLSL namespace; declaration order matters. Missing targets, case mismatches, cycles and root escapes get diagnostics. Use admitted relative UTF-8 .glsl names; no absolute paths, .git components, reserved managed names or links. This is a bounded shader program, not a package loader: no network imports, arbitrary audio/font/video resources or additional renderer. Current acknowledged limits include 32 source files, 64 KiB raw and expanded source, and include depth 16; follow any tighter APP instructions.
Copilot
Copilot is the chat inside the studio. With Include shader source explicitly granted for the current Shader, supported native logical file tools can list/read the complete set and propose create, edit, rename, move or delete operations, including include rewrites. Review the per-file diff and preserved metadata, Looks and resources, then Apply. An ordinary source edit preserves unrelated modules and settings. A saved chat card cannot authorize another Apply.
Opening the workshop does not send source. A selection grant does not grant the whole file set. Hosted source use requires the current catalog/privacy support and deployed service; guide text is no source permission. Copilot does not get native filesystem paths, external workspace attachment or Git authority. While an external agent is attached, take control before asking Copilot to edit. Copilot does not Import, export a bundle, apply a Look or Accept a Variation Board take.
Shader Coding Agent: open, edit, register, repair, review
Use Claude Code, Grok Build or Codex for a longer coding session. The implemented source contract supports document schema 4, workspace schema 2 and bundle schema 4 with source-modules/1; use it only when your installed connector and running APP negotiate it. Known schema numbers do not prove executable support. Source/fixture checks do not certify a released installation, shared-filesystem access, live providers, deployed WWW or real GPU behavior. Legacy workspace v1 remains the unchanged source.glsl / authoring.json pair for compatible legacy assets. Unsupported modular assets must refuse with upgrade/reconnect guidance; never flatten or downgrade them.
- Launch 360 Hextile locally and install the
360-hextileplugin using Agent Mode & MCP. Open a Project Shader in Enter Shader Workshop. The host must access the same physical Project files as APP; MCP connectivity alone is insufficient. - Turn on MCP Follow and grant whole-asset shader source read/propose in the current dialog. Follow alone does not share source. Resolve any dirty draft explicitly before attachment.
- Invoke the installed
shaderskill using your host's actual picker or command syntax. On Claude Code it is/360-hextile:shader. The360-hextileskill remains the Workflow hub. The existingget_guidenames arebest-practices,recipes,workflow-schemaandwebsite-index. - Discover current identity with
get_live_contextand check the actualtools/listincludesopen_shader_workspace,register_shader_updateandget_shader_update. Negotiateopen_shader_workspacewithworkspace_schema:2. Use returned Shader, surface and Project witness; send saved revision/hashes only for a saved base. An unaccepted clone has no saved revision. Wait for a successful acknowledged open and read its exact file inventory, raw digest and instructions. A v1 reply to a v2 request is a refusal to continue, not a downgrade. - Verify the acknowledged native paths and pre-edit digest, then edit the complete declared set. Update
authoring.jsoninventories when adding/removing files; preserve metadata, Looks, provenance, originals, textures and all sequence frames. Unlisted disk files are not automatically part of the Shader. Preserve exact BOM/newline bytes and use the returned v2 raw digest framing rather than text normalization. - Call
register_shader_updatewith the whole-set digest, returnedexpected_generation, and nextchange_id(handle+:+ the next generation). Registration freezes a candidate and starts Prepare/compile/preview; it does not save. Readget_shader_updatefor that exact candidate and check attempt. With current source grant/witness,include_source_diagnostics:truereturns bounded logical file/line diagnostics; the default is source-free. - Repair the located error in permitted members, recompute the complete digest (including unused helpers), and register a fresh next change ID. The installed skill permits at most three repairs after the initial candidate. Poll within the returned deadline. Unsupported runtime, lost grant/attachment or stalled checks end the turn with the real status; they are not a passing preview. An uncertain reply is reconciled with the original tuple, never a guessed generation.
- Review the exact source and ancillary diff, Prepare, compile and preview states. Only the human Applies. Claim saved only after the exact saved revision/hash is observed. Last-good pixels may remain visible while the current candidate fails; registered, compiled, previewed, painted and saved are separate states.
Take control retires external ownership before local edits. Stop does not quit the agent's terminal or guarantee admitted compute has stopped. Copilot can answer while attached; edit proposals wait for control. Shader Workshop follow is not a Workflow run_workflow. The agent does not Import a panorama or save the asset for you. Hextile MCP does not commit Git; external native Git needs your instruction. Neither registration nor Apply is a Git commit.
Project Git and complete portable workspaces
Use one optional repository at the Project root for many Shaders. Track 360-project.index.json and every complete shaders/<stable-id>/workspace/ tree: authoring.json, root and all declared helper GLSL, compatible looks/<stable-look-id>.json, provenance.json, referenced resources/<hash>.png, every ordered sequence frame, and optional originals/<hash>.glsl. Track any referenced Project cover image too. Preserve Project, Shader and Look IDs. Fork or Save Copy creates a fresh Shader ID; an occupied ID needs refusal or explicit Fork, not overwrite.
Only after every Shader covered by an ignore pattern has verified complete portable conversion may its local shader.json, documents/, checkpoints/, asset-root resources/, originals/ and .local/ be ignored. Mixed legacy Projects need explicit per-asset rules until conversion; hiding their only saved copies would lose work. Keep workspace resources tracked. Never ignore all JSON, all assets, .360hextile/ wholesale or the Project marker. Never overwrite a user's Git policy automatically. Optional LFS is separate; clone must materialize actual resource objects before admission, not leave LFS pointer text. No LFS rules are enabled by default.
Quiesce cooperating edits before a requested Git snapshot. Git diff/commit/restore/checkout/push are native host operations requiring your instruction. Git history changes working files, not APP acceptance authority. Accepted payloads are isolated from workspace changes, so a checkout deleting a tracked texture does not erase an already accepted resource.
Optional Git policy downloads
Before using these wildcard examples, verify complete portable conversion of every covered Shader. For mixed legacy Projects, use explicit per-asset rules instead. Inspect your existing policy and merge deliberately; never automatically replace it.
Download gitignore.txt and Save As .gitignore at the Project root. Its exact content is:
/shaders/*/shader.json
/shaders/*/documents/
/shaders/*/checkpoints/
/shaders/*/resources/
/shaders/*/originals/
/shaders/*/.local/
Download gitattributes.txt and Save As .gitattributes at the Project root:
/shaders/*/workspace/** -text
/360-project.index.json -text
-text disables implicit newline conversion for raw workspace/marker identity without disabling GLSL text diffs. It does not activate LFS. If you separately choose binary-resource LFS rules, materialize every object after clone; missing objects refuse admission. Keep referenced cover images binary-safe if adding broader text rules. These examples leave other Project machinery/output visible for your own audit.
Clone, first Apply and history
Clone the whole Project and materialize resources, then open its tracked Project marker through the app's Project flow. Complete workspaces appear as unaccepted drafts without ignored shader.json or local history. Missing/corrupt members show incomplete/refused state. A clone carries no lease, check proof or accepted revision. Review, register/Prepare and human Apply create its first accepted revision; do not invent revision zero or read a nonexistent saved context.
Editor text Undo changes an unsaved draft; a structural file batch can be explicitly discarded. Checkpoint Revert restores a complete snapshot as a new accepted revision and matching working files. Dirty disk changes require explicit comparison/preservation before replacement. Git restore changes the portable draft and needs fresh registration, Prepare, review and Apply. It cannot restore an APP receipt or substitute for checkpoint Revert. Local accepted/history copies coexist with working files; one saved pointer selects the current accepted authority.
.hexshader: share the accepted snapshot
Export Shader Bundle (shader name menu) writes a ZIP .hexshader from the exact accepted snapshot. It includes all declared GLSL, including unused helpers, metadata/configuration, every compatible Look, exact provenance, referenced supported PNG textures and every ordered sequence frame with FPS, settings and dimensions. An optional retained original is included only when truthfully recorded and distribution rights permit it; a source hash does not grant rights. Do not manufacture a flattened upstream original or provenance.
Export never selects a dirty workspace or Git HEAD. Missing/corrupt members or incompatible Looks refuse a complete bundle; there is no partial-share fallback. Open/Add Shader Bundle loads it into the library, with complete member/path/hash validation. It is not Import: Import mints a panorama. Sharing the accepted package does not require old local checkpoints or original Render/Sequence locations.
Legacy texture-free schema 1, image schema 2 and sequence schema 3 remain supported by their compatible readers; schema 4 carries the complete file set. An older reader refuses an unknown schema or required capability and preserves bytes for recovery. Bundle size/resource limits still apply; a higher schema number does not lift them.
Related sources
Use 360 Fractals for a GPU fractal on the sphere, Patterns for procedural generators, or 360 LoRA for a starting panorama. Full hub: Creating Renders.