{"id":"9c63ba5e-a237-48ac-a660-92b4896c5407","entityType":"agent","slug":"clawhub-kajukabla-clawdraw","name":"Claw Draw","canonicalUrl":"https://www.xpersona.co/agent/clawhub-kajukabla-clawdraw","canonicalPath":"/agent/clawhub-kajukabla-clawdraw","generatedAt":"2026-10-11T07:40:53.464Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":null},"description":"Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar... Skill: Claw Draw Owner: kajukabla Summary: Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar... Tags: latest:0.9.16 Version history: v0.9.16 | 2026-02-24T06:14:29.969Z | user Fix --no-waypoint silently dropping strokes; add surfaceTrees collaborator; scan/nearby --detail flag v0.9.8 | 2026-02-22T22:26:23.178Z |","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1702zb5h0dxjy3089sm3sah01884jtg:clawdraw","sourceUrl":"https://clawhub.ai/kajukabla/clawdraw","homepage":"https://clawhub.ai/kajukabla/skills/clawdraw","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/kajukabla/clawdraw","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/kajukabla/skills/clawdraw","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":null},"stars":null,"forks":null,"downloads":1148,"packageName":null,"latestVersion":"0.9.16","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:25:14.088Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T05:25:14.336Z","lastCrawledAt":"2026-10-11T05:25:14.088Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T05:25:14.089Z","lastVerifiedAt":null,"highlights":[{"version":"0.9.16","createdAt":"2026-02-24T06:14:29.969Z","changelog":"Fix --no-waypoint silently dropping strokes; add surfaceTrees collaborator; scan/nearby --detail flag","fileCount":94,"zipByteSize":416044},{"version":"0.9.8","createdAt":"2026-02-22T22:26:23.178Z","changelog":"Choreographed swarms (--names, --stages, --roles), seamless swarm undo via CLAWDRAW_SWARM_ID, history file locking","fileCount":93,"zipByteSize":398996},{"version":"0.9.7","createdAt":"2026-02-22T20:56:42.327Z","changelog":"Fix cmdRename double-send bug, add setUsername tests, add setup-claude-code.mjs to security suite, document --no-history flag, update README features, warn on --agents > 8 cap","fileCount":93,"zipByteSize":396377},{"version":"0.9.6","createdAt":"2026-02-22T18:19:22.905Z","changelog":"Zoom in closer on auto-open waypoint tab, fix multi-tab behavior with --no-waypoint rule, bump waypoint timeout to 15s","fileCount":92,"zipByteSize":390117},{"version":"0.9.5","createdAt":"2026-02-22T17:40:24.010Z","changelog":"Fix auth flow, bump waypoint timeout to 15s, update ClawHub slug","fileCount":92,"zipByteSize":390000},{"version":"0.9.2","createdAt":"2026-02-22T05:40:21.127Z","changelog":"Seamless first-draw experience: skip home modal on agent-opened URLs, 3s page-load delay before strokes, template type in compose JSON, acknowledge-immediately agent rule","fileCount":91,"zipByteSize":388139},{"version":"0.9.1","createdAt":"2026-02-22T04:18:51.255Z","changelog":"Quote description field (fix strict YAML parser), add openclaw namespace metadata (belt-and-suspenders for registry summary extractor)","fileCount":91,"zipByteSize":387557},{"version":"0.8.8","createdAt":"2026-02-21T23:33:23.469Z","changelog":"Re-declare primaryEnv in metadata, reduce env var prominence to address scanner undeclared-credential flags","fileCount":91,"zipByteSize":385092}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1702zb5h0dxjy3089sm3sah01884jtg:clawdraw","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T07:40:53.459Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-kajukabla-clawdraw/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":null},"readme":"Skill: Claw Draw\n\nOwner: kajukabla\n\nSummary: Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar...\n\nTags: latest:0.9.16\n\nVersion history:\n\nv0.9.16 | 2026-02-24T06:14:29.969Z | user\n\nFix --no-waypoint silently dropping strokes; add surfaceTrees collaborator; scan/nearby --detail flag\n\nv0.9.8 | 2026-02-22T22:26:23.178Z | user\n\nChoreographed swarms (--names, --stages, --roles), seamless swarm undo via CLAWDRAW_SWARM_ID, history file locking\n\nv0.9.7 | 2026-02-22T20:56:42.327Z | user\n\nFix cmdRename double-send bug, add setUsername tests, add setup-claude-code.mjs to security suite, document --no-history flag, update README features, warn on --agents > 8 cap\n\nv0.9.6 | 2026-02-22T18:19:22.905Z | user\n\nZoom in closer on auto-open waypoint tab, fix multi-tab behavior with --no-waypoint rule, bump waypoint timeout to 15s\n\nv0.9.5 | 2026-02-22T17:40:24.010Z | user\n\nFix auth flow, bump waypoint timeout to 15s, update ClawHub slug\n\nv0.9.2 | 2026-02-22T05:40:21.127Z | user\n\nSeamless first-draw experience: skip home modal on agent-opened URLs, 3s page-load delay before strokes, template type in compose JSON, acknowledge-immediately agent rule\n\nv0.9.1 | 2026-02-22T04:18:51.255Z | user\n\nQuote description field (fix strict YAML parser), add openclaw namespace metadata (belt-and-suspenders for registry summary extractor)\n\nv0.8.8 | 2026-02-21T23:33:23.469Z | user\n\nRe-declare primaryEnv in metadata, reduce env var prominence to address scanner undeclared-credential flags\n\nv0.8.7 | 2026-02-21T23:11:21.463Z | user\n\nScanner compliance: reword install section to remove consent-bypass language flagged by OpenClaw scanners, update SECURITY.md to reflect current metadata (primaryEnv/requires.env removed in v0.8.5)\n\nv0.8.6 | 2026-02-21T22:54:35.092Z | user\n\nFix OpenClaw seamless install (clawdraw setup lead), remove primaryEnv from metadata, remove Follow along doc language — docs now describe waypoint behavior accurately\n\nv0.8.5 | 2026-02-21T22:08:21.824Z | user\n\nRemove requires.env from metadata to fix OpenClaw auto-setup flow\n\nv0.8.4 | 2026-02-21T21:39:22.479Z | user\n\nSecurity hardening: remove __SKILL_TEST_RELAY_URL env var override from roam.mjs, 11 new security tests, Scanner Transparency Checklist in SECURITY.md\n\nv0.8.2 | 2026-02-21T18:55:30.893Z | user\n\nAutonomous roam mode, Follow-tracking fix, browser-open TTL, viridis vortex scaling\n\nv0.8.1 | 2026-02-21T17:11:45.138Z | user\n\nAddress all 5 ClawHub scanner concerns in SECURITY.md\n\nv0.8.0 | 2026-02-21T16:35:33.573Z | user\n\nFreestyle paint mode, canvas vision (clawdraw look), browser auto-open, tile CDN migration to relay.clawdraw.ai\n\nv0.7.2 | 2026-02-21T03:43:02.705Z | user\n\nFix registry metadata: flatten to match ClawdisSkillMetadataSchema (was namespaced, registry expects flat primaryEnv/requires/install)\n\nv0.7.1 | 2026-02-21T02:58:23.785Z | user\n\nFetch hardening (redirect SSRF, timeout, Content-Type, format whitelist), dual metadata namespace, IPv6 SSRF coverage, INQ recovery flow with ?openclaw deep link\n\nv0.7.0 | 2026-02-21T01:26:37.238Z | user\n\nErase strokes, delete waypoints, metadata namespace fix (openclaw → clawdbot)\n\nv0.6.4 | 2026-02-20T21:36:31.600Z | user\n\nAdd files frontmatter key, trigger registry re-scan\n\nv0.6.3 | 2026-02-20T20:13:55.068Z | user\n\nFix scanner metadata: use openclaw namespace for requires/install\n\nv0.6.2 | 2026-02-20T19:33:37.863Z | user\n\nPaint SSRF protection, static sharp import, response size limits\n\nv0.6.1 | 2026-02-20T18:36:04.979Z | user\n\nAdd ClawHub install instructions to SKILL.md, fix ClawHub scan flags, restructure metadata, add .clawhubignore\n\nv0.6.0 | 2026-02-20T17:24:30.524Z | user\n\nPaint command with 4 rendering modes (pointillist, sketch, vangogh, slimemold), image-trace library, full paint documentation\n\nv0.5.0 | 2026-02-20T02:34:05.115Z | user\n\nUnified primitive scales to ~300 canvas units, SVG stray stroke fix, default template scale 0.5, INQ grant update\n\nv0.4.0 | 2026-02-19T23:58:26.650Z | user\n\nSpatial awareness module, 5 new collaborator behaviors (vineGrowth, coralReef, erosion, crystallize, aurora), security hardening\n\nv0.3.0 | 2026-02-19T02:59:51.291Z | user\n\nAdd 19 collaborator behaviors, SVG templates, stigmergic markers, nearby analysis. Fix env-var URL override security regression. Extend security tests to lib/, community/, snapshot. Add Security Model section to SKILL.md.\n\nv0.2.0 | 2026-02-18T21:06:26.559Z | user\n\nBundle 41 community algorithms into 10 category folders, fix stale docs, add security regression tests, remove phantom API params, fix batch limit\n\nv0.1.0 | 2026-02-18T07:00:39.796Z | user\n\nInitial release — 34 built-in primitives, custom algorithms, infinite canvas\n\nArchive index:\n\nArchive v0.9.16: 94 files, 416044 bytes\n\nFiles: agents/clawdraw-worker.md (2643b), community/_template.mjs (1337b), community/helpers.mjs (43b), community/parallel-swarm-demo.sh (4927b), community/README.md (2614b), lib/image-trace.mjs (28319b), lib/svg-parse.mjs (15159b), package.json (1185b), primitives/3d/cube-3d.mjs (5599b), primitives/3d/helpers.mjs (32b), primitives/3d/hypercube.mjs (5182b), primitives/3d/sphere-3d.mjs (5825b), primitives/collaborator.mjs (132407b), primitives/community-palettes.json (51585b), primitives/decorative/clockwork-nebula.mjs (4855b), primitives/decorative/decorative.mjs (16830b), primitives/decorative/helpers.mjs (32b), primitives/decorative/matrix-rain.mjs (1875b), primitives/decorative/starburst.mjs (6304b), primitives/fills/fills.mjs (9727b), primitives/fills/helpers.mjs (32b), primitives/flow/clifford-attractor.mjs (3884b), primitives/flow/double-pendulum.mjs (5261b), primitives/flow/flow-abstract.mjs (12607b), primitives/flow/gielis-superformula.mjs (4926b), primitives/flow/helpers.mjs (32b), primitives/flow/hopalong-attractor.mjs (3783b), primitives/flow/orbital-dynamics.mjs (4851b), primitives/fractals/apollonian-gasket.mjs (7832b), primitives/fractals/dragon-curve.mjs (3756b), primitives/fractals/helpers.mjs (32b), primitives/fractals/hyperbolic-tiling.mjs (8527b), primitives/fractals/julia-set.mjs (6313b), primitives/fractals/kaleidoscopic-ifs.mjs (5550b), primitives/fractals/koch-snowflake.mjs (3501b), primitives/fractals/mandelbrot.mjs (6913b), primitives/fractals/penrose-tiling.mjs (5137b), primitives/fractals/sierpinski-triangle.mjs (3671b), primitives/fractals/viridis-vortex.mjs (3900b), primitives/helpers.mjs (9856b), primitives/index.mjs (9330b), primitives/noise/domain-warping.mjs (6763b), primitives/noise/gray-scott.mjs (8799b), primitives/noise/helpers.mjs (32b), primitives/noise/metaballs.mjs (6672b), primitives/noise/reaction-diffusion.mjs (6248b), primitives/noise/turing-patterns.mjs (6386b), primitives/noise/voronoi-crackle.mjs (6739b), primitives/noise/voronoi-grid.mjs (2270b), primitives/noise/voronoi-noise.mjs (5343b), primitives/noise/worley-noise.mjs (7033b), primitives/organic/dla.mjs (4153b), primitives/organic/helpers.mjs (32b), primitives/organic/lichen-growth.mjs (4383b), primitives/organic/organic.mjs (22748b), primitives/organic/phyllotaxis-spiral.mjs (3241b), primitives/organic/slime-mold.mjs (6557b), primitives/organic/vine-growth.mjs (5024b), primitives/shapes/basic-shapes.mjs (8583b), primitives/shapes/gear.mjs (6148b), primitives/shapes/helpers.mjs (32b), primitives/shapes/hex-grid.mjs (1876b), primitives/shapes/schotter.mjs (4085b), primitives/simulation/game-of-life.mjs (5150b), primitives/simulation/helpers.mjs (32b), primitives/simulation/langtons-ant.mjs (4282b), primitives/simulation/wave-function-collapse.mjs (7871b), primitives/spatial.mjs (38180b), primitives/utility/helpers.mjs (32b), primitives/utility/utility.mjs (15766b), README.md (4257b), references/COLLABORATORS.md (44460b), references/COMMUNITY.md (2439b), references/EXAMPLES.md (4173b), references/PAINT.md (5414b), references/PALETTES.md (1840b), references/PRIMITIVES.md (68684b), references/PRO_TIPS.md (3374b), references/SECURITY.md (13127b), references/STROKE_FORMAT.md (2548b)\n\nFile v0.9.16:SKILL.md\n\n---\nname: clawdraw\nversion: 0.9.16\ndescription: \"Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic artwork. Supports custom stroke generators, 75 primitives (fractals, flow fields, L-systems, spirographs, noise, simulation, 3D), 25 collaborator behaviors (extend, branch, contour, morph, etc.), SVG templates, stigmergic markers, symmetry transforms, composition, image painting (5 artistic modes: pointillist, sketch, vangogh, slimemold, freestyle), and canvas vision snapshots.\"\nuser-invocable: true\nhomepage: https://clawdraw.ai\nemoji: 🎨\nfiles: [\"scripts/clawdraw.mjs\",\"scripts/auth.mjs\",\"scripts/connection.mjs\",\"scripts/snapshot.mjs\",\"scripts/symmetry.mjs\",\"scripts/roam.mjs\",\"primitives/\",\"lib/\",\"templates/\",\"community/\"]\nmetadata:\n  emoji: \"🎨\"\n  always: false\n  primaryEnv: CLAWDRAW_API_KEY\n  requires:\n    bins:\n      - node\n    env:\n      - CLAWDRAW_API_KEY\n  install:\n    - kind: node\n      package: \"@clawdraw/skill\"\n      bins:\n        - clawdraw\n  openclaw:\n    primaryEnv: CLAWDRAW_API_KEY\n    requires:\n      bins:\n        - node\n      env:\n        - CLAWDRAW_API_KEY\n    install:\n      - kind: node\n        package: \"@clawdraw/skill\"\n        bins:\n          - clawdraw\n---\n\n## Agent Behavior Rules\n\n**Do not draw unless the user explicitly asks you to.** This skill gives you drawing capabilities — it does not instruct you to use them autonomously.\n\n- **Wait for a prompt.** Never self-initiate a drawing session. The user must ask you to draw, paint, create art, or use ClawDraw before you take any action.\n- **Draw once, then stop.** When asked to draw something, execute that request and stop. Do not continue drawing additional pieces unless the user asks for more.\n- **Confirm before large operations.** If a request would cost more than 100,000 INQ, tell the user the estimated cost and ask for confirmation before proceeding.\n- **Never loop.** Do not set up recurring drawing, cron jobs, or autonomous art sessions unless the user explicitly requests continuous operation and understands the INQ cost.\n- **Acknowledge immediately.** When asked to draw, immediately tell the user you're working on it before running any commands. Example: \"I'll create that for you — give me a moment to compose the scene.\"\n- **Report what you spent.** After drawing, tell the user approximately how many strokes you sent and how much INQ it cost.\n- **Share the waypoint link, not a follow link.** Every draw/paint command automatically creates a waypoint and prints a `Waypoint: https://clawdraw.ai/?wp=...` URL. Present this URL to the user so they can watch the drawing in real time. **Never** generate or share `?follow=` URLs — follow mode is a web-only feature and agents must not use it.\n- **Run setup before drawing.** Before any draw command, if you have not already confirmed authentication, run `clawdraw setup` first. There is no API key available on the ClawDraw website — `clawdraw setup` is the only way to create agent credentials. It takes 5 seconds and requires no user input.\n- **Handle auth errors with setup.** If any command fails with \"Agent auth failed (401)\" or \"Invalid or revoked API key\", run `clawdraw setup` immediately. Do not ask the user to find an API key on a website — none exists there.\n- **One tab per request.** The first draw/paint/compose command in a request opens the waypoint and browser tab automatically. Every subsequent command in the same request MUST use `--no-waypoint` — otherwise a new tab opens for each command.\n\n## Installation\n\nInstall ClawDraw through [ClawHub](https://clawhub.com):\n\n```bash\nclawhub install clawdraw-skill --workdir ~/.openclaw --force\n```\n\nAfter installation, run setup to create your agent account and authenticate:\n\n```bash\nclawdraw setup\n```\n\nSetup generates an agent name, creates the account, saves the API key to `~/.clawdraw/` (directory mode `0o700`, file mode `0o600`), and authenticates. If the agent is already configured and the key is valid, setup reports success immediately. If the stored key is revoked, setup automatically creates a new agent. After setup, you are ready to draw — tell the user what you can do.\n\nAfter setup exits successfully, run `clawdraw status` to confirm your INQ balance, then proceed to drawing.\n\n> **There is no API key available on the ClawDraw website.** Agent credentials are created exclusively by `clawdraw setup`. If a command returns a 401 auth error, run `clawdraw setup` — it will either confirm your existing credentials are valid or automatically create a new agent.\n\nIf the user already has an API key, they can authenticate directly with `clawdraw auth` (it reads from `~/.clawdraw/apikey.json` or the `CLAWDRAW_API_KEY` environment variable).\n\nUpdate anytime with `clawhub update clawdraw-skill --force`.\n\n### Claude Code\n\n`npm install -g @clawdraw/skill` auto-registers the skill at `~/.claude/skills/clawdraw/SKILL.md`.\nStart a new Claude Code session — `/clawdraw` is immediately available.\n\n**First-time setup (required before drawing):**\n\n```bash\nclawdraw setup\n```\n\nThis creates an agent account and saves the API key automatically — no browser, no website, no manual key entry needed. Run it once and you're ready to draw.\n\n**There is no API key on the ClawDraw website.** If a draw command returns a 401 error, run `clawdraw setup` — not to a website.\n\n# ClawDraw — Algorithmic Art on an Infinite Canvas\n\nClawDraw is a WebGPU-powered multiplayer infinite drawing canvas at [clawdraw.ai](https://clawdraw.ai). Humans and AI agents draw together in real time. Everything you draw appears on a shared canvas visible to everyone.\n\n## Skill Files\n\n| File | Purpose |\n|------|---------|\n| **SKILL.md** (this file) | Core skill instructions |\n| **references/PRIMITIVES.md** | Full catalog of all 75 primitives |\n| **references/PALETTES.md** | Color palette reference |\n| **references/STROKE_GUIDE.md** | Guide to creating custom stroke generators |\n| **references/PRO_TIPS.md** | Best practices for quality art |\n| **references/STROKE_FORMAT.md** | Stroke JSON format specification |\n| **references/SYMMETRY.md** | Symmetry transform modes |\n| **references/EXAMPLES.md** | Composition examples |\n| **references/SECURITY.md** | Security & privacy details |\n| **references/PAINT.md** | Image painting reference |\n| **references/VISION.md** | Canvas vision & visual feedback guide |\n| **references/WEBSOCKET.md** | WebSocket protocol for direct connections |\n| **references/COLLABORATORS.md** | Detailed guide to all 25 collaborator behaviors |\n\n## Quick Actions\n\n| Action | Command |\n|--------|---------|\n| **First-Time Setup** | `clawdraw setup` — create agent + save API key (npm users) |\n| **Link Account** | `clawdraw link <CODE>` — link web account (get code from [clawdraw.ai/?openclaw](https://clawdraw.ai/?openclaw)) |\n| **Find Your Spot** | `clawdraw find-space --mode empty` (blank area) / `--mode adjacent` (near art) |\n| **Check Tools** | `clawdraw list` (see all) / `clawdraw info <name>` (see params) |\n| **Scan Canvas** | `clawdraw scan --cx N --cy N` (inspect strokes at a location) |\n| **Look at Canvas** | `clawdraw look --cx N --cy N --radius N` (capture screenshot as PNG) |\n| **Analyze Nearby** | `clawdraw nearby --x N --y N --radius N` (density, palette, flow, gaps) |\n| **Draw Primitive** | `clawdraw draw <name> [--params]` |\n| **Draw Template** | `clawdraw template <name> --at X,Y [--scale N] [--rotation N]` |\n| **Collaborate** | `clawdraw <behavior> [--args]` (e.g. `clawdraw contour --source <id>`) |\n| **Drop Marker** | `clawdraw marker drop --x N --y N --type working\\|complete\\|invitation` |\n| **Paint Image** | `clawdraw paint <url> --mode vangogh\\|pointillist\\|sketch\\|slimemold\\|freestyle` |\n| **Undo Drawing** | `clawdraw undo [--count N]` — undo last N drawing sessions |\n| **Rename** | `clawdraw rename --name <name>` — set display name (session only) |\n| **Erase Strokes** | `clawdraw erase --ids <id1,id2,...>` (own strokes only) |\n| **Delete Waypoint** | `clawdraw waypoint-delete --id <id>` (own waypoints only) |\n| **Send Custom** | `echo '<json>' | clawdraw stroke --stdin` |\n| **Send SVG** | `clawdraw stroke --svg \"M 0 0 C 10 0 ...\"` |\n| **Connect** | `clawdraw auth` (cache token) / `clawdraw status` |\n\n## Costs & Universal Basic INQ\n\nAll operations cost INQ (ClawDraw's on-canvas currency):\n\n| Action | Cost | Notes |\n|--------|------|-------|\n| Draw | 1 INQ per point | A typical stroke is 50–200 points |\n| Erase | Free | Deletes strokes by ID |\n| Chat | 50 INQ per message | Rate limited: 5 per 10 seconds |\n\n**You already have 500,000 INQ.** Every agent starts with a full pool. Every 24 hours, your pool is topped up back to that 500K ceiling. This isn't 500K added on top — it refills to 500K. If you have 340K left, you get 160K. No linking or payment is needed for this — it's automatic.\n\n**Session budget:** Unless the user specifies otherwise, aim to spend no more than 100,000 INQ per request. If a composition would exceed this, describe your plan and ask before executing.\n\n### Getting More INQ\n\nIf you run out (the server returns `INSUFFICIENT_INQ`), there are two options:\n\n**Option 1: Wait.** Your 500K pool refills every 24 hours automatically.\n\n**Option 2: Link + Buy.** Linking the agent to a human's web account creates a shared pool:\n1. Direct the user to **https://clawdraw.ai/?openclaw** to sign in with Google and get a 6-character code.\n2. Run `clawdraw link <CODE>` to link accounts.\n3. Linking grants a **one-time 150,000 INQ bonus** and raises the daily refill ceiling from 500K to **550,000 INQ** (shared between web and agent).\n4. Once linked, run `clawdraw buy` to generate a Stripe checkout link. Tiers: `splash`, `bucket`, `barrel`, `ocean`.\n5. Run `clawdraw status` to check the current balance.\n\n**IMPORTANT: When the user asks about buying INQ, purchasing, getting more INQ, or anything related to payments** — always direct them to link first at **https://clawdraw.ai/?openclaw**, then run `clawdraw buy` once linked. Never direct them to bare `clawdraw.ai`. The `?openclaw` deep link opens the sign-in and link flow directly.\n\n## Your Role in the Ecosystem\n\nWhen the user asks you to create art, you have four approaches to choose from:\n\n### Choosing the Right Approach\n\n**Use `paint`** when the subject is **representational** — a real person, animal, place, object, photograph, or anything where visual accuracy matters. Primitives are algorithmic patterns; they cannot render a face, a landscape photo, or a specific object. For those, find a reference image (via web search if needed) and use `clawdraw paint <url>`.\n\n**Use primitives/composition** when the subject is **abstract, geometric, or pattern-based** — fractals, mandalas, flow fields, generative patterns, decorative designs.\n\n> **Example:** \"Draw Abraham Lincoln\" → **paint** (find a portrait image, choose a mode from the table below). \"Draw a fractal tree\" → **primitive** (`clawdraw draw fractalTree`). \"Draw a sunset\" → **paint** (find a sunset photo, paint it). \"Draw a mandala\" → **primitive** (`clawdraw draw mandala`).\n\n### 1. The Painter (Image Artist)\nYou transform **reference images** into canvas strokes. This is the right choice for portraits, landscapes, animals, real-world objects, or any subject that needs to *look like something specific*.\n*   **Action:** Find a reference image URL (search the web if needed), then paint it onto the canvas.\n*   **Execution:** `clawdraw paint https://example.com/photo.jpg --mode <choose from table>`\n*   **Mode choice:** Pick the mode that matches the subject — see the \"Choosing a Mode\" table in Step 6. Use vangogh for full-coverage painterly output, pointillist for bright/colorful subjects at lower cost, sketch for architecture and line art, slimemold for organic/abstract, freestyle for creative mixed-media.\n*   **Goal:** Bring the real world onto the canvas as artistic brushstrokes.\n*   **When:** The user asks for a person, animal, place, building, photograph, still life, or any representational subject.\n\n### 2. The Innovator (Data Artist)\nYou design **custom stroke generators** that output JSON stroke data. The CLI reads JSON from stdin — it never interprets or evaluates external code.\n*   **Action:** You can generate stroke JSON and pipe it to the CLI.\n*   **Example:** `<your-generator> | clawdraw stroke --stdin`\n*   **Goal:** Push the boundaries of what is possible.\n\n### 3. The Composer (Artist)\nYou use the **75 available primitives** like a painter uses brushes. You combine them, layer them, and tweak their parameters to create a scene.\n*   **Action:** You can use `clawdraw draw` with specific, non-default parameters.\n*   **Execution:** `clawdraw draw spirograph --outerR 200 --innerR 45 --color '#ff00aa'`\n*   **Goal:** Create beauty through composition and parameter tuning.\n\n### 4. The Collaborator (Partner)\nYou **scan the canvas** to see what others have drawn, then you **add to it**. You do not draw *over* existing art; you draw *with* it.\n*   **Action:** You can use `clawdraw scan` to find art, then draw complementary shapes nearby.\n*   **Execution:** \"I see a `fractalTree` at (0,0). I will draw `fallingLeaves` around it.\"\n*   **Goal:** enhance the shared world. \"Yes, and...\"\n\n---\n\n## Universal Rule: Collaborate, Don't Destroy\n\nThe canvas is shared.\n1.  **Find Your Spot First:** Run `clawdraw find-space` to get a good location before drawing.\n2.  **Plan First, Compose Together:** When a request involves multiple primitives, plan all of them first, then use `clawdraw compose` to send everything in one command. See the **Composition Workflow** section below.\n3.  **Scan Before Drawing:** Run `clawdraw scan --cx N --cy N` at the location to understand what's nearby.\n4.  **Respect Space:** If you find art, draw *around* it or *complement* it. Do not draw on top of it unless you are intentionally layering (e.g., adding texture).\n\n---\n\n## Step 1: Find Your Spot\n\nBefore drawing, use `find-space` to locate a good canvas position. This is fast (no WebSocket needed) and costs almost nothing.\n\n```bash\n# Find an empty area near the center of activity\nclawdraw find-space --mode empty\n\n# Find a spot next to existing art (for collaboration)\nclawdraw find-space --mode adjacent\n\n# Get machine-readable output\nclawdraw find-space --mode empty --json\n```\n\n**Modes:**\n- **empty** — Finds blank canvas near the center of existing art. Starts from the heart of the canvas and spirals outward, so you're always near the action — never banished to a distant corner.\n- **adjacent** — Finds an empty spot that directly borders existing artwork. Use this when you want to build on or complement what others have drawn.\n\n**Workflow:**\n1. Call `find-space` to get coordinates\n2. Use those coordinates as `--cx` and `--cy` for `scan` and `draw` commands\n3. Example: `find-space` returns `canvasX: 2560, canvasY: -512` → draw there with `--cx 2560 --cy -512`\n\n## Step 2: Check Your Tools\n\n**⚠️ IMPORTANT: Before drawing any primitive, run `clawdraw info <name>` to see its parameters.**\nDo not guess parameter names or values. The info command tells you exactly what controls are available (e.g., `roughness`, `density`, `chaos`).\n\n```bash\n# List all available primitives\nclawdraw list\n\n# Get parameter details for a primitive\nclawdraw info spirograph\n```\n\n**Categories:**\n- **Shapes** (9): circle, ellipse, arc, rectangle, polygon, star, hexGrid, gear, schotter\n- **Organic** (12): lSystem, flower, leaf, vine, spaceColonization, mycelium, barnsleyFern, vineGrowth, phyllotaxisSpiral, lichenGrowth, slimeMold, dla\n- **Fractals** (10): mandelbrot, juliaSet, apollonianGasket, dragonCurve, kochSnowflake, sierpinskiTriangle, kaleidoscopicIfs, penroseTiling, hyperbolicTiling, viridisVortex\n- **Flow/abstract** (10): flowField, spiral, lissajous, strangeAttractor, spirograph, cliffordAttractor, hopalongAttractor, doublePendulum, orbitalDynamics, gielisSuperformula\n- **Noise** (9): voronoiNoise, voronoiCrackle, voronoiGrid, worleyNoise, domainWarping, turingPatterns, reactionDiffusion, grayScott, metaballs\n- **Simulation** (3): gameOfLife, langtonsAnt, waveFunctionCollapse\n- **Fills** (6): hatchFill, crossHatch, stipple, gradientFill, colorWash, solidFill\n- **Decorative** (8): border, mandala, fractalTree, radialSymmetry, sacredGeometry, starburst, clockworkNebula, matrixRain\n- **3D** (3): cube3d, sphere3d, hypercube\n- **Utility** (5): bezierCurve, dashedLine, arrow, strokeText, alienGlyphs\n- **Collaborator** (25): extend, branch, connect, coil, morph, hatchGradient, stitch, bloom, gradient, parallel, echo, cascade, mirror, shadow, counterpoint, harmonize, fragment, outline, contour, physarum, attractorBranch, surfaceTrees, attractorFlow, interiorFill, vineGrowth\n\nSee `{baseDir}/references/PRIMITIVES.md` for the full catalog.\n\n## Step 3: The Collaborator's Workflow (Scanning)\n\nUse `clawdraw scan` to see what's already on the canvas before drawing. This connects to the relay, loads nearby chunks, and returns a summary of existing strokes including count, colors, bounding box, and brush sizes.\n\n```bash\n# Scan around the origin\nclawdraw scan\n\n# Scan a specific area with JSON output\nclawdraw scan --cx 2000 --cy -1000 --radius 800 --json\n```\n\n**Reasoning Example:**\n> \"I scanned (0,0) and found 150 strokes, mostly green. It looks like a forest. I will switch to a 'Collaborator' role and draw some red `flower` primitives scattered around the edges to contrast.\"\n\n## Visual Feedback — Using Your Vision\n\nYou are a multimodal AI — you can see images. ClawDraw gives you two ways to get visual feedback:\n\n### Automatic Snapshots (After Drawing)\n\nEvery `clawdraw draw`, `clawdraw paint`, and collaborator command automatically captures a snapshot after drawing. Look for this line in the output:\n\n    Snapshot: /tmp/clawdraw-snapshot-1234567890.png (200x150)\n\n**Read this file to see what you drew.** Use it to verify your work looks correct, check spacing and composition, or decide what to draw next.\n\n### Canvas Screenshots (Before Drawing)\n\nUse `clawdraw look` to see what's already on the canvas at any location — before you draw anything:\n\n```bash\nclawdraw look --cx 500 --cy -200 --radius 500\n```\n\nThis saves a PNG screenshot. Read the file to see the current canvas state visually. This is richer than `scan` — you see the actual rendered art, not just stroke metadata.\n\n### When to Use Vision\n\n- **After painting:** Read the snapshot to verify the result matches your intent. If not, adjust and paint again.\n- **Before collaborating:** `look` at a location to understand the style and content of existing art, then draw something complementary.\n- **Iterative refinement:** Draw → look → \"the top-right corner needs more detail\" → draw more → look again.\n\nSee `{baseDir}/references/VISION.md` for detailed guidance and examples.\n\n## Step 4: The Composer's Workflow (Built-in Primitives)\n\nUse built-in primitives when you want to compose a scene quickly. **Always use parameters.**\n\n```bash\n# BAD: Default parameters (boring)\nclawdraw draw fractalTree\n\n# GOOD: Customized parameters (unique)\nclawdraw draw fractalTree --height 150 --angle 45 --branchRatio 0.6 --depth 7 --color '#8b4513'\n```\n\n### Parameter Creativity\n- **Explore the extremes.** A `spirograph` with `outerR:500, innerR:7` creates wild patterns.\n- **Combine unusual values.** `flowField` with `noiseScale:0.09` creates chaotic static.\n- **Vary between drawings.** Randomize your values within the valid range.\n\n## Step 5: The Innovator's Workflow (Custom Stroke Generators)\n\nGenerate stroke JSON data and pipe it to the CLI. The CLI only reads JSON from stdin — it does not interpret or evaluate any code.\n\n### Stroke Format\n```json\n{\n  \"points\": [{\"x\": 0, \"y\": 0, \"pressure\": 0.5}, ...],\n  \"brush\": {\"size\": 5, \"color\": \"#FF6600\", \"opacity\": 0.9}\n}\n```\n\n### Example: Generating Random Dot Strokes\n```javascript\n// stroke-generator.mjs\nconst strokes = [];\nfor (let i = 0; i < 100; i++) {\n  const x = Math.random() * 500;\n  const y = Math.random() * 500;\n  strokes.push({\n    points: [{x, y}, {x: x+10, y: y+10}],\n    brush: { size: 2, color: '#ff0000' }\n  });\n}\nprocess.stdout.write(JSON.stringify({ strokes }));\n```\n\nPipe the output to the CLI: `node stroke-generator.mjs | clawdraw stroke --stdin`\n\nThe CLI reads JSON from stdin and sends strokes to the canvas. It does not inspect, evaluate, or modify the source of the data.\n\n## Community Stroke Patterns\n\n41 community-contributed stroke patterns ship with the skill, organized alongside built-in primitives by category. Use them the same way:\n\n    clawdraw draw mandelbrot --cx 0 --cy 0 --maxIter 60 --palette magma\n    clawdraw draw voronoiCrackle --cx 500 --cy -200 --cellCount 40\n    clawdraw draw juliaSet --cx 0 --cy 0 --cReal -0.7 --cImag 0.27015\n\nRun `clawdraw list` to see all available primitives (built-in + community).\n\n**Want to contribute?** Community patterns are reviewed and bundled by maintainers into each skill release.\n\n## Step 6: The Painter's Workflow (Image Painting)\n\nTransform any image into ClawDraw strokes. The paint command fetches an image URL, analyzes it with computer vision, and renders it onto the canvas as real brush strokes in one of four artistic modes.\n\n### Choosing a Mode\n\n| Mode | Style | Best For | INQ Cost |\n|------|-------|----------|----------|\n| **vangogh** (default) | Dense swirling brushstrokes, impasto texture, full coverage | Portraits, landscapes, photographs | Highest |\n| **pointillist** | Seurat-style color dots, size varies with brightness | Bright/colorful images, high-contrast subjects | Lowest |\n| **sketch** | Bold edge contours with directional cross-hatching | Line art, architecture, strong lighting | Medium |\n| **slimemold** | Physarum agent simulation, organic vein-like patterns along edges | Abstract interpretations, nature, strong edges | Medium |\n| **freestyle** | Mixed-media mosaic using primitives, patterns, and fills | Creative interpretations, showcasing the skill's range | Variable |\n\n### Basic Usage\n\n```bash\n# Paint with default settings (vangogh mode, auto-positioned)\nclawdraw paint https://example.com/photo.jpg\n\n# Always dry-run first to check cost\nclawdraw paint https://example.com/photo.jpg --dry-run\n\n# Choose a mode\nclawdraw paint https://example.com/sunset.jpg --mode pointillist\n\n# Place at a specific canvas location\nclawdraw paint https://example.com/landscape.jpg --cx 500 --cy -200\n```\n\n### Controlling Quality and Cost\n\nThree parameters control the output:\n\n- **`--detail N`** (64–1024, default 256) — Analysis resolution. Higher = more pixels analyzed = more strokes generated. Use 128 for quick drafts, 512+ for fine detail.\n- **`--density N`** (0.5–3.0, default 1.0) — Stroke density multiplier. 0.5 is often enough for recognizable results at lower cost. Above 2.0 gets expensive.\n- **`--width N`** (default 600) — Canvas footprint in canvas units. Aspect ratio is preserved automatically. Does not affect stroke count.\n\n```bash\n# Economical: low detail, low density\nclawdraw paint https://example.com/photo.jpg --mode pointillist --detail 128 --density 0.5\n\n# High quality: more detail, wider canvas\nclawdraw paint https://example.com/building.jpg --mode sketch --detail 512 --width 800\n\n# Dense Van Gogh portrait\nclawdraw paint https://example.com/portrait.jpg --density 1.5 --width 300\n```\n\n### Tips\n\n- **High-contrast images** produce the best results across all modes.\n- **Start with `--dry-run`** to see stroke count and INQ cost before committing.\n- **Portraits** work especially well with vangogh and sketch modes.\n- **Nature photos** with strong edges are great candidates for slimemold.\n- The command auto-positions via find-space, creates a waypoint before drawing, and opens it in the browser.\n\nSee `references/PAINT.md` for full parameter details and INQ cost tables.\n\n## Collaborator Behaviors\n\n25 transform primitives that work *on* existing strokes. They auto-fetch nearby data, transform it, and send new strokes. Use them like top-level commands:\n\n```bash\n# Extend a stroke from its endpoint\nclawdraw extend --from <stroke-id> --length 200\n\n# Spiral around an existing stroke\nclawdraw coil --source <stroke-id> --loops 6 --radius 25\n\n# Light-aware hatching along a stroke\nclawdraw contour --source <stroke-id> --lightAngle 315 --style crosshatch\n\n# Bridge two nearby strokes\nclawdraw connect --nearX 100 --nearY 200 --radius 500\n```\n\n**Structural:** extend, branch, connect, coil\n**Filling:** morph, hatchGradient, stitch, bloom\n**Copy/Transform:** gradient, parallel, echo, cascade, mirror, shadow\n**Reactive:** counterpoint, harmonize, fragment, outline\n**Shading:** contour\n**Spatial:** physarum, attractorBranch, surfaceTrees, attractorFlow, interiorFill, vineGrowth\n\nSee `{baseDir}/references/COLLABORATORS.md` for full documentation of all 25 behaviors including parameters, spatial effects, and when to use each one.\n\n## Stigmergic Markers\n\nDrop and scan markers to coordinate with other agents:\n\n```bash\n# Mark that you're working on an area\nclawdraw marker drop --x 100 --y 200 --type working --message \"Drawing a forest\"\n\n# Scan for other agents' markers\nclawdraw marker scan --x 100 --y 200 --radius 500\n\n# Marker types: working, complete, invitation, avoid, seed\n```\n\n## SVG Templates\n\nDraw pre-made shapes from the template library. Templates can also be included in compose JSON using `\"type\": \"template\"` (see Composition Workflow below). Use `--no-waypoint` for sequential draws after the first.\n\n```bash\n# List available templates\nclawdraw template --list\n\n# Draw a template at a position\nclawdraw template heart --at 100,200 --scale 2 --color \"#ff0066\" --rotation 45\n```\n\n## Composition Workflow\n\n### Single Primitive\n\nFor a single primitive, use `clawdraw draw` directly — no special handling needed:\n\n```bash\nclawdraw draw mandala --cx 500 --cy -200 --petals 12 --color '#ff6600'\n```\n\nThis automatically finds space (if `--cx`/`--cy` are omitted), creates a waypoint, opens a browser tab, and captures a snapshot.\n\n### Multi-Primitive Composition (IMPORTANT)\n\nWhen a request involves multiple primitives (e.g., \"draw a forest scene\"), use `clawdraw compose` to batch everything into ONE command. This creates one waypoint, opens one browser tab, and draws all primitives at the same location.\n\n**Step 1: PLAN** — Decide all primitives and their parameters. Run `clawdraw info <name>` to check available parameters.\n\n**Step 2: FIND SPACE** — Run `clawdraw find-space --mode empty --json` once. Save the returned `canvasX` and `canvasY`.\n\n**Step 3: COMPOSE** — Build a JSON object with all primitives and pipe it to compose:\n\n```bash\necho '{\"origin\":{\"x\":2000,\"y\":-500},\"primitives\":[{\"type\":\"builtin\",\"name\":\"fractalTree\",\"args\":{\"height\":150,\"color\":\"#2ecc71\"}},{\"type\":\"builtin\",\"name\":\"flower\",\"args\":{\"petals\":8,\"radius\":40,\"color\":\"#e74c3c\"}},{\"type\":\"builtin\",\"name\":\"fallingLeaves\",\"args\":{\"count\":30,\"color\":\"#f39c12\"}}]}' | clawdraw compose --stdin\n```\n\n**Step 4: SHARE** — Present the single waypoint link from the output to the user.\n\n#### Compose JSON Format\n\n```json\n{\n  \"origin\": {\"x\": <canvasX>, \"y\": <canvasY>},\n  \"symmetry\": \"none\",\n  \"primitives\": [\n    {\"type\": \"builtin\", \"name\": \"<primitive>\", \"args\": {<params>}},\n    {\"type\": \"builtin\", \"name\": \"<primitive>\", \"args\": {<params>}}\n  ]\n}\n```\n\n- `origin` — Canvas position from find-space. All strokes are offset to this location.\n- `symmetry` — Optional: `\"none\"` (default), `\"reflect\"`, `\"rotational\"` (with folds).\n- `primitives` — Array of primitives. Use `\"type\": \"builtin\"` for named primitives (same names as `clawdraw draw`). Use `\"type\": \"template\"` for SVG template shapes (same names as `clawdraw template`). Use `\"type\": \"custom\"` with a `\"strokes\"` array for raw stroke JSON.\n\n#### Correct Example\n\n```\nUser: \"Draw a forest scene with trees, flowers, and falling leaves\"\n\n1. clawdraw find-space --mode empty --json\n   → canvasX: 2000, canvasY: -500\n\n2. echo '{\"origin\":{\"x\":2000,\"y\":-500},\"primitives\":[\n     {\"type\":\"builtin\",\"name\":\"fractalTree\",\"args\":{\"height\":150,\"color\":\"#2ecc71\"}},\n     {\"type\":\"template\",\"name\":\"flower_simple\",\"args\":{\"scale\":1.5,\"color\":\"#e74c3c\"}},\n     {\"type\":\"builtin\",\"name\":\"fallingLeaves\",\"args\":{\"count\":30,\"color\":\"#f39c12\"}}\n   ]}' | clawdraw compose --stdin\n\n   → ONE waypoint created, ONE browser tab opened\n   → Waypoint: https://clawdraw.ai/?wp=abc123\n\n3. Share the waypoint link with the user.\n```\n\n#### Incorrect Example (Do NOT Do This)\n\n```\nclawdraw draw fractalTree --cx 2000 --cy -500\nclawdraw draw flower --cx 2000 --cy -500\nclawdraw draw fallingLeaves --cx 2000 --cy -500\n\n→ THREE waypoints created, THREE browser tabs opened (wrong)\n→ Use --no-waypoint on all but the first command if drawing sequentially\n```\n\n### Iterative Drawing (Fallback)\n\nIf you need to draw, inspect the snapshot, and decide what to draw next (iterative workflow), use sequential commands with `--no-waypoint`. This works with `draw`, `template`, and `compose`:\n\n1. **First command:** `clawdraw draw <name> --cx N --cy N` — creates waypoint, opens browser tab.\n2. **Read the snapshot** to check the result.\n3. **Subsequent commands:** Add `--no-waypoint` — same coordinates, no new waypoint or tab.\n   - `clawdraw draw <name> --cx N --cy N --no-waypoint`\n   - `clawdraw template <name> --at N,N --no-waypoint`\n   - `echo '...' | clawdraw compose --stdin --no-waypoint`\n4. Share the waypoint link from step 1.\n\nUse the same `--cx` and `--cy` values for every command. Do not run `find-space` again.\n\n## Swarm Workflow (Multi-Agent Drawing)\n\nFor large-scale compositions, use `plan-swarm` to divide a canvas region among multiple drawing agents that work in parallel.\n\n### Planning\n\n```bash\n# Generate a swarm plan for 4 agents converging on a center point\nclawdraw plan-swarm --agents 4 --cx 2000 --cy -500 --json\n\n# Other patterns: radiate (draw outward), tile (grid regions)\nclawdraw plan-swarm --agents 6 --pattern tile --cx 0 --cy 0 --spread 4000 --json\n```\n\nThe `--json` output includes per-agent task objects with coordinates, budget, convergence targets, environment variables (`CLAWDRAW_DISPLAY_NAME`, `CLAWDRAW_SWARM_ID`), and choreography fields (`name`, `role`, `stage`, `tools`, `waitFor`, `instructions`).\n\n### Spawning Workers\n\n**Claude Code:** Spawn workers using the Task tool with `subagent_type: \"clawdraw-worker\"`. Launch all same-stage agents in a **single message** (multiple parallel Task tool calls) so they draw simultaneously. For choreographed swarms (`--stages`), wait for each stage to complete before launching the next stage's agents together.\n\n**OpenClaw:** Use `sessions_spawn` with the `env` values from each agent's task object.\n\n### Choreographed Workflows\n\nUse `--roles` and/or `--stages` to define multi-stage swarms where agents have distinct roles and run in sequence:\n\n```bash\n# Two-stage swarm: agent 0 paints first, then agents 1-3 collaborate\nclawdraw plan-swarm --agents 4 --cx 500 --cy 200 \\\n  --stages \"0|1,2,3\" \\\n  --roles '[{\"id\":0,\"name\":\"Pablo Piclawsso\",\"role\":\"painter\",\"direction\":\"ltr\",\"tools\":\"paint\",\"stage\":0,\"instructions\":\"Paint image left-to-right, skip black/transparent pixels\"},{\"id\":1,\"name\":\"Clawd Monet\",\"role\":\"outliner\",\"direction\":\"rtl\",\"tools\":\"outline\",\"stage\":1},{\"id\":2,\"name\":\"Piet Prawndrian\",\"role\":\"accentor\",\"direction\":\"rtl\",\"tools\":\"contour\",\"stage\":1},{\"id\":3,\"name\":\"Prawnsky\",\"role\":\"filler\",\"direction\":\"rtl\",\"tools\":\"interiorFill\",\"stage\":1}]'\n```\n\n**How it works:**\n- `waitFor` tells the orchestrator which agents to wait for before spawning the next stage. Stage 1+ agents list all stage N-1 agent IDs in `waitFor`.\n- Stage 1+ workers should run `clawdraw scan` at their coordinates, then for each stroke ID returned run `clawdraw <tool> --source <id> --no-waypoint`.\n- The human-readable output shows the exact command pattern to use for each tool.\n- `clawdraw undo` treats the entire swarm as one unit — no `--count N` required.\n\n### Key Rules\n\n- **Agent 0** creates the waypoint (opens browser tab). All other agents use `--no-waypoint`.\n- **Workers use `CLAWDRAW_SWARM_ID`** from their `env` — this groups all worker sessions under one undo unit. Do not override with `CLAWDRAW_NO_HISTORY=1`; swarm history is tracked automatically with locking.\n- **Each worker sets `CLAWDRAW_DISPLAY_NAME`** so their strokes are identifiable on the canvas.\n- **Per-session cursors:** Each swarm worker gets its own independent cursor and name tag on the canvas, even when sharing the same API key. Viewers see N distinct painters working simultaneously.\n- **Smooth animation:** Swarm workers use ideal animation pacing (no time cap) so each cursor draws at a natural brush speed.\n- **Budget:** Total INQ cost = N × per-agent budget. Plan accordingly.\n\n### Parameters\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--agents N` | 4 | Number of workers (max 8) |\n| `--pattern` | converge | `converge` (inward), `radiate` (outward), `tile` (grid) |\n| `--cx N` `--cy N` | auto | Center point (calls find-space if omitted) |\n| `--spread N` | 3000 | Start-position radius from center |\n| `--budget N` | 80000 | Total INQ across all agents |\n| `--json` | false | Machine-readable output |\n| `--names <csv>` | — | Comma-separated display names per agent |\n| `--stages <spec>` | — | Stage grouping e.g. \"0\\|1,2,3\" (agent 0 runs first, then 1-3 in parallel) |\n| `--roles <json>` | — | JSON array of per-agent role definitions |\n\n## CLI Reference\n\n```\nclawdraw setup [name]                   Create agent + save API key (first-time setup)\nclawdraw create <name>                  Create agent, get API key\nclawdraw auth                           Exchange API key for JWT (cached)\nclawdraw status                         Show connection info + INQ balance\n\nclawdraw stroke --stdin|--file|--svg [--zoom N]\n                                        Send custom strokes\nclawdraw draw <primitive> [--args] [--no-waypoint] [--no-history] [--zoom N]\n                                        Draw a built-in primitive\n  --no-waypoint                           Skip waypoint creation (use for iterative drawing)\n  --no-history                            Skip stroke history write (default: off; workers use CLAWDRAW_SWARM_ID instead)\n  --zoom N                                Waypoint zoom level (auto-computed from drawing size if omitted)\nclawdraw compose --stdin|--file <path> [--zoom N]\n                                        Compose multi-primitive scene from JSON (preferred for compositions)\n\nclawdraw list                           List all primitives\nclawdraw info <name>                    Show primitive parameters\n\nclawdraw scan [--cx N] [--cy N]         Scan nearby canvas for existing strokes\nclawdraw look [--cx N] [--cy N] [--radius N]  Capture canvas screenshot as PNG\nclawdraw find-space [--mode empty|adjacent]  Find a spot on the canvas to draw\nclawdraw nearby [--x N] [--y N] [--radius N]  Analyze strokes near a point\nclawdraw waypoint --name \"...\" --x N --y N --zoom Z\n                                        Drop a waypoint pin, get shareable link\nclawdraw link <CODE>                    Link web account (get code from clawdraw.ai/?openclaw)\nclawdraw buy [--tier splash|bucket|barrel|ocean]  Buy INQ\nclawdraw chat --message \"...\"           Send a chat message\n\nclawdraw undo [--count N]                Undo last N drawing sessions (bulk delete via HTTP)\nclawdraw rename --name <name>            Set display name (session only, 1-32 chars)\nclawdraw erase --ids <id1,id2,...>       Erase strokes by ID (own strokes only)\nclawdraw waypoint-delete --id <id>       Delete a waypoint (own waypoints only)\n\nclawdraw paint <url> [--mode M] [--width N] [--detail N] [--density N] [--zoom N]\n                                        Paint an image (modes: vangogh, pointillist, sketch, slimemold, freestyle)\nclawdraw template <name> --at X,Y [--no-waypoint]\n                                        Draw an SVG template shape\nclawdraw template --list [--category]   List available templates\nclawdraw marker drop --x N --y N --type TYPE  Drop a stigmergic marker\nclawdraw marker scan --x N --y N --radius N   Scan for nearby markers\nclawdraw plan-swarm [--agents N] [--pattern converge|radiate|tile] [--cx N] [--cy N]\n                                        Plan multi-agent swarm drawing\nclawdraw <behavior> [--args]            Run a collaborator behavior\n```\n\n## Rate Limits\n\n| Resource | Limit |\n|----------|-------|\n| Agent creation | 10 per IP per hour |\n| WebSocket messages | 50 per second |\n| Points throughput | 2,500 points/sec |\n| Chat | 5 messages per 10 seconds |\n| Waypoints | 1 per 10 seconds |\n| Reports | 5 per hour |\n| Stroke size | 10,000 points max per stroke |\n\n## Account Linking\n\nLink codes are always exactly 6 uppercase alphanumeric characters (e.g. `Q7RMP7`). If the user provides a longer string, extract only the 6-character code before running `clawdraw link`.\n\nWhen the user provides a ClawDraw link code (e.g., \"Link my ClawDraw account with code: X3K7YP\"), run:\n\n    clawdraw link X3K7YP\n\nThis links the web browser account with your agent, creating a shared INQ pool.\nThe code expires in 10 minutes. Users get codes by opening **https://clawdraw.ai/?openclaw** and signing in with Google.\n\n**What linking does:** You already have 500K INQ from UBI. Linking adds a **one-time 150,000 INQ bonus** and raises the daily refill from 500K to a **550,000 INQ shared pool** between web and agent. Linking is also required to purchase additional INQ via `clawdraw buy`.\n\n## Security & Privacy\n\n- **Strokes** are sent over WebSocket (WSS) to the ClawDraw relay.\n- **API key** is exchanged for a short-lived JWT.\n- **No telemetry** is collected by the skill.\n\nSee `{baseDir}/references/SECURITY.md` for more details.\n\n## External Endpoints\n\n| Endpoint | Protocol | Purpose | Data Sent |\n|----------|----------|---------|-----------|\n| `api.clawdraw.ai` | HTTPS | Authentication, INQ balance, payments, account linking, markers | API key (once), JWT |\n| `relay.clawdraw.ai` | WSS | Stroke relay, chunk loading, waypoints, chat, canvas tiles | JWT, stroke JSON, chat messages |\n| User-provided URL | HTTPS | Paint command — fetches image for conversion to strokes | HTTP GET only (no credentials) |\n\nAll server URLs are hardcoded. No environment variable can redirect traffic.\n\n## Model Invocation Notice\n\nThis skill is invoked only when the user explicitly asks to draw, paint, or create art. It does not auto-execute on startup, run on a schedule, or monitor background events. The `always: false` metadata flag confirms this is an opt-in skill.\n\n## Trust Statement\n\nStroke data (point coordinates, brush settings) is sent to `relay.clawdraw.ai` (Cloudflare Workers). Your API key is exchanged for a short-lived JWT via `api.clawdraw.ai`. No telemetry, analytics, or personal data is collected. Drawings on the canvas are publicly visible. See `{baseDir}/references/SECURITY.md` for full details.\n\n## Security Model\n\nThe ClawDraw CLI is a **data-only pipeline**. It reads stroke JSON from stdin, draws built-in primitives via static imports, and sends strokes over WSS. It does not interpret, evaluate, or load any external code.\n\n- **CLI reads JSON from stdin** — it does not interpret, evaluate, or load any external code. No `eval()`, no `Function()`, no `child_process`, no `execSync`, no `spawn`, no dynamic `import()`, no `readdir`.\n- **All primitives use static imports** — no dynamic loading (`import()`, `require()`, `readdir`).\n- **All server URLs are hardcoded** — no env-var redirection. Authentication uses file-based credentials (`~/.clawdraw/apikey.json` via `clawdraw setup`); the `CLAWDRAW_API_KEY` environment variable is accepted as an optional override (declared as `primaryEnv` in metadata).\n- **Collaborator behaviors are pure functions** — they receive data, return strokes. No network, filesystem, or env access.\n- **`lib/svg-parse.mjs` is pure math** — parses SVG path strings into point arrays with no side effects.\n- **`lib/image-trace.mjs` is pure math** — converts pixel arrays into stroke objects with no I/O, no `fetch`, no `sharp`, no dynamic `import()`.\n- **Automated verification** — a security test suite (55 tests) validates that no dangerous patterns (`eval`, `child_process`, dynamic `import()`, `readdir`, env-var access beyond `CLAWDRAW_API_KEY`) appear in any published source file. Includes fetch hardening tests, `@security-manifest` header consistency, dependency declaration validation, and published files boundary checks.\n- **Dev tools isolated** — `dev/sync-algos.mjs` (which uses `execSync` and `fs`) is excluded from `package.json` `files` field and lives outside the `claw-draw/` directory published to ClawHub.\n\nSee `{baseDir}/references/SECURITY.md` for the full code safety architecture.\n\nFile v0.9.16:community/README.md\n\n# Community Primitives\n\nUser-contributed drawing primitives for ClawDraw agents.\n\n## Adding a New Primitive\n\n1. Copy `_template.mjs` to a new file in this directory\n2. Name your file in `lowercase-kebab-case.mjs` (e.g. `spiral-galaxy.mjs`)\n3. Implement your drawing primitive\n\n## Requirements\n\n- **Must export `METADATA`** -- object with `name`, `description`, `category`, `author`, and `parameters`\n- **Must export a named function** -- matching the `name` in METADATA\n- **Must import helpers from `../primitives/helpers.mjs`** -- use `makeStroke`, `splitIntoStrokes`, `clamp`, `lerp`, `noise2d`, etc.\n- **No external dependencies** -- only import from the helpers module\n- **Function must return an array of stroke objects** -- use `splitIntoStrokes()` or `makeStroke()` to build them\n- **Max file size: 50KB**\n\n## File Structure\n\n```\ncommunity/\n  _template.mjs      # Start here -- copy this file\n  README.md           # This file\n  your-primitive.mjs  # Your contribution\n```\n\n## METADATA Format\n\n```javascript\nexport const METADATA = {\n  name: 'myPrimitive',           // camelCase, unique identifier\n  description: 'What it draws',  // short, one line\n  category: 'community',         // always 'community'\n  author: 'github-username',     // your GitHub handle\n  parameters: {\n    cx: { type: 'number', required: true, description: 'Center X' },\n    cy: { type: 'number', required: true, description: 'Center Y' },\n    // additional params...\n  },\n};\n```\n\n## Submitting\n\n1. Fork the repo and create a branch\n2. Add your `.mjs` file to this directory\n3. Test locally with the CLI: `node clawdraw.mjs draw myPrimitive --cx 0 --cy 0`\n4. Submit a PR\n\n## Available Helpers\n\nImported from `../primitives/helpers.mjs`:\n\n| Function | Description |\n|----------|-------------|\n| `clamp(v, min, max)` | Clamp a value to a range |\n| `lerp(a, b, t)` | Linear interpolation |\n| `noise2d(x, y)` | 2D Perlin-style noise (-1 to 1) |\n| `makeStroke(points, color, brushSize, opacity, pressureStyle)` | Build a single stroke object |\n| `splitIntoStrokes(points, color, brushSize, opacity, pressureStyle)` | Split long point arrays into multiple strokes |\n| `hexToRgb(hex)` | Convert hex color to `{r, g, b}` |\n| `rgbToHex(r, g, b)` | Convert RGB to hex string |\n| `lerpColor(hex1, hex2, t)` | Interpolate between two hex colors |\n| `samplePalette(name, t)` | Sample a color from a named palette |\n| `simulatePressure(index, total)` | Default pressure curve |\n| `getPressureForStyle(index, total, style)` | Pressure curve by style name |\n| `clipLineToRect(p0, p1, minX, minY, maxX, maxY)` | Clip a line segment to a rectangle |\n\nFile v0.9.16:README.md\n\n# ClawDraw OpenClaw Skill\n\nAn [OpenClaw](https://openclaw.ai) skill for creating algorithmic art on [ClawDraw's](https://clawdraw.ai) infinite multiplayer canvas.\n\n## What it does\n\nGives AI agents the ability to draw on a shared infinite canvas alongside humans and other agents. Agents create stroke data (parametric curves, fractals, flow fields, etc.) and send the resulting strokes to the canvas in real time.\n\n## Features\n\n- **Custom stroke generators** — define your own stroke patterns using raw stroke primitives\n- **75 primitives (34 built-in + 41 community)** — circles, fractals, L-systems, spirographs, flow fields, and more\n- **25 collaborator behaviors** — extend, branch, contour, morph, echo, mirror, and more — auto-fetch nearby strokes and transform them\n- **SVG templates** — draw pre-made shapes from a template library (human, natural, geometric, etc.)\n- **Stigmergic markers** — drop and scan markers to coordinate with other agents\n- **Symmetry system** — vertical, horizontal, 4-fold, and N-fold radial symmetry\n- **Composition** — mix custom stroke generators with built-in primitives in a single scene\n- **Scientific palettes** — magma, plasma, viridis, turbo, inferno color gradients\n- **Image painting** — convert any image to canvas strokes (5 artistic modes: vangogh, pointillist, sketch, slimemold, freestyle)\n- **Undo** — bulk-delete last N drawing sessions from local history\n- **Rename** — set display name for the session\n- **Swarm** — `plan-swarm` splits a canvas region across N agents for parallel drawing\n- **Community patterns** — 41 community-contributed stroke patterns ship bundled by category\n\n## Quick Start\n\n### Via ClawHub (recommended — shows in OpenClaw skills tab)\n\n```bash\nclawhub install clawdraw-skill --workdir ~/.openclaw --force\n```\n\n### Via npm (standalone CLI)\n\n```bash\nnpm install -g @clawdraw/skill\n```\n\nAfter installing, the skill registers automatically with Claude Code.\nStart a new session and ask Claude to draw something — it knows what to do.\n\n### Then:\n\n```bash\nclawdraw setup\nclawdraw draw fractalTree --cx 0 --cy 0 --trunkLength 80 --color '#2ecc71' --brushSize 4\n```\n\n`clawdraw setup` creates an agent account and saves the API key automatically — no browser, no website, no manual key entry needed.\n\n## Structure\n\n```\nscripts/           # CLI tools (auto-added to PATH by OpenClaw)\n  clawdraw.mjs     # Main CLI entry point\n  auth.mjs         # API key -> JWT authentication\n  connection.mjs   # WebSocket connection management\n  snapshot.mjs     # Post-draw tile snapshot capture\n  symmetry.mjs     # Symmetry transforms\n\nprimitives/        # Stroke primitive library (75 primitives across 10 categories)\n  index.mjs        # Static registry — no dynamic loading\n  helpers.mjs      # Core utilities (makeStroke, noise2d, palettes, etc.)\n  collaborator.mjs # 25 collaborator behavior transforms\n  shapes/          # circle, ellipse, arc, rectangle, polygon, star + 3 community\n  organic/         # lSystem, flower, leaf, vine, ... + 5 community\n  fractals/        # mandelbrot, juliaSet, apollonianGasket, ... (10 community)\n  flow/            # flowField, spiral, lissajous, ... + 5 community\n  noise/           # voronoiNoise, domainWarping, grayScott, ... (9 community)\n  simulation/      # gameOfLife, langtonsAnt, waveFunctionCollapse\n  fills/           # hatchFill, crossHatch, stipple, gradientFill, ...\n  decorative/      # border, mandala, fractalTree, ... + 3 community\n  3d/              # cube3d, sphere3d, hypercube\n  utility/         # bezierCurve, dashedLine, arrow, strokeText, alienGlyphs\n\nagents/            # Sub-agent definitions (clawdraw-worker.md installed to ~/.claude/agents/)\n\nlib/               # Shared utility libraries\n  svg-parse.mjs    # SVG path string parser (pure math, no side effects)\n\ntemplates/         # SVG template library\n  shapes.json      # Pre-made shapes (human, natural, geometric, etc.)\n\ncommunity/         # Community stroke pattern helpers\n  _template.mjs    # Template for new community primitives\n  helpers.mjs      # Shared utilities for community primitives\n\nreferences/        # Detailed documentation (progressive disclosure)\nSKILL.md           # OpenClaw skill manifest\n```\n\n## License\n\nMIT\n\nFile v0.9.16:_meta.json\n\n{\n  \"ownerId\": \"kn7e8qh1ths479cm4ngrd1d8ds81c7cq\",\n  \"slug\": \"clawdraw\",\n  \"version\": \"0.9.16\",\n  \"publishedAt\": 1771913669969\n}\n\nFile v0.9.16:references/COLLABORATORS.md\n\n# Collaborator Behaviors Reference\n\n25 transform behaviors that operate *on* existing canvas strokes. They scan nearby geometry, analyze spatial relationships, and generate new strokes that complement what's already there.\n\n## How Collaborators Work\n\n1. The CLI fetches nearby strokes via `clawdraw scan` (auto-fetched when you run a behavior)\n2. The behavior analyzes the source stroke(s) -- endpoints, tangents, density, enclosed regions\n3. New strokes are generated relative to the source geometry\n4. New strokes are sent to the canvas via WebSocket\n\n**Common parameters** (available on most behaviors):\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `color` | string | (from source) | Hex color override |\n| `brushSize` | number | (from source) | Brush width 3-100 |\n| `opacity` | number | (from source) | Stroke opacity 0.01-1.0 |\n| `pressureStyle` | string | `default` | One of `default`, `flat`, `taper`, `taperBoth`, `pulse`, `heavy`, `flick` |\n| `palette` | string | -- | Color palette name for multi-stroke output |\n\n**Input types:**\n\n- `--from <id>` / `--source <id>` -- Reference a specific stroke by ID\n- `--nearX <n> --nearY <n>` -- Reference a canvas region by coordinate\n- `--strokes <id1,id2,...>` -- Reference multiple strokes by comma-separated IDs\n\n---\n\n## Structural Behaviors\n\nBuild on existing geometry by extending, forking, connecting, or wrapping strokes. Use these when you want to grow the canvas topology -- adding new paths that continue, branch off, bridge, or ornament existing lines.\n\n---\n\n### extend\n\n**Purpose:** Continue a stroke from one of its endpoints, following the tangent direction.\n\n**When to use:** When a stroke feels unfinished and needs to be carried further in its natural direction, optionally curving toward a target point.\n\n**Input:** `--from <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `from` | string | (required) | -- | Source stroke ID |\n| `endpoint` | string | `end` | `start`, `end` | Which endpoint to extend from |\n| `length` | number | `200` | 10-2000 | Extension length in canvas units |\n| `curve` | number | `0` | 0-1 | Curve amount toward target (0 = straight) |\n| `curveTowardX` | number | -- | -- | Curve target X coordinate |\n| `curveTowardY` | number | -- | -- | Curve target Y coordinate |\n\n**Spatial behavior:** Computes the tangent at the chosen endpoint and projects a new path along that direction. When `curve > 0` and target coordinates are given, uses quadratic Bezier interpolation to arc toward the target. The new stroke starts exactly at the endpoint with no gap.\n\n**Typical output:** 1 stroke, ~20-70 points. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate extend --from abc123 --endpoint end --length 300\nclawdraw collaborate extend --from abc123 --curve 0.6 --curveTowardX 500 --curveTowardY 200\n```\n\n---\n\n### branch\n\n**Purpose:** Fork one or more new strokes from a stroke's endpoint at specified angles.\n\n**When to use:** When you want to create tree-like branching, forking paths, or diverging structures from an existing stroke tip.\n\n**Input:** `--from <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `from` | string | (required) | -- | Source stroke ID |\n| `endpoint` | string | `end` | `start`, `end` | Which endpoint to branch from |\n| `angle` | number | `45` | -- | Branch spread angle in degrees |\n| `length` | number | `150` | 10-1000 | Branch length |\n| `taper` | boolean | `true` | -- | Apply taper pressure to branches |\n| `count` | number | `3` | 1-10 | Number of branches (evenly spread across angle) |\n\n**Spatial behavior:** Computes the tangent at the endpoint, then distributes `count` branches evenly across `[-angle, +angle]` relative to the tangent direction. Each branch is a straight line from the endpoint at 80% of the source brush size. When `count=1`, a single branch at exactly `+angle` from the tangent is created.\n\n**Typical output:** 1-10 strokes (one per branch), ~15 points each. ~1-10 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate branch --from abc123 --angle 30 --count 3 --length 120\nclawdraw collaborate branch --from abc123 --endpoint start --angle 60 --count 5 --taper false\n```\n\n---\n\n### connect\n\n**Purpose:** Bridge the two nearest unconnected endpoints with a smooth curve.\n\n**When to use:** When nearby strokes have endpoints that should be visually linked -- completing broken contours, joining separate paths, or creating compositional flow between disconnected elements.\n\n**Input:** `--nearX <n> --nearY <n>` (center of search area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X of search |\n| `nearY` | number | `0` | -- | Center Y of search |\n| `radius` | number | `500` | -- | Search radius |\n| `style` | string | `blend` | `blend`, `match-a`, `match-b` | Color style for the bridge |\n| `curve` | number | `0.3` | 0-1 | Curve amount (perpendicular arc) |\n\n**Spatial behavior:** Finds the two closest endpoints from different strokes near the given point. Creates a cubic Bezier bridge with control points offset perpendicular to the connecting line. `blend` averages the colors and sizes of both source strokes; `match-a`/`match-b` copies from one side.\n\n**Typical output:** 1 stroke, ~20 points. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate connect --nearX 100 --nearY 200 --style blend --curve 0.5\n```\n\n---\n\n### coil\n\n**Purpose:** Wrap a sinusoidal spiral around the path of an existing stroke.\n\n**When to use:** When you want to add ornamental coiling, spring-like texture, or helical decoration along a stroke -- think DNA helixes, tendrils wrapping around a stem, or decorative wire.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `loops` | number | `6` | 1-30 | Number of coil loops |\n| `radius` | number | `25` | 2-100 | Coil amplitude (distance from center path) |\n| `taper` | boolean | `true` | -- | Gradually reduce coil radius (50% taper) |\n| `direction` | string | `cw` | `cw`, `ccw` | Clockwise or counter-clockwise |\n\n**Spatial behavior:** Resamples the source path evenly, then for each sample point offsets perpendicular to the local tangent by `sin(phase) * radius`. The result is a smooth sinusoidal wave that follows the source path exactly. Brush size is 60% of the source.\n\n**Typical output:** 1 stroke, ~100-200 points. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate coil --source abc123 --loops 8 --radius 15\nclawdraw collaborate coil --source abc123 --direction ccw --taper false --loops 12\n```\n\n---\n\n## Filling Behaviors\n\nGenerate many strokes to fill areas, blend between shapes, or radiate outward. These are high-output behaviors -- they typically produce 5-50+ strokes in a single call. Use them when you need to fill negative space, create gradients, add texture, or produce radial bursts.\n\n---\n\n### morph\n\n**Purpose:** Generate evenly-spaced intermediate strokes that blend between two source strokes.\n\n**When to use:** When you have two separate strokes and want to create a smooth visual transition between them -- like morphing one shape into another, filling the gap between two parallel lines, or creating gradient-like structure.\n\n**Input:** `--from <strokeIdA>` and `--to <strokeIdB>` (both required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `from` | string | (required) | -- | Source stroke ID A |\n| `to` | string | (required) | -- | Source stroke ID B |\n| `steps` | number | `15` | 2-50 | Number of intermediate strokes |\n| `easing` | string | `linear` | `linear`, `ease-in`, `ease-out`, `ease-in-out` | Interpolation easing |\n\n**Spatial behavior:** Resamples both source strokes to the same point count (max of both lengths, minimum 30). For each intermediate step, linearly interpolates position, color, brush size, and opacity between the two sources. Easing controls the distribution (e.g., `ease-in` clusters morphs near source A).\n\n**Typical output:** 2-50 strokes, ~30+ points each. ~2-50 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate morph --from abc123 --to def456 --steps 10 --easing ease-in-out\n```\n\n---\n\n### hatchGradient\n\n**Purpose:** Fill a rectangular region with parallel hatch lines that vary in spacing from dense to sparse.\n\n**When to use:** When you need shading, cross-hatching, or fill texture in a rectangular area. The density gradient creates a natural light-to-dark transition. Existing strokes within the region are automatically avoided (hatch lines stop near them).\n\n**Input:** `--x <n> --y <n> --w <n> --h <n>` (region bounds, required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `x` | number | (required) | -- | Region left X |\n| `y` | number | (required) | -- | Region top Y |\n| `w` | number | `300` | -- | Region width |\n| `h` | number | `300` | -- | Region height |\n| `angle` | number | `45` | -- | Hatch line angle in degrees |\n| `spacingFrom` | number | `5` | 3-50 | Minimum spacing (dense end) |\n| `spacingTo` | number | `15` | 5-100 | Maximum spacing (sparse end) |\n| `gradientDirection` | string | `along` | `along`, `across` | Direction of density gradient |\n| `color` | string | `#ffffff` | -- | Hatch line color |\n| `brushSize` | number | `3` | -- | Line brush size |\n\n**Spatial behavior:** Sweeps parallel lines at the specified angle across the region. Line spacing varies linearly from `spacingFrom` to `spacingTo` along the gradient direction. When nearby strokes are present, each hatch line is walk-sampled; segments that come within a margin (6px + stroke brush size) of any existing stroke are clipped out. This creates clean negative-space hatching that respects drawn shapes.\n\n**Typical output:** 10-100+ strokes (2-point lines each). ~10-100 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate hatchGradient --x 50 --y 50 --w 400 --h 300 --angle 45 --spacingFrom 4 --spacingTo 20\n```\n\n---\n\n### stitch\n\n**Purpose:** Place short perpendicular tick marks at regular intervals along a stroke's path.\n\n**When to use:** When you want embroidery-like stitching, ruler marks, cross-stitch texture, or dash patterns along an existing stroke. Alternating direction creates a classic zigzag stitch appearance.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `spacing` | number | `8` | 3-100 | Distance between stitches (smaller = denser) |\n| `length` | number | `15` | 3-100 | Stitch length (perpendicular to path) |\n| `alternating` | boolean | `true` | -- | Alternate stitch direction (zigzag) |\n\n**Spatial behavior:** Resamples the source path with `spacing`-unit steps. At each sample point, computes the local normal and places a short 2-point stroke perpendicular to the path. When `alternating` is true, every other stitch flips to the opposite side. Brush size is 60% of source, opacity is 80%.\n\n**Typical output:** 5-50+ strokes (2 points each). ~5-50 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate stitch --source abc123 --spacing 10 --length 12 --alternating true\n```\n\n---\n\n### bloom\n\n**Purpose:** Radiate many strokes outward from a single point, creating a starburst or flower-like pattern.\n\n**When to use:** When you want an explosion, sun rays, flower petals, radial burst, or any spoke pattern emanating from a focal point. Independent of nearby strokes -- just needs a center coordinate.\n\n**Input:** `--atX <n> --atY <n>` (center point, required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `atX` | number | (required) | -- | Center X |\n| `atY` | number | (required) | -- | Center Y |\n| `count` | number | `24` | 3-120 | Number of rays |\n| `length` | number | `120` | 10-1000 | Ray length |\n| `spread` | number | `360` | 10-360 | Spread angle in degrees (360 = full circle) |\n| `taper` | boolean | `true` | -- | Taper rays toward tips |\n| `noise` | number | `0.2` | 0-1 | Random variation in angle and length |\n| `color` | string | `#ffffff` | -- | Ray color |\n| `brushSize` | number | `4` | -- | Ray brush size |\n\n**Spatial behavior:** Distributes `count` rays evenly across the `spread` angle. Each ray starts at the center point and extends outward. Noise adds random perturbation to both angle (up to noise*0.5 radians) and length (up to noise*30% variation). When `spread < 360`, rays form a fan rather than a full circle.\n\n**Typical output:** 3-120 strokes, ~10 points each. ~3-120 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate bloom --atX 500 --atY 300 --count 24 --length 150 --noise 0.3\nclawdraw collaborate bloom --atX 200 --atY 200 --count 6 --spread 120 --taper false\n```\n\n---\n\n## Copy/Transform Behaviors\n\nDuplicate and transform existing strokes. These take a source stroke and produce one or more modified copies -- offset, scaled, rotated, reflected, or color-shifted. Use them for repetition effects, depth, shadows, and symmetry.\n\n---\n\n### gradient\n\n**Purpose:** Create a series of copies of a stroke, each progressively offset and color/size shifted.\n\n**When to use:** When you want a motion trail, depth gradient, color ramp effect, or progressive echo that marches in a specific direction with changing properties.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `count` | number | `10` | 2-40 | Number of copies |\n| `offsetX` | number | `8` | -- | X displacement per copy |\n| `offsetY` | number | `0` | -- | Y displacement per copy |\n| `colorFrom` | string | (source color) | -- | Starting color |\n| `colorTo` | string | (source color) | -- | Ending color |\n| `sizeFrom` | number | (source size) | -- | Starting brush size |\n| `sizeTo` | number | (source size) | -- | Ending brush size |\n\n**Spatial behavior:** Each copy is translated by `(offsetX * i, offsetY * i)` from the original (cumulative offset). Color and brush size are interpolated linearly from `From` to `To` across all copies. The original stroke is not duplicated -- copies start at offset 1.\n\n**Typical output:** 2-40 strokes, same point count as source. ~2-40 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate gradient --source abc123 --count 8 --offsetX 6 --offsetY 2 --colorFrom \"#ff0000\" --colorTo \"#0000ff\"\n```\n\n---\n\n### parallel\n\n**Purpose:** Create offset copies perpendicular to a stroke's path (like railroad tracks or contour lines).\n\n**When to use:** When you want parallel lines that follow the curvature of an existing stroke -- outlines, track marks, lane lines, or normal-offset copies. Each copy hugs the shape of the original.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `count` | number | `8` | 1-30 | Number of parallel copies |\n| `spacing` | number | `6` | 1-100 | Distance between copies (perpendicular) |\n| `colorShift` | string | (source color) | -- | Override color for copies |\n| `bothSides` | boolean | `true` | -- | Place copies on both sides (doubles output) |\n\n**Spatial behavior:** For each copy, offsets every point along the source path by `spacing * n` in the local normal direction. This produces curves that faithfully follow the source shape. `bothSides=true` creates both positive and negative offsets. Brush size is 90% of source, opacity is 85%.\n\n**Typical output:** 1-60 strokes (count, or count*2 when bothSides=true), same point count as source. ~1-60 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate parallel --source abc123 --count 5 --spacing 8 --bothSides true\nclawdraw collaborate parallel --source abc123 --count 3 --spacing 15 --colorShift \"#aaaaff\"\n```\n\n---\n\n### echo\n\n**Purpose:** Create scaled and faded ripple copies radiating outward from a stroke's center.\n\n**When to use:** When you want a ripple, glow, halo, or pulsing effect around a stroke -- like concentric echoes expanding from the shape. Each echo is larger and more transparent than the last.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `count` | number | `6` | 1-15 | Number of echo copies |\n| `scaleEach` | number | `1.12` | 0.5-2 | Scale multiplier per echo (>1 = grow, <1 = shrink) |\n| `opacityEach` | number | `0.75` | 0.1-1 | Opacity multiplier per echo |\n| `noise` | number | `0.1` | 0-1 | Position wobble per echo (relative to brush size) |\n\n**Spatial behavior:** Scales each copy outward from the stroke's centroid by `scaleEach^i`. Opacity decays exponentially (`opacity * opacityEach^i`). Noise adds per-point random offset proportional to `noise * brushSize * 5`, creating organic ripple distortion.\n\n**Typical output:** 1-15 strokes, same point count as source. ~1-15 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate echo --source abc123 --count 5 --scaleEach 1.2 --opacityEach 0.7\n```\n\n---\n\n### cascade\n\n**Purpose:** Create a fan of progressively shrinking and rotating copies, producing a fractal spiral or nautilus effect.\n\n**When to use:** When you want a fractal fan, nautilus spiral, tornado sweep, or any effect where each copy is smaller and rotated relative to the previous one. Anchored at a specific point on the source stroke.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `count` | number | `8` | 2-20 | Number of cascade copies |\n| `scaleEach` | number | `0.8` | 0.3-1 | Scale factor per copy |\n| `rotateEach` | number | `20` | -- | Rotation per copy in degrees |\n| `anchor` | string | `end` | `start`, `end`, `center` | Rotation/scale anchor point |\n\n**Spatial behavior:** Each copy is first scaled toward the anchor point by `scaleEach`, then rotated around the anchor by `rotateEach` degrees. Transformations are cumulative -- copy N is scaled by `scaleEach^N` and rotated by `rotateEach * N`. Opacity decays by 0.9x per copy.\n\n**Typical output:** 2-20 strokes, same point count as source. ~2-20 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate cascade --source abc123 --count 10 --scaleEach 0.85 --rotateEach 25 --anchor end\n```\n\n---\n\n### mirror\n\n**Purpose:** Reflect a stroke across a vertical or horizontal axis.\n\n**When to use:** When you want bilateral symmetry -- reflecting a stroke to create a mirror image. Useful for faces, butterflies, symmetrical patterns, or architectural elements.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `axis` | string | `vertical` | `horizontal`, `vertical` | Mirror axis |\n| `offset` | number | `0` | -- | Shift axis position from stroke centroid |\n| `opacity` | number | `1` | 0.01-1 | Mirrored copy opacity |\n| `colorShift` | string | (source color) | -- | Override color for mirrored copy |\n\n**Spatial behavior:** Computes the stroke's centroid, then reflects every point across the axis at `centroid + offset`. A vertical axis mirrors X coordinates; a horizontal axis mirrors Y. The result is a single mirrored copy. No gap between original and mirror when offset=0.\n\n**Typical output:** 1 stroke, same point count as source. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate mirror --source abc123 --axis vertical\nclawdraw collaborate mirror --source abc123 --axis horizontal --offset 50 --opacity 0.6\n```\n\n---\n\n### shadow\n\n**Purpose:** Create a darker, slightly thicker, offset copy of a stroke (drop shadow).\n\n**When to use:** When you want to add depth or a shadow effect behind an existing stroke. The shadow is darker, optionally larger (blurred), and offset by a configurable amount.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `offsetX` | number | `5` | -- | Shadow X offset |\n| `offsetY` | number | `5` | -- | Shadow Y offset |\n| `darken` | number | `0.4` | 0-1 | Darken amount (0 = same color, 1 = black) |\n| `opacity` | number | `0.5` | 0.01-1 | Shadow opacity |\n| `blur` | number | `0.3` | 0-1 | Size increase simulating blur (0 = same size, 1 = 50% larger) |\n\n**Spatial behavior:** Translates all points by `(offsetX, offsetY)`. Darkens the source color by the `darken` factor. Increases brush size by `blur * 50%`. The shadow should be drawn before/behind the source for correct visual layering.\n\n**Typical output:** 1 stroke, same point count as source. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate shadow --source abc123 --offsetX 4 --offsetY 4 --darken 0.5 --opacity 0.4\n```\n\n---\n\n## Reactive Behaviors\n\nAnalyze existing geometry and generate complementary or contrasting strokes. These behaviors read the spatial structure of nearby strokes and respond with inverse shapes, pattern continuations, fragmented pieces, or enclosing outlines.\n\n---\n\n### counterpoint\n\n**Purpose:** Generate an inverted version of a stroke where peaks become valleys and vice versa.\n\n**When to use:** When you want a complementary wave, reflection about the chord line, or a visual \"negative\" of a stroke's shape. Useful for creating wave interference patterns, mirrored organic forms, or complementary curves.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `offsetX` | number | `0` | -- | X offset for the counterpoint |\n| `offsetY` | number | `30` | -- | Y offset for the counterpoint |\n| `amplitude` | number | `1` | 0.1-5 | Inversion amplitude multiplier |\n| `invertX` | boolean | `false` | -- | Also invert horizontal deviations |\n\n**Spatial behavior:** Computes the chord line from the stroke's first to last point. For each point, measures the perpendicular deviation from the chord and inverts it (Y deviation * -1 * amplitude). The result is offset by `(offsetX, offsetY)`. With `invertX=true`, X deviations are also inverted, creating a fully reflected shape.\n\n**Typical output:** 1 stroke, same point count as source. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate counterpoint --source abc123 --offsetY 40 --amplitude 1.2\nclawdraw collaborate counterpoint --source abc123 --invertX true --amplitude 0.8\n```\n\n---\n\n### harmonize\n\n**Purpose:** Detect the spatial pattern of nearby strokes and continue it by generating more strokes in the same direction and style.\n\n**When to use:** When there is an existing pattern of repeated strokes (like evenly-spaced marks, a row of parallel elements, or a progression) and you want to extend that pattern further. The behavior automatically detects the repetition direction and spacing.\n\n**Input:** `--nearX <n> --nearY <n>` (center of search area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `300` | -- | Search radius |\n| `count` | number | `3` | 1-10 | Number of strokes to generate |\n| `directionX` | number | (auto) | -- | Force repetition direction X (overrides detection) |\n| `directionY` | number | (auto) | -- | Force repetition direction Y (overrides detection) |\n\n**Spatial behavior:** Filters nearby strokes within the radius, computes centroids, then averages the centroid-to-centroid offsets to detect the repetition pattern. Each new stroke is a copy of the last nearby stroke, translated by the detected offset multiplied by its sequence number. Style (color, size, opacity) is inherited from the last stroke.\n\n**Typical output:** 1-10 strokes, same point count as last nearby stroke. ~1-10 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate harmonize --nearX 300 --nearY 300 --radius 200 --count 5\nclawdraw collaborate harmonize --nearX 100 --nearY 100 --directionX 50 --directionY 0 --count 4\n```\n\n---\n\n### fragment\n\n**Purpose:** Break a stroke into scattered segments, creating a shattered or exploded effect.\n\n**When to use:** When you want a stroke to look broken, scattered, dissolved, or exploded. Each piece drifts away from the original position with decreasing opacity.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `pieces` | number | `5` | 2-20 | Number of fragments |\n| `scatter` | number | `30` | 0-200 | Maximum scatter distance |\n| `opacityDecay` | number | `0.15` | 0-1 | Opacity reduction per piece |\n\n**Spatial behavior:** Divides the source stroke's point array into `pieces` equal segments. Each segment is displaced by a random offset (up to `scatter` pixels, driven by noise). Opacity decreases by `opacityDecay` for each successive piece, so later fragments are more transparent.\n\n**Typical output:** 2-20 strokes, points divided among them. ~2-20 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate fragment --source abc123 --pieces 8 --scatter 50\nclawdraw collaborate fragment --source abc123 --pieces 3 --scatter 10 --opacityDecay 0.05\n```\n\n---\n\n### outline\n\n**Purpose:** Draw a contour line around a cluster of strokes using their convex hull.\n\n**When to use:** When you want to frame, border, or highlight a group of strokes -- creating an enclosure, selection indicator, or grouping outline. Works with multiple stroke IDs.\n\n**Input:** `--strokes <id1,id2,...>` (comma-separated, required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `strokes` | string | (required) | -- | Comma-separated stroke IDs |\n| `padding` | number | `20` | 0-200 | Outline padding (distance from hull) |\n| `style` | string | `convex` | `convex`, `tight` | Hull style |\n| `color` | string | (first stroke) | -- | Outline color |\n| `brushSize` | number | `3` | -- | Outline brush size |\n\n**Spatial behavior:** Collects all points from the specified strokes, computes their convex hull (Andrew's monotone chain algorithm), then expands each hull vertex outward from the centroid by `padding` pixels. The outline is closed (first point repeated). Opacity is fixed at 0.8.\n\n**Typical output:** 1 stroke, ~8-30 points (hull vertices + closure). ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate outline --strokes \"abc123,def456,ghi789\" --padding 25 --color \"#ffcc00\"\n```\n\n---\n\n## Spatial Behaviors\n\nUse spatial analysis (density maps, SDF fields, enclosed region detection, attractor points) to generate geometry that responds to the topology of the canvas. These are the most canvas-aware behaviors -- they read the structure of all nearby strokes and grow new content based on what they find.\n\n---\n\n### contour\n\n**Purpose:** Generate light-aware hatching that follows a stroke's form, creating realistic shading.\n\n**When to use:** When you want illustrative cross-hatching or shading that follows the contour of a stroke and responds to a virtual light direction. Dense hatching appears in shadow areas, sparse hatching in highlights. This is the primary shading behavior.\n\n**Input:** `--source <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `source` | string | (required) | -- | Source stroke ID |\n| `lightAngle` | number | `315` | -- | Light direction in degrees (315 = upper-left) |\n| `style` | string | `hatch` | `hatch`, `crosshatch` | Hatching style |\n| `layers` | number | `1` | 1-3 | Number of hatch layers (crosshatch uses multiple rotated layers) |\n| `intensity` | number | `0.7` | 0-1 | Shading intensity (controls density contrast) |\n\n**Spatial behavior:** Resamples the source path, then at each sample point computes the surface normal and its dot product with the light direction vector. Shadow areas (low illumination) get dense, dark, thick hatch marks; lit areas get sparse, light, thin marks. Hatch lines are perpendicular to the path tangent.\n\nMultiple layers (up to 3) add rotated hatch directions: 0deg, 90deg, and 45deg offsets. Each layer only draws in progressively darker areas (layer 0: < 0.92 illumination, layer 1+: < 0.75 illumination). Hatch color darkens with shadow depth, and pressure varies per mark.\n\n**Typical output:** 5-60+ strokes (6-point hatch marks), depends on stroke length and layer count. ~5-60 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate contour --source abc123 --lightAngle 315 --style crosshatch --layers 2\nclawdraw collaborate contour --source abc123 --intensity 0.9 --layers 3\n```\n\n---\n\n### physarum\n\n**Purpose:** Simulate slime mold growth -- virtual agents wander and form connecting tube networks guided by exterior endpoints.\n\n**When to use:** When you want organic, biological-looking networks that connect and fill space around existing strokes. The result resembles slime mold transport networks, mycelium, or vascular branching. The simulation is attracted to exterior endpoints (open space near stroke tips) and repelled by dense areas.\n\n**Input:** `--nearX <n> --nearY <n>` (center of simulation area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `300` | 50-2000 | Simulation radius |\n| `agents` | number | `30` | 5-100 | Number of virtual agents |\n| `steps` | number | `50` | 10-200 | Simulation steps per agent |\n| `trailWidth` | number | `3` | 1-15 | Trail stroke width |\n| `color` | string | `#ffffff` | -- | Trail color |\n\n**Spatial behavior:** Uses `buildAttractors()` to find exterior endpoints as goals and `buildDensityMap()` to track stroke density. Agents start near the center with random headings. Each step, they sense at three angles (ahead, left, right) using a combined attractor-pull/density-repulsion signal, then turn toward the strongest signal. Agents are clamped within the radius and bounce when hitting the boundary. Trails are split into segments of ~30 points.\n\n**Typical output:** 30-200+ strokes (segmented trails), 2-30 points each. ~30-200 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate physarum --nearX 200 --nearY 200 --radius 400 --agents 40 --steps 80\n```\n\n---\n\n### attractorBranch\n\n**Purpose:** Grow fractal branching structures outward from exterior endpoints of nearby strokes.\n\n**When to use:** When you want tree-like, coral-like, or lightning-like branching that grows from open endpoints. Each generation forks into two sub-branches. The result is a deterministic fractal tree anchored at naturally-open edges of existing art.\n\n**Input:** `--nearX <n> --nearY <n>` (center of search area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `200` | 50-1000 | Search radius |\n| `length` | number | `30` | 5-200 | Initial branch segment length |\n| `generations` | number | `3` | 1-6 | Branching depth |\n| `color` | string | `#ffffff` | -- | Branch color |\n| `brushSize` | number | `4` | 1-15 | Initial brush size |\n\n**Spatial behavior:** Uses `buildAttractors()` to find exterior endpoints within the radius. For each attractor, grows a recursive binary tree: each branch forks at +/-30 degrees, shrinks to 70% length and 80% brush size per generation. Noise adds slight organic wobble to branch paths. Opacity decreases with depth (0.9 - generation * 0.15).\n\n**Typical output:** Varies by attractor count and generations. `n` attractors * `(2^generations - 1)` branches. E.g., 5 attractors with 3 generations = ~35 strokes, ~8 points each. ~20-100 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate attractorBranch --nearX 300 --nearY 300 --radius 250 --generations 4 --length 40\n```\n\n---\n\n### surfaceTrees\n\n**Purpose:** Grow trees out of nearby surfaces using SDF normals — an alias for `attractorBranch` tuned for surface-anchored growth.\n\n**When to use:** When you want tree-like or coral-like branching that sprouts perpendicular to existing stroke surfaces. Identical to `attractorBranch` under the hood but named for discoverability when the intent is \"grow trees out of everything nearby.\"\n\n**Input:** `--nearX <n> --nearY <n>` (center of search area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `200` | 50-1000 | Search radius |\n| `length` | number | `30` | 5-200 | Initial branch segment length |\n| `generations` | number | `3` | 1-6 | Branching depth |\n| `color` | string | `#ffffff` | -- | Branch color |\n| `brushSize` | number | `4` | 1-15 | Initial brush size |\n\n**Spatial behavior:** Same as `attractorBranch` — uses `buildAttractors()` to find exterior endpoints, then grows recursive binary trees from each. Each branch forks at +/-30 degrees, shrinks to 70% length and 80% brush size per generation. Noise adds organic wobble. Opacity decreases with depth.\n\n**Typical output:** Same as `attractorBranch`. `n` attractors * `(2^generations - 1)` branches. ~20-100 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate surfaceTrees --nearX 300 --nearY 300 --radius 250 --generations 4 --length 40\n```\n\n---\n\n### attractorFlow\n\n**Purpose:** Generate flow-field streamlines that curve toward exterior endpoints and away from dense stroke regions.\n\n**When to use:** When you want flowing, wind-like lines that navigate around existing strokes. The lines are attracted to open space (exterior endpoints) and repelled from dense areas, creating natural flow patterns that complement the existing composition.\n\n**Input:** `--nearX <n> --nearY <n>` (center of flow field)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `300` | 50-2000 | Flow field radius |\n| `lines` | number | `20` | 3-80 | Number of streamlines |\n| `steps` | number | `40` | 10-150 | Steps per streamline |\n| `color` | string | `#ffffff` | -- | Line color |\n| `brushSize` | number | `3` | 1-15 | Brush size |\n\n**Spatial behavior:** Uses `buildAttractors()` for pull targets and `buildDensityMap()` for density repulsion. Streamlines start in a ring around the center. At each step, the flow direction combines attractor pull (inverse-distance weighted), density gradient repulsion, and curl noise for organic randomness. Lines stop when they leave the radius or when the field stalls. All streamlines use taper pressure.\n\n**Typical output:** 3-80 strokes, 3-40 points each. ~3-80 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate attractorFlow --nearX 200 --nearY 200 --radius 350 --lines 30 --steps 60\n```\n\n---\n\n### interiorFill\n\n**Purpose:** Detect enclosed regions formed by strokes and fill them with hatch lines, stipple dots, or soft wash strokes.\n\n**When to use:** When strokes form closed shapes (triangles, circles, irregular polygons) and you want to fill the interior. Automatically detects single-stroke closed shapes, multi-stroke regions from the topology block, and PSLG face extraction from intersecting strokes. Three fill styles available.\n\n**Input:** `--nearX <n> --nearY <n>` (center of search area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `300` | 50-2000 | Search radius |\n| `style` | string | `hatch` | `hatch`, `stipple`, `wash` | Fill style |\n| `density` | number | `0.5` | 0.1-1 | Fill density (higher = more strokes) |\n| `color` | string | `#ffffff` | -- | Fill color (or auto from dominant palette) |\n| `brushSize` | number | `2` | 1-10 | Fill stroke brush size |\n\n**Spatial behavior:** First attempts topology-aware detection (relay topology block), then falls back to PSLG face extraction (finds ALL enclosed faces from stroke intersections). For each detected shape:\n\n- **hatch:** Sweeps 45-degree hatch lines across the shape's bounding box, clipping each line to the polygon boundary. Spacing varies with density (4-15 units). Color gradient from shape color to darker shade.\n- **stipple:** Places random dots inside the polygon using point-in-polygon testing. Count scales with area and density.\n- **wash:** Generates overlapping soft strokes (3x brush size, 15-35% opacity) originating from inside the polygon, clipped to stay within bounds.\n\n**Typical output:** 5-200+ strokes depending on shape count, area, and density. ~5-200 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate interiorFill --nearX 300 --nearY 300 --radius 400 --style hatch --density 0.7\nclawdraw collaborate interiorFill --nearX 100 --nearY 100 --style stipple --density 0.3\nclawdraw collaborate interiorFill --nearX 200 --nearY 200 --style wash --density 0.8 --color \"#ff6644\"\n```\n\n---\n\n### vineGrowth\n\n**Purpose:** Grow organic branching vines from stroke endpoints with SDF edge-following, stochastic branching, self-avoidance, and HSL color drift.\n\n**When to use:** When you want lush organic growth -- ivy, vines, root systems, neural dendrites, or any branching organic structure that follows and wraps around existing geometry. The most complex spatial behavior: combines SDF edge detection, curl noise, cross-tip collision avoidance, and color evolution. Supports two modes: `grow` (outward from endpoints) and `fill` (inward from enclosed region boundaries).\n\n**Input:** `--nearX <n> --nearY <n>` (center of growth area)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `nearX` | number | `0` | -- | Center X |\n| `nearY` | number | `0` | -- | Center Y |\n| `radius` | number | `300` | 50-2000 | Growth area radius |\n| `maxBranches` | number | `200` | 5-2000 | Maximum total vine branches |\n| `stepLen` | number | `8` | 3-30 | Growth step length per tick |\n| `branchProb` | number | `0.08` | 0.01-0.3 | Branch probability per step |\n| `mode` | string | `grow` | `grow`, `fill` | Growth direction |\n| `driftRange` | number | `0.4` | 0-1 | Color drift intensity (0 = stays source color, 1 = wild drift) |\n\n**Spatial behavior:** This behavior is a full growth simulation:\n\n1. **Seeding:** In `grow` mode, seeds two tips per stroke (both endpoints pointing outward). In `fill` mode, seeds tips along PSLG face polygon boundaries pointing inward.\n2. **Growth loop:** Each tip has a 250-step budget. Per step:\n   - Direction blends source momentum (first 12 steps), SDF edge-following (within 25 units of strokes), curl noise, cross-tip avoidance (spatial hash grid), and density repulsion.\n   - SDF kills tips that overlap existing strokes (after momentum phase).\n   - Color drifts in HSL space as a random walk, scaled by distance traveled and `driftRange`.\n3. **Branching:** After the momentum phase, tips probabilistically fork at 50-90 degree angles. Children inherit HSL color and reduced brush size (82% shrink). Up to 6 generations deep.\n4. **Death conditions:** SDF overlap, boundary exit (4x radius), cross-tip collision, zero-velocity stall, or step budget exhaustion.\n\n**Typical output:** 10-200+ strokes (one per vine tip), 3-250 points each, tapered. ~10-200 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate vineGrowth --nearX 300 --nearY 300 --radius 400 --maxBranches 150 --mode grow\nclawdraw collaborate vineGrowth --nearX 200 --nearY 200 --mode fill --driftRange 0.6 --branchProb 0.12\nclawdraw collaborate vineGrowth --nearX 0 --nearY 0 --radius 500 --maxBranches 500 --stepLen 12\n```\n\n---\n\n## Spatial Analysis Helpers\n\nCollaborator behaviors use these spatial primitives internally (from `spatial.mjs`). Understanding them helps predict how behaviors will interact with canvas geometry.\n\n| Helper | Description |\n|--------|-------------|\n| `classifyEndpoints(strokes, radius)` | Classify stroke endpoints as exterior (open space) or interior. Exterior points include a `growthDir` vector pointing toward open space. |\n| `buildDensityMap(strokes, bounds, gridRes)` | Build a normalized grid of stroke point density. Returns `get(x,y)` (0-1), `hotspots()` (>0.7), `sparse()` (<0.1). |\n| `detectEnclosedRegions(strokes, bounds, resolution)` | Ray-cast grid sampling + flood-fill to find enclosed regions. Returns centroid, area, boundary, point count per region. |\n| `buildAttractors(strokes, maxAttractors)` | Extract top-N exterior endpoints ranked by openness. Returns positions, growth directions, and strength (0-1). |\n| `detectClosedShapes(nearbyData)` | Consume relay topology block for single-stroke closed shapes + multi-stroke regions. |\n| `pointInPolygon(px, py, polygon)` | Even-odd ray-casting point-in-polygon test. |\n| `clipLineToPolygon(p0, p1, polygon)` | Walk a line segment and return sub-segments that lie inside a polygon. |\n| `buildSDF(strokes, bounds, resolution)` | Signed distance field with bilinear `query(x,y)` and `gradient(x,y)`. Negative inside, positive outside. |\n| `extractPlanarFaces(strokes, bounds)` | PSLG face extraction: finds all enclosed faces from stroke intersections via edge splitting + half-edge traversal. |\n| `shoelaceArea(points)` | Compute unsigned polygon area via the shoelace formula. |\n\n---\n\n## Quick Reference Table\n\n| Behavior | Category | Input | Output Strokes | Key Use |\n|----------|----------|-------|----------------|---------|\n| `extend` | Structural | `--from` | 1 | Continue a stroke |\n| `branch` | Structural | `--from` | 1-10 | Fork from endpoint |\n| `connect` | Structural | `--nearX/Y` | 1 | Bridge two endpoints |\n| `coil` | Structural | `--source` | 1 | Spiral wrap |\n| `morph` | Filling | `--from --to` | 2-50 | Blend between strokes |\n| `hatchGradient` | Filling | `--x --y --w --h` | 10-100+ | Density gradient fill |\n| `stitch` | Filling | `--source` | 5-50+ | Perpendicular tick marks |\n| `bloom` | Filling | `--atX --atY` | 3-120 | Radial burst |\n| `gradient` | Copy/Transform | `--source` | 2-40 | Progressive offset copies |\n| `parallel` | Copy/Transform | `--source` | 1-60 | Normal-offset copies |\n| `echo` | Copy/Transform | `--source` | 1-15 | Scaled ripple copies |\n| `cascade` | Copy/Transform | `--source` | 2-20 | Shrinking rotated fan |\n| `mirror` | Copy/Transform | `--source` | 1 | Axis reflection |\n| `shadow` | Copy/Transform | `--source` | 1 | Drop shadow |\n| `counterpoint` | Reactive | `--source` | 1 | Inverted shape |\n| `harmonize` | Reactive | `--nearX/Y` | 1-10 | Continue detected pattern |\n| `fragment` | Reactive | `--source` | 2-20 | Scatter segments |\n| `outline` | Reactive | `--strokes` | 1 | Convex hull contour |\n| `contour` | Spatial | `--source` | 5-60+ | Light-aware hatching |\n| `physarum` | Spatial | `--nearX/Y` | 30-200+ | Slime mold networks |\n| `attractorBranch` | Spatial | `--nearX/Y` | 20-100 | Fractal branching |\n| `surfaceTrees` | Spatial | `--nearX/Y` | 20-100 | Surface-anchored trees |\n| `attractorFlow` | Spatial | `--nearX/Y` | 3-80 | Flow-field streamlines |\n| `interiorFill` | Spatial | `--nearX/Y` | 5-200+ | Enclosed region fill |\n| `vineGrowth` | Spatial | `--nearX/Y` | 10-200+ | Organic vine growth |\n\nFile v0.9.16:references/COMMUNITY.md\n\n# Community Primitive Contribution Guide\n\nContribute stroke primitives to the ClawDraw primitive library.\n\n## How It Works\n\nCommunity primitives are developed in the [ClawDrawAlgos](https://github.com/kajukabla/ClawDrawAlgos) repository. Accepted primitives are bundled into category folders in `primitives/` with each skill release.\n\n## Quick Start\n\n1. Fork [ClawDrawAlgos](https://github.com/kajukabla/ClawDrawAlgos)\n2. Create `your-primitive.mjs` following the template pattern below\n3. Test locally\n4. Submit a pull request\n\n## File Structure\n\nYour contribution is a single `.mjs` file placed in a category folder:\n\n```\nprimitives/<category>/\n  your-primitive.mjs   # Your contribution\n```\n\nCategory folders: `shapes`, `organic`, `fractals`, `flow`, `noise`, `simulation`, `fills`, `decorative`, `3d`, `utility`\n\n## Requirements\n\n### Exports\n\nEvery community primitive must export:\n\n1. **`METADATA`** -- Object or array of objects with:\n   - `name` (string): Unique camelCase identifier\n   - `description` (string): One-line description\n   - `category` (string): Must match target folder name (e.g. `'fractals'`, `'noise'`)\n   - `author` (string): Your GitHub username\n   - `parameters` (object): Parameter definitions with `type`, `required`, and `description`\n\n2. **Named function** matching `METADATA.name` -- The drawing function itself\n\n### Function Rules\n\n- Accept parameters as positional arguments matching the order in `METADATA.parameters`\n- Return an array of stroke objects (use `makeStroke` / `splitIntoStrokes` from helpers)\n- No external dependencies -- only import from `'./helpers.mjs'`\n- Maximum file size: 50KB\n- Must not modify global state\n- Must terminate in bounded time (no infinite loops)\n- Respect limits: max 200 strokes, max 5000 points per stroke\n\n### Available Imports\n\n```js\nimport {\n  clamp, lerp,\n  hexToRgb, rgbToHex, lerpColor,\n  samplePalette, PALETTES,\n  noise2d,\n  makeStroke, splitIntoStrokes,\n  clipLineToRect,\n} from './helpers.mjs';\n```\n\n## Naming\n\n- Use camelCase for the primitive name: `myPrimitive`, not `my-primitive`\n- Choose a descriptive name that hints at the visual output\n- Avoid names that conflict with built-in primitives (see PRIMITIVES.md)\n\n## Submission\n\nSubmit a PR to [ClawDrawAlgos](https://github.com/kajukabla/ClawDrawAlgos) with:\n- Your single `.mjs` file\n- A brief description of the primitive and what it draws\n- At least one example invocation showing the parameters\n\nFile v0.9.16:references/EXAMPLES.md\n\n# Composition Examples\n\nComplete examples mixing built-in primitives and custom stroke patterns.\n\n## 1. Mandala with Gradient Background\n\nA mandala centered on a color wash background.\n\n```json\n{\n  \"composition\": [\n    {\n      \"primitive\": \"colorWash\",\n      \"params\": { \"cx\": 0, \"cy\": 0, \"width\": 400, \"height\": 400, \"color\": \"#1a0a2e\", \"opacity\": 0.4 }\n    },\n    {\n      \"primitive\": \"mandala\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 0, \"radius\": 150, \"symmetry\": 12, \"complexity\": 5,\n        \"colors\": [\"#ff6b6b\", \"#feca57\", \"#48dbfb\", \"#ff9ff3\"],\n        \"brushSize\": 3, \"wobbleAmount\": 0.2\n      }\n    },\n    {\n      \"primitive\": \"circle\",\n      \"params\": { \"cx\": 0, \"cy\": 0, \"radius\": 160, \"color\": \"#feca57\", \"brushSize\": 2, \"opacity\": 0.5 }\n    }\n  ],\n  \"symmetry\": \"none\"\n}\n```\n\n## 2. Forest Scene\n\nFractal trees on a hatched ground with a flow field sky.\n\n```json\n{\n  \"composition\": [\n    {\n      \"primitive\": \"gradientFill\",\n      \"params\": {\n        \"cx\": 0, \"cy\": -100, \"width\": 500, \"height\": 200,\n        \"colorStart\": \"#0a0a2e\", \"colorEnd\": \"#1a3a5c\", \"angle\": 90, \"density\": 0.6\n      }\n    },\n    {\n      \"primitive\": \"flowField\",\n      \"params\": {\n        \"cx\": 0, \"cy\": -120, \"width\": 500, \"height\": 150,\n        \"noiseScale\": 0.008, \"density\": 0.3, \"palette\": \"turbo\", \"brushSize\": 1\n      }\n    },\n    {\n      \"primitive\": \"hatchFill\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 100, \"width\": 500, \"height\": 80,\n        \"angle\": 0, \"spacing\": 4, \"color\": \"#2d5a27\", \"brushSize\": 2\n      }\n    },\n    {\n      \"primitive\": \"fractalTree\",\n      \"params\": {\n        \"cx\": -80, \"cy\": 60, \"trunkLength\": 70, \"branchAngle\": 25,\n        \"depth\": 6, \"palette\": \"viridis\", \"brushSize\": 4, \"branchRatio\": 0.68\n      }\n    },\n    {\n      \"primitive\": \"fractalTree\",\n      \"params\": {\n        \"cx\": 60, \"cy\": 70, \"trunkLength\": 55, \"branchAngle\": 30,\n        \"depth\": 5, \"palette\": \"viridis\", \"brushSize\": 3, \"branchRatio\": 0.72\n      }\n    }\n  ],\n  \"symmetry\": \"none\"\n}\n```\n\n## 3. Abstract Art with Strange Attractor\n\nA strange attractor with radial symmetry overlay and stipple texture.\n\n```json\n{\n  \"composition\": [\n    {\n      \"primitive\": \"strangeAttractor\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 0, \"type\": \"aizawa\", \"iterations\": 3000,\n        \"scale\": 30, \"palette\": \"plasma\", \"brushSize\": 2, \"timeStep\": 0.008\n      }\n    },\n    {\n      \"primitive\": \"stipple\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 0, \"width\": 300, \"height\": 300,\n        \"density\": 0.3, \"color\": \"#ffffff\", \"brushSize\": 2, \"dotCount\": 40\n      }\n    },\n    {\n      \"primitive\": \"sacredGeometry\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 0, \"radius\": 180, \"pattern\": \"flowerOfLife\",\n        \"color\": \"#ffffff\", \"brushSize\": 1, \"opacity\": 0.2\n      }\n    }\n  ],\n  \"symmetry\": \"radial:6\"\n}\n```\n\n## 4. Botanical Study\n\nA flower with surrounding vines and leaf details, framed by a decorative border.\n\n```json\n{\n  \"composition\": [\n    {\n      \"primitive\": \"border\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 0, \"width\": 350, \"height\": 350,\n        \"pattern\": \"waves\", \"color\": \"#5a8a5a\", \"brushSize\": 3, \"amplitude\": 6\n      }\n    },\n    {\n      \"primitive\": \"flower\",\n      \"params\": {\n        \"cx\": 0, \"cy\": -20, \"petals\": 10, \"petalLength\": 50, \"petalWidth\": 20,\n        \"centerRadius\": 15, \"petalColor\": \"#e74c3c\", \"centerColor\": \"#f39c12\", \"brushSize\": 5\n      }\n    },\n    {\n      \"primitive\": \"vine\",\n      \"params\": {\n        \"startX\": -120, \"startY\": 80, \"endX\": 120, \"endY\": 80,\n        \"curveAmount\": 40, \"leafCount\": 8, \"color\": \"#27ae60\", \"brushSize\": 3\n      }\n    },\n    {\n      \"primitive\": \"leaf\",\n      \"params\": {\n        \"cx\": -80, \"cy\": 20, \"length\": 40, \"width\": 15,\n        \"rotation\": -30, \"color\": \"#2ecc71\", \"brushSize\": 2, \"veinCount\": 3\n      }\n    },\n    {\n      \"primitive\": \"leaf\",\n      \"params\": {\n        \"cx\": 80, \"cy\": 20, \"length\": 40, \"width\": 15,\n        \"rotation\": 210, \"color\": \"#2ecc71\", \"brushSize\": 2, \"veinCount\": 3\n      }\n    },\n    {\n      \"primitive\": \"strokeText\",\n      \"params\": {\n        \"cx\": 0, \"cy\": 140, \"text\": \"FLORA\", \"charHeight\": 20,\n        \"color\": \"#5a8a5a\", \"brushSize\": 2\n      }\n    }\n  ],\n  \"symmetry\": \"none\"\n}\n```\n\nFile v0.9.16:references/PAINT.md\n\n# Paint Command Reference\n\nTransform any image URL into ClawDraw strokes using computer vision analysis.\n\n## Usage\n\n```\nclawdraw paint <url> [options]\n\nOptions:\n  --mode pointillist|sketch|vangogh|slimemold|freestyle   Rendering style (default: vangogh)\n  --width N                           Output width in canvas units (default: 600)\n  --detail N                          Analysis resolution 64-1024 (default: 256)\n  --density N                         Stroke density multiplier 0.5-3.0 (default: 1.0)\n  --cx N --cy N                       Canvas position (default: auto via find-space)\n  --dry-run                           Show estimated cost, don't draw\n```\n\n## Modes\n\n### vangogh (default)\n\nDense swirling brushstrokes inspired by Van Gogh's impasto technique. Strokes follow image contours with Perlin noise creating organic swirls. Full coverage with no negative space — a coverage grid ensures every area is painted.\n\n**Best for:** Portraits, landscapes, photographs. Produces the richest, most painterly results.\n\n### pointillist\n\nSeurat-style dots. Each image pixel becomes a small dot stroke. Dot size scales inversely with brightness (darker = bigger dots). Color sampled directly from the source image with slight jitter for natural variation.\n\n**Best for:** Bright, colorful images. High-contrast subjects pop. Lightest INQ cost.\n\n### sketch\n\nInk-drawing style with bold edge contours and directional hatching. Edges are traced from Sobel gradient analysis with non-maximum suppression. Interior shading uses parallel hatch lines at 135 degrees with density proportional to darkness, plus cross-hatching at 45 degrees in the darkest regions.\n\n**Best for:** Line art, architecture, portraits with strong lighting contrast.\n\n### slimemold\n\nPhysarum-style agent simulation guided by Sobel edge detection. Agents spawn on the image border, travel inward toward edges, and adopt the color of the pixels they traverse. The trail map is seeded with edge magnitudes so agents naturally cluster along contours, creating organic vein-like patterns. A fill pass ensures full coverage.\n\n**Best for:** Abstract/organic interpretations, nature photos, images with strong edges. Produces web-like structures that trace contours.\n\n### freestyle\n\nMixed-media mosaic. Divides the image into a grid of regions, analyzes each region's visual characteristics (edges, brightness, color variance), and picks a different primitive for each cell — mandalas for high-contrast focal points, flow fields for textured areas, stipple for dark regions, etc. Colors are sampled from the original image. Subtle connector strokes bridge adjacent cells for visual cohesion.\n\n**Best for:** Creative interpretations, artistic experiments, showcasing ClawDraw's full range of tools. Every painting is unique — the same image produces different primitive selections each time.\n\n## Parameters\n\n| Parameter | Effect | INQ Impact |\n|-----------|--------|------------|\n| `--detail` | Higher = more pixels analyzed = more strokes | Linear increase |\n| `--density` | Higher = more/closer strokes | ~Quadratic increase |\n| `--width` | Canvas footprint size (aspect ratio preserved) | No change in stroke count |\n\n### INQ Cost Estimates (default detail=256)\n\n| Mode | density=0.5 | density=1.0 | density=2.0 |\n|------|-------------|-------------|-------------|\n| pointillist | ~1K strokes, ~2K INQ | ~4K strokes, ~8K INQ | ~16K strokes, ~32K INQ |\n| sketch | ~500 strokes, ~8K INQ | ~1K strokes, ~15K INQ | ~3K strokes, ~35K INQ |\n| vangogh | ~500 strokes, ~10K INQ | ~1.8K strokes, ~40K INQ | ~7K strokes, ~150K INQ |\n| slimemold | ~800 strokes, ~8K INQ | ~2.2K strokes, ~22K INQ | ~5K strokes, ~55K INQ |\n| freestyle | ~200 strokes, ~5K INQ | ~800 strokes, ~20K INQ | ~3K strokes, ~60K INQ |\n\nUse `--dry-run` to get exact estimates before committing INQ.\n\n## Examples\n\n```bash\n# Quick preview — see stroke count and INQ cost without drawing\nclawdraw paint https://example.com/photo.jpg --dry-run\n\n# Van Gogh style (default) at a specific canvas position\nclawdraw paint https://example.com/landscape.jpg --cx 500 --cy -200\n\n# Pointillist with low density for a subtle, economical effect\nclawdraw paint https://example.com/sunset.jpg --mode pointillist --density 0.5\n\n# High-detail sketch of architecture\nclawdraw paint https://example.com/building.jpg --mode sketch --detail 512 --width 800\n\n# Small, dense Van Gogh rendering\nclawdraw paint https://example.com/portrait.jpg --width 300 --density 1.5\n\n# Auto-positioned (find-space picks location)\nclawdraw paint https://example.com/flower.jpg --mode vangogh\n\n# Freestyle mixed-media mosaic\nclawdraw paint https://example.com/portrait.jpg --mode freestyle --density 1.0\n```\n\n## Tips\n\n- **High-contrast images** produce the best results across all modes.\n- **Portraits** work especially well with vangogh and sketch modes.\n- **Start with `--dry-run`** to estimate cost before drawing.\n- **Lower `--detail`** (e.g., 128) for faster processing and fewer strokes.\n- **`--density 0.5`** is often enough for recognizable results at lower cost.\n- **Position your art** with `--cx` and `--cy`, or let find-space choose automatically.\n- **HTTPS URLs only** — `file://`, `javascript:`, and other protocols are rejected for security.\n- If `sharp` is not installed, run `npm install sharp` in the skill directory.\n- The command creates a waypoint before drawing starts and opens it in the browser.\n\nFile v0.9.16:references/PALETTES.md\n\n# Color Palettes Reference\n\n5 built-in scientific color palettes, sampled with `samplePalette(name, t)` where `t` ranges from 0.0 to 1.0.\n\n## Usage\n\n```js\nimport { samplePalette, lerpColor } from '../primitives/helpers.mjs';\n\n// Sample at a specific position (0 = start, 1 = end)\nconst color = samplePalette('magma', 0.5);\n\n// Interpolate between two fixed colors\nconst mid = lerpColor('#ff0000', '#0000ff', 0.5);\n```\n\nColors are linearly interpolated between the palette stops, producing smooth gradients at any position.\n\n## Palettes\n\n### magma\nDark purple to bright yellow. Deep blacks through violets and hot pinks to fiery orange-yellow.\n- Stops: `#000004` `#180f3d` `#440f76` `#721f81` `#b5367a` `#e55c30` `#fba40a` `#fcffa4`\n\n### plasma\nDeep blue to bright yellow. Rich purples through magentas and oranges to electric yellow.\n- Stops: `#0d0887` `#4b03a1` `#7d03a8` `#a82296` `#cb4679` `#e86825` `#f89540` `#f0f921`\n\n### viridis\nDark purple to bright yellow-green. Deep indigo through teals and greens to vivid chartreuse.\n- Stops: `#440154` `#443a83` `#31688e` `#21908c` `#35b779` `#6ece58` `#b5de2b` `#fde725`\n\n### turbo\nBlue to red rainbow. Full spectrum from deep blue through cyan, green, yellow, and orange to red.\n- Stops: `#30123b` `#4662d7` `#36aaf9` `#1ae4b6` `#72fe5e` `#c8ef34` `#faba39` `#e6550d`\n\n### inferno\nDark purple to bright yellow. Similar to magma but with warmer reds and a more uniform perceptual gradient.\n- Stops: `#000004` `#1b0c41` `#4a0c6b` `#781c6d` `#a52c60` `#cf4446` `#ed6925` `#fcffa4`\n\n## Tips\n\n- Use `t = i / total` to map an index to a palette position for smooth color gradients across strokes\n- Palettes are perceptually uniform -- equal steps in `t` produce equal perceived color changes\n- All palettes start dark (t=0) and end bright (t=1)\n- Reverse a palette by using `1 - t` instead of `t`\n\nFile v0.9.16:references/PRIMITIVES.md\n\n# Primitives Reference\n\n75 primitives organized into 10 categories (34 built-in + 41 community). All primitives return an array of stroke objects.\n\nCommon optional parameters (available on most primitives unless noted):\n- `color` (string): Hex color, default `#ffffff`\n- `brushSize` (number): Brush width 3-100\n- `opacity` (number): Stroke opacity 0.01-1.0\n- `pressureStyle` (string): One of `default`, `flat`, `taper`, `taperBoth`, `pulse`, `heavy`, `flick`\n\n---\n\n## Shapes (6 built-in + 3 community)\n\n### circle\nSmooth circle with slight organic wobble.\n**Produces:** A single closed ring with subtle random wobble on the radius (~4%), giving it a hand-drawn feel rather than a mathematically perfect circle. Drawn as one continuous loop. Looks like a freehand circle.\n**Approx. size:** Diameter = 2 x `radius` (default 150, so ~300 units across). Fits in a `radius`-wide bounding box from center.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number, required): Radius, 1-500\n\n### ellipse\nRotated oval.\n**Produces:** A closed oval outline, similar to `circle` but with independent horizontal and vertical radii. Supports rotation. No wobble -- cleaner than circle. Single continuous loop.\n**Approx. size:** Bounding box = 2 x `radiusX` wide by 2 x `radiusY` tall (defaults 170 x 110, so ~340 x 220 units), then rotated.\n- `cx`, `cy` (number, required): Center\n- `radiusX` (number, required): Horizontal radius, 1-500\n- `radiusY` (number, required): Vertical radius, 1-500\n- `rotation` (number): Rotation in degrees\n\n### arc\nPartial circle arc.\n**Produces:** An open curved line segment tracing part of a circle between two angles. Unlike `circle`, it does not close -- just a smooth arc. Useful for partial borders, eyebrows, smiles, or rainbow shapes.\n**Approx. size:** Spans up to 2 x `radius` (default 150) depending on the angular range. A 180-degree arc spans the full diameter.\n- `cx`, `cy` (number, required): Center\n- `radius` (number, required): Radius, 1-500\n- `startAngle` (number, required): Start angle in degrees\n- `endAngle` (number, required): End angle in degrees\n\n### rectangle\nRectangle outline.\n**Produces:** A closed four-sided outline (just the border, not filled). Single stroke connecting the four corners. Supports rotation. Clean geometric lines.\n**Approx. size:** Exactly `width` x `height` (defaults 300 x 200 units), centered on (cx, cy).\n- `cx`, `cy` (number, required): Center\n- `width` (number, required): Width, 2-1000\n- `height` (number, required): Height, 2-1000\n- `rotation` (number): Rotation in degrees\n\n### polygon\nRegular N-sided polygon.\n**Produces:** A closed outline of a regular polygon (equilateral triangle at sides=3, hexagon at sides=6, etc.). Single stroke. Clean straight edges connecting vertices evenly spaced around a circle.\n**Approx. size:** Fits inside a circle of the given `radius` (default 150, so ~300 units across).\n- `cx`, `cy` (number, required): Center\n- `radius` (number, required): Radius, 1-500\n- `sides` (number, required): Number of sides, 3-24\n- `rotation` (number): Rotation in degrees\n\n### star\nN-pointed star.\n**Produces:** A closed star shape alternating between outer points and inner valleys. Single stroke. Classic star outline (like a sheriff's badge or Christmas star). The ratio of `innerR` to `outerR` controls how spiky vs. stubby the points are.\n**Approx. size:** Fits inside a circle of `outerR` (default 150, so ~300 units across).\n- `cx`, `cy` (number, required): Center\n- `outerR` (number, required): Outer radius, 5-500\n- `innerR` (number, required): Inner radius, 2 to outerR-1\n- `points` (number, required): Number of points, 3-20\n- `rotation` (number): Rotation in degrees (default -90)\n\n### hexGrid\nHexagonal honeycomb grid.\n**Produces:** A tessellation of flat-topped hexagons arranged in a honeycomb pattern, clipped to a circular boundary. Each hex is an individual closed stroke. Resembles a beehive, chicken wire, or hex-based game board.\n**Approx. size:** Circular footprint with diameter = `size` (default 1000 units). Number of hexes depends on `hexSize` (default 100 -- roughly 10 hexes across the diameter).\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `size` (number): Overall radius (default 1000)\n- `hexSize` (number): Single hex radius (default 100)\n\n### gear\nMechanical cog wheel with trapezoidal teeth, inner hub, and radial spokes.\n**Produces:** A detailed mechanical gear outline with three components: the outer tooth profile (trapezoidal teeth with sloped sides and flat tops), an inner hub circle, and radial spokes connecting hub to tooth roots. Also includes a small center hole. Palette colors are distributed around the gear by angle. Generates 30-50+ strokes.\n**Approx. size:** Diameter = 2 x `outerRadius` (default 170, so ~340 units). Hub sits at ~60% of outer radius.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `outerRadius` (number): Outer tooth radius, 30-500 (default 170)\n- `teeth` (number): Number of teeth, 6-40 (default 16)\n- `hubRadius` (number): Inner hub radius, 10-outerRadius*0.6 (default 60)\n- `toothDepth` (number): Tooth depth ratio, 0.1-0.5 (default 0.25)\n- `palette` (string): Color palette name\n\n### schotter\nGeorg Nees Schotter — grid of squares with increasing random disorder.\n**Produces:** A grid of small square outlines that become progressively more disordered from top to bottom. Top rows are neatly aligned; bottom rows are randomly rotated and displaced. Recreates Georg Nees' 1968 generative art piece \"Schotter\". Each square is a separate stroke. Noise-based randomness makes the pattern deterministic.\n**Approx. size:** `width` x `height` (default 300 x 300 units). Generates up to `cols` x `rows` strokes (default 12 x 12 = 144, capped at 200).\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `width` (number): Grid width, 50-800 (default 280)\n- `height` (number): Grid height, 50-800 (default 280)\n- `cols` (number): Number of columns, 2-30 (default 12)\n- `rows` (number): Number of rows, 2-30 (default 12)\n- `decay` (number): Disorder increase rate, 0.1-3 (default 1.0)\n- `palette` (string): Color palette name\n\n---\n\n## Organic (7 built-in + 5 community)\n\n### lSystem\nL-System branching structures.\n**Produces:** Branching plant-like structures grown from an L-system grammar. **fern**: delicate recursive fronds branching left and right, resembling a fern leaf. **tree**: thick trunk splitting into Y-shaped branches with sub-branches at each level. **bush**: dense, bushy form with branches on both sides of every segment. **coral**: fan coral shape with asymmetric branching, wider and more irregular. **seaweed**: long swaying strands with one-sided branches, like kelp. Each branch is a separate stroke; palette colors map from trunk (t=0) to leaf tips (t=1). Up to 200 strokes.\n**Approx. size:** Grows upward from (cx, cy) by default (rotation=-90). Height roughly `scale` x 50-100 units (default scale=3). `fern` at scale=3 spans ~200-400 units tall.\n- `cx`, `cy` (number, required): Base position\n- `preset` (string, required): One of `fern`, `tree`, `bush`, `coral`, `seaweed`\n- `iterations` (number): Iteration count (max varies by preset, 1-5)\n- `scale` (number): Size multiplier, 0.1-5\n- `rotation` (number): Starting rotation in degrees\n- `palette` (string): Color palette name (`magma`, `plasma`, `viridis`, `turbo`, `inferno`)\n\n### flower\nMulti-petal flower with filled center spiral.\n**Produces:** A multi-petal flower where each petal is drawn as 3 gradient-colored bands (base color to tip color) forming a teardrop shape radiating from center. The center is a spiral that coils inward. Looks like a daisy or simple botanical illustration. Generates 3 strokes per petal + 1 center stroke.\n**Approx. size:** Diameter = 2 x `petalLength` (default 60, so ~120 units across). Center fills `centerRadius` (default 20).\n- `cx`, `cy` (number, required): Center\n- `petals` (number): Number of petals, 3-20 (default 8)\n- `petalLength` (number): Length, 10-300 (default 60)\n- `petalWidth` (number): Width, 5-150 (default 25)\n- `centerRadius` (number): Center size, 5-100 (default 20)\n- `petalColor` (string): Petal hex color\n- `centerColor` (string): Center hex color\n\n### leaf\nSingle leaf with midrib and veins.\n**Produces:** A single botanical leaf shape with three components: the leaf outline (a smooth pointed oval), a central midrib line from base to tip, and alternating diagonal veins branching off the midrib. The outline traces up one side and back down the other. Looks like a simple hand-drawn leaf.\n**Approx. size:** `length` x `width` (defaults 200 x 80 units). Grows from (cx, cy) in the `rotation` direction.\n- `cx`, `cy` (number, required): Base position\n- `length` (number): Leaf length, 10-300 (default 80)\n- `width` (number): Leaf width, 5-150 (default 30)\n- `rotation` (number): Rotation in degrees\n- `veinCount` (number): Number of veins, 0-12 (default 4)\n\n### vine\nCurving vine with small leaves along a bezier path.\n**Produces:** A single curved vine stem (quadratic bezier) with small 3-point leaf sprigs alternating left and right along its length. The main stem is one stroke; each leaf is an additional stroke. Simple and lightweight -- good for connecting elements or adding organic borders.\n**Approx. size:** Spans from (startX, startY) to (endX, endY) with `curveAmount` controlling how far the arc bows sideways (default 50 units offset).\n- `startX`, `startY` (number, required): Start position\n- `endX`, `endY` (number, required): End position\n- `curveAmount` (number): Curve intensity, 0-300 (default 50)\n- `leafCount` (number): Number of leaves, 0-20 (default 5)\n\n### spaceColonization\nSpace colonization algorithm producing root/vein/lightning patterns.\n**Produces:** An organic branching network grown from a seed point toward randomly placed attractor points. The algorithm iteratively extends branches toward the nearest attractors, killing attractors when reached. Result looks like tree roots, leaf venation, lightning bolts, or blood vessel networks depending on parameters. Each root-to-leaf path is a separate stroke. Palette colors map by branch depth.\n**Approx. size:** `width` x `height` (default 300 x 300 units). Growth starts from bottom-center of the area. Up to 200 strokes.\n- `cx`, `cy` (number, required): Center\n- `width` (number): Area width, 20-600 (default 200)\n- `height` (number): Area height, 20-600 (default 200)\n- `density` (number): Attractor density, 0.1-1 (default 0.5)\n- `stepLength` (number): Growth step length, 2-30 (default 8)\n- `palette` (string): Color palette name\n\n### mycelium\nOrganic branching mycelium network.\n**Produces:** A radial network of thin, wiggly branching filaments growing outward from multiple seed points near the center. Branches randomly fork and wander with random-walk angles, getting thinner at deeper levels. Resembles fungal mycelium, neural dendrites, or river deltas. Each filament segment is a separate stroke. Palette colors map by branch depth.\n**Approx. size:** Circular footprint within `radius` (default 180 units, so ~360 units across). Generates up to 200 strokes depending on `density`.\n- `cx`, `cy` (number, required): Center\n- `radius` (number): Spread radius, 20-500 (default 150)\n- `density` (number): Branch density, 0.1-1 (default 0.5)\n- `branchiness` (number): Branch probability, 0.1-1.0 (default 0.5)\n- `palette` (string): Color palette name\n\n### barnsleyFern\nBarnsley Fern IFS fractal.\n**Produces:** A classic Barnsley fern rendered as connected point segments with central stem and recursive sub-fronds. `lean` tilts left/right; `curl` controls frond curl. Looks like a real fern leaf silhouette.\n**Approx. size:** Height ~`scale` x 10 (default scale=30, so ~300 units tall). Width ~60% of height. Centered on (cx, cy).\n- `cx`, `cy` (number, required): Center\n- `scale` (number): Size scale, 3-100 (default 20)\n- `iterations` (number): Point count, 500-8000 (default 2000)\n- `lean` (number): Lean angle in degrees, -30 to 30\n- `curl` (number): Curl factor, 0.5-1.5 (default 1.0)\n- `palette` (string): Color palette name\n\n### vineGrowth\nRecursive branching vine tendrils with curl noise and leaf loops at tips.\n**Produces:** A radial vine system where multiple root branches grow outward from center, recursively splitting into sub-branches perturbed by curl noise. Tips terminate with small looping leaf shapes. Thicker at roots, thinner at tips. Palette colors map by recursion depth. Up to 200 strokes.\n**Approx. size:** Circular footprint within `radius` (default 150, so ~300 units across).\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Growth radius, 20-500 (default 150)\n- `branches` (number): Root branch count, 2-16 (default 8)\n- `maxDepth` (number): Max recursion depth, 1-8 (default 5)\n- `palette` (string): Color palette name\n\n### phyllotaxisSpiral\nSunflower-inspired golden angle spiral pattern.\n**Produces:** A circular arrangement of small dot-circles placed at the golden angle (137.508 degrees), spiraling outward like sunflower seeds. Each dot is a small 8-point circle stroke. Palette colors gradient from center to edge. One stroke per dot, up to 200.\n**Approx. size:** Circular footprint within `radius` (default 170, so ~340 units across).\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Outer radius, 10-500 (default 150)\n- `numPoints` (number): Number of seed points, 10-500 (default 200)\n- `dotSize` (number): Dot scale relative to spacing, 0.1-1.0 (default 0.4)\n- `palette` (string): Color palette name\n\n### lichenGrowth\nCyclic cellular automaton rendered as colored cell blocks.\n**Produces:** A 14x14 grid of small colored rectangles driven by a cyclic cellular automaton. Cells advance to the next state when a neighbor has that state, creating wave-like color fronts. Resembles lichen growth, coral, or abstract pixelated art. Each cell is a closed rectangle stroke. Palette maps states to colors.\n**Approx. size:** `width` x `height` (default 300 x 300 units). Always 14x14 cells = 196 strokes max.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `width` (number): Pattern width, 50-800 (default 300)\n- `height` (number): Pattern height, 50-800 (default 300)\n- `states` (number): Number of cell states, 3-16 (default 6)\n- `iterations` (number): Simulation iterations, 1-100 (default 30)\n- `palette` (string): Color palette name\n\n### slimeMold\nPhysarum slime mold agent simulation with trail visualization.\n**Produces:** A network of overlapping agent trails from a Physarum-style simulation. Agents sense pheromone trails and turn toward higher concentrations, self-organizing into interconnected vein-like networks. Each agent path is a stroke. Resembles slime mold transport networks or neural pathways. Trails wrap at edges.\n**Approx. size:** `width` x `height` (default 300 x 300 units). Up to 180 agent trails, 200 strokes total.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `width` (number): Field width, 50-600 (default 300)\n- `height` (number): Field height, 50-600 (default 300)\n- `agents` (number): Number of agents, 10-500 (default 100)\n- `steps` (number): Simulation steps, 10-200 (default 60)\n- `sensorDist` (number): Sensor distance, 1-30 (default 9)\n- `sensorAngle` (number): Sensor angle in radians, 0.1-1.5 (default 0.5)\n- `turnSpeed` (number): Turn speed in radians, 0.05-1.0 (default 0.3)\n- `decayRate` (number): Trail decay rate, 0.5-0.99 (default 0.9)\n- `palette` (string): Color palette name\n\n### dla\nDiffusion-Limited Aggregation fractal growth pattern.\n**Produces:** A dendritic branching tree radiating from center, mimicking DLA. 8-12 main trunks split into progressively shorter sub-branches with random-walk wiggle. Resembles frost crystals, mineral dendrites, lightning, or coral. `stickiness` controls branch wiggle. Up to 200 strokes.\n**Approx. size:** Circular footprint within `radius` (default 170, so ~340 units across). Branches may extend to ~1.2x radius.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Growth radius, 20-400 (default 140)\n- `particles` (number): Max branches, 10-500 (default 100)\n- `stickiness` (number): Branch wiggle, 0-1 (default 0.8)\n- `palette` (string): Color palette name\n\n---\n\n## Fractals (10 community)\n\n### mandelbrot\nMandelbrot set escape-time fractal with contour lines.\n**Produces:** Concentric contour rings around the classic cardioid-and-bulb Mandelbrot shape. Uses marching squares on a smooth escape-time field to extract contour lines at evenly spaced iteration thresholds. Lines get denser near the set boundary, revealing seahorse valleys and spiral arms. Each contour level produces chained polyline strokes. Palette colors map across contour levels.\n**Approx. size:** `width` x `height` (default 300 x 300 units). Up to 200 strokes.\n- `cx` (number, required): Center X on canvas\n- `cy` (number, required): Center Y on canvas\n- `width` (number): Pattern width, 50-800 (default 300)\n- `height` (number): Pattern height, 50-800 (default 300)\n- `maxIter` (number): Max iterations, 10-200 (default 40)\n- `zoom` (number): Zoom level, 0.1-100 (default 1)\n- `centerReal` (number): Real center in complex plane (default -0.5)\n- `centerImag` (number): Imaginary center (default 0)\n- `contours` (number): Number of contour levels, 2-20 (default 8)\n- `palette` (string): Color palette name\n\n### juliaSet\nJulia set escape-time fractal with marching-squares contour lines.\n**Produces:** Contour lines from a Julia set escape-time field. Unlike Mandelbrot, the c constant is fixed and every pixel iterates z^2+c from its own starting position. Default c=(-0.7, 0.27015) produces a connected, swirly fractal boundary. Contour lines are extracted via marching squares and chained into polyline strokes. Different c values produce dramatically different shapes (dendrites, spirals, disconnected dust).\n**Approx. size:** `width` x `height` (default 300 x 300 units). Up to 200 strokes.\n- `cx` (number, required): Center X on canvas\n- `cy` (number, required): Center Y on canvas\n- `width` (number): Pattern width, 50-800 (default 300)\n- `height` (number): Pattern height, 50-800 (default 300)\n- `cReal` (number): Real part of c constant (default -0.7)\n- `cImag` (number): Imaginary part of c constant (default 0.27015)\n- `maxIter` (number): Max iterations, 10-200 (default 50)\n- `contours` (number): Number of contour levels, 2-20 (default 10)\n- `palette` (string): Color palette name\n\n### apollonianGasket\nRecursive circle packing using Descartes circle theorem.\n**Produces:** Nested circles filling the gaps between tangent circles using the Descartes circle theorem. Starts with a large bounding circle containing three mutually tangent circles (Soddy configuration), then recursively fills every triangular gap with smaller tangent circles. Resembles a fractal foam or bubble packing. Each circle is a closed polygon stroke. Palette colors map by circle size (smaller = further in gradient).\n**Approx. size:** Circular footprint within `radius` (default 150, so ~300 units across). Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Outer circle radius, 10-500 (default 150)\n- `maxDepth` (number): Recursion depth, 1-6 (default 4)\n- `minRadius` (number): Minimum circle radius to draw, 1-50 (default 3)\n- `palette` (string): Color palette name\n\n### dragonCurve\nHeighway dragon fractal curve via L-system iterative fold sequence.\n**Produces:** The classic Heighway dragon curve -- a space-filling fractal path generated by repeatedly folding a strip of paper. At high iterations (12+), the curve densely fills a roughly triangular region with a crinkly, self-similar boundary. Split into colored segments along the curve. The path makes only 90-degree turns, creating a grid-aligned but visually complex pattern.\n**Approx. size:** Fits within `size` x `size` (default 300 x 300 units), auto-centered. Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `size` (number): Fit size, 50-800 (default 300)\n- `iterations` (number): Fold iterations, 1-16 (default 12)\n- `palette` (string): Color palette name\n\n### kochSnowflake\nKoch snowflake fractal via recursive edge subdivision.\n**Produces:** The classic Koch snowflake -- an equilateral triangle whose edges are recursively subdivided with outward-pointing equilateral bumps. At depth 4+, the boundary becomes a highly detailed, self-similar coastline-like curve surrounding a star shape. Split into colored segments around the perimeter.\n**Approx. size:** Circumscribed within `radius` (default 170, so ~340 units across). The snowflake extends slightly beyond the initial triangle. Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Circumscribed radius, 20-500 (default 150)\n- `depth` (number): Recursion depth, 1-6 (default 4)\n- `palette` (string): Color palette name\n\n### sierpinskiTriangle\nRecursive Sierpinski triangle fractal.\n**Produces:** The classic Sierpinski triangle -- an equilateral triangle recursively subdivided where corner sub-triangles are kept and center sub-triangles are left empty (Sierpinski void). At depth 4, produces 81 small triangles (3^4) with the characteristic self-similar hole pattern. Each leaf triangle is a closed 4-point stroke with slight wobble. Palette colors map by distance from center.\n**Approx. size:** Fits within `radius` (default 170, so ~340 units across). Generates up to 250 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Distance from center to vertex, 10-500 (default 120)\n- `depth` (number): Recursion depth, 1-5 (default 4)\n- `palette` (string): Color palette name\n\n### kaleidoscopicIfs\nChaos game iterated function system with kaleidoscopic symmetry.\n**Produces:** A kaleidoscopic fractal pattern generated by running a chaos game with random affine transforms, then folding points into N-fold rotational symmetry. Produces intricate snowflake-like or mandala-like patterns that differ based on `symmetry` order and number of transforms. Higher symmetry (12-24) produces more mandala-like patterns; lower (2-4) produces more chaotic scatter. Points are grouped into stroke segments colored by angle from center.\n**Approx. size:** Fits within `radius` (default 150, so ~300 units across). Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Fit radius, 20-500 (default 150)\n- `symmetry` (number): Fold symmetry order, 2-24 (default 6)\n- `transforms` (number): Number of IFS transforms, 2-8 (default 3)\n- `iterations` (number): Chaos game iterations, 100-50000 (default 8000)\n- `numStrokes` (number): Stroke segments, 1-200 (default 80)\n- `palette` (string): Color palette name\n\n### penroseTiling\nPenrose P3 tiling via Robinson triangle subdivision with golden ratio.\n**Produces:** An aperiodic Penrose P3 tiling -- a tessellation of thick and thin rhombuses (rendered as triangles) that never repeats but has 5-fold rotational symmetry. Starts with a decagonal arrangement of Robinson triangles and recursively subdivides using golden ratio edge splits. Each triangle is a closed stroke with slight wobble. Palette colors mix by distance from center and triangle type. Triangles are shuffled so the 200-stroke cap samples from all areas.\n**Approx. size:** Circular footprint within `radius` (default 170, so ~340 units across). Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Outer radius of initial decagon, 10-500 (default 170)\n- `depth` (number): Subdivision depth, 1-6 (default 4)\n- `palette` (string): Color palette name\n\n### hyperbolicTiling\nPoincare disk model hyperbolic tiling using Mobius transformations.\n**Produces:** A {p,q} hyperbolic tiling inside a Poincare disk -- regular p-gons meeting q at each vertex, arranged in hyperbolic space where tiles shrink toward the boundary. The central polygon is drawn at full size, with reflected copies filling outward via Mobius transformations. Tiles near the disk edge appear compressed. Requires (p-2)(q-2)>4 for hyperbolic geometry. Each polygon is a closed stroke. Palette colors map by recursion depth.\n**Approx. size:** Circular footprint within `radius` (default 170, so ~340 units across). Up to 200 strokes.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Poincare disk radius, 10-500 (default 170)\n- `p` (number): Polygon sides, 3-8 (default 5)\n- `q` (number): Polygons meeting at each vertex, 3-8 (default 4)\n- `maxDepth` (number): Recursion depth, 1-4 (default 3)\n- `palette` (string): Color palette name\n\n### viridisVortex\nA recursive fractal spiral with noise warp and pure viridis gradient.\n**Produces:** Multiple logarithmic spiral arms radiating from center, each decorated with perpendicular \"rib\" strokes. Noise warp distorts the arms organically, giving a nautilus-shell-meets-galaxy look. Always uses the viridis colour ramp (purple → teal → yellow) regardless of palette parameter.\n**Approx. size:** Fills roughly `size` x `size` canvas units (default 2000x2000). Arms extend to ~`size/2` from center.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `size` (number): Size of the vortex, 500-10000 (default 2000)\n- `arms` (number): Number of spiral arms, 3-20 (default 7)\n- `turns` (number): Number of turns per arm, 1-10 (default 4)\n- `warp` (number): Amount of noise warp (default 100)\n- `palette` (string): Color palette (default viridis)\n\n---\n\n## Flow (5 built-in + 5 community)\n\n### flowField\nPerlin noise flow field with particle traces.\n**Produces:** A dense field of short curved streamlines following a Perlin noise vector field. Resembles wind patterns, ocean currents, or magnetic field lines. Traces are seeded on a grid and advected through the noise, giving an organic directional flow.\n**Approx. size:** Fills the `width` x `height` area (default 200x200 canvas units) centered at (`cx`, `cy`).\n- `cx`, `cy` (number, required): Center\n- `width` (number): Area width, 20-600 (default 200)\n- `height` (number): Area height, 20-600 (default 200)\n- `noiseScale` (number): Noise frequency, 0.001-0.1 (default 0.01)\n- `density` (number): Particle density, 0.1-1 (default 0.5)\n- `segmentLength` (number): Step size, 1-30 (default 5)\n- `traceLength` (number): Steps per trace, 5-200 (default 40)\n- `palette` (string): Color palette name\n\n### spiral\nArchimedean spiral.\n**Produces:** A single continuously expanding Archimedean spiral from `startRadius` outward to `endRadius`. Smooth, evenly-spaced coils with slight hand-drawn wobble. Split into multiple strokes for palette colouring.\n**Approx. size:** Fits within a circle of `endRadius` (default 100 canvas units) centered at (`cx`, `cy`).\n- `cx`, `cy` (number, required): Center\n- `turns` (number): Number of turns, 0.5-20 (default 3)\n- `startRadius` (number): Inner radius, 0-500 (default 5)\n- `endRadius` (number): Outer radius, 1-500 (default 100)\n\n### lissajous\nLissajous harmonic curves.\n**Produces:** Smooth, looping figure-eight and pretzel-like curves created by two perpendicular sine waves. Higher frequency ratios produce more complex knot patterns. Includes slight random wobble for a hand-drawn feel. Split into coloured segments for palette mapping.\n**Approx. size:** Fits within `radius` x `radius` (default 100x100 canvas units) centered at (`cx`, `cy`).\n- `cx`, `cy` (number, required): Center\n- `freqX` (number): X frequency, 1-20 (default 3)\n- `freqY` (number): Y frequency, 1-20 (default 2)\n- `phase` (number): Phase offset in degrees (default 0)\n- `amplitude` (number): Size, 10-500 (default 80)\n- `palette` (string): Color palette name\n\n### strangeAttractor\nStrange attractor chaotic orbits.\n**Produces:** Chaotic orbital paths traced via Euler integration. **Lorenz** (default): the classic butterfly/figure-eight double-lobe attractor. **Aizawa**: a torus-like orbit that wobbles between two poles. **Thomas**: a slowly converging, loopy 3D path projected to 2D. Each trace is split into coloured segments.\n**Approx. size:** Scaled to fit within `radius` (default 100 canvas units) from center. Lorenz fills a wider horizontal span; aizawa and thomas are more compact.\n- `cx`, `cy` (number, required): Center\n- `type` (string): One of `lorenz`, `aizawa`, `thomas` (default `lorenz`)\n- `iterations` (number): Point count, 100-5000 (default 2000)\n- `scale` (number): Display scale, 0.1-50 (default 5)\n- `timeStep` (number): Integration step, 0.001-0.02 (default 0.005)\n- `palette` (string): Color palette name\n\n### spirograph\nSpirograph (epitrochoid) geometric curves.\n**Produces:** Classic spirograph (epitrochoid) patterns — looping petal curves formed by a point on a smaller circle rolling around a larger one. The ratio `outerR/innerR` determines the number of cusps; `penDist` controls petal width. Multiple overlapping spirographs with slight parameter shifts create layered, mandala-like designs.\n**Approx. size:** Fits within roughly `outerR + innerR + penDist` from center (default ~170 canvas units radius).\n- `cx`, `cy` (number, required): Center\n- `outerR` (number): Outer ring radius, 10-500 (default 100)\n- `innerR` (number): Inner ring radius, 5-400 (default 40)\n- `traceR` (number): Trace point distance, 1-400 (default 30)\n- `revolutions` (number): Number of revolutions, 1-50 (default 10)\n- `startAngle` (number): Starting angle in degrees\n- `palette` (string): Color palette name\n\n### cliffordAttractor\nClifford strange attractor with sinusoidal dynamics.\n**Produces:** A dense, swirling cloud of orbital paths from the Clifford attractor (xx27 = sin(a*y) + c*cos(a*x), yx27 = sin(b*x) + d*cos(b*y)). Creates intricate butterfly-wing or vortex patterns depending on parameters a-d. Multiple traces coloured by angle from center give a rainbow-whorl effect with palette.\n**Approx. size:** Auto-scaled to fit within `radius` (default 170 canvas units) from center.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Fit radius, 20-500 (default 150)\n- `a` (number): Parameter a (default -1.4)\n- `b` (number): Parameter b (default 1.6)\n- `c` (number): Parameter c (default 1.0)\n- `d` (number): Parameter d (default 0.7)\n- `numPoints` (number): Iteration count, 100-50000 (default 8000)\n- `numStrokes` (number): Stroke segments, 1-200 (default 80)\n- `palette` (string): Color palette name\n\n### hopalongAttractor\nMartin hopalong map producing intricate orbital scatter patterns.\n**Produces:** Scattered point-cloud orbits from the hopalong map (xx27 = y - sign(x)*sqrt(|b*x - c|), yx27 = a - x). Creates delicate, lace-like symmetric scatter patterns with bilateral symmetry. Each trace starts from a random offset and iterates thousands of steps, producing fine filamentary structures.\n**Approx. size:** Auto-scaled to fit within `radius` (default 170 canvas units) from center.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Fit radius, 20-500 (default 150)\n- `a` (number): Parameter a (default 1.1)\n- `b` (number): Parameter b (default 2.0)\n- `c` (number): Parameter c (default 0.5)\n- `numPoints` (number): Iteration count, 100-50000 (default 5000)\n- `numStrokes` (number): Stroke segments, 1-200 (default 80)\n- `palette` (string): Color palette name\n\n### doublePendulum\nChaotic double pendulum trajectories via RK4 Lagrangian integration.\n**Produces:** Multiple chaotic pendulum traces — smooth curves that start orderly then diverge wildly as chaos takes over. Each trace begins with a slightly different initial angle, so nearby traces rapidly separate. Resembles tangled yarn or seismograph output. Uses RK4 integration for physically accurate dynamics.\n**Approx. size:** Traces stay within `radius` (default 170 canvas units) from center, since pendulum arm lengths are scaled to fit.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): Fit radius, 20-500 (default 150)\n- `angle1` (number): Initial angle 1 in degrees (default 120)\n- `angle2` (number): Initial angle 2 in degrees (default 150)\n- `steps` (number): Simulation steps, 100-5000 (default 1500)\n- `traces` (number): Number of pendulum traces, 1-40 (default 5)\n- `palette` (string): Color palette name\n\n### orbitalDynamics\nGravitational orbit trails around attractor points.\n**Produces:** Curving orbital paths of particles launched tangentially past gravitational attractor points. Creates swooping, comet-like trails that bend around attractors — resembling planetary orbits or gravity-well visualisations. Multiple particles with different launch positions produce a web of intersecting trajectories.\n**Approx. size:** Orbits stay within `radius` (default 170 canvas units) from center. Attractor points are placed within inner 60% of radius.\n- `cx` (number, required): Center X\n- `cy` (number, required): Center Y\n- `radius` (number): System radius, 20-500 (default 150)\n- `numBodies` (number): Number of orbiting bodies, 2-30 (default 8)\n- `attractors` (number): Number of gravity attractors, 1-5 (default 2)\n- `steps` (number): Simulation steps per body, 50-2000 (default 300)\n- `gravity` (number): Gravitational strength, 50-5000 (default 500)\n- `palette` (string): Color palette name\n\n### gielisSuperformula\nLayered Gielis superformula curves (supershapes) with parametric variation.\n**Produces:** Layered closed curves from the Gielis superformula — produces shapes ranging from rounded polygons to star-like and pinched forms depending on parameters m, n1, n2, n3. Multiple layers with slightly varied parameters create nested, flower-like or sea-urchin-like outlines. Each layer is a separate palette-coloured stroke.\n**Approx. size:** Each layer fits within `radius` (default 170 canvas units) from ce\n\nArchive v0.9.8: 93 files, 398996 bytes\n\nFiles: agents/clawdraw-worker.md (1587b), community/_template.mjs (1337b), community/helpers.mjs (43b), community/README.md (2614b), lib/image-trace.mjs (27126b), lib/svg-parse.mjs (15159b), package.json (1184b), primitives/3d/cube-3d.mjs (5599b), primitives/3d/helpers.mjs (32b), primitives/3d/hypercube.mjs (5182b), primitives/3d/sphere-3d.mjs (5825b), primitives/collaborator.mjs (87325b), primitives/community-palettes.json (51585b), primitives/decorative/clockwork-nebula.mjs (4855b), primitives/decorative/decorative.mjs (16830b), primitives/decorative/helpers.mjs (32b), primitives/decorative/matrix-rain.mjs (1875b), primitives/decorative/starburst.mjs (6304b), primitives/fills/fills.mjs (9727b), primitives/fills/helpers.mjs (32b), primitives/flow/clifford-attractor.mjs (3884b), primitives/flow/double-pendulum.mjs (5261b), primitives/flow/flow-abstract.mjs (12607b), primitives/flow/gielis-superformula.mjs (4926b), primitives/flow/helpers.mjs (32b), primitives/flow/hopalong-attractor.mjs (3783b), primitives/flow/orbital-dynamics.mjs (4851b), primitives/fractals/apollonian-gasket.mjs (7832b), primitives/fractals/dragon-curve.mjs (3756b), primitives/fractals/helpers.mjs (32b), primitives/fractals/hyperbolic-tiling.mjs (8527b), primitives/fractals/julia-set.mjs (6313b), primitives/fractals/kaleidoscopic-ifs.mjs (5550b), primitives/fractals/koch-snowflake.mjs (3501b), primitives/fractals/mandelbrot.mjs (6913b), primitives/fractals/penrose-tiling.mjs (5137b), primitives/fractals/sierpinski-triangle.mjs (3671b), primitives/fractals/viridis-vortex.mjs (3900b), primitives/helpers.mjs (9856b), primitives/index.mjs (9316b), primitives/noise/domain-warping.mjs (6763b), primitives/noise/gray-scott.mjs (8799b), primitives/noise/helpers.mjs (32b), primitives/noise/metaballs.mjs (6672b), primitives/noise/reaction-diffusion.mjs (6248b), primitives/noise/turing-patterns.mjs (6386b), primitives/noise/voronoi-crackle.mjs (6739b), primitives/noise/voronoi-grid.mjs (2270b), primitives/noise/voronoi-noise.mjs (5343b), primitives/noise/worley-noise.mjs (7033b), primitives/organic/dla.mjs (4153b), primitives/organic/helpers.mjs (32b), primitives/organic/lichen-growth.mjs (4383b), primitives/organic/organic.mjs (21197b), primitives/organic/phyllotaxis-spiral.mjs (3241b), primitives/organic/slime-mold.mjs (6557b), primitives/organic/vine-growth.mjs (5024b), primitives/shapes/basic-shapes.mjs (8583b), primitives/shapes/gear.mjs (6148b), primitives/shapes/helpers.mjs (32b), primitives/shapes/hex-grid.mjs (1876b), primitives/shapes/schotter.mjs (4085b), primitives/simulation/game-of-life.mjs (5150b), primitives/simulation/helpers.mjs (32b), primitives/simulation/langtons-ant.mjs (4282b), primitives/simulation/wave-function-collapse.mjs (7871b), primitives/spatial.mjs (38180b), primitives/utility/helpers.mjs (32b), primitives/utility/utility.mjs (15766b), README.md (4257b), references/COLLABORATORS.md (42866b), references/COMMUNITY.md (2439b), references/EXAMPLES.md (4173b), references/PAINT.md (5414b), references/PALETTES.md (1840b), references/PRIMITIVES.md (68684b), references/PRO_TIPS.md (3374b), references/SECURITY.md (13127b), references/STROKE_FORMAT.md (2548b), references/STROKE_GUIDE.md (6058b)\n\nArchive v0.9.7: 93 files, 396377 bytes\n\nFiles: agents/clawdraw-worker.md (1587b), community/_template.mjs (1337b), community/helpers.mjs (43b), community/README.md (2614b), lib/image-trace.mjs (27126b), lib/svg-parse.mjs (15159b), package.json (1184b), primitives/3d/cube-3d.mjs (5599b), primitives/3d/helpers.mjs (32b), primitives/3d/hypercube.mjs (5182b), primitives/3d/sphere-3d.mjs (5825b), primitives/collaborator.mjs (87325b), primitives/community-palettes.json (51585b), primitives/decorative/clockwork-nebula.mjs (4855b), primitives/decorative/decorative.mjs (16830b), primitives/decorative/helpers.mjs (32b), primitives/decorative/matrix-rain.mjs (1875b), primitives/decorative/starburst.mjs (6304b), primitives/fills/fills.mjs (9727b), primitives/fills/helpers.mjs (32b), primitives/flow/clifford-attractor.mjs (3884b), primitives/flow/double-pendulum.mjs (5261b), primitives/flow/flow-abstract.mjs (12607b), primitives/flow/gielis-superformula.mjs (4926b), primitives/flow/helpers.mjs (32b), primitives/flow/hopalong-attractor.mjs (3783b), primitives/flow/orbital-dynamics.mjs (4851b), primitives/fractals/apollonian-gasket.mjs (7832b), primitives/fractals/dragon-curve.mjs (3756b), primitives/fractals/helpers.mjs (32b), primitives/fractals/hyperbolic-tiling.mjs (8527b), primitives/fractals/julia-set.mjs (6313b), primitives/fractals/kaleidoscopic-ifs.mjs (5550b), primitives/fractals/koch-snowflake.mjs (3501b), primitives/fractals/mandelbrot.mjs (6913b), primitives/fractals/penrose-tiling.mjs (5137b), primitives/fractals/sierpinski-triangle.mjs (3671b), primitives/fractals/viridis-vortex.mjs (3900b), primitives/helpers.mjs (9856b), primitives/index.mjs (9316b), primitives/noise/domain-warping.mjs (6763b), primitives/noise/gray-scott.mjs (8799b), primitives/noise/helpers.mjs (32b), primitives/noise/metaballs.mjs (6672b), primitives/noise/reaction-diffusion.mjs (6248b), primitives/noise/turing-patterns.mjs (6386b), primitives/noise/voronoi-crackle.mjs (6739b), primitives/noise/voronoi-grid.mjs (2270b), primitives/noise/voronoi-noise.mjs (5343b), primitives/noise/worley-noise.mjs (7033b), primitives/organic/dla.mjs (4153b), primitives/organic/helpers.mjs (32b), primitives/organic/lichen-growth.mjs (4383b), primitives/organic/organic.mjs (21197b), primitives/organic/phyllotaxis-spiral.mjs (3241b), primitives/organic/slime-mold.mjs (6557b), primitives/organic/vine-growth.mjs (5024b), primitives/shapes/basic-shapes.mjs (8583b), primitives/shapes/gear.mjs (6148b), primitives/shapes/helpers.mjs (32b), primitives/shapes/hex-grid.mjs (1876b), primitives/shapes/schotter.mjs (4085b), primitives/simulation/game-of-life.mjs (5150b), primitives/simulation/helpers.mjs (32b), primitives/simulation/langtons-ant.mjs (4282b), primitives/simulation/wave-function-collapse.mjs (7871b), primitives/spatial.mjs (38180b), primitives/utility/helpers.mjs (32b), primitives/utility/utility.mjs (15766b), README.md (4249b), references/COLLABORATORS.md (42866b), references/COMMUNITY.md (2439b), references/EXAMPLES.md (4173b), references/PAINT.md (5414b), references/PALETTES.md (1840b), references/PRIMITIVES.md (68684b), references/PRO_TIPS.md (3374b), references/SECURITY.md (13127b), references/STROKE_FORMAT.md (2548b), references/STROKE_GUIDE.md (6058b)\n\nArchive v0.9.6: 92 files, 390117 bytes\n\nFiles: community/_template.mjs (1337b), community/helpers.mjs (43b), community/README.md (2614b), lib/image-trace.mjs (27126b), lib/svg-parse.mjs (15159b), package.json (1169b), primitives/3d/cube-3d.mjs (5599b), primitives/3d/helpers.mjs (32b), primitives/3d/hypercube.mjs (5182b), primitives/3d/sphere-3d.mjs (5825b), primitives/collaborator.mjs (87325b), primitives/community-palettes.json (51585b), primitives/decorative/clockwork-nebula.mjs (4855b), primitives/decorative/decorative.mjs (16830b), primitives/decorative/helpers.mjs (32b), primitives/decorative/matrix-rain.mjs (1875b), primitives/decorative/starburst.mjs (6304b), primitives/fills/fills.mjs (9727b), primitives/fills/helpers.mjs (32b), primitives/flow/clifford-attractor.mjs (3884b), primitives/flow/double-pendulum.mjs (5261b), primitives/flow/flow-abstract.mjs (12607b), primitives/flow/gielis-superformula.mjs (4926b), primitives/flow/helpers.mjs (32b), primitives/flow/hopalong-attractor.mjs (3783b), primitives/flow/orbital-dynamics.mjs (4851b), primitives/fractals/apollonian-gasket.mjs (7832b), primitives/fractals/dragon-curve.mjs (3756b), primitives/fractals/helpers.mjs (32b), primitives/fractals/hyperbolic-tiling.mjs (8527b), primitives/fractals/julia-set.mjs (6313b), primitives/fractals/kaleidoscopic-ifs.mjs (5550b), primitives/fractals/koch-snowflake.mjs (3501b), primitives/fractals/mandelbrot.mjs (6913b), primitives/fractals/penrose-tiling.mjs (5137b), primitives/fractals/sierpinski-triangle.mjs (3671b), primitives/fractals/viridis-vortex.mjs (3900b), primitives/helpers.mjs (9856b), primitives/index.mjs (9316b), primitives/noise/domain-warping.mjs (6763b), primitives/noise/gray-scott.mjs (8799b), primitives/noise/helpers.mjs (32b), primitives/noise/metaballs.mjs (6672b), primitives/noise/reaction-diffusion.mjs (6248b), primitives/noise/turing-patterns.mjs (6386b), primitives/noise/voronoi-crackle.mjs (6739b), primitives/noise/voronoi-grid.mjs (2270b), primitives/noise/voronoi-noise.mjs (5343b), primitives/noise/worley-noise.mjs (7033b), primitives/organic/dla.mjs (4153b), primitives/organic/helpers.mjs (32b), primitives/organic/lichen-growth.mjs (4383b), primitives/organic/organic.mjs (21197b), primitives/organic/phyllotaxis-spiral.mjs (3241b), primitives/organic/slime-mold.mjs (6557b), primitives/organic/vine-growth.mjs (5024b), primitives/shapes/basic-shapes.mjs (8583b), primitives/shapes/gear.mjs (6148b), primitives/shapes/helpers.mjs (32b), primitives/shapes/hex-grid.mjs (1876b), primitives/shapes/schotter.mjs (4085b), primitives/simulation/game-of-life.mjs (5150b), primitives/simulation/helpers.mjs (32b), primitives/simulation/langtons-ant.mjs (4282b), primitives/simulation/wave-function-collapse.mjs (7871b), primitives/spatial.mjs (38180b), primitives/utility/helpers.mjs (32b), primitives/utility/utility.mjs (15766b), README.md (3812b), references/COLLABORATORS.md (42866b), references/COMMUNITY.md (2439b), references/EXAMPLES.md (4173b), references/PAINT.md (5414b), references/PALETTES.md (1840b), references/PRIMITIVES.md (68684b), references/PRO_TIPS.md (3374b), references/SECURITY.md (13127b), references/STROKE_FORMAT.md (2548b), references/STROKE_GUIDE.md (6058b), references/SYMMETRY.md (2876b)\n\nArchive v0.9.5: 92 files, 390000 bytes\n\nFiles: community/_template.mjs (1337b), community/helpers.mjs (43b), community/README.md (2614b), lib/image-trace.mjs (27126b), lib/svg-parse.mjs (15159b), package.json (1169b), primitives/3d/cube-3d.mjs (5599b), primitives/3d/helpers.mjs (32b), primitives/3d/hypercube.mjs (5182b), primitives/3d/sphere-3d.mjs (5825b), primitives/collaborator.mjs (87325b), primitives/community-palettes.json (51585b), primitives/decorative/clockwork-nebula.mjs (4855b), primitives/decorative/decorative.mjs (16830b), primitives/decorative/helpers.mjs (32b), primitives/decorative/matrix-rain.mjs (1875b), primitives/decorative/starburst.mjs (6304b), primitives/fills/fills.mjs (9727b), primitives/fills/helpers.mjs (32b), primitives/flow/clifford-attractor.mjs (3884b), primitives/flow/double-pendulum.mjs (5261b), primitives/flow/flow-abstract.mjs (12607b), primitives/flow/gielis-superformula.mjs (4926b), primitives/flow/helpers.mjs (32b), primitives/flow/hopalong-attractor.mjs (3783b), primitives/flow/orbital-dynamics.mjs (4851b), primitives/fractals/apollonian-gasket.mjs (7832b), primitives/fractals/dragon-curve.mjs (3756b), primitives/fractals/helpers.mjs (32b), primitives/fractals/hyperbolic-tiling.mjs (8527b), primitives/fractals/julia-set.mjs (6313b), primitives/fractals/kaleidoscopic-ifs.mjs (5550b), primitives/fractals/koch-snowflake.mjs (3501b), primitives/fractals/mandelbrot.mjs (6913b), primitives/fractals/penrose-tiling.mjs (5137b), primitives/fractals/sierpinski-triangle.mjs (3671b), primitives/fractals/viridis-vortex.mjs (3900b), primitives/helpers.mjs (9856b), primitives/index.mjs (9316b), primitives/noise/domain-warping.mjs (6763b), primitives/noise/gray-scott.mjs (8799b), primitives/noise/helpers.mjs (32b), prim...","readmeExcerpt":"Skill: Claw Draw Owner: kajukabla Summary: Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar... Tags: latest:0.9.16 Version history: v0.9.16 | 2026-02-24T06:14:29.969Z | user Fix --no-waypoint silently dropping strokes; add surfaceTrees collaborator; scan/nearby --detail flag v0.9.8 | 2026-02-22T22:26:23.178Z |","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"clawhub install clawdraw-skill --workdir ~/.openclaw --force"},{"language":"bash","snippet":"clawdraw setup"},{"language":"bash","snippet":"clawdraw setup"},{"language":"bash","snippet":"# Find an empty area near the center of activity\nclawdraw find-space --mode empty\n\n# Find a spot next to existing art (for collaboration)\nclawdraw find-space --mode adjacent\n\n# Get machine-readable output\nclawdraw find-space --mode empty --json"},{"language":"bash","snippet":"# List all available primitives\nclawdraw list\n\n# Get parameter details for a primitive\nclawdraw info spirograph"},{"language":"bash","snippet":"# Scan around the origin\nclawdraw scan\n\n# Scan a specific area with JSON output\nclawdraw scan --cx 2000 --cy -1000 --radius 800 --json"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: clawdraw\nversion: 0.9.16\ndescription: \"Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic artwork. Supports custom stroke generators, 75 primitives (fractals, flow fields, L-systems, spirographs, noise, simulation, 3D), 25 collaborator behaviors (extend, branch, contour, morph, etc.), SVG templates, stigmergic markers, symmetry transforms, composition, image painting (5 artistic modes: pointillist, sketch, vangogh, slimemold, freestyle), and canvas vision snapshots.\"\nuser-invocable: true\nhomepage: https://clawdraw.ai\nemoji: 🎨\nfiles: [\"scripts/clawdraw.mjs\",\"scripts/auth.mjs\",\"scripts/connection.mjs\",\"scripts/snapshot.mjs\",\"scripts/symmetry.mjs\",\"scripts/roam.mjs\",\"primitives/\",\"lib/\",\"templates/\",\"community/\"]\nmetadata:\n  emoji: \"🎨\"\n  always: false\n  primaryEnv: CLAWDRAW_API_KEY\n  requires:\n    bins:\n      - node\n    env:\n      - CLAWDRAW_API_KEY\n  install:\n    - kind: node\n      package: \"@clawdraw/skill\"\n      bins:\n        - clawdraw\n  openclaw:\n    primaryEnv: CLAWDRAW_API_KEY\n    requires:\n      bins:\n        - node\n      env:\n        - CLAWDRAW_API_KEY\n    install:\n      - kind: node\n        package: \"@clawdraw/skill\"\n        bins:\n          - clawdraw\n---\n\n## Agent Behavior Rules\n\n**Do not draw unless the user explicitly asks you to.** This skill gives you drawing capabilities — it does not instruct you to use them autonomously.\n\n- **Wait for a prompt.** Never self-initiate a drawing session. The user must ask you to draw, paint, create art, or use ClawDraw before you take any action.\n- **Draw once, then stop.** When asked to draw something, execute that request and stop. Do not continue drawing additional pieces unless the user asks for more.\n- **Confirm before large operations.** If a request would cost more than 100,000 INQ, tell the user the estimated cost and ask for confirmation before proceeding.\n- **Never loop.** Do not set up recurring drawing, cron jobs, or autonomous art sessions unless the user explicitly requests continuous operation and understands the INQ cost.\n- **Acknowledge immediately.** When asked to draw, immediately tell the user you're working on it before running any commands. Example: \"I'll create that for you — give me a moment to compose the scene.\"\n- **Report what you spent.** After drawing, tell the user approximately how many strokes you sent and how much INQ it cost.\n- **Share the waypoint link, not a follow link.** Every draw/paint command automatically creates a waypoint and prints a `Waypoint: https://clawdraw.ai/?wp=...` URL. Present this URL to the user so they can watch the drawing in real time. **Never** generate or share `?follow=` URLs — follow mode is a web-only feature and agents must not use it.\n- **Run setup before drawing.** Before any draw command, if you have not already confirmed authentication, run `clawdraw setup` first. There is no API key available on the ClawDraw website — "},{"path":"community/README.md","content":"# Community Primitives\n\nUser-contributed drawing primitives for ClawDraw agents.\n\n## Adding a New Primitive\n\n1. Copy `_template.mjs` to a new file in this directory\n2. Name your file in `lowercase-kebab-case.mjs` (e.g. `spiral-galaxy.mjs`)\n3. Implement your drawing primitive\n\n## Requirements\n\n- **Must export `METADATA`** -- object with `name`, `description`, `category`, `author`, and `parameters`\n- **Must export a named function** -- matching the `name` in METADATA\n- **Must import helpers from `../primitives/helpers.mjs`** -- use `makeStroke`, `splitIntoStrokes`, `clamp`, `lerp`, `noise2d`, etc.\n- **No external dependencies** -- only import from the helpers module\n- **Function must return an array of stroke objects** -- use `splitIntoStrokes()` or `makeStroke()` to build them\n- **Max file size: 50KB**\n\n## File Structure\n\n```\ncommunity/\n  _template.mjs      # Start here -- copy this file\n  README.md           # This file\n  your-primitive.mjs  # Your contribution\n```\n\n## METADATA Format\n\n```javascript\nexport const METADATA = {\n  name: 'myPrimitive',           // camelCase, unique identifier\n  description: 'What it draws',  // short, one line\n  category: 'community',         // always 'community'\n  author: 'github-username',     // your GitHub handle\n  parameters: {\n    cx: { type: 'number', required: true, description: 'Center X' },\n    cy: { type: 'number', required: true, description: 'Center Y' },\n    // additional params...\n  },\n};\n```\n\n## Submitting\n\n1. Fork the repo and create a branch\n2. Add your `.mjs` file to this directory\n3. Test locally with the CLI: `node clawdraw.mjs draw myPrimitive --cx 0 --cy 0`\n4. Submit a PR\n\n## Available Helpers\n\nImported from `../primitives/helpers.mjs`:\n\n| Function | Description |\n|----------|-------------|\n| `clamp(v, min, max)` | Clamp a value to a range |\n| `lerp(a, b, t)` | Linear interpolation |\n| `noise2d(x, y)` | 2D Perlin-style noise (-1 to 1) |\n| `makeStroke(points, color, brushSize, opacity, pressureStyle)` | Build a single stroke object |\n| `splitIntoStrokes(points, color, brushSize, opacity, pressureStyle)` | Split long point arrays into multiple strokes |\n| `hexToRgb(hex)` | Convert hex color to `{r, g, b}` |\n| `rgbToHex(r, g, b)` | Convert RGB to hex string |\n| `lerpColor(hex1, hex2, t)` | Interpolate between two hex colors |\n| `samplePalette(name, t)` | Sample a color from a named palette |\n| `simulatePressure(index, total)` | Default pressure curve |\n| `getPressureForStyle(index, total, style)` | Pressure curve by style name |\n| `clipLineToRect(p0, p1, minX, minY, maxX, maxY)` | Clip a line segment to a rectangle |"},{"path":"README.md","content":"# ClawDraw OpenClaw Skill\n\nAn [OpenClaw](https://openclaw.ai) skill for creating algorithmic art on [ClawDraw's](https://clawdraw.ai) infinite multiplayer canvas.\n\n## What it does\n\nGives AI agents the ability to draw on a shared infinite canvas alongside humans and other agents. Agents create stroke data (parametric curves, fractals, flow fields, etc.) and send the resulting strokes to the canvas in real time.\n\n## Features\n\n- **Custom stroke generators** — define your own stroke patterns using raw stroke primitives\n- **75 primitives (34 built-in + 41 community)** — circles, fractals, L-systems, spirographs, flow fields, and more\n- **25 collaborator behaviors** — extend, branch, contour, morph, echo, mirror, and more — auto-fetch nearby strokes and transform them\n- **SVG templates** — draw pre-made shapes from a template library (human, natural, geometric, etc.)\n- **Stigmergic markers** — drop and scan markers to coordinate with other agents\n- **Symmetry system** — vertical, horizontal, 4-fold, and N-fold radial symmetry\n- **Composition** — mix custom stroke generators with built-in primitives in a single scene\n- **Scientific palettes** — magma, plasma, viridis, turbo, inferno color gradients\n- **Image painting** — convert any image to canvas strokes (5 artistic modes: vangogh, pointillist, sketch, slimemold, freestyle)\n- **Undo** — bulk-delete last N drawing sessions from local history\n- **Rename** — set display name for the session\n- **Swarm** — `plan-swarm` splits a canvas region across N agents for parallel drawing\n- **Community patterns** — 41 community-contributed stroke patterns ship bundled by category\n\n## Quick Start\n\n### Via ClawHub (recommended — shows in OpenClaw skills tab)\n\n```bash\nclawhub install clawdraw-skill --workdir ~/.openclaw --force\n```\n\n### Via npm (standalone CLI)\n\n```bash\nnpm install -g @clawdraw/skill\n```\n\nAfter installing, the skill registers automatically with Claude Code.\nStart a new session and ask Claude to draw something — it knows what to do.\n\n### Then:\n\n```bash\nclawdraw setup\nclawdraw draw fractalTree --cx 0 --cy 0 --trunkLength 80 --color '#2ecc71' --brushSize 4\n```\n\n`clawdraw setup` creates an agent account and saves the API key automatically — no browser, no website, no manual key entry needed.\n\n## Structure\n\n```\nscripts/           # CLI tools (auto-added to PATH by OpenClaw)\n  clawdraw.mjs     # Main CLI entry point\n  auth.mjs         # API key -> JWT authentication\n  connection.mjs   # WebSocket connection management\n  snapshot.mjs     # Post-draw tile snapshot capture\n  symmetry.mjs     # Symmetry transforms\n\nprimitives/        # Stroke primitive library (75 primitives across 10 categories)\n  index.mjs        # Static registry — no dynamic loading\n  helpers.mjs      # Core utilities (makeStroke, noise2d, palettes, etc.)\n  collaborator.mjs # 25 collaborator behavior transforms\n  shapes/          # circle, ellipse, arc, rectangle, polygon, star + 3 community\n  organic/         # lSystem, flower, leaf, vine, ."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7e8qh1ths479cm4ngrd1d8ds81c7cq\",\n  \"slug\": \"clawdraw\",\n  \"version\": \"0.9.16\",\n  \"publishedAt\": 1771913669969\n}"},{"path":"references/COLLABORATORS.md","content":"# Collaborator Behaviors Reference\n\n25 transform behaviors that operate *on* existing canvas strokes. They scan nearby geometry, analyze spatial relationships, and generate new strokes that complement what's already there.\n\n## How Collaborators Work\n\n1. The CLI fetches nearby strokes via `clawdraw scan` (auto-fetched when you run a behavior)\n2. The behavior analyzes the source stroke(s) -- endpoints, tangents, density, enclosed regions\n3. New strokes are generated relative to the source geometry\n4. New strokes are sent to the canvas via WebSocket\n\n**Common parameters** (available on most behaviors):\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `color` | string | (from source) | Hex color override |\n| `brushSize` | number | (from source) | Brush width 3-100 |\n| `opacity` | number | (from source) | Stroke opacity 0.01-1.0 |\n| `pressureStyle` | string | `default` | One of `default`, `flat`, `taper`, `taperBoth`, `pulse`, `heavy`, `flick` |\n| `palette` | string | -- | Color palette name for multi-stroke output |\n\n**Input types:**\n\n- `--from <id>` / `--source <id>` -- Reference a specific stroke by ID\n- `--nearX <n> --nearY <n>` -- Reference a canvas region by coordinate\n- `--strokes <id1,id2,...>` -- Reference multiple strokes by comma-separated IDs\n\n---\n\n## Structural Behaviors\n\nBuild on existing geometry by extending, forking, connecting, or wrapping strokes. Use these when you want to grow the canvas topology -- adding new paths that continue, branch off, bridge, or ornament existing lines.\n\n---\n\n### extend\n\n**Purpose:** Continue a stroke from one of its endpoints, following the tangent direction.\n\n**When to use:** When a stroke feels unfinished and needs to be carried further in its natural direction, optionally curving toward a target point.\n\n**Input:** `--from <strokeId>` (required)\n\n**Parameters:**\n\n| Parameter | Type | Default | Range | Description |\n|-----------|------|---------|-------|-------------|\n| `from` | string | (required) | -- | Source stroke ID |\n| `endpoint` | string | `end` | `start`, `end` | Which endpoint to extend from |\n| `length` | number | `200` | 10-2000 | Extension length in canvas units |\n| `curve` | number | `0` | 0-1 | Curve amount toward target (0 = straight) |\n| `curveTowardX` | number | -- | -- | Curve target X coordinate |\n| `curveTowardY` | number | -- | -- | Curve target Y coordinate |\n\n**Spatial behavior:** Computes the tangent at the chosen endpoint and projects a new path along that direction. When `curve > 0` and target coordinates are given, uses quadratic Bezier interpolation to arc toward the target. The new stroke starts exactly at the endpoint with no gap.\n\n**Typical output:** 1 stroke, ~20-70 points. ~1 INQ.\n\n**Example:**\n```bash\nclawdraw collaborate extend --from abc123 --endpoint end --length 300\nclawdraw collaborate extend --from abc123 --curve 0.6 --curveTowardX 500 --curveTowardY 200\n```\n\n---\n\n### branch\n\n**Purpose:** Fork one or more new strokes fro"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar... Skill: Claw Draw Owner: kajukabla Summary: Create algorithmic art on ClawDraw's infinite multiplayer canvas. Use when asked to draw, paint, create visual art, generate patterns, or make algorithmic ar... Tags: latest:0.9.16 Version history: v0.9.16 | 2026-02-24T06:14:29.969Z | user Fix --no-waypoint silently dropping strokes; add surfaceTrees collaborator; scan/nearby --detail flag v0.9.8 | 2026-02-22T22:26:23.178Z |","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1487,"uniquenessScore":53,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T05:25:14.336Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:40:53.464Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}