Create, place, preview, debug, and connect manifest-backed IWSDK UIKitML assets. Use for spatial panels, browser HUDs, UIKitML layout, fonts, editor previews, or runtime element behavior.
npx skills add https://github.com/facebook/immersive-web-sdk --skill iwsdk-ui
Treat UIKitML as a first-class renderable asset. Use the managed editor's isolated
renderer for layout, the scene editor for placement, and the application runtime for
behavior. Do not change the scene, camera, or component model merely to inspect a
panel.
User request is in $ARGUMENTS.
Every scene-authored panel has three different identities:
id attributes, which name fields and controls inside the document.Find or add the manifest entry in src/assets.ts and keep the source under
public/ui/:
import { AssetType, defineAssets } from '@iwsdk/core';
const publicAssetUrl = (path: string) =>
`${import.meta.env.BASE_URL}${path.replace(/^\/+/u, '')}`;
export default defineAssets({
'welcome-panel': {
name: 'Welcome panel',
type: AssetType.UIKitML,
url: publicAssetUrl('ui/welcome.uikitml'),
},
});
A file under public/ui/ is not placeable until it is registered. The .uikitml
file is the runtime source of truth; never generate an intermediate JSON file.
Run commands from the application directory. Reuse a command-ready session instead
of starting a second server or browser:
npx iwsdk dev status
npx iwsdk dev up --timeout 60000
npx iwsdk ui assets --raw
dev up owns the managed headed browser. Do not launch a second Playwright browser,
enable Vite's independent opener, or implement a custom UIKit renderer.
Use the editor-backed isolated renderer before debugging scene placement:
npx iwsdk ui render-preview \
--input-json '{"assetId":"welcome-panel","width":800,"height":600}' \
--output-file artifacts/welcome-panel.png
This renders the real manifest entry through the real UIKitML parser, fonts, layout,
and WebGL path on a neutral background. It waits for UIKit render and resource
signals; do not add fixed frame delays. Re-run the command after every layout change.
Same-URL sources are reloaded without restarting the server.
For a human-authored placement, open the scene and add the UIKitML asset from the
asset drawer. For file authoring, use the same asset-only node contract:
{
"id": "welcome-panel-instance",
"name": "Welcome panel",
"content": { "type": "asset", "asset": "welcome-panel" },
"transform": {
"position": [0, 1.4, -1.5],
"rotationDeg": [0, 180, 0],
"scale": 0.5
}
}
npx iwsdk scene render-file \
--input-json '{"path":"public/scenes/main.iwsdk.scene.json","view":"quarter"}' \
--output-file artifacts/main-editor.png
npx iwsdk scene open \
--input-json '{"path":"public/scenes/main.iwsdk.scene.json"}' --raw
UIKitML surfaces are single-sided. If the isolated preview works but the placed panel
is invisible, inspect its rotation first. Size a world-space panel with its ordinary
entity transform scale. There is no maxWidth/maxHeight fitting layer and no
editor-visible legacy PanelUI component to configure.
Use scene screenshot for editor/scene evidence. browser screenshot is intentionally
runtime-only and switches the managed workspace to runtime before capturing.
UIKitML is HTML/CSS-shaped, but it is not a browser engine. Before assuming browser
behavior, use npx iwsdk reference search or the connected IWSDK reference tools to
confirm supported elements and properties.
Key rules:
100 = 100 cm = 1 m);id attributes for elements application code must manipulate;instead of compensating with arbitrary waits.
IWSDK bundles the UIKitML Horizon component kit and Lucide icon set. Select the
Horizon kit explicitly in iwsdk.config.json so the choice is visible to both the
runtime and editor:
{
"world": {
"features": {
"spatialUI": { "kit": "horizon" }
}
}
}
Horizon tags such as <Panel>, <Button>, <ButtonIcon>, and <ButtonLabel>
can then be combined directly with Lucide tags such as <RectangleGoggles> or
<LogIn>. Do not install or register either component set in application code.
UIKitML also accepts remote TTF declarations. The starter's
public/ui/welcome.uikitml demonstrates multiple DM Sans weights loaded from
fonts.gstatic.com with @font-face; apply the declared family to a root class so
all descendants inherit it. Keep a local font under public/ when offline or
cross-origin availability is a product requirement.
After each edit:
ui render-preview and inspect the image;browser logs for parser, font, texture, or runtime failures.For a code-owned instance, keep the UIKitMLAsset returned by the asset manager:
import { UIKitMLAsset } from '@iwsdk/core';
const panel = await world.assets.instantiate<UIKitMLAsset>('welcome-panel');
const entity = world.createTransformEntity(panel);
const button = panel.requireElementById('xr-button');
button.addEventListener('click', () => world.launchXR());
For a scene-authored instance, resolve it by stable scene node ID after the level has
loaded:
const panel = world.requireSceneObject<UIKitMLAsset>('welcome-panel-instance');
const button = panel.requireElementById('xr-button');
button.setProperties({ display: 'none' });
Do not locate a panel by transient ECS index, manifest URL, or a scan for an internal
PanelDocument. Use the scene node ID and element IDs.
Add ScreenSpace only when the experience genuinely needs a browser-camera HUD:
entity.addComponent(ScreenSpace, {
width: '420px',
height: '240px',
top: '20px',
right: '20px',
zOffset: 0.2,
});
Position and size values are CSS strings. In immersive mode the document returns to
its authored world transform. Do not add ScreenSpace, a backdrop, or a temporary
camera pose merely to make a panel easier to inspect—the editor already provides the
correct isolated and in-scene render paths.
ui assets lists it.remains.
Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
Take facebook/iwsdk-ui from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.