Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/jongio/skills/create-canvas-appnpx skills add jongio/skills --skill create-canvas-appgit clone --depth 1 https://github.com/jongio/skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/jongio/skills/create-canvas-app)<a href="https://agentmods.dev/skills/jongio/skills/create-canvas-app"><img src="https://agentmods.dev/badge/skills/jongio/skills/create-canvas-app.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00132 | $0.06109 |
| Opus 5 | $0.00066 | $0.03054 |
| Sonnet 5 | $0.00026 | $0.01222 |
| Haiku 4.5 | $0.00013 | $0.00611 |
Grade A, and why
create-canvas-app scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 424 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Create Canvas App
A batteries-included way to build Copilot App canvas extensions. It exists
because hand-rolled canvases keep hitting the same walls: an innerHTML repaint
loop that eats keystrokes, state that lives only in one panel, ad-hoc styling
that ignores the host theme, and inconsistent icons. The kit fixes all four.
What a canvas is (and when to build one)
A canvas is an interactive surface the agent opens in a side panel via
open_canvas. Both the agent and the user act on the same state
through the same action handlers. Reach for a canvas when chat text or a diff
isn't enough: live dashboards, editors, spreadsheets, trackers, kanban/board
views, document previews, tool-specific workflows.
If the user just needs a non-visual agent tool, build a normal extension tool instead — not a canvas.
Rendering tier — decide first
| Tier | Use when | How |
|---|---|---|
| Static HTML string | Read-only or near-static content; no inputs to protect | The runtime's vanilla scaffold (extensions_manage scaffold kind:canvas). |
| Preact + htm + this kit | Anything interactive: inputs, live updates, lists, forms, shared state | This kit. Default choice for real canvases. |
The single most important reason to use the kit: Preact diffs the DOM, so a
live state push from the agent does not clobber focus, caret position, or
half-typed text in an input. The innerHTML = ... pattern most early canvases
use repaints the whole tree and loses keystrokes on every push. Don't do that.
The model (read this before coding)
extension.mjs ── the ONLY file that imports the Copilot SDK (thin adapter; also wires host AI)
canvas.mjs ── your canvas: id, schema, state load/save, action handlers (SDK-free)
canvas-kit/ ── the kit (copied in verbatim; do not edit)
web/index.html ── shell: loads /kit/theme.css and ./app.mjs
web/app.mjs ── your Preact view
- State is shared and durable. It's keyed by a domain id resolved from the
open input (
resolveDomainId), not byinstanceId— open the same domain in two panels and they show the same data. Persistence goes throughuserStore(extName, file)→$COPILOT_HOME/extensions/<name>/artifacts/<domain>.json. Two more tiers exist inkit/storage.mjsfor non-durable/scoped state:sessionStore(sessionId, extName, file)(per-session scratch, discarded with the session) andworkspaceStore(workspacePath, file)(rooted at the session workspace). All three write atomically (temp + rename) and serialize concurrent saves to the same file, so a racing agent + UI save can't corrupt orEPERMthe durable file. - Shared, multiplayer state (optional). For a board multiple people edit,
swap the local tier for
githubStore({ owner, repo, path })fromkit/github-store.mjs: it persists the same JSON to a file in a (private) repo via the GitHub Contents API, so every collaborator with push access edits ONE document — GitHub is both the store and the access control. Wire it asloadState/saveState, and addsyncState: () => store.poll()+syncIntervalMsso the runtime polls for other people's edits (cheap ETag304when unchanged) and adopts them live — but only while a panel is being viewed. Writes are optimistic-locked by blob SHA (a conflicting commit re-reads + retries; last-writer-wins by default, or pass amerge(remote, mine)). Token comes fromGH_TOKEN/GITHUB_TOKENorgh auth tokenand is only ever sent as anAuthorizationheader. - Agent and UI share handlers. An action invoked by the agent and the same
action invoked from a button run the identical handler and produce the identical
state mutation. Write the logic once, in
canvas.mjs. - Live updates are automatic. The kit serves
GET /state,GET /events(SSE), andPOST /action.mountCanvaswires them up; every state change fans out to all open panels. server.mjsis SDK-free so the whole runtime is testable with plain Node HTTP (seetest/http.test.mjs). Keep SDK calls inextension.mjsonly.
What ships with it
57 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- .vally.yaml 907 B
- docs/invoke.png 13 KB
- docs/stock-ticker.png 176 KB
- evals/create-canvas-app/eval.yaml 13 KB
- evals/README.md 2.4 KB
- kit/client.mjs 9.0 KB runs code
- kit/deeplinks.mjs 16 KB runs code
- kit/format.mjs 3.1 KB runs code
- kit/github-store.mjs 9.8 KB runs code
- kit/icons.mjs 4.1 KB runs code
- kit/net.mjs 6.0 KB runs code
- kit/server.mjs 21 KB runs code
- kit/storage.mjs 5.1 KB runs code
- kit/theme.css 12 KB
- kit/validate.mjs 6.1 KB runs code
- kit/vendor/lucide.mjs 387 KB runs code
- kit/vendor/preact-htm-standalone.mjs 13 KB runs code
- kit/version.mjs 683 B runs code
- LICENSE 1.0 KB
- package-lock.json 65 KB
- package.json 907 B
- README.md 11 KB
- reference/decision-log/canvas-kit/.kit-version.json 111 B
- reference/decision-log/canvas-kit/client.mjs 9.0 KB runs code
- reference/decision-log/canvas-kit/deeplinks.mjs 16 KB runs code
- reference/decision-log/canvas-kit/format.mjs 3.1 KB runs code
- reference/decision-log/canvas-kit/github-store.mjs 9.8 KB runs code
- reference/decision-log/canvas-kit/icons.mjs 4.1 KB runs code
- reference/decision-log/canvas-kit/net.mjs 6.0 KB runs code
- reference/decision-log/canvas-kit/server.mjs 21 KB runs code
- reference/decision-log/canvas-kit/storage.mjs 5.1 KB runs code
- reference/decision-log/canvas-kit/theme.css 12 KB
- reference/decision-log/canvas-kit/validate.mjs 6.1 KB runs code
- reference/decision-log/canvas-kit/vendor/lucide.mjs 387 KB runs code
- reference/decision-log/canvas-kit/vendor/preact-htm-standalone.mjs 13 KB runs code
- reference/decision-log/canvas-kit/version.mjs 683 B runs code
- reference/decision-log/canvas.mjs 12 KB runs code
- reference/decision-log/copilot-extension.json 45 B
- reference/decision-log/extension.mjs 2.6 KB runs code
- reference/decision-log/web/app.mjs 16 KB runs code
- reference/decision-log/web/index.html 770 B
- reference/deeplinks.md 9.0 KB
- references/advanced-patterns.md 14 KB
- scripts/check-kit-freshness.mjs 5.1 KB runs code
- scripts/install-local.ps1 1.2 KB runs code
- scripts/new-canvas.mjs 47 KB runs code
- scripts/sync-kit.mjs 4.3 KB runs code
- scripts/vendor-lucide.mjs 7.9 KB runs code
- test/client.test.mjs 5.0 KB runs code
- test/deeplinks.test.mjs 18 KB runs code
- test/generator.test.mjs 16 KB runs code
- test/http.test.mjs 13 KB runs code
- test/kit-parity.test.mjs 2.9 KB runs code
- test/kit-runtime.test.mjs 25 KB runs code
- test/tooling.test.mjs 7.4 KB runs code
- test/vendor-lucide.test.mjs 5.0 KB runs code
- thumbnail.png 288 KB
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago First seen · 424 lines · 132 tokens per session scan A 278486df30a2
create-canvas-app is a skill published in the GitHub repository jongio/skills (14 stars, last pushed today), licensed MIT. It adds 132 tokens to every session and 6,109 once invoked, about $0.0007 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
html-artifacts
Create or revise polished, standalone HTML documents for direct human reading. Use for technical documents, proposals, reports, specifications, guides, and review artifacts when the user wants a clear, attractive HTML deliverable.
competitive-exec-brief
Creates an executive-ready competitive analysis brief with a 1-slide PPTX summary for leadership presentations. Use when: competitive brief, exec competitive summary, competitive slide, competitive pptx, board competitive update, leadership competitive briefing.
asvs-audit
Role: You are an Application Security Expert. Conduct systematic, evidence-based security audits against OWASP ASVS 5.0 Level 1 requirements using the bundled CSV as the canonical source.
write-prd
Create a PRD and user stories through user interview, codebase exploration, and component design. Use when user wants to write a PRD, create a product requirements document, user stories or plan a new feature.
external-context
Invoke parallel document-specialist agents for external web searches and documentation lookup.
instrument-data-to-allotrope
Convert laboratory instrument output files (PDF, CSV, Excel, TXT) to Allotrope Simple Model (ASM) JSON format or flattened 2D CSV. Use this skill when scientists need to standardize instrument data for LIMS systems, data lakes, or downstream analysis. Supports auto-detection of instrument types. Outputs include full…