MCP Development
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
This skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file…
$ npx skills add OpenHands/extensions --skill canvas-extension-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenHands/extensions canvas-extension-api --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/OpenHands/extensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/canvas-extension-api .claude/skills/canvas-extension-api && 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 "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .claude/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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/OpenHands/extensions/tree/main/skills/canvas-extension-apiType 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 OpenHands/extensions --skill canvas-extension-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenHands/extensions canvas-extension-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/canvas-extension-api .agents/skills/canvas-extension-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .agents/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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 OpenHands/extensions --skill canvas-extension-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenHands/extensions canvas-extension-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/canvas-extension-api .cursor/skills/canvas-extension-api && 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 "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .cursor/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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/OpenHands/extensions.git --path skills/canvas-extension-api--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 OpenHands/extensions --skill canvas-extension-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenHands/extensions canvas-extension-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/canvas-extension-api .gemini/skills/canvas-extension-api && 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 "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .gemini/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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 OpenHands/extensions canvas-extension-apiInstalls 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 OpenHands/extensions --skill canvas-extension-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/canvas-extension-api .github/skills/canvas-extension-api && 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 "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .github/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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 OpenHands/extensions --skill canvas-extension-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenHands/extensions canvas-extension-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/canvas-extension-api .opencode/skills/canvas-extension-api && 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 "canvas-extension-api" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/canvas-extension-api into .opencode/skills/canvas-extension-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-extension-api", 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.
canvas-extension-apiThis skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file…
Canvas Extension API is an agent skill from OpenHands/extensions. This skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file Canvas App", "build a Sidecar-backed Canvas App", "add onboarding for an App service", "add a custom interface to Agent Canvas", "validate an OpenHands App", "make a Canvas App look native", "match Agent Canvas styles", "style a canvas extension", "reuse OpenHands design tokens", "add native Tailwind classes to an…
Its SKILL.md is about 5.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 17 other files, including scripts and reference files (for example `.plugin/plugin.json`, `README.md` and `references/acceptance-checklist.md`).
It sits in Frontend & Design, covering Design tokens, CSS and styling and Building AI agents. It works with Tailwind CSS. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit d008b81. 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 2 files in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodeFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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.
Canvas Extension API loads about 5.3k tokens when it runs, and up to ~22k if it reads all its reference files. Until then it costs about 171 tokens; SKILL.md has 2,444 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 OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 2,444 words, ~5,267 tokens.
.claude/skills/canvas-extension-api/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.Build and validate OpenHands Apps with the Canvas Extensions API, targeting the currently implemented manifest schema 1 and host API 1 routed-page ABI.
Use the naming layers consistently:
canvas-extension.json and its entrypoint.Use current product labels in user-facing instructions: Apps for Agent Canvas, Add app, Installed apps, App source, Enable trusted app, and Build an app. Keep technical identifiers such as canvas-extension.json, /api/canvas-extensions/*, host.extension, and /extensions/* unchanged unless the target implementation changes them.
Treat apps as trusted, same-realm browser code owned by the active Agent Server. Keep the categories distinct: apps extend what people can do in Agent Canvas, plugins extend agent runtime capabilities, and skills provide agent instructions and knowledge.
Treat an App as one authenticated browser dependency graph that Canvas imports from a Blob URL. Do not build a hosted SPA: the production result must be exactly one self-contained browser ESM entrypoint that exports activate(host). Always ship this UI package even when it uses an optional package-owned managed backend or a manual/deployment-owned Sidecar. Make the App page the guided UI for service setup after the App is opened. Never treat a service as another browser chunk or an automatic extension install hook.
For a new App, create an independent package in the target repository and implement its own UI, tests, and build tooling. Follow the Vite library-build reference in references/packaging-recipes.md; do not copy a shared starter or introduce a repository-wide runtime/workspace unless the target repository explicitly requires it.
Keep all source, scripts, dependencies, tests, and checked-in extension.js inside the App package. Implement one declared page with explicit root, nested, and unknown-route behavior. Inject scoped CSS per mount and clean it up with framework roots, requests, listeners, timers, Workers, and object URLs. Build validation must verify dist/extension.js before synchronizing it to the App root. Do not synchronize an unverified artifact. Use CHROME_PATH when the Chrome executable is elsewhere.
For an existing App, run the reusable static gate before and after its own checks:
node /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app
node /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app --dist --marker <required-feature-marker>Treat the static validator as a gate, not a replacement for the browser Blob smoke test. Read references/packaging-recipes.md before adding CSS, raw assets, dynamic modules, Workers, or WASM. Read references/backend-safety.md before any Agent Server integration or persistence. Read references/sidecar-pattern.md before designing a separately installed service or its onboarding. Read references/acceptance-checklist.md before reporting local Canvas compatibility.
Start by locating the target directory instead of assuming the current workspace. Inspect repository instructions, existing package management, build tooling, tests, and git status before editing.
Make an early architecture decision: browser-only App, Agent Server-integrated App, package-owned managed-backend App, manual/deployment-owned Sidecar App, or explicitly deployment-specific App. Keep the portable host API 1 surface separate from optional Agent Server/host capabilities and deployment-owned behavior.
Use the package-owned managed-backend path only when the target stack includes the lifecycle contract from software-agent-sdk PR #5270 at ac7b322ddf7d2e0e90a3643c5e26d848236af9a3, the bridge contract from PR #5272 at 6d9c82973e765cce4843d6a2fb52f634efa64293, and the host version named in references/v1-contract.md. Until a release containing both SDK PRs lands, those exact revisions are the minimum Agent Server implementation. Feature-detect canvas_app_backend_bridge_v1 and app_backend_ingress_url through GET /server_info; absence is an actionable unsupported state. Do not convert manual Sidecars into managed backends unless the App owns checksum-pinned artifacts for every supported platform.
Clarify only choices that materially affect implementation:
Default to one app with one routed page when requirements are otherwise clear. Keep the first implementation small and dependency-free unless the requested UI clearly benefits from a framework or the repository already has a bundler.
When creating multiple Apps in one repository, give every App an independent package root containing its own canvas-extension.json, entrypoint, version, tests, README, and build tooling. Do not introduce a monorepo, shared runtime, or common build foundation unless the target repository explicitly requires one. Keep app manifest names globally distinct within the Agent Server installation.
Treat installation as one app per request. The current Customize -> Apps flow accepts one source, optional ref, and optional repo_path; it does not recursively discover or bulk-install every manifest in a repository. For a remote repository, add each app separately using the same source/ref and its own repo_path. For a backend-local source, select each app package directory as the source path.
Read references/v1-contract.md before implementing unfamiliar Canvas Extensions API behavior. Read references/connections.md before connecting to Agent Server, the Automation service, or WebSocket endpoints. Read references/sidecar-pattern.md before proposing a Sidecar bridge, onboarding, or operator action. Read references/testing-and-installation.md before installing or testing inside Agent Canvas, especially for a multi-app repository.
Treat the v1 contract as young and subject to change. Before substantial work, compare the installed or target OpenHands version with the current upstream sources when access is available:
specs/canvas-extensions.mdsrc/types/canvas-extension.tssrc/components/features/canvas-extensions/canvas-extensions-runtime.tsxsrc/routes/canvas-extension-page.tsxdocs/CANVAS_EXTENSIONS_TESTING.mdDo not invent planned surfaces such as conversation tabs, slots, themes, or visualizer replacement. Implement only contributions supported by the target version. Routed pages are the only implemented contribution in host API 1.
Place canvas-extension.json at the app package root. Point entrypoint to one self-contained browser ESM file inside that root.
Use this minimal manifest shape:
{
"schema_version": 1,
"name": "example-dashboard",
"display_name": "Example dashboard",
"version": "0.1.0",
"description": "A backend-specific project dashboard.",
"entrypoint": "extension.js",
"contributes": {
"pages": [
{
"id": "dashboard",
"title": "Dashboard",
"path": "/dashboard",
"nav_label": "Dashboard"
}
]
}
}For an optional package-owned managed backend, add this top-level sibling of contributes:
"backend": {
"schema_version": 1,
"artifacts": {
"linux-amd64": {
"path": "backend/linux-amd64.tar.gz",
"sha256": "<64 lowercase hex characters>"
},
"linux-arm64": {
"path": "backend/linux-arm64.tar.gz",
"sha256": "<64 lowercase hex characters>"
}
},
"argv": [
"{artifact_dir}/bin/server",
"--host=127.0.0.1",
"--port={port}",
"--data-dir={data_dir}"
],
"health": { "path": "/health" }
}This declaration is optional. Omit it for browser-only Apps and manual/deployment-owned Sidecars. It never authorizes automatic preparation or startup. The server supports Linux amd64 and arm64 initially, verifies package-contained .tar.gz artifacts by SHA-256, and executes the structured argv without a shell. argv[0] must remain inside {artifact_dir}; allowed placeholders are {artifact_dir}, {data_dir}, and {port}.
Follow these invariants:
Add a concise README.md when the app is intended for reuse or publication. Document purpose, build command if any, output entrypoint, installation coordinate, and verification steps. Avoid adding explanatory change-log documents.
Export an activate function from the ESM entrypoint:
export function activate(host) {
if (host.apiVersion !== "1") {
throw new Error(`This app requires host API 1.`);
}
return host.registerPage("dashboard", ({ container, path, navigate }) => {
const root = document.createElement("section");
root.textContent = path ? `Nested route: ${path}` : "Dashboard";
container.append(root);
return () => root.remove();
});
}Use the host contract deliberately:
host.extension and host.backend.host.registerPage(id, mount) during activation.path as the route remainder below the declared page path.navigate(absoluteCanvasPath) for Canvas-aware routing.host.agentServer.request({ path, method, body, headers }) for authenticated calls to the owning Agent Server./; never pass absolute URLs or // paths.Prefer @openhands/typescript-client for bundled TypeScript integrations whenever it covers the required Agent Server API and the necessary connection inputs are available. Prefer its typed clients, models, compatibility checks, and WebSocket lifecycle over hand-written transport code. Bundle the client into the self-contained app entrypoint; never leave a bare package import or external runtime chunk.
Respect the host API 1 connection boundary:
host.agentServer.request as the portable Agent Server HTTP path; Canvas selects the active backend and supplies authentication.references/v1-contract.md. The helper owns session creation, validated iframe isolation, retry/new-tab behavior, and revocation; the App never reads the app-scoped cookie or constructs the ingress URL. The ingress must be a separate browser origin from Canvas, and the host must preserve the server-returned sandbox including allow-same-origin.window.location or extract session keys from Canvas internals.host.agentServer.request unless the backend explicitly documents an Agent Server proxy for them. Automation is a separate service with deployment-provided base URL and authentication.host.agentServer.request, add a backend-owned bridge, or feature-detect a future host subscription API.Return cleanup from every layer that creates effects:
activate.Assume activation, mounting, and disposal may happen repeatedly during hot enable/disable, updates, backend switches, reconnects, and route changes.
Render within the supplied container; do not replace unrelated Canvas DOM. Scope CSS under an app-specific root class. Prefer Canvas CSS variables with sensible fallbacks rather than copying host implementation classes.
Read references/native-design.md before styling an App page. It covers the core rule (reuse tokens, not host internals), the three implementation paths (dependency-free, Tailwind-bundled, existing CSS), the Tailwind v4 theme mapping to host variables, layout and density conventions, copy-ready component recipes, the raw scoped CSS alternative, and a mount-safe style helper. Treat it as the authoritative design reference for Apps.
Provide:
<main aria-label={page title}>, so do not add a nested main or duplicate page landmark label;innerHTML;Avoid global event handlers, prototype changes, global CSS selectors, and ambient state unless unavoidable. Same-realm execution means these effects have full Canvas authority and cleanup is only best-effort.
Test real app code with a DOM environment and a small Canvas Extensions API host test double. Test at minimum:
activate registers every declared page exactly once.Use the repository's existing test infrastructure. Do not introduce a new framework when adequate tests already exist. For dependency-free fixtures, Vitest with a DOM environment matches the upstream example, but it is not part of the Canvas Extensions API runtime contract.
Run the bundled validator before reporting completion:
node /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app-packageThen run the target repository's formatter, linter, tests, and build. Inspect the final entrypoint rather than assuming the bundler configuration worked:
activate;Treat validator warnings as prompts for inspection, not proof of invalidity. The helper uses conservative static checks and cannot replace loading the app bundle in Canvas.
Install only when requested. Installation and enablement are separate product actions: installation must leave the app disabled, and enabling executes trusted same-realm code. Managed-backend preparation and startup are additional explicit actions tied to the resolved revision; installation, enablement, activation, and ordinary page mounts never execute backend code.
For a backend-local app, install the path as interpreted on the Agent Server machine. For a Git-hosted app, provide source, optional ref, and optional repo_path. Never assume a frontend-local path exists inside a remote or containerized backend.
For multiple apps in one repository, produce an install matrix listing app name, manifest directory, source, ref, and repo_path. Submit one Add app operation per row. For remote repositories, omit repo_path only when the selected app lives at the repository root. For backend-local sources, make source the selected app package directory. Do not claim that selecting a repository root installs nested apps.
Validate and test every app package independently, then run shared repository checks once. Report partial failures by app name rather than treating one passing app package as validation of the entire repository.
Verify the lifecycle in Canvas:
Do not enable, uninstall, publish, push, or open a pull request without the user's authorization.
Summarize:
references/v1-contract.md - exact manifest, host API, lifecycle, routing, trust, and current limitations.references/connections.md - Agent Server HTTP, Automation service, WebSocket, and TypeScript client connection guidance.references/testing-and-installation.md - test strategy, manual Canvas workflow, and installation coordinates.references/packaging-recipes.md - one-file Vite, CSS, assets, Workers, and WASM rules.references/backend-safety.md - authenticated requests, command safety, persistence, and prerequisite onboarding.references/native-design.md - native Agent Canvas styling: token reuse, Tailwind mapping, layout, component recipes, scoped CSS, and style injection.references/acceptance-checklist.md - automated checks and the local install/enable/reload lifecycle.scripts/validate-extension.mjs - dependency-free static artifact validator for an App package directory.© OpenHands, 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 14 other files (scripts, references) in skills/canvas-extension-api of OpenHands/extensions.
Open the folder on GitHubat commit d008b81
Canvas Extension API 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 |
|---|---|---|---|---|---|---|
| Canvas Extension API this skillOpenHands/extensions | 157 | — | ~5.3k | Automated safety check: Pass | MIT | |
| MCP Developmentcoollabsio/coolify | 63k | 1 repos | ~949 | Automated safety check: Pass | MIT | |
| Tailwind Design SystemSuFxGIT/scoutarr | 114 | 5 repos | ~5.6k | Automated safety check: Pass | None | |
| Extract DesignManavarya09/design-extract | 4.2k | — | ~786 | Automated safety check: Notes | MIT | |
| Tailwind Design Systemjh941213/my-cc-harness | 126 | 9 repos | ~4.7k | Automated safety check: Pass | None | |
| Preline Theme Generatorhtmlstreamofficial/preline | 6.5k | — | ~619 | Automated safety check: Warn | Custom licence |
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
SuFxGIT/scoutarr
Build scalable design systems with Tailwind CSS v4, design tokens, component libraries, and responsive patterns.
Manavarya09/design-extract
Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.
jh941213/my-cc-harness
Build scalable design systems with Tailwind CSS, design tokens, component libraries, and responsive patterns.
htmlstreamofficial/preline
Generates light and dark Preline theme CSS from a brand color or mood, previews it, and validates token coverage through bundled local scripts.
jezweb/claude-skills
Set up Tailwind v4 + shadcn/ui themed UI with dark mode. An agent skill from jezweb/claude-skills.
OpenHands/extensions
Evaluate how well a codebase supports autonomous AI-assisted development.
OpenHands/extensions
Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).
OpenHands/extensions
Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.
OpenHands/extensions
Create an automation that implements GitHub issues when a configurable trigger label is applied.
OpenHands/extensions
This skill should be used when the user asks to "monitor a GitHub repository", "watch GitHub for issues or PRs", "respond to @OpenHands mentions on GitHub", "set up an OpenHands GitHub integration"…
OpenHands/extensions
Create an automation that implements GitLab issues when a configurable trigger label is applied.
Works with
Categories
This skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file…. Canvas Extension API is an agent skill from OpenHands/extensions.
Canvas Extension API fits situations like: asks to create an OpenHands App; scaffold a Canvas App; build an app with the Canvas Extensions API; build an Agent Canvas App.
Run `npx skills add OpenHands/extensions --skill canvas-extension-api -a claude-code`. Or copy the skill folder (skills/canvas-extension-api in OpenHands/extensions) into .claude/skills/canvas-extension-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenHands/extensions --skill canvas-extension-api -a codex`. Or copy the skill folder (skills/canvas-extension-api in OpenHands/extensions) into .agents/skills/canvas-extension-api 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 OpenHands/extensions --skill canvas-extension-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas-extension-api, .gemini/skills/canvas-extension-api, .github/skills/canvas-extension-api and .opencode/skills/canvas-extension-api in your project.
Going by SKILL.md and its folder, Canvas Extension API needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node). Our summary lists: Node.js.
SKILL.md names 1 domain. As links in the text: github.com. 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.
Canvas Extension API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.3k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 16k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Canvas Extension API: MCP Development (coollabsio/coolify, 63k stars), Tailwind Design System (SuFxGIT/scoutarr, 114 stars), Extract Design (Manavarya09/design-extract, 4.2k stars) and Tailwind Design System (jh941213/my-cc-harness, 126 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenHands (a GitHub organization) maintains it in OpenHands/extensions, which has 157 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on October 6, 2026.
Source: OpenHands/extensions on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.