Agent skill

Canvas Extension API

by OpenHands in 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…

MITAuto-check passedFrontend & Design

Install Canvas Extension API

skills CLI
$ npx skills add OpenHands/extensions --skill canvas-extension-api -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install OpenHands/extensions canvas-extension-api --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
canvas-extension-api
GitHub stars
157
Token cost
~5.3k tokens
SKILL.md length
2,444 words
Files
15 (incl. scripts, references)
Skills in repo
78
Repo updated
First seen
Licence
MIT

At a glance

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…

  • Works in 8 steps: activate registers every declared page… → The mount renders its initial state. → Agent Server requests use the expected… → …
  • Asks to create an OpenHands App
  • SKILL.md covers Prefer the proven App…, Establish the target, Inspect current upstream… and Create the app package, plus 7 more sections
  • Runs JavaScript scripts from its folder; calls node

What it does

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.

When your agent uses it

  • Asks to create an OpenHands App
  • Scaffold a Canvas App
  • Build an app with the Canvas Extensions API
  • Build an Agent Canvas App

Example prompts

  • “create an OpenHands App”
  • “scaffold a Canvas App”
  • “build an app with the Canvas Extensions API”
  • “/canvas-extension-api”

Requirements

  • Node.js

Workflow steps

8 steps, taken from the first numbered list in SKILL.md.

  1. activate registers every declared page exactly once.
  2. The mount renders its initial state.
  3. Agent Server requests use the expected root-relative path and method.
  4. Nested navigation disposes the prior mount and remounts with the correct route remainder; test any intentionally preserved state explicitly.
  5. The mount disposer removes DOM and stops effects.
  6. The activation disposer unregisters contributions.
  7. Unsupported host API versions fail clearly when compatibility is checked.
  8. Network and malformed-response errors render safely.

What it can do on your machine

Read from SKILL.md and the folder at commit d008b81. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 2 files in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~171
When it runs · the whole SKILL.md, loaded when a task matches
~5.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~22k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 2,444 words, ~5,267 tokens.

Download SKILL.mdSave it as .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.
name
canvas-extension-api
description
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 app", or mentions Canvas Apps, Agent Canvas extensions, Blob-importable app bundles, registerPage, app pages, Sidecars, or canvas extension packages.

Canvas Extensions API

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:

  • OpenHands Apps - customer-facing category for interfaces people discover, install, enable, and open.
  • Apps for Agent Canvas - product phrasing that clarifies where apps run.
  • Canvas Extensions API - developer platform used to build apps.
  • Canvas extension package - technical artifact containing canvas-extension.json and its entrypoint.
  • OpenHands Extensions - ecosystem and repository umbrella for apps, skills, plugins, automations, and integrations.

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.

Prefer the proven App authoring loop

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:

sh
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.

Establish the target

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:

  • app purpose and page behavior;
  • target repository and subdirectory;
  • dependency-free JavaScript versus a bundled TypeScript/framework project;
  • Agent Server endpoints or host metadata required;
  • whether to build only, install locally, or prepare publication instructions;
  • for a Sidecar: execution location, owner, connection route, secrets and data, lifecycle actions, and portability across Agent Canvas deployments.

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.

Inspect current upstream behavior

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.md
  • src/types/canvas-extension.ts
  • src/components/features/canvas-extensions/canvas-extensions-runtime.tsx
  • src/routes/canvas-extension-page.tsx
  • docs/CANVAS_EXTENSIONS_TESTING.md

Do 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.

Create the app package

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:

json
{
  "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:

json
"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:

  • Use lowercase letters, digits, and hyphens for app names and page IDs.
  • Use absolute kebab-case page paths with a leading slash.
  • Keep every manifest path within the app package root.
  • Give each page ID and path a unique value.
  • Register only page IDs declared in the manifest.
  • Keep the entrypoint free of unresolved bare imports and external chunks.
  • Bundle dependencies, CSS, and small assets into the entrypoint when using build tooling.

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.

Implement activation and pages

Export an activate function from the ESM entrypoint:

js
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:

  • Read immutable metadata from host.extension and host.backend.
  • Call host.registerPage(id, mount) during activation.
  • Use the mount callback's path as the route remainder below the declared page path.
  • Treat every nested-route navigation as a fresh mount: Canvas disposes the previous mount, clears the container, and invokes the mount callback with the new remainder. DOM and framework state do not persist across route changes; keep intentional cross-route state in the URL, backend, or activation-scoped state and clean it up on deactivation.
  • Use navigate(absoluteCanvasPath) for Canvas-aware routing.
  • Use host.agentServer.request({ path, method, body, headers }) for authenticated calls to the owning Agent Server.
  • Pass only root-relative request paths beginning with one /; 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:

  • Treat host.agentServer.request as the portable Agent Server HTTP path; Canvas selects the active backend and supplies authentication.
  • For a managed-backend view, require the feature-detected host helper documented in 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.
  • Installing, enabling, activating, or mounting an App never prepares or starts a managed backend. Show the resolved revision and declaration, obtain explicit lifecycle consent, and call prepare then start with that exact revision. An update invalidates approval.
  • Do not derive an Agent Server URL from window.location or extract session keys from Canvas internals.
  • Do not send Automation service requests through 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.
  • Do not open a direct Agent Server WebSocket from a portable v1 app. The host currently exposes neither the owning server origin nor a WebSocket/auth capability. Poll through host.agentServer.request, add a backend-owned bridge, or feature-detect a future host subscription API.
  • Use the TypeScript client's Agent Server WebSocket support in trusted standalone or future host-enabled contexts, and stop it during disposal. Do not treat the Agent Server client as an Automation service client.

Return cleanup from every layer that creates effects:

  • Return the unregister function or an activation disposer from activate.
  • Return a mount disposer for DOM nodes, timers, listeners, observers, subscriptions, and outstanding state.
  • Make async work disposal-aware so late responses cannot mutate an unmounted page.
  • Remove injected styles when the page unmounts.

Assume activation, mounting, and disposal may happen repeatedly during hot enable/disable, updates, backend switches, reconnects, and route changes.

Show full SKILL.md (847 more words)Show less

Build a production-quality page

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:

  • semantic structure and headings inside the supplied container. Canvas already owns the outer <main aria-label={page title}>, so do not add a nested main or duplicate page landmark label;
  • keyboard-operable controls and visible focus;
  • responsive behavior for narrow layouts;
  • loading, empty, stale, and error states;
  • reduced-motion handling for animation;
  • text-safe rendering through DOM APIs or escaping rather than untrusted innerHTML;
  • clear handling for malformed or partial Agent Server responses.

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.

Add tests

Test real app code with a DOM environment and a small Canvas Extensions API host test double. Test at minimum:

  1. activate registers every declared page exactly once.
  2. The mount renders its initial state.
  3. Agent Server requests use the expected root-relative path and method.
  4. Nested navigation disposes the prior mount and remounts with the correct route remainder; test any intentionally preserved state explicitly.
  5. The mount disposer removes DOM and stops effects.
  6. The activation disposer unregisters contributions.
  7. Unsupported host API versions fail clearly when compatibility is checked.
  8. Network and malformed-response errors render safely.

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.

Validate the package

Run the bundled validator before reporting completion:

sh
node /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app-package

Then run the target repository's formatter, linter, tests, and build. Inspect the final entrypoint rather than assuming the bundler configuration worked:

  • confirm the file exists at the manifest path;
  • confirm it exports activate;
  • reject bare imports and dynamic external chunks;
  • confirm CSS and required small assets are bundled or embedded;
  • confirm the output runs as browser ESM without Node globals.

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 and verify safely

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:

  1. Install and confirm the inventory entry is disabled.
  2. Review source, revision, manifest metadata, and contributions.
  3. Enable and accept the trusted-code disclosure: “This app runs trusted JavaScript inside Agent Canvas and can make authenticated requests to the active Agent Server. Review its source and revision before enabling it.”
  4. Open the navigation item and exercise root and nested routes.
  5. Disable and confirm navigation and mounted UI disappear.
  6. Re-enable without restarting Canvas.
  7. Switch backend or reconnect when relevant and confirm isolation.
  8. Uninstall only when requested.

Do not enable, uninstall, publish, push, or open a pull request without the user's authorization.

Report completion

Summarize:

  • app location and contributed pages;
  • manifest schema and host API targeted;
  • build output and validation results;
  • tests run and their results;
  • installation status, explicitly stating whether it remains disabled;
  • remaining limitations tied to the current v1 ABI.

Resources

  • 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

Files

SKILL.md and 14 other files (scripts, references) in skills/canvas-extension-api of OpenHands/extensions.

  • SKILL.md
  • .claude-plugin
  • .codex-plugin
  • .plugin/plugin.json
  • README.md
  • references/acceptance-checklist.md
  • references/backend-safety.md
  • references/connections.md
  • references/native-design.md
  • references/packaging-recipes.md
  • references/sidecar-pattern.md
  • references/testing-and-installation.md
  • references/v1-contract.md
  • scripts/validate-extension.mjs
  • scripts/validate-extension.test.mjs

Open the folder on GitHubat commit d008b81

Compare with similar skills

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.

Canvas Extension API compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Canvas Extension API this skillOpenHands/extensions157—~5.3kAutomated safety check: PassMIT
MCP Developmentcoollabsio/coolify63k1 repos~949Automated safety check: PassMIT
Tailwind Design SystemSuFxGIT/scoutarr1145 repos~5.6kAutomated safety check: PassNone
Extract DesignManavarya09/design-extract4.2k—~786Automated safety check: NotesMIT
Tailwind Design Systemjh941213/my-cc-harness1269 repos~4.7kAutomated safety check: PassNone
Preline Theme Generatorhtmlstreamofficial/preline6.5k—~619Automated safety check: WarnCustom licence

Similar skills

  • MCP Development

    coollabsio/coolify

    A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.

    63k GitHub starsUsed in 1 repo~949 tokens
    Frontend & DesignAuto-check passed
  • Tailwind Design System

    SuFxGIT/scoutarr

    Build scalable design systems with Tailwind CSS v4, design tokens, component libraries, and responsive patterns.

    114 GitHub starsUsed in 5 repos~5.6k tokens
    Frontend & DesignAuto-check passed
  • Extract Design

    Manavarya09/design-extract

    Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.

    4.2k GitHub stars~786 tokensUpdated 8 days ago
    Frontend & DesignAuto-check: notes
  • Tailwind Design System

    jh941213/my-cc-harness

    Build scalable design systems with Tailwind CSS, design tokens, component libraries, and responsive patterns.

    126 GitHub starsUsed in 9 repos~4.7k tokens
    Frontend & DesignAuto-check passed
  • Preline Theme Generator

    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.

    6.5k GitHub stars~619 tokensUpdated 1 mo ago
    Frontend & DesignAuto-check: warnings
  • Tailwind Theme Builder

    jezweb/claude-skills

    Set up Tailwind v4 + shadcn/ui themed UI with dark mode. An agent skill from jezweb/claude-skills.

    1.1k GitHub starsUsed in 1 repo~3.2k tokens
    Frontend & DesignAuto-check passed

More from OpenHands/extensions

All 78 skills in this repo
  • Agent Readiness Report

    OpenHands/extensions

    Evaluate how well a codebase supports autonomous AI-assisted development.

    157 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • Discord

    OpenHands/extensions

    Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).

    157 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • GitHub

    OpenHands/extensions

    Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.

    157 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • GitHub Issue To PR

    OpenHands/extensions

    Create an automation that implements GitHub issues when a configurable trigger label is applied.

    157 GitHub stars~4.4k tokensUpdated yesterday
    Auto-check passed
  • GitHub Repo Monitor

    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"…

    157 GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • GitLab Issue To Mr

    OpenHands/extensions

    Create an automation that implements GitLab issues when a configurable trigger label is applied.

    157 GitHub stars~4.9k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Canvas Extension API

What does Canvas Extension API do?

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.

When should I use Canvas Extension API?

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.

How do I install Canvas Extension API in Claude Code?

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.

How do I install Canvas Extension API in Codex?

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.

Can I use Canvas Extension API in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Canvas Extension API need to run?

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.

Does Canvas Extension API access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Canvas Extension API safe to install?

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.

What licence does Canvas Extension API use?

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.

How many tokens does Canvas Extension API use?

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.

What are the alternatives to Canvas Extension API?

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.

Who maintains Canvas Extension API?

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.