Web Artifacts Builder
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
Ports a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry.
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install theexperiencecompany/gaia-ui port-component --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/port-component .claude/skills/port-component && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .claude/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-componentType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install theexperiencecompany/gaia-ui port-component --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/port-component .agents/skills/port-component && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .agents/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install theexperiencecompany/gaia-ui port-component --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/port-component .cursor/skills/port-component && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .cursor/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/theexperiencecompany/gaia-ui.git --path .agents/skills/port-component--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install theexperiencecompany/gaia-ui port-component --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/port-component .gemini/skills/port-component && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .gemini/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install theexperiencecompany/gaia-ui port-componentInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/port-component .github/skills/port-component && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .github/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add theexperiencecompany/gaia-ui --skill port-component -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install theexperiencecompany/gaia-ui port-component --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/theexperiencecompany/gaia-ui.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/port-component .opencode/skills/port-component && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "port-component" agent skill from https://github.com/theexperiencecompany/gaia-ui/tree/main/.agents/skills/port-component into .opencode/skills/port-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-component", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
port-componentPorts a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry.
Port Component is an agent skill from theexperiencecompany/gaia-ui. Ports a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry. Use when asked to port, copy, migrate, or bring over a component from gaia, the mono repo, or the main repo into gaia-ui. The user may give a component name ("port weather-card"), a file path in the gaia repo, or a screenshot of UI from heygaia.io to identify the component. Pulls from the master branch by default unless a specific branch or ref is given.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/find-component.sh`).
It sits in Frontend & Design. It works with React, TypeScript and Git. The repository describes itself as: Beautifully designed components for building AI Agents 🌎. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 14e2015. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
gitpnpmghFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comui.heygaia.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Port Component loads about 2.9k tokens when it runs. Until then it costs about 118 tokens; SKILL.md has 1,379 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from theexperiencecompany/gaia-ui at commit 14e2015, republished under its MIT licence (© theexperiencecompany). 1,379 words, ~2,909 tokens.
.claude/skills/port-component/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Copies a component from the gaia mono repo into this repo (gaia-ui), makes it a reusable open-source component, and wires up registry, preview, and docs.
~/work/gaia (override with GAIA_REPO env var). Remote: https://github.com/theexperiencecompany/gaiaorigin/master. Use another branch or ref only if the user asks.registry/new-york/ui/ in this repo.Never check out branches in the gaia repo. Read files with git show <ref>:<path> so the user's working tree there stays untouched.
The user identifies the component in one of three ways:
git show.git grep -i "Request a Feature" origin/master -- apps/web).If it is still ambiguous after searching, show the user the candidate paths and ask.
Only search frontend code. Never search backend, infra, or tooling.
Search these paths, in this order:
| Path | What lives there |
|---|---|
apps/web/src/components/ | Shared web components (ui/, navigation/, layout/, shared/, seo/) |
apps/web/src/features/<feature>/components/ | Feature components (chat, landing, pricing, mail, calendar, settings, onboarding, ...) |
apps/web/src/config/ | App config the components import (appConfig.tsx has footerSections, connect, nav links) |
apps/web/src/lib/, apps/web/src/hooks/ | Helpers and hooks components may depend on |
apps/web/src/stores/ | Zustand stores (strip these when porting, replace with props) |
Do NOT look in: apps/api (Python backend), apps/bots, apps/bridge, apps/voice-agent, infra, tools, scripts, packages/cli, docs, openspec. apps/mobile and apps/desktop only if the user explicitly asks for a mobile or desktop component.
.agents/skills/port-component/scripts/find-component.sh <component-name> [ref]The script fetches origin, searches file names and exported symbols on the ref, and prints matching paths. Read files without checkout:
git -C ~/work/gaia show 'origin/master:apps/web/src/components/navigation/Footer.tsx'Also read every local import of the component (relative imports, config, hooks, feature utils). Each one must be ported, inlined, or replaced with a prop.
Look in registry/new-york/ui/ and registry.json. If the component already exists, ask before overwriting.
Most mono repo components are coupled to the app. They must ship as clean open-source components anyone can drop into their project. Apply these rules:
footerSections from appConfig becomes a sections prop. Never hardcode GAIA links, URLs, or copy in the component; demo data belongs in the preview.ReactNode prop (startSlot, brandSlot) or is dropped./public, make it an optional prop with a CSS fallback so the component works with zero assets.matchMedia over pulling in motion just for useReducedMotion. Every dependency listed in registry.json gets installed in the consumer's project.@/components/ui/*) or Radix patterns.cn from @/lib/utils, icons from @/components/icons (Hugeicons), sibling registry components from @/registry/new-york/ui/<name>.footer.tsx, footer-wordmark.tsx) that all get listed in the registry.json files array. Look at weather-card for the pattern.className pass-through merged with cn().aria-hidden on decorative elements, prefers-reduced-motion, semantic elements (nav, footer, button).Add an entry to registry.json items. Edit the file directly and match the existing tab formatting exactly (never round-trip the whole file through a formatter or script). Include dependencies only for npm packages the component actually imports, registryDependencies for gaia-ui components it uses, and every file in files.
Then build the registry artifact and commit it with the rest:
pnpm registry:build # shadcn build, generates public/r/<name>.jsonOnly commit the public/r/<name>.json you added plus the footer entry in public/r/registry.json. If the local shadcn version reformats every other public/r/*.json, revert those unrelated files and match the existing format in yours (for example the top-level "type": "registry:ui" field).
Create components/previews/<name>/default.tsx with realistic demo data (this is where GAIA-branded content is fine). Add variant previews only if the component has real variants. Previews auto-register by path; no index to update.
Port the brand assets too, not just the code. The preview must look like the component does on the GAIA landing page, and the code alone rarely gets you there. Before writing the preview, hunt down every asset the original render depends on and bring the real one over:
apps/web/public (wallpapers, logos, textures), copy the exact file into gaia-ui's public/ at a matching path (git show origin/master:apps/web/public/<path> > public/<path>) and use it in the preview (for example backgroundSrc). Never substitute a CSS-gradient approximation when the original uses an image; a hand-tuned gradient will not match.--font-* variables in apps/web/src/app/styles/globals.css and apps/web/src/app/fonts/); gaia's font-serif is Aeonik, not a serif. If gaia-ui does not load that face, copy the woff2 into app/fonts/, register it with next/font/local (see app/fonts/aeonik.ts), and pass it to the preview. The component itself stays font-agnostic via a fontClassName-style prop.Then compare your rendered preview against the live landing page (or a recording of it) side by side before calling the port done. If it does not read as the same thing, an asset is still missing.
Create content/docs/components/<name>.mdx. Copy the structure of an existing doc (pricing-card.mdx is the reference) and keep it tight:
category, title, description. The category places it in the sidebar; pick from the list in lib/navigation.ts (CATEGORY_ORDER).<ComponentPreview name="<name>/default" />, "Usage in Gaia" (one or two lines), Installation (package-install block with the https://ui.heygaia.io/r/<name> URL), Usage (one minimal example), Examples (only meaningfully different ones), Props table per exported component, short Notes if there are real caveats.The sidebar is generated from docs frontmatter, so a correct category is all that is needed; only touch lib/navigation.ts for a brand new category.
Run all of these and fix failures:
pnpm type # tsc --noEmit
pnpm lint # biome checkThen confirm:
public/r/<name>.json exists after the registry build and contains all files.pnpm dev, or verify the mdx frontmatter category matches CATEGORY_ORDER in lib/navigation.ts./docs/components/<name> in the dev server and check the browser for runtime errors, or at minimum confirm the preview imports resolve in pnpm type.// run from a repo that has playwright installed (~/work/gaia works)
import { chromium } from "playwright";
const b = await chromium.launch({ executablePath: "/usr/bin/chromium" });
const page = await b.newPage({ viewport: { width: 1440, height: 1000 }, colorScheme: "dark" });
await page.goto("http://localhost:<port>/docs/components/<name>", { waitUntil: "networkidle" });
await page.waitForTimeout(3000); // let canvases/animations draw
await page.locator("main <demo-selector>").first().screenshot({ path: "/tmp/<name>.png" });
await b.close();Eyeball the screenshot before using it: wrong logo, broken layout, or empty canvas means something is off.
Unless the user says otherwise: branch (sanku/<name>-component), commit, push, and open a PR on gaia-ui with gh pr create, summarizing what was ported, from where (source path and ref), and what was changed to make it reusable.
Include the screenshot in the PR description. Push it to the pr-assets branch and reference the raw URL:
git checkout pr-assets 2>/dev/null || git checkout --orphan pr-assets
# copy image in, commit only the image, push, then switch backThen embed: 
If gh hangs through the mise shim, call the real binary at ~/.local/share/mise/installs/gh/<version>/gh_*/bin/gh.
© theexperiencecompany, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in .agents/skills/port-component of theexperiencecompany/gaia-ui.
Open the folder on GitHubat commit 14e2015
Port Component next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Port Component this skilltheexperiencecompany/gaia-ui | 220 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Web Artifacts Builderanthropics/skills | 180k | 40 repos | ~769 | Automated safety check: Pass | Apache-2.0 | |
| Ink Tui Wizardnovuhq/novu | 40k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Frontend Module Standardssiteboon/claudecodeui | 14k | — | ~2.6k | Automated safety check: Pass | AGPL-3.0 | |
| Dify Component Writing Guidelanggenius/dify | 158k | — | ~626 | Automated safety check: Pass | Custom licence | |
| React Frontend Development Guidelinesdiet103/claude-code-infrastructure-showcase | 10k | 2 repos | ~2.9k | Automated safety check: Pass | MIT |
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
novuhq/novu
Build terminal user interfaces (TUIs) using Ink (React for CLIs) and @inkjs/ui with a reactive, session-driven wizard pattern.
siteboon/claudecodeui
Enforces one repository's React and TypeScript module layout for code under src/: source-root imports, feature barrels, deliberate exports and no deep imports.
langgenius/dify
Use when implementing or refactoring React/TypeScript components and the task requires decisions about component ownership, feature boundaries, state, data…
diet103/claude-code-infrastructure-showcase
Guidelines for React 18 and TypeScript apps covering Suspense data fetching, lazy loading, feature folders, MUI v7 styling, TanStack Router and performance.
ChrisWiles/claude-code-showcase
Shows how to build forms with Formik and Yup validation, including conditional rules, field helpers, GraphQL submission, edit forms and multi-step flows.
Works with
Categories
Ports a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry. Port Component is an agent skill from theexperiencecompany/gaia-ui. Ports a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry.
Port Component fits situations like: bring over a component from gaia; the main repo into gaia-ui.
Run `npx skills add theexperiencecompany/gaia-ui --skill port-component -a claude-code`. Or copy the skill folder (.agents/skills/port-component in theexperiencecompany/gaia-ui) into .claude/skills/port-component in your project. Claude Code loads it when a task matches its description.
Run `npx skills add theexperiencecompany/gaia-ui --skill port-component -a codex`. Or copy the skill folder (.agents/skills/port-component in theexperiencecompany/gaia-ui) into .agents/skills/port-component in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add theexperiencecompany/gaia-ui --skill port-component -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/port-component, .gemini/skills/port-component, .github/skills/port-component and .opencode/skills/port-component in your project.
Going by SKILL.md and its folder, Port Component needs a shell for the scripts in its folder and the command-line tools its instructions call (git, pnpm and gh). Our summary lists: Python 3; A Bash shell.
SKILL.md names 2 domains. In commands or code: github.com and ui.heygaia.io; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Port Component is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Port Component: Web Artifacts Builder (anthropics/skills, 180k stars), Ink Tui Wizard (novuhq/novu, 40k stars), Frontend Module Standards (siteboon/claudecodeui, 14k stars) and Dify Component Writing Guide (langgenius/dify, 158k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
theexperiencecompany (a GitHub organization) maintains it in theexperiencecompany/gaia-ui, which has 220 GitHub stars. The repository was last updated on September 3, 2026.
Source: theexperiencecompany/gaia-ui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.