원클릭으로
canvas
Create, read, and manipulate shapes on the workspace canvas. Supports geometric shapes, text, notes, iframe embeds, images, and videos.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Create, read, and manipulate shapes on the workspace canvas. Supports geometric shapes, text, notes, iframe embeds, images, and videos.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Design static ad creatives for social media and display advertising campaigns.
Source and evaluate candidates with job analysis, search strategies, specific candidate profiles, and outreach templates.
Draft emails, manage calendar scheduling, prepare meeting agendas, and organize productivity
Create brand identity kits with color palettes, typography, logo concepts, and brand guidelines.
Perform competitive market analysis with feature comparisons, positioning, and strategic recommendations.
Create social media posts, newsletters, and marketing content calibrated to your voice and platform.
| name | canvas |
| description | Create, read, and manipulate shapes on the workspace canvas. Supports geometric shapes, text, notes, iframe embeds, images, and videos. |
The workspace canvas is an infinite board where you can create, position, and manipulate visual elements. You have two tools:
get_canvas_state -- Read what shapes are on the board, their positions, types, and properties.apply_canvas_actions -- Create, update, delete, move, resize, reorder, align, or distribute shapes.Always read the board before making layout-sensitive changes.
(0, 0) is at the top-left of the canvas.x goes right, positive y goes down.geo -- Geometric shapes (rectangles, ellipses). Props: color, fill, text.text -- Text labels. Props: text, color.note -- Sticky notes. Props: text, color.iframe -- Embedded web content. Requires url (https only). Optional: componentPath, componentName, componentProps.image -- Embedded images. Props: src (HTTPS image URL), altText. For local files, copy to .canvas/assets/ and use https://<domain>:5904/<filename> as src.video -- Embedded videos. Props: src (HTTPS video URL), altText. Local files work the same way as images via .canvas/assets/.get_canvas_stateReturns shapes at three detail levels:
url, componentName, componentPath. Image shapes include src, altText, and filepath (local file path in .canvas/assets/, if applicable). Video shapes include src and altText.componentName. Image shapes include src and filepath. Video shapes include src.Pass an optional focus_area ({x, y, w, h}) to zoom into a specific region.
Example call with no arguments (uses current viewport):
{"focus_area": null}
Example response:
{
"focusedShapes": [
{
"shapeId": "box-1",
"shapeType": "geo",
"x": 100, "y": 100, "w": 200, "h": 150,
"color": "blue", "fill": "solid", "text": "Frontend"
},
{
"shapeId": "preview-1",
"shapeType": "iframe",
"x": 400, "y": 100, "w": 1280, "h": 720,
"url": "https://<resolved-domain>.replit.dev/preview/hello-world/Card",
"componentName": "Card",
"componentPath": "mockup/src/components/mockups/hello-world/Card.tsx"
}
],
"blurryShapes": [
{
"shapeId": "distant-iframe",
"shapeType": "iframe",
"x": 5000, "y": 100, "w": 1280, "h": 720,
"componentName": "Sidebar"
}
],
"peripheralClusters": [],
"viewport": {"x": 0, "y": 0, "w": 1920, "h": 1080},
"summary": "2 shapes on canvas.",
"focusedOmittedCount": 0,
"blurryOmittedCount": 0
}
Focused iframe shapes include url, componentName, and componentPath. Blurry iframe shapes only include componentName (no URL or path). Focused image shapes include src, altText, and filepath. Focused video shapes include src and altText. Blurry image shapes include src and filepath. Blurry video shapes include src.
apply_canvas_actionsSend an ordered list of actions. Each action has a type field. Results are returned per-action with generated shapeId values.
Set a shapeId so you can reference the shape later.
{
"type": "create",
"shapeId": "my-box",
"shape": {
"type": "geo",
"x": 100, "y": 100, "w": 200, "h": 150,
"color": "blue", "fill": "solid", "text": "Hello"
}
}
Embed live web content. The url must use https://.
To get the URL for a Replit dev server, run echo $REPLIT_DOMAINS in the shell to get the domain, then construct the full URL. For the main app on port 5000, no port suffix is needed. For other ports, append :<port>.
Always resolve the actual domain first -- do not pass literal template strings as the iframe URL.
{
"type": "create",
"shapeId": "app-preview",
"shape": {
"type": "iframe",
"x": 0, "y": 0, "w": 1280, "h": 720,
"url": "https://<resolved-domain>.replit.dev",
"componentName": "App Preview"
}
}
url -- Required. Must be https. This is what actually loads content.componentPath -- File path shown in the title bar (metadata label only).componentName -- Display name shown in the title bar (metadata label only).componentProps -- Extra props dict merged into shape props.To embed individual React components (not just the full app), you need a component preview server that renders each component at its own URL. Use the mockup-sandbox skill to set it up.
Embed an image on the canvas.
From an external URL:
{
"type": "create",
"shapeId": "hero-image",
"shape": {
"type": "image",
"x": 0, "y": 0, "w": 800, "h": 600,
"src": "https://example.com/hero.png",
"altText": "Hero banner image"
}
}
From a local file (copy to .canvas/assets/, resolve domain, use port 5904):
mkdir -p .canvas/assets
cp assets/hero.png .canvas/assets/hero.png
echo $REPLIT_DOMAINS # e.g. abc123.replit.dev
{
"type": "create",
"shapeId": "hero-image",
"shape": {
"type": "image",
"x": 0, "y": 0, "w": 800, "h": 600,
"src": "https://<resolved-domain>:5904/hero.png",
"altText": "Hero banner image"
}
}
Embed a video on the canvas. Local files work the same way as images via .canvas/assets/.
From an external URL:
{
"type": "create",
"shapeId": "demo-video",
"shape": {
"type": "video",
"x": 0, "y": 0, "w": 1280, "h": 720,
"src": "https://example.com/demo.mp4",
"altText": "Product demo video"
}
}
From a local file:
cp assets/demo.mp4 .canvas/assets/demo.mp4
{
"type": "create",
"shapeId": "demo-video",
"shape": {
"type": "video",
"x": 0, "y": 0, "w": 1280, "h": 720,
"src": "https://<resolved-domain>:5904/demo.mp4",
"altText": "Product demo video"
}
}
Only include the fields you want to change. Always set shapeType to the shape's type (from get_canvas_state).
{
"type": "update",
"shapeId": "my-box",
"updates": {"shapeType": "geo", "color": "red", "text": "Updated"}
}
{"type": "delete", "shapeId": "my-box"}
{"type": "move", "shapeId": "my-box", "x": 300, "y": 200}
{"type": "resize", "shapeId": "my-box", "w": 400, "h": 300}
Direction: "front" or "back".
{"type": "reorder", "shapeId": "my-box", "direction": "front"}
Align multiple shapes. Options: "left", "center-horizontal", "right", "top", "center-vertical", "bottom".
{
"type": "align",
"shapeIds": ["box-1", "box-2", "box-3"],
"alignment": "center-horizontal"
}
Evenly space shapes. Direction: "horizontal" or "vertical".
{
"type": "distribute",
"shapeIds": ["box-1", "box-2", "box-3"],
"direction": "horizontal"
}
https -- http and about:blank are rejected.echo $REPLIT_DOMAINS in the shell, then build the URL from the result. Never pass a literal template string as the URL.:<port>.X-Frame-Options: DENY or restrictive CSP headers will show a blank iframe. Replit dev URLs work fine./preview/{folder}/{Component} URLs. This gives you isolated components that can be iterated on independently.Since iframe URLs must be https (no about:blank), to plan a layout before you have real URLs:
geo shapes at the desired positions with labels describing what goes there.geo shapes.iframe shapes at the same positions with the actual URLs.get_canvas_state to see what's on the board.summary and focusedShapes to understand positions and IDs.apply_canvas_actions with a batch of changes.focus_canvas_shapes with the IDs of all relevant shapes. Use animate_ms: 500 for a smooth transition.SHAPE_NOT_FOUND -- Shape ID doesn't exist.UNSUPPORTED_SHAPE_TYPE -- Invalid shape type.INVALID_PROPS -- Bad property values (e.g., non-https iframe URL).VALIDATION_FAILED -- Shape with that ID already exists.INSUFFICIENT_SHAPES -- Not enough shapes for align/distribute.get_canvas_state before layout-sensitive changes.focus_canvas_shapes on the affected shape IDs with animate_ms: 500 for smooth transitions. After a batch of creates, focus on all new shape IDs together in a single call.apply_canvas_actions call.componentPath and componentName so users can identify embedded content.get_canvas_state to get detail where you need it.