← WebMCP Directory

Tool tree

quipra.github.io

Media & PersonalTools verified
Website
One desk shared by a person and an agent. Paper, pens, ruler, compass, stencils. Nothing else.
Explore capabilities
    guideAction

    Read one desk skill by topic: core, geometry, lettering, vectors, illustration, animation, recipes, collaboration, layers. core (the desk and its loop) comes with the first look; read geometry before a construction, lettering before labels, vectors for organic shapes, illustration for pictures, animation for motion, recipes to make your own tools, collaboration when the person has drawn, layers to organize. Omit topic for the index.

    View tool JSON
    {
      "name": "guide",
      "kind": "act",
      "impl": "imperative",
      "description": "Read one desk skill by topic: core, geometry, lettering, vectors, illustration, animation, recipes, collaboration, layers. core (the desk and its loop) comes with the first look; read geometry before a construction, lettering before labels, vectors for organic shapes, illustration for pictures, animation for motion, recipes to make your own tools, collaboration when the person has drawn, layers to organize. Omit topic for the index.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "core",
              "geometry",
              "lettering",
              "vectors",
              "illustration",
              "animation",
              "recipes",
              "collaboration",
              "layers"
            ]
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    lookAction

    Look at the sheet: every mark (id, label, group, author human|agent, kind, pen, bounding box), what changed since your last look, the pen in hand, and a 48x32 map of where ink is. The first look also returns the guide. Look once before drawing and once after a figure, not after every mark. Optional region filters marks; detail adds sampled geometry.

    View tool JSON
    {
      "name": "look",
      "kind": "act",
      "impl": "imperative",
      "description": "Look at the sheet: every mark (id, label, group, author human|agent, kind, pen, bounding box), what changed since your last look, the pen in hand, and a 48x32 map of where ink is. The first look also returns the guide. Look once before drawing and once after a figure, not after every mark. Optional region filters marks; detail adds sampled geometry.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "region": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              },
              "w": {
                "type": "number"
              },
              "h": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y",
              "w",
              "h"
            ],
            "additionalProperties": false,
            "description": "only marks touching this rectangle"
          },
          "detail": {
            "type": "boolean",
            "description": "include sampled point geometry"
          },
          "wait": {
            "type": "boolean",
            "description": "true to wait (up to 3s) for ink in motion to settle first; the mark list is exact either way"
          },
          "offset": {
            "type": "number"
          },
          "limit": {
            "type": "number"
          },
          "at": {
            "type": "number",
            "description": "seconds: see every mark where its motion puts it at that time"
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    measureAnswer

    Exact geometry without ink. Give from and to for distance and angle between points; of for one mark's length, midpoint, center, radius or vertices; a and b for the exact crossing points of two marks (lines, arcs, circles, shapes, strokes). Use it to find construction points instead of estimating.

    View tool JSON
    {
      "name": "measure",
      "kind": "answer",
      "impl": "imperative",
      "description": "Exact geometry without ink. Give from and to for distance and angle between points; of for one mark's length, midpoint, center, radius or vertices; a and b for the exact crossing points of two marks (lines, arcs, circles, shapes, strokes). Use it to find construction points instead of estimating.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "to": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "of": {
            "type": "string",
            "description": "a mark id"
          },
          "a": {
            "type": "string",
            "description": "first mark id"
          },
          "b": {
            "type": "string",
            "description": "second mark id"
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    pick_penAction

    Set the default pen for later marks: pencil, fineliner, marker, brush or highlighter, with color (ink, accent, blue, green, ochre or hex), width, opacity and dash. Any mark can also carry its own inline pen instead.

    View tool JSON
    {
      "name": "pick_pen",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the default pen for later marks: pencil, fineliner, marker, brush or highlighter, with color (ink, accent, blue, green, ochre or hex), width, opacity and dash. Any mark can also carry its own inline pen instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "pencil",
              "fineliner",
              "marker",
              "brush",
              "highlighter"
            ]
          },
          "brush": {
            "type": "string",
            "description": "name of a brush made with make"
          },
          "color": {
            "type": "string"
          },
          "width": {
            "type": "number"
          },
          "opacity": {
            "type": "number"
          },
          "dash": {
            "type": "boolean"
          },
          "texture": {
            "type": "string",
            "enum": [
              "grain",
              "chalk",
              "none"
            ]
          },
          "taper": {
            "type": "boolean"
          },
          "fill": {
            "type": "string",
            "enum": [
              "hatch",
              "crosshatch",
              "stipple",
              "none"
            ]
          },
          "hatchAngle": {
            "type": "number"
          },
          "fillColor": {
            "type": "string",
            "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
          },
          "tip": {
            "type": "string",
            "enum": [
              "round",
              "soft",
              "flat",
              "bristle",
              "chalk",
              "pencil"
            ],
            "description": "brush tip stamped along the stroke"
          },
          "spacing": {
            "type": "number",
            "description": "stamp spacing as a fraction of size, 0.03..0.5"
          },
          "scatter": {
            "type": "number",
            "description": "stamp scatter across the path, 0..1"
          },
          "grain": {
            "type": "number",
            "description": "paper grain strength 0..1"
          },
          "engine": {
            "type": "object",
            "description": "brush engine, merged field by field over the kind's defaults",
            "properties": {
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "stamp shape laid along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
              },
              "sizeBase": {
                "type": "number",
                "description": "size at pressure 0, times width, 0..4"
              },
              "sizeGain": {
                "type": "number",
                "description": "extra size at pressure 1, times width, 0..4"
              },
              "flowBase": {
                "type": "number",
                "description": "per-stamp alpha at pressure 0, 0..1"
              },
              "flowGain": {
                "type": "number",
                "description": "extra per-stamp alpha at pressure 1, 0..1"
              },
              "scatter": {
                "type": "number",
                "description": "random offset across the path, 0..2 of size"
              },
              "grain": {
                "type": "number",
                "description": "paper grain eating the deposit, 0..1"
              },
              "multiply": {
                "type": "boolean",
                "description": "multiply blending, the way ink darkens on paper"
              },
              "oriented": {
                "type": "boolean",
                "description": "tip follows the stroke direction, for chisels"
              },
              "sizeJitter": {
                "type": "number",
                "description": "random size variation per stamp, 0..1"
              },
              "flowJitter": {
                "type": "number",
                "description": "random alpha variation per stamp, 0..1"
              },
              "angleJitter": {
                "type": "number",
                "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
              },
              "pressureCurve": {
                "type": "number",
                "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
              },
              "wet": {
                "type": "number",
                "description": "drying stroke: fade toward the paper along the stroke, 0..1"
              },
              "dual": {
                "type": "boolean",
                "description": "stamp a second tip at half size for a textured core"
              }
            },
            "additionalProperties": false
          },
          "shadow": {
            "type": "object",
            "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
            "properties": {
              "dx": {
                "type": "number"
              },
              "dy": {
                "type": "number"
              },
              "blur": {
                "type": "number"
              },
              "color": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "glow": {
            "type": "object",
            "description": "halo around the mark: blur 0..80, color; {} removes it",
            "properties": {
              "blur": {
                "type": "number"
              },
              "color": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "blur": {
            "type": "number",
            "description": "soften the whole mark, 0..80 paper units; 0 removes it"
          }
        },
        "required": [
          "kind"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    drawAction

    Freehand on the 1200x800 sheet (origin top-left). Give points for one stroke, or strokes for several pen-down paths that form one mark (a letter, a word, a sketch). Each point may carry pressure p 0..1. Sparse points are smoothed into a curve. Use ruler and compass for exact lines and circles.

    View tool JSON
    {
      "name": "draw",
      "kind": "act",
      "impl": "imperative",
      "description": "Freehand on the 1200x800 sheet (origin top-left). Give points for one stroke, or strokes for several pen-down paths that form one mark (a letter, a word, a sketch). Each point may carry pressure p 0..1. Sparse points are smoothed into a curve. Use ruler and compass for exact lines and circles.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                },
                "p": {
                  "type": "number",
                  "description": "pressure 0..1, default 0.5"
                }
              },
              "required": [
                "x",
                "y"
              ],
              "additionalProperties": false
            },
            "description": "one continuous stroke"
          },
          "strokes": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  },
                  "p": {
                    "type": "number",
                    "description": "pressure 0..1, default 0.5"
                  }
                },
                "required": [
                  "x",
                  "y"
                ],
                "additionalProperties": false
              },
              "description": "one pen-down path"
            },
            "description": "several paths, pen lifted between them"
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "label"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    rulerAction

    Draw one straight line from one point to another. arrow: true adds an arrowhead at 'to'. Returns length and angle.

    View tool JSON
    {
      "name": "ruler",
      "kind": "act",
      "impl": "imperative",
      "description": "Draw one straight line from one point to another. arrow: true adds an arrowhead at 'to'. Returns length and angle.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "to": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "arrow": {
            "type": "boolean"
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "from",
          "to",
          "label"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    compassAction

    Draw a circle or arc. Degrees: 0 right, 90 down, clockwise. Omit start and end for a full circle; give both for an arc (span within -360..360).

    View tool JSON
    {
      "name": "compass",
      "kind": "act",
      "impl": "imperative",
      "description": "Draw a circle or arc. Degrees: 0 right, 90 down, clockwise. Omit start and end for a full circle; give both for an arc (span within -360..360).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "center": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "radius": {
            "type": "number"
          },
          "start": {
            "type": "number"
          },
          "end": {
            "type": "number"
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "center",
          "radius",
          "label"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    stencilAction

    Trace a shape stencil: rectangle, triangle (apex up) or regular polygon (sides 3..12). x,y is the center; w,h the size; rotation in degrees clockwise.

    View tool JSON
    {
      "name": "stencil",
      "kind": "act",
      "impl": "imperative",
      "description": "Trace a shape stencil: rectangle, triangle (apex up) or regular polygon (sides 3..12). x,y is the center; w,h the size; rotation in degrees clockwise.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "shape": {
            "type": "string",
            "enum": [
              "rectangle",
              "triangle",
              "polygon"
            ]
          },
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          },
          "w": {
            "type": "number"
          },
          "h": {
            "type": "number"
          },
          "rotation": {
            "type": "number"
          },
          "sides": {
            "type": "number"
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "shape",
          "x",
          "y",
          "w",
          "h",
          "label"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    pathAction

    The pen tool: a vector path from SVG path data (M L H V C S Q T Z, absolute or relative) in paper units, e.g. 'M 300 400 C 350 300 450 300 500 400 Z'. Give the pen a fillColor for a solid shape. Paths transform, animate, and cross like every other mark.

    View tool JSON
    {
      "name": "path",
      "kind": "act",
      "impl": "imperative",
      "description": "The pen tool: a vector path from SVG path data (M L H V C S Q T Z, absolute or relative) in paper units, e.g. 'M 300 400 C 350 300 450 300 500 400 Z'. Give the pen a fillColor for a solid shape. Paths transform, animate, and cross like every other mark.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "d": {
            "type": "string"
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "d",
          "label"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    editAction

    Change existing marks without redrawing, or animate them. Select by ids, group and/or region, then any of: pen (restyle), dx/dy (move), scale (about a point, default the mark's center), rotate (degrees clockwise), label, regroup, duplicate (edit copies, keep originals). With at (seconds) the same fields become a KEYFRAME instead: the mark tweens there from its previous key with ease or bezier; opacity and reveal (write-on) are keyable too. wiggle adds smooth random drift, boil re-noises the edge like hand-drawn animation, preset applies a built-in motion (rise, drop, pop, fade, wipe, typewriter, breathe, spin, shake, drift, sketchy, fadeOut, sink) or one you made, stagger cascades a group. align (left, center, right, top, middle, bottom) lines the selection up by its bounds, toPaper: true against the sheet instead; distribute (horizontal, vertical) spaces it evenly between the outermost two. hidden and order manage layers. Playback starts automatically.

    View tool JSON
    {
      "name": "edit",
      "kind": "act",
      "impl": "imperative",
      "description": "Change existing marks without redrawing, or animate them. Select by ids, group and/or region, then any of: pen (restyle), dx/dy (move), scale (about a point, default the mark's center), rotate (degrees clockwise), label, regroup, duplicate (edit copies, keep originals). With at (seconds) the same fields become a KEYFRAME instead: the mark tweens there from its previous key with ease or bezier; opacity and reveal (write-on) are keyable too. wiggle adds smooth random drift, boil re-noises the edge like hand-drawn animation, preset applies a built-in motion (rise, drop, pop, fade, wipe, typewriter, breathe, spin, shake, drift, sketchy, fadeOut, sink) or one you made, stagger cascades a group. align (left, center, right, top, middle, bottom) lines the selection up by its bounds, toPaper: true against the sheet instead; distribute (horizontal, vertical) spaces it evenly between the outermost two. hidden and order manage layers. Playback starts automatically.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "mark ids"
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "region": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              },
              "w": {
                "type": "number"
              },
              "h": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y",
              "w",
              "h"
            ],
            "additionalProperties": false
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          },
          "dx": {
            "type": "number"
          },
          "dy": {
            "type": "number"
          },
          "scale": {
            "type": "number"
          },
          "rotate": {
            "type": "number"
          },
          "about": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "label": {
            "type": "string",
            "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
          },
          "regroup": {
            "type": "string",
            "description": "new group name for the selected marks"
          },
          "duplicate": {
            "type": "boolean"
          },
          "hidden": {
            "type": "boolean",
            "description": "hide or show the selected marks (they stay in the scene)"
          },
          "order": {
            "type": "string",
            "enum": [
              "front",
              "back"
            ],
            "description": "bring to front or send to back of the drawing order"
          },
          "align": {
            "type": "string",
            "enum": [
              "left",
              "center",
              "right",
              "top",
              "middle",
              "bottom"
            ],
            "description": "line the selected marks up by their bounds: left, center, right across, top, middle, bottom down"
          },
          "distribute": {
            "type": "string",
            "enum": [
              "horizontal",
              "vertical"
            ],
            "description": "space the selected marks evenly between the outermost two"
          },
          "toPaper": {
            "type": "boolean",
            "description": "align to the sheet instead of to the selection's own bounds"
          },
          "at": {
            "type": "number",
            "description": "seconds on the timeline; with at, this edit becomes a keyframe"
          },
          "ease": {
            "type": "string",
            "enum": [
              "linear",
              "ease",
              "easeIn",
              "easeOut",
              "easeInOut",
              "bounce"
            ],
            "description": "curve into this keyframe, default easeInOut"
          },
          "bezier": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "description": "cubic-bezier x1 y1 x2 y2, instead of ease"
          },
          "opacity": {
            "type": "number",
            "description": "0..1 at this keyframe"
          },
          "reveal": {
            "type": "number",
            "description": "0..1 how much of the mark is drawn at this keyframe (write-on)"
          },
          "wiggle": {
            "type": "object",
            "properties": {
              "amp": {
                "type": "number",
                "description": "paper units"
              },
              "freq": {
                "type": "number",
                "description": "Hz"
              }
            },
            "required": [
              "amp",
              "freq"
            ],
            "additionalProperties": false
          },
          "boil": {
            "type": "number",
            "description": "line boil: re-noise textured edges this many times per second, 0 to stop"
          },
          "preset": {
            "type": "string",
            "description": "a motion you made with make, applied starting at 'at'"
          },
          "clearMotion": {
            "type": "boolean",
            "description": "remove all keyframes and motion from the selected marks"
          },
          "stagger": {
            "type": "number",
            "description": "seconds between each selected mark's start, in scene order, for cascades"
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    eraseAction

    Rub out marks selected by ids, group and/or every mark touching a rectangular region. This removes the person's marks too, so look first.

    View tool JSON
    {
      "name": "erase",
      "kind": "act",
      "impl": "imperative",
      "description": "Rub out marks selected by ids, group and/or every mark touching a rectangular region. This removes the person's marks too, so look first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "mark ids"
          },
          "group": {
            "type": "string",
            "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
          },
          "region": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              },
              "w": {
                "type": "number"
              },
              "h": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y",
              "w",
              "h"
            ],
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    undoAction

    Lift your own last mark off the paper. Only removes marks the agent made.

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Lift your own last mark off the paper. Only removes marks the agent made.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    timelineAction

    The sheet's clock. action play, pause, seek (at), set (duration, fps, loop, onion), or clear (a fresh sheet: blank, grid or lined, which erases everything including the person's marks, so ask first). Returns the timeline state and every keyframe time.

    View tool JSON
    {
      "name": "timeline",
      "kind": "act",
      "impl": "imperative",
      "description": "The sheet's clock. action play, pause, seek (at), set (duration, fps, loop, onion), or clear (a fresh sheet: blank, grid or lined, which erases everything including the person's marks, so ask first). Returns the timeline state and every keyframe time.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "play",
              "pause",
              "seek",
              "set",
              "clear"
            ]
          },
          "duration": {
            "type": "number",
            "description": "seconds"
          },
          "fps": {
            "type": "number"
          },
          "loop": {
            "type": "boolean"
          },
          "onion": {
            "type": "boolean",
            "description": "tracing paper: previous frame faint while scrubbing"
          },
          "paper": {
            "type": "string",
            "enum": [
              "blank",
              "grid",
              "lined"
            ],
            "description": "for clear: the fresh sheet's paper"
          },
          "at": {
            "type": "number",
            "description": "seconds, for seek"
          }
        },
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    makeAction

    Make your own tool for this session. kind motion: a named animation preset (keys with relative times, wiggle, boil) applied to any marks with edit preset. kind brush: a named pen you design (kind, color, width, opacity, dash, texture, taper, fill, effects shadow|glow|blur, and a full engine block: tip, spacing, sizeBase, sizeGain, flowBase, flowGain, scatter, grain, multiply, oriented, sizeJitter, flowJitter, angleJitter, pressureCurve, wet, dual) and then use anywhere as pen: { brush: name }. kind recipe: a named list of construct steps with parameters, written as JSON text in steps; any number in a step may be an expression over $params such as "($A.x+$B.x)/2" or "hypot($B.x-$A.x,$B.y-$A.y)/2" (functions: sqrt abs min max hypot sin cos tan atan2 round). Use a recipe as a construct step { tool: recipe, name, args }. Making a name again replaces it.

    View tool JSON
    {
      "name": "make",
      "kind": "act",
      "impl": "imperative",
      "description": "Make your own tool for this session. kind motion: a named animation preset (keys with relative times, wiggle, boil) applied to any marks with edit preset. kind brush: a named pen you design (kind, color, width, opacity, dash, texture, taper, fill, effects shadow|glow|blur, and a full engine block: tip, spacing, sizeBase, sizeGain, flowBase, flowGain, scatter, grain, multiply, oriented, sizeJitter, flowJitter, angleJitter, pressureCurve, wet, dual) and then use anywhere as pen: { brush: name }. kind recipe: a named list of construct steps with parameters, written as JSON text in steps; any number in a step may be an expression over $params such as \"($A.x+$B.x)/2\" or \"hypot($B.x-$A.x,$B.y-$A.y)/2\" (functions: sqrt abs min max hypot sin cos tan atan2 round). Use a recipe as a construct step { tool: recipe, name, args }. Making a name again replaces it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "brush",
              "recipe",
              "motion"
            ]
          },
          "name": {
            "type": "string",
            "description": "short identifier, e.g. inkwash, bisector"
          },
          "description": {
            "type": "string",
            "description": "what it is for, shown in look.custom"
          },
          "pen": {
            "type": "object",
            "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "pencil",
                  "fineliner",
                  "marker",
                  "brush",
                  "highlighter"
                ]
              },
              "brush": {
                "type": "string",
                "description": "name of a brush made with make"
              },
              "color": {
                "type": "string"
              },
              "width": {
                "type": "number"
              },
              "opacity": {
                "type": "number"
              },
              "dash": {
                "type": "boolean"
              },
              "texture": {
                "type": "string",
                "enum": [
                  "grain",
                  "chalk",
                  "none"
                ]
              },
              "taper": {
                "type": "boolean"
              },
              "fill": {
                "type": "string",
                "enum": [
                  "hatch",
                  "crosshatch",
                  "stipple",
                  "none"
                ]
              },
              "hatchAngle": {
                "type": "number"
              },
              "fillColor": {
                "type": "string",
                "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
              },
              "tip": {
                "type": "string",
                "enum": [
                  "round",
                  "soft",
                  "flat",
                  "bristle",
                  "chalk",
                  "pencil"
                ],
                "description": "brush tip stamped along the stroke"
              },
              "spacing": {
                "type": "number",
                "description": "stamp spacing as a fraction of size, 0.03..0.5"
              },
              "scatter": {
                "type": "number",
                "description": "stamp scatter across the path, 0..1"
              },
              "grain": {
                "type": "number",
                "description": "paper grain strength 0..1"
              },
              "engine": {
                "type": "object",
                "description": "brush engine, merged field by field over the kind's defaults",
                "properties": {
                  "tip": {
                    "type": "string",
                    "enum": [
                      "round",
                      "soft",
                      "flat",
                      "bristle",
                      "chalk",
                      "pencil"
                    ],
                    "description": "stamp shape laid along the stroke"
                  },
                  "spacing": {
                    "type": "number",
                    "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                  },
                  "sizeBase": {
                    "type": "number",
                    "description": "size at pressure 0, times width, 0..4"
                  },
                  "sizeGain": {
                    "type": "number",
                    "description": "extra size at pressure 1, times width, 0..4"
                  },
                  "flowBase": {
                    "type": "number",
                    "description": "per-stamp alpha at pressure 0, 0..1"
                  },
                  "flowGain": {
                    "type": "number",
                    "description": "extra per-stamp alpha at pressure 1, 0..1"
                  },
                  "scatter": {
                    "type": "number",
                    "description": "random offset across the path, 0..2 of size"
                  },
                  "grain": {
                    "type": "number",
                    "description": "paper grain eating the deposit, 0..1"
                  },
                  "multiply": {
                    "type": "boolean",
                    "description": "multiply blending, the way ink darkens on paper"
                  },
                  "oriented": {
                    "type": "boolean",
                    "description": "tip follows the stroke direction, for chisels"
                  },
                  "sizeJitter": {
                    "type": "number",
                    "description": "random size variation per stamp, 0..1"
                  },
                  "flowJitter": {
                    "type": "number",
                    "description": "random alpha variation per stamp, 0..1"
                  },
                  "angleJitter": {
                    "type": "number",
                    "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                  },
                  "pressureCurve": {
                    "type": "number",
                    "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                  },
                  "wet": {
                    "type": "number",
                    "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                  },
                  "dual": {
                    "type": "boolean",
                    "description": "stamp a second tip at half size for a textured core"
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "type": "object",
                "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  },
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "glow": {
                "type": "object",
                "description": "halo around the mark: blur 0..80, color; {} removes it",
                "properties": {
                  "blur": {
                    "type": "number"
                  },
                  "color": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "blur": {
                "type": "number",
                "description": "soften the whole mark, 0..80 paper units; 0 removes it"
              }
            },
            "additionalProperties": false
          },
          "params": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "recipe parameter names, e.g. [\"A\", \"B\"]"
          },
          "steps": {
            "type": "string",
            "description": "recipe only: JSON text of an array of construct steps using $params"
          },
          "motion": {
            "type": "string",
            "description": "motion only: JSON text {keys:[{at,dx,dy,scale,rotate,opacity,reveal,ease}], wiggle:{amp,freq}, boil}; key times are relative to where the preset is applied"
          }
        },
        "required": [
          "kind",
          "name"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }
    constructAction

    The main way to draw: up to 40 instrument steps in one call, in order. Each step names its tool (pick_pen, draw, ruler, compass, stencil, path, edit, erase, undo, timeline, or recipe with name and args) and carries that tool's fields, plus an optional inline pen and group. verify: true appends a look to the result so you can check the figure without another call. Stops at the first invalid step and reports what was done.

    View tool JSON
    {
      "name": "construct",
      "kind": "act",
      "impl": "imperative",
      "description": "The main way to draw: up to 40 instrument steps in one call, in order. Each step names its tool (pick_pen, draw, ruler, compass, stencil, path, edit, erase, undo, timeline, or recipe with name and args) and carries that tool's fields, plus an optional inline pen and group. verify: true appends a look to the result so you can check the figure without another call. Stops at the first invalid step and reports what was done.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "tool": {
                  "type": "string",
                  "enum": [
                    "pick_pen",
                    "draw",
                    "ruler",
                    "compass",
                    "stencil",
                    "path",
                    "edit",
                    "erase",
                    "undo",
                    "timeline",
                    "recipe"
                  ]
                },
                "label": {
                  "type": "string",
                  "description": "Short name for this mark, e.g. 'side AB', 'arc from A'."
                },
                "group": {
                  "type": "string",
                  "description": "Optional group name shared by related marks, e.g. 'triangle ABC'."
                },
                "pen": {
                  "type": "object",
                  "description": "Pen for this mark: kind, or brush (a name you made with make), color by name (ink, accent, blue, green, ochre) or hex, width 1..64, opacity 0.05..1, dash for construction lines, texture grain|chalk, taper for thin ends, fill hatch|crosshatch|stipple and/or fillColor (solid) for closed paths, shapes and circles, hatchAngle. Brush engine: tip (round, soft, flat, bristle, chalk, pencil), spacing, scatter, grain, or engine { ... } for every studio parameter. Effects: shadow, glow, blur 0..80.",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": [
                        "pencil",
                        "fineliner",
                        "marker",
                        "brush",
                        "highlighter"
                      ]
                    },
                    "brush": {
                      "type": "string",
                      "description": "name of a brush made with make"
                    },
                    "color": {
                      "type": "string"
                    },
                    "width": {
                      "type": "number"
                    },
                    "opacity": {
                      "type": "number"
                    },
                    "dash": {
                      "type": "boolean"
                    },
                    "texture": {
                      "type": "string",
                      "enum": [
                        "grain",
                        "chalk",
                        "none"
                      ]
                    },
                    "taper": {
                      "type": "boolean"
                    },
                    "fill": {
                      "type": "string",
                      "enum": [
                        "hatch",
                        "crosshatch",
                        "stipple",
                        "none"
                      ]
                    },
                    "hatchAngle": {
                      "type": "number"
                    },
                    "fillColor": {
                      "type": "string",
                      "description": "solid fill for closed paths, shapes and circles: palette name, hex, auto, or none"
                    },
                    "tip": {
                      "type": "string",
                      "enum": [
                        "round",
                        "soft",
                        "flat",
                        "bristle",
                        "chalk",
                        "pencil"
                      ],
                      "description": "brush tip stamped along the stroke"
                    },
                    "spacing": {
                      "type": "number",
                      "description": "stamp spacing as a fraction of size, 0.03..0.5"
                    },
                    "scatter": {
                      "type": "number",
                      "description": "stamp scatter across the path, 0..1"
                    },
                    "grain": {
                      "type": "number",
                      "description": "paper grain strength 0..1"
                    },
                    "engine": {
                      "type": "object",
                      "description": "brush engine, merged field by field over the kind's defaults",
                      "properties": {
                        "tip": {
                          "type": "string",
                          "enum": [
                            "round",
                            "soft",
                            "flat",
                            "bristle",
                            "chalk",
                            "pencil"
                          ],
                          "description": "stamp shape laid along the stroke"
                        },
                        "spacing": {
                          "type": "number",
                          "description": "stamp spacing as a fraction of size, 0.02 dense .. 1 dotted"
                        },
                        "sizeBase": {
                          "type": "number",
                          "description": "size at pressure 0, times width, 0..4"
                        },
                        "sizeGain": {
                          "type": "number",
                          "description": "extra size at pressure 1, times width, 0..4"
                        },
                        "flowBase": {
                          "type": "number",
                          "description": "per-stamp alpha at pressure 0, 0..1"
                        },
                        "flowGain": {
                          "type": "number",
                          "description": "extra per-stamp alpha at pressure 1, 0..1"
                        },
                        "scatter": {
                          "type": "number",
                          "description": "random offset across the path, 0..2 of size"
                        },
                        "grain": {
                          "type": "number",
                          "description": "paper grain eating the deposit, 0..1"
                        },
                        "multiply": {
                          "type": "boolean",
                          "description": "multiply blending, the way ink darkens on paper"
                        },
                        "oriented": {
                          "type": "boolean",
                          "description": "tip follows the stroke direction, for chisels"
                        },
                        "sizeJitter": {
                          "type": "number",
                          "description": "random size variation per stamp, 0..1"
                        },
                        "flowJitter": {
                          "type": "number",
                          "description": "random alpha variation per stamp, 0..1"
                        },
                        "angleJitter": {
                          "type": "number",
                          "description": "random tumble per stamp, 0..1 of a full turn, non-oriented tips"
                        },
                        "pressureCurve": {
                          "type": "number",
                          "description": "exponent on pressure: 0.3 eager, 1 linear, 3 reluctant"
                        },
                        "wet": {
                          "type": "number",
                          "description": "drying stroke: fade toward the paper along the stroke, 0..1"
                        },
                        "dual": {
                          "type": "boolean",
                          "description": "stamp a second tip at half size for a textured core"
                        }
                      },
                      "additionalProperties": false
                    },
                    "shadow": {
                      "type": "object",
                      "description": "drop shadow: dx and dy -200..200, blur 0..80, color; {} removes it",
                      "properties": {
                        "dx": {
                          "type": "number"
                        },
                        "dy": {
                          "type": "number"
                        },
                        "blur": {
                          "type": "number"
                        },
                        "color": {
                          "type": "string"
                        }
                      },
                      "additionalProperties": false
                    },
                    "glow": {
                      "type": "object",
                      "description": "halo around the mark: blur 0..80, color; {} removes it",
                      "properties": {
                        "blur": {
                          "type": "number"
                        },
                        "color": {
                          "type": "string"
                        }
                      },
                      "additionalProperties": false
                    },
                    "blur": {
                      "type": "number",
                      "description": "soften the whole mark, 0..80 paper units; 0 removes it"
                    }
                  },
                  "additionalProperties": false
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "pencil",
                    "fineliner",
                    "marker",
                    "brush",
                    "highlighter"
                  ]
                },
                "color": {
                  "type": "string"
                },
                "width": {
                  "type": "number"
                },
                "dash": {
                  "type": "boolean"
                },
                "points": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "x": {
                        "type": "number"
                      },
                      "y": {
                        "type": "number"
                      },
                      "p": {
                        "type": "number",
                        "description": "pressure 0..1, default 0.5"
                      }
                    },
                    "required": [
                      "x",
                      "y"
                    ],
                    "additionalProperties": false
                  },
                  "description": "one pen-down path"
                },
                "strokes": {
                  "type": "array",
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        },
                        "p": {
                          "type": "number",
                          "description": "pressure 0..1, default 0.5"
                        }
                      },
                      "required": [
                        "x",
                        "y"
                      ],
                      "additionalProperties": false
                    },
                    "description": "one pen-down path"
                  }
                },
                "from": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y"
                  ],
                  "additionalProperties": false
                },
                "to": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y"
                  ],
                  "additionalProperties": false
                },
                "arrow": {
                  "type": "boolean"
                },
                "center": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y"
                  ],
                  "additionalProperties": false
                },
                "radius": {
                  "type": "number"
                },
                "start": {
                  "type": "number"
                },
                "end": {
                  "type": "number"
                },
                "shape": {
                  "type": "string",
                  "enum": [
                    "rectangle",
                    "triangle",
                    "polygon"
                  ]
                },
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                },
                "w": {
                  "type": "number"
                },
                "h": {
                  "type": "number"
                },
                "rotation": {
                  "type": "number"
                },
                "sides": {
                  "type": "number"
                },
                "ids": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "mark ids"
                },
                "region": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "w": {
                      "type": "number"
                    },
                    "h": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "w",
                    "h"
                  ],
                  "additionalProperties": false
                },
                "dx": {
                  "type": "number"
                },
                "dy": {
                  "type": "number"
                },
                "scale": {
                  "type": "number"
                },
                "rotate": {
                  "type": "number"
                },
                "about": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y"
                  ],
                  "additionalProperties": false
                },
                "regroup": {
                  "type": "string"
                },
                "duplicate": {
                  "type": "boolean"
                },
                "name": {
                  "type": "string",
                  "description": "recipe name"
                },
                "args": {
                  "type": "array",
                  "description": "parameter values: {name, x, y} for a point, {name, value} for a number, {name, text} for text",
                  "items": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "x": {
                        "type": "number"
                      },
                      "y": {
                        "type": "number"
                      },
                      "value": {
                        "type": "number"
                      },
                      "text": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "name"
                    ],
                    "additionalProperties": false
                  }
                },
                "d": {
                  "type": "string",
                  "description": "path: SVG path data"
                },
                "hidden": {
                  "type": "boolean",
                  "description": "hide or show the selected marks (they stay in the scene)"
                },
                "order": {
                  "type": "string",
                  "enum": [
                    "front",
                    "back"
                  ],
                  "description": "bring to front or send to back of the drawing order"
                },
                "align": {
                  "type": "string",
                  "enum": [
                    "left",
                    "center",
                    "right",
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "description": "line the selected marks up by their bounds: left, center, right across, top, middle, bottom down"
                },
                "distribute": {
                  "type": "string",
                  "enum": [
                    "horizontal",
                    "vertical"
                  ],
                  "description": "space the selected marks evenly between the outermost two"
                },
                "toPaper": {
                  "type": "boolean",
                  "description": "align to the sheet instead of to the selection's own bounds"
                },
                "at": {
                  "type": "number",
                  "description": "seconds on the timeline; with at, this edit becomes a keyframe"
                },
                "ease": {
                  "type": "string",
                  "enum": [
                    "linear",
                    "ease",
                    "easeIn",
                    "easeOut",
                    "easeInOut",
                    "bounce"
                  ],
                  "description": "curve into this keyframe, default easeInOut"
                },
                "bezier": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  },
                  "description": "cubic-bezier x1 y1 x2 y2, instead of ease"
                },
                "opacity": {
                  "type": "number",
                  "description": "0..1 at this keyframe"
                },
                "reveal": {
                  "type": "number",
                  "description": "0..1 how much of the mark is drawn at this keyframe (write-on)"
                },
                "wiggle": {
                  "type": "object",
                  "properties": {
                    "amp": {
                      "type": "number",
                      "description": "paper units"
                    },
                    "freq": {
                      "type": "number",
                      "description": "Hz"
                    }
                  },
                  "required": [
                    "amp",
                    "freq"
                  ],
                  "additionalProperties": false
                },
                "boil": {
                  "type": "number",
                  "description": "line boil: re-noise textured edges this many times per second, 0 to stop"
                },
                "preset": {
                  "type": "string",
                  "description": "a motion you made with make, applied starting at 'at'"
                },
                "clearMotion": {
                  "type": "boolean",
                  "description": "remove all keyframes and motion from the selected marks"
                },
                "stagger": {
                  "type": "number",
                  "description": "seconds between each selected mark's start, in scene order, for cascades"
                },
                "action": {
                  "type": "string",
                  "enum": [
                    "play",
                    "pause",
                    "seek",
                    "set",
                    "clear"
                  ]
                },
                "duration": {
                  "type": "number",
                  "description": "seconds"
                },
                "fps": {
                  "type": "number"
                },
                "loop": {
                  "type": "boolean"
                },
                "onion": {
                  "type": "boolean",
                  "description": "tracing paper: previous frame faint while scrubbing"
                },
                "paper": {
                  "type": "string",
                  "enum": [
                    "blank",
                    "grid",
                    "lined"
                  ],
                  "description": "for clear: the fresh sheet's paper"
                }
              },
              "required": [
                "tool"
              ],
              "additionalProperties": false
            }
          },
          "verify": {
            "type": "boolean",
            "description": "append a look to the result"
          }
        },
        "required": [
          "steps"
        ],
        "additionalProperties": false
      },
      "page": "/desk/"
    }