Jabbertoon error codes

When Jabbertoon checks a move, a character or a cartoon, every problem it finds has a code: a short name made of lower-case words, such as the ones below. The block editor and the studio show the problem in words; the tools for AI assistants give the code as well, with where the problem is, what is wrong and how to fix it, and each answer links to the code's place on this page. The tools have codes of their own as well, from their own checks and for a call, a file or a video they cannot make; those have no example here, and each says why.

An error stops the program from being used until it is fixed. A warning lets it play, because the program is still valid, but points at something that will probably not do what you meant, such as a part that no character has. Each code below says which of the two it is, in a tag before what it means: Error or Warning. Under each, open its example to see a program that gets it and what the check says about it.

The codes are also published as data, in the error catalog, and a program can be checked against the JSON Schemas before Jabbertoon sees it.

All 235 codes, A to Z

background_not_drawable_here

Error A scene's background is not one of the six this renderer draws, so it would be drawn as another.

How to fix it: Use one of beach, meadow, classroom, stage, space or city as the place's background, or pass allow_substitutes: true to draw the meadow instead (listed in the result).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"name": "Ann", "look": {"template": "kid"}}
  },
  "scripts": [
    {
      "hat": {
        "on": "scene",
        "name": "One",
        "place": "kitchen"
      },
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: places: A background cannot be drawn here: kitchen (it is not one of the six backgrounds (beach, meadow, classroom, stage, space, city)).

bad_arguments

Error The call's arguments are not ones the tool can use: one is missing, unknown or of the wrong type.

How to fix it: Send the arguments the tool's inputSchema gives, as the message says.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

bad_fps

Error That frame rate is not one this renderer makes.

How to fix it: Use 24 (the default) or any whole number up to 30. The cartoon itself always runs on its 24 frames-a-second clock.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

bad_option

Error An option has a value this renderer does not take.

How to fix it: See the option named in the message, and the values it takes.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

bad_size

Error That frame size is not one this renderer makes.

How to fix it: Use 1280x720 (the default), 1920x1080 or 1080x1920 for a video; a frame or a contact sheet takes any size from 16 to 3840 pixels a side.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

bad_time

Error That time is not in the cartoon.

How to fix it: Give a time in seconds from 0 to the cartoon's length.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

block_has_no_body

Warning A block that holds no body was given one; its body never runs.

How to fix it: Move the blocks out of it, or into a block that holds a body (for, repeat, forever, while, if, between).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "op": "move",
          "dx": 10,
          "body": [{"op": "wait", "s": 1}]
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0]: "move" has no body

block_needs_op

Error A block has no "op" saying what it is.

How to fix it: Give each block an "op": {"op": "say", ...}.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"do": "wait"}]}]
}

What the check says: scripts[0].body[0]: block needs an "op"

blocks_never_run

Warning The scene ends before a script reaches some of its blocks, so they never run.

How to fix it: Let the script reach its end before the scene ends: pin the next scene later, or take out the wait the script was held at.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "window", "from": -1, "body": []}]
    }
  ]
}

What the check says: Blocks of a script in scene "s" never run: the scene ends at 0 s before the script reaches them.

body_not_list

Error A body is not a list of blocks.

How to fix it: Make the body a list: "body": [{...}, {...}].

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "forever", "body": {"op": "wait"}}]}
  ]
}

What the check says: scripts[0].body[0].body: body must be an array

branches_not_list

Error The branches of an at-the-same-time block are not a list of bodies.

How to fix it: Write branches as a list of lists of blocks: [[...], [...]].

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "together", "branches": "two"}]}
  ]
}

What the check says: scripts[0].body[0].branches: must be an array of bodies

busy

Error The online tools are busy: they have answered all they take today, or as many at once as they take.

How to fix it: Try again after the time Retry-After gives; the studio at https://jabbertoon.com/studio/ and the tool on your own computer work without them.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

canvas_unavailable

Error There is no canvas to draw on here.

How to fix it: Install the package again (npm install); its canvas library (@napi-rs/canvas) has builds for Windows, macOS and Linux on Node 22 or later.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

caption_cut

Warning A caption is cut off before its time is up, when its scene ends.

How to fix it: A caption does not wait: put a wait after it (as long as its for), or end the scene later.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "say",
          "who": "A",
          "text": "And they swam all day."
        },
        {"op": "caption", "text": "The end", "for": 2}
      ]
    }
  ]
}

What the check says: The caption "The end" is cut off when scene "s" ends at 1.57 s: 0 of 2 s shown.

caption_hidden

Warning A line said while a caption is up takes its place, so the caption is hidden for most of its time.

How to fix it: A line takes the place of a caption while it is said: give the caption its own moment, before or after the line.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "caption",
          "text": "Lunchtime in the park",
          "for": 2
        },
        {
          "op": "say",
          "who": "A",
          "text": "I am so hungry today, friends!"
        },
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: The caption "Lunchtime in the park" at 0 s is hidden for most of its time: A's line "I am so hungry today, friends!", said at 0 s, takes its place.

caption_needs_text

Error A caption has no words.

How to fix it: Give the caption as text: "text": "Later that day".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "caption"}]
    }
  ]
}

What the check says: scripts[0].body[0].text: caption needs text, as a string

caption_too_long

Warning A caption (or a line, which shows as one) takes more than about three lines of the picture.

How to fix it: Split the words into two captions (or lines), each of at most about three lines.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "caption",
          "text": "This caption goes on and on and on, far longer than three lines of the picture can ever hold at the size the studio writes them, so the end of it is lost below the frame.",
          "for": 4
        },
        {"op": "wait", "s": 4}
      ]
    }
  ]
}

What the check says: The caption "This caption goes on and on and on, far…" at 0 s takes about 5 lines on the picture; 3 fit.

cartoon_empty

Error The cartoon has no scenes, so there is nothing to play, and render_video and preview refuse it.

How to fix it: Add a scene: {"hat": {"on": "scene", "name": "Hello"}, "body": [{"op": "say", "who": "dog", "text": "Hi!"}]}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"name": "Ann", "look": {"template": "kid"}}
  },
  "scripts": []
}

What the check says: scripts: has no scenes, so there is nothing to play

Only in the downloadable tool, not yet published: preview, render_video

cartoon_fails_when_played

Error The cartoon stopped with an error while it was being played, so it was not drawn.

How to fix it: Fix what the message names, as validate's play check does (fails_when_played, at the same time): a name in a formula that is not a setting, a variable or one the engine has; a character (who) that is not in the cast; or a loop that never waits (put a wait in it).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"name": "Ann", "look": {"template": "kid"}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "wait", "s": "=nope + 1"}]
    }
  ]
}

What the check says: The cartoon stopped with an error before its first frame: expression: unknown name "nope"

cartoon_file_field_unknown

Error A cartoon file holds its cast, its places and its program, and nothing else.

How to fix it: Move the field into the program where it belongs, or leave it out.

An example that gets this code
{
  "pack": 1,
  "id": "c4c:cartoon:happy_now",
  "type": "cartoon",
  "version": "1.0.1",
  "name": "Happy now?",
  "description": "Sunny brings Grump a cake with sprinkles. Two characters, two scenes, about 23 seconds.",
  "author": {"id": "you", "name": "You"},
  "license": "cc0",
  "remixable": true,
  "derived_from": [],
  "preview": {"seconds": 23},
  "content_hash": "sha256:28ac64431d1fac33415608eb770bb63fd22de03c84953fe5369bec79925cc505",
  "content": {
    "cast": {
      "A": {
        "name": "Sunny",
        "legs": 2,
        "look": {
          "template": "person",
          "colors": {"body": "#ffcf77", "acc": "#6a4c93"}
        }
      },
      "B": {
        "name": "Grump",
        "legs": 4,
        "at": {
          "x": 0.68,
          "y": 0.92,
          "h": 0.34,
          "facing": -1
        },
        "look": {
          "template": "dog",
          "colors": {
            "skin": "#9e8a78",
            "body": "#d9cbbd",
            "acc": "#5a4636"
          }
        }
      }
    },
    "places": {"park": {"background": "meadow"}},
    "program": {
      "v": 1,
      "kind": "cartoon",
      "name": "Happy now?",
      "scripts": [
        {
          "hat": {
            "on": "scene",
            "name": "Morning",
            "place": "park"
          },
          "body": [
            {
              "op": "does",
              "who": "B",
              "behaviour": "c4c:beh:sadidle"
            },
            {
              "op": "caption",
              "text": "Grump was having a grey sort of morning.",
              "for": 2.6
            },
            {"op": "wait", "s": 1.2},
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:walk",
              "for": 2,
              "params": {"from": 0, "to": 0, "t_in": 2}
            },
            {
              "op": "enter",
              "who": "A",
              "from": "left",
              "over": 2,
              "x": 0.3
            },
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:wave_hello"
            },
            {
              "op": "say",
              "who": "A",
              "text": "Good morning, Grump!",
              "mood": "happy"
            },
            {
              "op": "does",
              "who": "B",
              "behaviour": "c4c:beh:annoyed"
            },
            {
              "op": "say",
              "who": "B",
              "text": "Is it?",
              "mood": "angry"
            },
            {"op": "wait", "s": 0.5},
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:bounce"
            },
            {
              "op": "say",
              "who": "A",
              "text": "I baked you a cake. It has sprinkles!",
              "mood": "happy"
            },
            {
              "op": "does",
              "who": "B",
              "behaviour": "c4c:beh:sadidle"
            },
            {
              "op": "say",
              "who": "B",
              "text": "I don't like sprinkles.",
              "mood": "sad"
            },
            {"op": "wait", "s": 0.8}
          ]
        },
        {
          "hat": {"on": "scene", "name": "One bite later"},
          "body": [
            {
              "op": "caption",
              "text": "One bite later...",
              "for": 1.6
            },
            {
              "op": "does",
              "who": "B",
              "behaviour": "c4c:beh:idle"
            },
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:point"
            },
            {"op": "wait", "s": 1},
            {
              "op": "say",
              "who": "A",
              "text": "Are you happy now?",
              "mood": "happy"
            },
            {"op": "wait", "s": 0.9},
            {
              "op": "does",
              "who": "B",
              "behaviour": "c4c:beh:wag"
            },
            {
              "op": "say",
              "who": "B",
              "text": "...Maybe a little."
            },
            {"op": "cut", "place": "park", "mood": "bloom"},
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:jump_for_joy"
            },
            {
              "op": "say",
              "who": "A",
              "text": "Hooray! Cake for everyone!",
              "mood": "happy"
            },
            {
              "op": "say",
              "who": "B",
              "text": "Don't make it weird.",
              "mood": "angry"
            },
            {
              "op": "does",
              "who": "A",
              "behaviour": "c4c:beh:walk",
              "for": 2.4,
              "params": {"from": 0, "to": 0, "t_in": 2.4}
            },
            {
              "op": "together",
              "branches": [
                [
                  {
                    "op": "exit",
                    "who": "A",
                    "to": "left",
                    "over": 2.4
                  }
                ],
                [
                  {"op": "wait", "s": 1.2},
                  {
                    "op": "say",
                    "who": "B",
                    "text": "Thanks for the cake.",
                    "speed": 0.85
                  }
                ]
              ]
            },
            {"op": "mood", "who": "B", "mood": "happy"},
            {"op": "wait", "s": 1.2}
          ]
        }
      ]
    },
    "extra": 1
  }
}

What the check says: content.extra: a cartoon pack holds {cast, places, program} only

cartoon_file_no_program

Error A cartoon file needs its program.

How to fix it: Give {"cast": {...}, "program": {"v": 1, "kind": "cartoon", "scripts": [...]}}.

An example that gets this code
{
  "format": "jabbertoon-project",
  "version": 2,
  "cartoon": 5,
  "assets": {"characters": {}, "sounds": {}}
}

What the check says: cartoon: a project file holds its cartoon in "cartoon"

cartoon_over_limit

Error The cartoon is longer than 600 seconds (or never ends), so it was not drawn.

How to fix it: Make it 10 minutes or shorter: end every scene (a "forever" loop needs a scene that ends it), or split it into parts.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"name": "Ann", "look": {"template": "kid"}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "wait", "s": 700}]
    }
  ]
}

What the check says: The cartoon is still playing after 601 seconds (it is longer than the limit of 600 seconds, or a scene never ends), so it was not drawn.

cartoon_script_needs_scene_hat

Error A cartoon script does not start with a scene hat that has a name.

How to fix it: Start every script of a cartoon with {"on": "scene", "name": "..."}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [{"body": []}]
}

What the check says: scripts[0].hat: every cartoon script needs a scene hat {"on":"scene","name":"…"}

cast_at_field_unknown

Warning A cast member's "at" has a field other than x, y, h and facing; it is ignored.

How to fix it: Keep only x, y, h and facing in "at".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.5, "z": 1}}},
  "scripts": []
}

What the check says: cast.A.at: unknown field "z"

cast_at_not_number

Error A value of a cast member's "at" is not a number.

How to fix it: Give x, y, h and facing as numbers (a formula is not allowed there): x from 0 to 1, y the feet line (the ground is 0.92), h a share of the stage's height.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": "=t"}}},
  "scripts": []
}

What the check says: cast.A.at.x: must be a number

cast_at_not_object

Error A cast member's "at" is not {x, y, h, facing}.

How to fix it: Write where it stands as {"x": 0.3, "y": 0.92, "h": 0.5, "facing": 1} (stage fractions; facing 1 right, -1 left).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": 0.5}},
  "scripts": []
}

What the check says: cast.A.at: must be {x, y, h, facing}

cast_entry_bad

Error A cast member is neither a role description (text) nor an object.

How to fix it: Write the member as {"name", "legs", "at", "voice", "pack", "look"}, or as text describing its role.

An example that gets this code
{"v": 1, "kind": "cartoon", "cast": {"A": 5}, "scripts": []}

What the check says: cast.A: must be a role description or {name, legs, at, voice, pack, look}

cast_field_unknown

Warning A cast member has a field the language does not use; it is ignored.

How to fix it: Remove the field, or move it where it belongs (colours go in look.colors, the template in look.template).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"colour": "red"}},
  "scripts": []
}

What the check says: cast.A: unknown field "colour"

cast_has_no_design

Error A cast member is only a role (a few words), with no look, pack or picture to draw, so render_video refuses it.

How to fix it: Give it a look with one of the six characters as its template, keeping its words as its name: {"name": "Biscuit", "look": {"template": "dog"}}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": "a friendly dog"},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A: is only a role ("a friendly dog"): it has no look, pack or picture to draw, so render_video refuses it

Only in the downloadable tool, not yet published: render_video

cast_id_bad

Error A cast id has a letter it cannot have.

How to fix it: Use letters, digits, _ or - in a cast id (A, sunny, dog_2), and the same id in every "who".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"my dog": {}},
  "scripts": []
}

What the check says: cast.my dog: a cast id is letters, digits, _ or -

cast_is_a_list

Warning The cast is a list, so its members are named "0", "1", ... and each who must say one of those.

How to fix it: Write the cast as an object keyed by the ids the who fields use: {"dog": {"name": "Biscuit"}, "cat": {"name": "Mia"}}.

An example that gets this code
{
  "cast": [{"name": "Ann", "look": {"template": "kid"}}],
  "program": {
    "v": 1,
    "kind": "cartoon",
    "scripts": [
      {
        "hat": {"on": "scene", "name": "One"},
        "body": [{"op": "say", "who": "0", "text": "Hi!"}]
      }
    ]
  }
}

What the check says: cast: is a list, so its entries are named "0", "1", ... and each "who" must say one of those

cast_legs_bad

Error A cast member's legs is not a whole number.

How to fix it: Give legs as 0, 2 or 4 (a whole number, 0 or more).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"legs": 2.5}},
  "scripts": []
}

What the check says: cast.A.legs: must be a whole number

cast_missing

Warning The scene has no cast, so every "who" must name a character the page adds itself.

How to fix it: Add a cast: {"A": {"name": "Sunny"}}, and use its ids in "who".

An example that gets this code
{
  "v": 1,
  "kind": "scene",
  "scripts": [{"body": [{"op": "wait", "s": 1}]}]
}

What the check says: cast: no cast declared: "who" must name characters added with addCharacter

cast_name_not_text

Error A cast member's name is not text.

How to fix it: Give the name as text in quotes: "name": "Sunny".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": 7}},
  "scripts": []
}

What the check says: cast.A.name: must be a string

cast_not_drawable_here

Error A character in the cast cannot be drawn here: it is a picture from the internet, a role with no design, a character pack this renderer does not have, or a design it does not know.

How to fix it: Give the character a look ({"template": "dog", "style": "outlined"}) or one of the shipped character packs (c4c:char:person, kid, dog, cat, bird, monster), or a picture of its own in a project file; or pass allow_substitutes: true to draw a stand-in, listed in the result.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Ann",
      "look": {
        "template": "kid",
        "image": "https://example.com/ann.png"
      }
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A: Character A (Ann) cannot be drawn here: a picture from outside (image) (pictures from the internet (emoji, Open Peeps, DiceBear) are never fetched by the renderer).

cast_not_object

Error The cast is not an object of members by id.

How to fix it: Write the cast as {"A": {"name": "Sunny"}, "B": {...}}: one entry per character, keyed by its id.

An example that gets this code
{"v": 1, "kind": "cartoon", "cast": ["A"], "scripts": []}

What the check says: cast: must be {id: entry}

cast_over_studio_limit

Warning The cast has more characters than the studio opens.

How to fix it: Keep the cast to two characters to open the cartoon in the studio; a longer cast still validates and plays.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"at": {"x": 0.2}},
    "B": {"at": {"x": 0.5}},
    "C": {"at": {"x": 0.8}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "wait", "s": 1}]
    }
  ]
}

What the check says: The cast has 3 characters; the studio opens 2.

cast_pack_bad

Error A cast member's pack is neither an id nor {id, version}.

How to fix it: Give the pack as "c4c:char:dog" or {"id": "c4c:char:dog", "version": "1.0.0"}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"pack": ["c4c:char:sunny"]}},
  "scripts": []
}

What the check says: cast.A.pack: must be an id or {id, version}

cast_pack_id_bad

Error A cast member's pack is not a pack id.

How to fix it: Give the pack id as written in the pack, like "c4c:char:dog".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"pack": "sunny"},
    "B": {"pack": {"id": "Sunny"}}
  },
  "scripts": []
}

What the check says: cast.A.pack: "sunny" is not a pack id like "c4c:char:sunny"

cast_pack_version_not_text

Error A cast member's pack version is not text.

How to fix it: Give the version as text, like "1.0.0", or leave it out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"pack": {"id": "c4c:char:sunny", "version": 1}}
  },
  "scripts": []
}

What the check says: cast.A.pack.version: must be a string

cast_voice_not_text

Error A cast member's voice is not text.

How to fix it: Give the voice as text, one of the studio's voices such as "af_heart".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"voice": 1}},
  "scripts": []
}

What the check says: cast.A.voice: must be a string

chain_channel_bad

Error A chain wave runs down something that is not one part.

How to fix it: Give a part channel without a #number, like "part:tail".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "chain", "ch": "part:tail#1"}]}
  ]
}

What the check says: scripts[0].body[0].ch: chain runs down one part: a part channel without a #number, like "part:tail", not "part:tail#1"

chain_needs_channel

Error A chain wave does not say which part it runs down.

How to fix it: Give "ch", the part, like "part:tail".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "chain"}]}]
}

What the check says: scripts[0].body[0]: chain needs "ch": the part the wave runs down, like "part:tail"

chain_not_a_chain

Warning A chain wave runs down a part that is drawn in one piece, so only its first segment moves.

How to fix it: Run the chain down a tail, the body, the ears or the hair, or use a wave on the part.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "chain", "ch": "part:arm:1"}]}
  ]
}

What the check says: scripts[0].body[0].ch: the arm is not drawn as a chain, so nothing draws "part:arm:1#1" …

chain_on_legs

Warning A chain wave on legs runs from leg to leg (a leg's #number says which leg), not down one leg.

How to fix it: Run the chain down a tail, the body, the ears or the hair; move legs with their own blocks.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "chain", "ch": "part:leg"}]}
  ]
}

What the check says: scripts[0].body[0].ch: a leg's #number says which leg it is (#0 back left … #3 front right), so this wave runs from leg to leg

chain_part_is_a_raise

Error A block that turns a part was given a raise (lift:).

How to fix it: Name the part itself ("tail"), not its raise.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "swish", "part": "lift:tail"}]}
  ]
}

What the check says: scripts[0].body[0].part: swish turns a part: name the part, not a raise ("lift:tail")

chain_part_segment

Error A chain block was given one segment of a chain; it numbers the segments itself.

How to fix it: Name the whole part ("tail"), not "part:tail#2".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "swish", "part": "part:tail#2"}]}
  ]
}

What the check says: scripts[0].body[0].part: name the whole tail (the block numbers its segments), not "part:tail#2"

channel_bad

Error A channel is not one the language has.

How to fix it: Use dx, dy, rot, sx, sy, mouth, blink, or part:<part> or lift:<part>, like part:arm:-1 (the left arm).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "set", "to": {"dz": 1}}]}]
}

What the check says: scripts[0].body[0].to.dz: bad channel "dz"

channel_values_not_object

Error A set or glide's channels are not {channel: value}.

How to fix it: Write them as {"dx": 40, "part:arm:1": 30}.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "set", "to": [1]}]}]
}

What the check says: scripts[0].body[0].to: must be {channel: value}

character_invalid

Error A part, a shape or the face of the character is not one the studio can draw.

How to fix it: Fix the part named, as its fix says (the character format: https://jabbertoon.com/docs/packs/).

An example that gets this code
{
  "name": "Rex",
  "content": {
    "tree": 5,
    "legs": 4,
    "kind": "dog",
    "height": 178.4,
    "footprint": 120,
    "look": "outlined",
    "views": [
      {"view": "side"},
      {
        "view": "front",
        "tree": {
          "id": "root",
          "role": "root",
          "pos": {"x": 0, "y": 0},
          "rot": 0,
          "sx": 1,
          "sy": 1,
          "z": 0,
          "children": [
            {
              "id": "torso",
              "role": "torso",
              "shape": {
                "type": "ellipse",
                "w": 87.5,
                "h": 77
              },
              "pos": {"x": 0, "y": -91},
              "rot": 0,
              "sx": 1,
              "sy": 1,
              "z": 0,
              "fill": "#b8793f",
              "children": [
                {
                  "id": "bib",
                  "role": null,
                  "shape": {
                    "type": "ellipse",
                    "w": 43.4,
                    "h": 43.4
                  },
                  "pos": {"x": 0, "y": 7},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 0,
                  "fill": "#f7d9b0",
                  "children": []
                },
                {
                  "id": "tail",
                  "role": "tail",
                  "index": 0,
                  "shape": {
                    "type": "taper",
                    "w": 18,
                    "w2": 11,
                    "h": 59.5
                  },
                  "pos": {"x": 15.4, "y": -15.4},
                  "rot": 196,
                  "sx": 1,
                  "sy": 1,
                  "z": -3,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "tail1",
                      "role": "tail",
                      "index": 1,
                      "pos": {"x": 0, "y": 14.875},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "children": [
                        {
                          "id": "tail2",
                          "role": "tail",
                          "index": 2,
                          "pos": {"x": 0, "y": 14.875},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [
                            {
                              "id": "tail3",
                              "role": "tail",
                              "index": 3,
                              "pos": {"x": 0, "y": 14.875},
                              "rot": 0,
                              "sx": 1,
                              "sy": 1,
                              "z": 0,
                              "children": [],
                              "limits": {
                                "min": -70,
                                "max": 70
                              },
                              "tip": {"x": 0, "y": 14.875}
                            }
                          ],
                          "limits": {"min": -70, "max": 70}
                        }
                      ],
                      "limits": {"min": -70, "max": 70}
                    }
                  ],
                  "limits": {"min": -120, "max": 120},
                  "bend": true
                },
                {
                  "id": "leg0",
                  "role": "leg",
                  "side": -1,
                  "index": 0,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 35.42
                  },
                  "pos": {"x": -28, "y": 9.8},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": -2,
                  "fill": "#a26a37",
                  "children": [
                    {
                      "id": "low0",
                      "role": "shin",
                      "side": -1,
                      "index": 0,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 32.2
                      },
                      "pos": {"x": 0, "y": 32.2},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#a26a37",
                      "children": [
                        {
                          "id": "paw0",
                          "role": "foot",
                          "side": -1,
                          "index": 0,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.268},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#6b4120",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": 1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -75, "max": 60},
                  "fold": true
                },
                {
                  "id": "leg1",
                  "role": "leg",
                  "side": 1,
                  "index": 1,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 35.42
                  },
                  "pos": {"x": 28, "y": 9.8},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": -2,
                  "fill": "#a26a37",
                  "children": [
                    {
                      "id": "low1",
                      "role": "shin",
                      "side": 1,
                      "index": 1,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 32.2
                      },
                      "pos": {"x": 0, "y": 32.2},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#a26a37",
                      "children": [
                        {
                          "id": "paw1",
                          "role": "foot",
                          "side": 1,
                          "index": 1,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.268},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#6b4120",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": -1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -60, "max": 75},
                  "fold": true
                },
                {
                  "id": "leg2",
                  "role": "leg",
                  "side": -1,
                  "index": 2,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 38.5
                  },
                  "pos": {"x": -17.5, "y": 15.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 1,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "low2",
                      "role": "shin",
                      "side": -1,
                      "index": 2,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 35
                      },
                      "pos": {"x": 0, "y": 35},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#b8793f",
                      "children": [
                        {
                          "id": "paw2",
                          "role": "foot",
                          "side": -1,
                          "index": 2,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.9},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#7a4a24",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": 1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -75, "max": 60},
                  "fold": true
                },
                {
                  "id": "leg3",
                  "role": "leg",
                  "side": 1,
                  "index": 3,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 38.5
                  },
                  "pos": {"x": 17.5, "y": 15.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 1,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "low3",
                      "role": "shin",
                      "side": 1,
                      "index": 3,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 35
                      },
                      "pos": {"x": 0, "y": 35},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#b8793f",
                      "children": [
                        {
                          "id": "paw3",
                          "role": "foot",
                          "side": 1,
                          "index": 3,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.9},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#7a4a24",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": -1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -60, "max": 75},
                  "fold": true
                },
                {
                  "id": "head",
                  "role": "head",
                  "shape": {
                    "type": "ellipse",
                    "w": 76.96000000000001,
                    "h": 66.56,
                    "oy": -19.2
                  },
                  "pos": {"x": 0, "y": -29.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 2,
                  "fill": "#b8793f",
                  "face": {
                    "eyeX": 14.8,
                    "eyeY": -28.16,
                    "eyeR": 7.77,
                    "brows": true,
                    "mouthW": 22.2,
                    "mouthH": 10.88,
                    "mouthY": 3.2,
                    "z": 1.5
                  },
                  "children": [
                    {
                      "id": "snout",
                      "role": "snout",
                      "shape": {
                        "type": "ellipse",
                        "w": 38.480000000000004,
                        "h": 24.32
                      },
                      "pos": {"x": 0, "y": -4.48},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 1,
                      "fill": "#f7d9b0",
                      "children": [],
                      "limits": {"min": -20, "max": 20}
                    },
                    {
                      "id": "nose",
                      "role": "nose",
                      "shape": {
                        "type": "ellipse",
                        "w": 14.8,
                        "h": 9.6
                      },
                      "pos": {"x": 0, "y": -10.88},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 3,
                      "fill": "#222",
                      "outline": false,
                      "children": [],
                      "limits": {"min": -20, "max": 20}
                    },
                    {
                      "id": "ear-1",
                      "role": "ear",
                      "side": -1,
                      "index": 0,
                      "shape": {
                        "type": "teardrop",
                        "w": 23.68,
                        "h": 49.92
                      },
                      "pos": {"x": -32.56, "y": -39.68},
                      "rot": 26,
                      "sx": 1,
                      "sy": 1,
                      "z": -1,
                      "fill": "#7a4a24",
                      "children": [
                        {
                          "id": "ear-1_1",
                          "role": "ear",
                          "side": -1,
                          "index": 1,
                          "pos": {"x": 0, "y": 24.96},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [],
                          "limits": {"min": -60, "max": 60},
                          "tip": {"x": 0, "y": 24.96}
                        }
                      ],
                      "limits": {"min": -90, "max": 90},
                      "bend": true
                    },
                    {
                      "id": "ear1",
                      "role": "ear",
                      "side": 1,
                      "index": 0,
                      "shape": {
                        "type": "teardrop",
                        "w": 23.68,
                        "h": 49.92
                      },
                      "pos": {"x": 32.56, "y": -39.68},
                      "rot": -26,
                      "sx": 1,
                      "sy": 1,
                      "z": -1,
                      "fill": "#7a4a24",
                      "children": [
                        {
                          "id": "ear1_1",
                          "role": "ear",
                          "side": 1,
                          "index": 1,
                          "pos": {"x": 0, "y": 24.96},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [],
                          "limits": {"min": -60, "max": 60},
                          "tip": {"x": 0, "y": 24.96}
                        }
                      ],
                      "limits": {"min": -90, "max": 90},
                      "bend": true
                    }
                  ],
                  "limits": {"min": -40, "max": 40}
                }
              ],
              "limits": {"min": -30, "max": 30}
            }
          ]
        },
        "footprint": 64
      },
      {
        "view": "back",
        "tree": {
          "id": "root",
          "role": "root",
          "pos": {"x": 0, "y": 0},
          "rot": 0,
          "sx": -1,
          "sy": 1,
          "z": 0,
          "children": [
            {
              "id": "torso",
              "role": "torso",
              "shape": {
                "type": "ellipse",
                "w": 87.5,
                "h": 77
              },
              "pos": {"x": 0, "y": -91},
              "rot": 0,
              "sx": 1,
              "sy": 1,
              "z": 0,
              "fill": "#b8793f",
              "children": [
                {
                  "id": "tail",
                  "role": "tail",
                  "index": 0,
                  "shape": {
                    "type": "taper",
                    "w": 18,
                    "w2": 11,
                    "h": 59.5
                  },
                  "pos": {"x": 15.4, "y": -15.4},
                  "rot": 196,
                  "sx": 1,
                  "sy": 1,
                  "z": 3,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "tail1",
                      "role": "tail",
                      "index": 1,
                      "pos": {"x": 0, "y": 14.875},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "children": [
                        {
                          "id": "tail2",
                          "role": "tail",
                          "index": 2,
                          "pos": {"x": 0, "y": 14.875},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [
                            {
                              "id": "tail3",
                              "role": "tail",
                              "index": 3,
                              "pos": {"x": 0, "y": 14.875},
                              "rot": 0,
                              "sx": 1,
                              "sy": 1,
                              "z": 0,
                              "children": [],
                              "limits": {
                                "min": -70,
                                "max": 70
                              },
                              "tip": {"x": 0, "y": 14.875}
                            }
                          ],
                          "limits": {"min": -70, "max": 70}
                        }
                      ],
                      "limits": {"min": -70, "max": 70}
                    }
                  ],
                  "limits": {"min": -120, "max": 120},
                  "bend": true
                },
                {
                  "id": "leg0",
                  "role": "leg",
                  "side": -1,
                  "index": 0,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 38.5
                  },
                  "pos": {"x": -17.5, "y": 15.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 1,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "low0",
                      "role": "shin",
                      "side": -1,
                      "index": 0,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 35
                      },
                      "pos": {"x": 0, "y": 35},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#b8793f",
                      "children": [
                        {
                          "id": "paw0",
                          "role": "foot",
                          "side": -1,
                          "index": 0,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.9},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#7a4a24",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": 1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -75, "max": 60},
                  "fold": true
                },
                {
                  "id": "leg1",
                  "role": "leg",
                  "side": 1,
                  "index": 1,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 38.5
                  },
                  "pos": {"x": 17.5, "y": 15.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": 1,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "low1",
                      "role": "shin",
                      "side": 1,
                      "index": 1,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 35
                      },
                      "pos": {"x": 0, "y": 35},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#b8793f",
                      "children": [
                        {
                          "id": "paw1",
                          "role": "foot",
                          "side": 1,
                          "index": 1,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.9},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#7a4a24",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": -1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -60, "max": 75},
                  "fold": true
                },
                {
                  "id": "leg2",
                  "role": "leg",
                  "side": -1,
                  "index": 2,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 35.42
                  },
                  "pos": {"x": -28, "y": 9.8},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": -2,
                  "fill": "#a26a37",
                  "children": [
                    {
                      "id": "low2",
                      "role": "shin",
                      "side": -1,
                      "index": 2,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 32.2
                      },
                      "pos": {"x": 0, "y": 32.2},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#a26a37",
                      "children": [
                        {
                          "id": "paw2",
                          "role": "foot",
                          "side": -1,
                          "index": 2,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.268},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#6b4120",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": 1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -75, "max": 60},
                  "fold": true
                },
                {
                  "id": "leg3",
                  "role": "leg",
                  "side": 1,
                  "index": 3,
                  "shape": {
                    "type": "capsule",
                    "w": 21,
                    "h": 35.42
                  },
                  "pos": {"x": 28, "y": 9.8},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": -2,
                  "fill": "#a26a37",
                  "children": [
                    {
                      "id": "low3",
                      "role": "shin",
                      "side": 1,
                      "index": 3,
                      "shape": {
                        "type": "capsule",
                        "w": 18,
                        "h": 32.2
                      },
                      "pos": {"x": 0, "y": 32.2},
                      "rot": 0,
                      "sx": 1,
                      "sy": 1,
                      "z": 0,
                      "fill": "#a26a37",
                      "children": [
                        {
                          "id": "paw3",
                          "role": "foot",
                          "side": 1,
                          "index": 3,
                          "shape": {
                            "type": "hcapsule",
                            "w": 26,
                            "h": 15
                          },
                          "pos": {"x": 0, "y": 32.268},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "fill": "#6b4120",
                          "children": [],
                          "limits": {"min": -45, "max": 45}
                        }
                      ],
                      "limits": {"min": -60, "max": 60},
                      "flex": -1,
                      "fold": true
                    }
                  ],
                  "limits": {"min": -60, "max": 75},
                  "fold": true
                },
                {
                  "id": "head",
                  "role": "head",
                  "shape": {
                    "type": "ellipse",
                    "w": 76.96000000000001,
                    "h": 66.56,
                    "oy": -19.2
                  },
                  "pos": {"x": 0, "y": -29.4},
                  "rot": 0,
                  "sx": 1,
                  "sy": 1,
                  "z": -1,
                  "fill": "#b8793f",
                  "children": [
                    {
                      "id": "ear-1",
                      "role": "ear",
                      "side": -1,
                      "index": 0,
                      "shape": {
                        "type": "teardrop",
                        "w": 23.68,
                        "h": 49.92
                      },
                      "pos": {"x": -32.56, "y": -39.68},
                      "rot": 26,
                      "sx": 1,
                      "sy": 1,
                      "z": 1,
                      "fill": "#7a4a24",
                      "children": [
                        {
                          "id": "ear-1_1",
                          "role": "ear",
                          "side": -1,
                          "index": 1,
                          "pos": {"x": 0, "y": 24.96},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [],
                          "limits": {"min": -60, "max": 60},
                          "tip": {"x": 0, "y": 24.96}
                        }
                      ],
                      "limits": {"min": -90, "max": 90},
                      "bend": true
                    },
                    {
                      "id": "ear1",
                      "role": "ear",
                      "side": 1,
                      "index": 0,
                      "shape": {
                        "type": "teardrop",
                        "w": 23.68,
                        "h": 49.92
                      },
                      "pos": {"x": 32.56, "y": -39.68},
                      "rot": -26,
                      "sx": 1,
                      "sy": 1,
                      "z": 1,
                      "fill": "#7a4a24",
                      "children": [
                        {
                          "id": "ear1_1",
                          "role": "ear",
                          "side": 1,
                          "index": 1,
                          "pos": {"x": 0, "y": 24.96},
                          "rot": 0,
                          "sx": 1,
                          "sy": 1,
                          "z": 0,
                          "children": [],
                          "limits": {"min": -60, "max": 60},
                          "tip": {"x": 0, "y": 24.96}
                        }
                      ],
                      "limits": {"min": -90, "max": 90},
                      "bend": true
                    }
                  ],
                  "limits": {"min": -40, "max": 40}
                }
              ],
              "limits": {"min": -30, "max": 30}
            }
          ]
        },
        "footprint": 64
      }
    ],
    "spots": {
      "side": {
        "hip": {
          "node": "torso",
          "at": [-51, -3.5],
          "hands": false
        },
        "chest": {
          "node": "torso",
          "at": [82.45, 7],
          "alt": [105.4, 10.5]
        },
        "head": {
          "node": "head",
          "at": [11.1, 7.36],
          "alt": [23.68, 16]
        },
        "mouth": {
          "node": "head",
          "at": [44.4, 6.4],
          "alt": [24.42, 19.2]
        }
      },
      "front": {
        "hip": {
          "node": "torso",
          "at": [35, 7],
          "mirror": true,
          "hands": false
        },
        "chest": {
          "node": "torso",
          "at": [0, 3.5],
          "hands": false
        },
        "head": {
          "node": "head",
          "at": [22.2, -48],
          "mirror": true,
          "hands": false
        },
        "mouth": {
          "node": "head",
          "at": [0, 1.28],
          "hands": false
        }
      },
      "back": {
        "hip": {
          "node": "torso",
          "at": [35, 7],
          "mirror": true,
          "hands": false
        },
        "chest": {
          "node": "torso",
          "at": [0, 3.5],
          "hands": false
        },
        "head": {
          "node": "head",
          "at": [22.2, -48],
          "mirror": true,
          "hands": false
        },
        "mouth": {
          "node": "head",
          "at": [0, 1.28],
          "hands": false
        }
      }
    }
  }
}

What the check says: character.content: must be a character pack's content, with its node tree in content.tree

clip_bad

Error A wave's clip is neither "pos" nor "neg".

How to fix it: Use "pos" (only the upper half) or "neg" (only the lower half), or leave it out.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "wave", "ch": "dy", "clip": "up"}]}
  ]
}

What the check says: scripts[0].body[0].clip: must be "pos" or "neg"

content_hash_wrong

Error The pack's content_hash is not the hash of its content.

How to fix it: Set content_hash to the value the fix gives: sha256 of the canonical JSON of the content.

An example that gets this code
{
  "pack": 1,
  "id": "c4c:beh:wave_hello",
  "type": "behaviour",
  "version": "1.0.0",
  "name": "Wave hello",
  "description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
  "author": {"id": "you", "name": "You"},
  "license": "cc0",
  "remixable": true,
  "derived_from": [],
  "preview": {"moves": ["wave_hello"], "seconds": 6},
  "content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
  "content": {
    "v": 1,
    "kind": "behaviour",
    "name": "wave_hello",
    "scripts": [
      {
        "body": [
          {"op": "mood", "mood": "happy"},
          {"op": "bob", "amp": 4, "every": 1.2},
          {
            "op": "setPart",
            "part": "right forearm",
            "deg": 20
          },
          {
            "op": "setPart",
            "part": "right arm",
            "deg": 150,
            "over": 0.35,
            "ease": "out"
          },
          {
            "op": "forever",
            "body": [
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": -40,
                "over": 0.2
              },
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": 40,
                "over": 0.2
              }
            ]
          }
        ]
      }
    ]
  }
}

What the check says: content_hash: is not the hash of this content

cut_needs_place_or_mood

Error A cut changes neither the place nor the mood.

How to fix it: Give a place, a mood (the grade), or both: {"op": "cut", "place": "park", "mood": "bloom"}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "cut"}]
    }
  ]
}

What the check says: scripts[0].body[0]: cut needs a place, a mood, or both

damping_negative

Error A spring's damping is below 0.

How to fix it: Give damping of 0 or more (0 swings on and on, 1 settles without swinging past).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "letFollow", "damping": -1}]}
  ]
}

What the check says: scripts[0].body[0].damping: must be 0 or more (0 swings on and on, 1 settles without swinging past)

does_also_not_boolean

Error A does's "also" is not true or false.

How to fix it: Give "also": true to add the move to what the character does, or leave it out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": "c4c:beh:walk",
          "also": "yes"
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].also: true or false

does_needs_move

Error A does does not say which move.

How to fix it: Give "behaviour": a move's id like "c4c:beh:wave_hello", or a move written out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "does", "who": "A"}]
    }
  ]
}

What the check says: scripts[0].body[0].behaviour: needs a pack id like "c4c:beh:bounce" or an inline behaviour program

does_setting_unknown

Warning A does gives a setting its own move does not have; the move ignores it.

How to fix it: Use a setting of the move, or add it to the move's settings.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": {
            "v": 1,
            "kind": "behaviour",
            "scripts": [{"body": [{"op": "wait", "s": 1}]}]
          },
          "params": {"speed": 2}
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].params.speed: the inline behaviour has no such param

does_settings_not_object

Error A does's settings (params) are not {name: value}.

How to fix it: Write them as {"t_in": 2}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": "c4c:beh:walk",
          "params": [1]
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].params: must be {name: value}

drive_needs_channel_and_value

Error A drive block lacks "ch" or "value".

How to fix it: Give both: "ch": "dy", "value": "=sin(t) * 10".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "drive", "ch": "dy"}]}]
}

What the check says: scripts[0].body[0]: drive needs "ch" and "value"

dur_unknown_here

Warning A scene reads "dur", the scene's length, which is known only when the next scene is pinned with "at"; here it is Infinity.

How to fix it: Pin the next scene with "at" (seconds from the start), or use a number of seconds.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "wait", "s": "=dur"}]
    }
  ]
}

What the check says: scripts[0].body[0].s: "dur" is the scene's length only when the next scene is pinned with "at"; here it is Infinity

ease_unknown

Error A block names an ease the language does not have.

How to fix it: Use linear, smooth, inout, in, out or snappy.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "enter", "who": "A", "ease": "bouncy"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].ease: unknown ease "bouncy"

empty_stage

Warning Nobody is on the stage for two seconds or more (a character with half of it, or its face, in the picture is on it).

How to fix it: Bring a character on (enter, or place with x) sooner, or shorten the wait, or end the scene there.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "a", "at": 4},
      "body": []
    },
    {
      "hat": {"on": "scene", "name": "b", "at": 2},
      "body": []
    }
  ]
}

What the check says: Nobody is on the stage from 0 s to 4 s.

expression_invalid

Error A formula does not read: a sign, a bracket or a word is out of place.

How to fix it: Check the formula: numbers, names, + - * / ^ % and brackets, functions like sin(t); in JSON it starts with =.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "wait", "s": "=1 +"}]}]
}

What the check says: scripts[0].body[0].s: expression: unexpected end of "1 +"

expression_unknown_function

Error A formula uses a function the language does not have.

How to fix it: Use one of its functions (sin, cos, abs, min, max, clamp, floor, round, sqrt and the others the spec lists).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "wait", "s": "=wobble(1)"}]}
  ]
}

What the check says: scripts[0].body[0].s: expression: unknown function "wobble" in "wobble(1)"

facing_bad

Error A facing given as a number is neither 1 nor -1.

How to fix it: Use 1 for facing right or -1 for facing left.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "place", "who": "A", "facing": 2}]
    }
  ]
}

What the check says: scripts[0].body[0].facing: must be 1 (facing right) or -1 (facing left)

fails_when_played

Error The program fails when it is played: a formula, a block or a character it names cannot run.

How to fix it: Fix what the message names: a name in a formula that is not a setting, a variable or one the engine has; a character (who) that is not in the cast (give the cartoon a cast line with every character); or a loop that never waits (put a wait in it).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "name": "Hello, Mia",
  "scripts": [
    {
      "hat": {"on": "scene", "name": "Hello"},
      "body": [
        {
          "op": "enter",
          "who": "dog",
          "from": "left",
          "x": 0.3
        },
        {
          "op": "does",
          "who": "dog",
          "behaviour": "c4c:beh:wave_hello"
        },
        {
          "op": "say",
          "who": "dog",
          "text": "Hi, Mia! Do you want to play?"
        },
        {
          "op": "does",
          "who": "cat",
          "behaviour": "c4c:beh:bounce"
        },
        {
          "op": "say",
          "who": "cat",
          "text": "Yes, please!",
          "mood": "happy"
        }
      ]
    }
  ]
}

What the check says: The cartoon cannot start: no character "dog".

falloff_large

Warning A falloff over 2 makes each segment swing more than twice the one before.

How to fix it: Use a falloff of 2 or less.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "flop", "falloff": 3}]}]
}

What the check says: scripts[0].body[0].falloff: a falloff of 3 makes each segment swing more than twice the one before

falloff_not_positive

Warning A falloff of 0 or less stops or flips every segment after the first.

How to fix it: Give a falloff more than 0 (1 keeps every segment the same).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "flop", "falloff": 0}]}]
}

What the check says: scripts[0].body[0].falloff: a falloff of 0 stops or flips every segment after the first

feet_off_stage

Warning A character's feet (y) are outside the picture, so it stands out of frame.

How to fix it: Keep y between 0 (the top edge) and 1 (the bottom edge); the ground is 0.92.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "place", "who": "A", "y": 1.4}]
    }
  ]
}

What the check says: scripts[0].body[0].y: y 1.4 is off the stage (0 is the top edge, 1 the bottom edge, the ground 0.92): the character's feet are out of frame

ffmpeg_failed

Error ffmpeg stopped with an error, so the video was not made.

How to fix it: Read the last lines of ffmpeg's own message (in the result), and try again; a full disk or a folder you cannot write to are the usual causes.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

ffmpeg_missing

Error Making a video needs ffmpeg, and none was found. Frames and contact sheets work without it.

How to fix it: Get ffmpeg one of three ways: install it from https://ffmpeg.org/download.html or your package manager (winget install ffmpeg, brew install ffmpeg, apt install ffmpeg) so it is on your PATH; point at one you have with --ffmpeg <path> or JABBERTOON_FFMPEG=<path>; or run npm install ffmpeg-static where you run jabbertoon. Jabbertoon does not ship ffmpeg.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

ffmpeg_no_h264

Error The ffmpeg found cannot write H.264 video (it has none of libx264, h264_mf, h264_videotoolbox or libopenh264).

How to fix it: Use a full build of ffmpeg (https://ffmpeg.org/download.html), or point at another with --ffmpeg <path>.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

ffmpeg_no_webp

Error The ffmpeg found cannot write animated WebP (it has no libwebp_anim encoder).

How to fix it: Use a build of ffmpeg with libwebp (the full builds at https://ffmpeg.org/download.html have it).

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

field_ignored

Warning A block has a field it does not take; it is ignored.

How to fix it: Remove the field, or check its spelling.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "2": 1,
          "10": 1,
          "op": "set",
          "to": {"dx": 1},
          "note": "hi",
          "id": "b1",
          "extra": 2
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0]: "set" ignores "2"

file_exists

Error A file with that name is already there, and it was not replaced.

How to fix it: Give another name, or pass overwrite: true to replace it.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

file_not_found

Error There is no file of that name in the output folder.

How to fix it: Give the name of a .json or .txt file in the output folder (jabbertoon doctor says where the folder is).

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

file_unreadable

Error That file could not be read: it is not a cartoon's JSON or screenplay text, or not UTF-8.

How to fix it: Save the cartoon as UTF-8 JSON (.json) or screenplay text (.txt), then give its name again.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

folder_not_writable

Error The output folder cannot be made or written to.

How to fix it: Choose another folder with --out <folder> or JABBERTOON_OUT, one you can write to.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

follow_after_bad

Error A let-follow block follows something other than the body or a part.

How to fix it: Follow "body" or a part, like "head".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "letFollow", "after": "lift:head"}]}
  ]
}

What the check says: scripts[0].body[0].after: follows "body" or a part, not "lift:head"

follow_after_segment

Error A let-follow block follows one segment or one leg, not a whole part.

How to fix it: Follow the whole part ("tail", "head").

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "letFollow", "after": "part:tail#2"}]}
  ]
}

What the check says: scripts[0].body[0].after: follows a whole part, not one segment or leg ("part:tail#2")

follow_channels_empty

Error A follow block's list of channels is empty.

How to fix it: Give at least one channel in "ch".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "follow", "ch": [], "source": "dy"}]}
  ]
}

What the check says: scripts[0].body[0].ch: needs at least one channel

follow_mood

Error A follow block follows or moves "mood", which is not a number.

How to fix it: Follow a number channel (dy, rot, a part).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "op": "follow",
          "ch": "part:tail",
          "source": "mood"
        },
        {"op": "follow", "ch": "mood", "source": "dy"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].source: mood is not a number: follow a number channel

follow_needs_channel_and_source

Error A follow block lacks "ch" (what moves) or "source" (what it follows).

How to fix it: Give both: "ch": "part:tail", "source": "dy".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "follow", "ch": "part:tail"}]}
  ]
}

What the check says: scripts[0].body[0]: follow needs "ch" and "source"

follow_source_bad

Error A follow block's source is not one channel.

How to fix it: Give the source as one channel, like "dy".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "op": "follow",
          "ch": "part:tail",
          "source": ["dy"]
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].source: must be one channel, like "dy", not ["dy"]

format_1_project

Error That project file is the studio's older format (format 1), which this renderer does not read.

How to fix it: Open it in the studio at https://jabbertoon.com/studio/ and save it again, or give the cartoon program itself.

An example that gets this code
{
  "jabbertoon": "cartoon",
  "format": 1,
  "name": "Old",
  "cast": [null, null],
  "names": ["A", "B"],
  "scenes": []
}

What the check says: That project file is the studio's older format (format 1), which this renderer does not read.

gait_bob_bad

Error A walk cycle's bob is neither [base, amp] nor null.

How to fix it: Give bob as [-2, 3] (two numbers), or null for no bob.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "gait", "bob": [1]}]}]
}

What the check says: scripts[0].body[0].bob: must be [base, amp] or null

glide_cut

Warning An enter, an exit or a glide (place … in N s) is cut off before it lands, when its scene ends; an exit cut off leaves the character on the stage.

How to fix it: Give the enter, exit or place time to land: a wait after it, or pin the next scene later.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "B": {"look": {"template": "cat"}, "at": {"x": 0.5}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "a"},
      "body": [
        {"op": "place", "who": "B", "x": 0.5},
        {"op": "wait", "s": 0.1},
        {
          "op": "exit",
          "who": "B",
          "to": "right",
          "over": 0.2
        }
      ]
    },
    {
      "hat": {"on": "scene", "name": "b", "at": 0.3},
      "body": [{"op": "wait", "s": 1}]
    }
  ]
}

What the check says: B's exit to the right lands just after it should, when scene "a" ends at 0.3 s, so B stays on stage, just out of the frame.

hat_never_fires

Warning A move starts a script with a hat that never fires in a cartoon (touch, beat, loud, every), so those blocks never run.

How to fix it: Use a hat that fires in a cartoon: when it starts, when the scene starts, when I start talking, when I stop talking.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "hop", "amp": 20}]},
    {"hat": {"on": "beat"}, "body": [{"op": "squash"}]}
  ]
}

What the check says: The "beat" hat in this move never fires: nothing in a cartoon sends it, so its blocks never run.

hat_unknown

Error A move's script starts with a hat the language does not have.

How to fix it: Start the script with a hat it has: start, talk-start, talk-end, scene, key, click (and beat, loud, every, touch, which never fire).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"hat": {"on": "wink"}, "body": []}]
}

What the check says: scripts[0].hat: unknown hat "wink"

hold_negative

Warning A reach holds for less than 0 s, so it lets go at once.

How to fix it: Give hold 0 or more seconds.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "reach", "at": "head", "hold": -1}]}
  ]
}

What the check says: scripts[0].body[0].hold: a hold below 0 lets go at once

image_unreadable

Error A picture in the project could not be read as an image.

How to fix it: Give the picture as a PNG data URL ("data:image/png;base64,..."), as the studio saves it.

An example that gets this code
{
  "format": "jabbertoon-project",
  "version": 2,
  "cartoon": {
    "v": 1,
    "kind": "cartoon",
    "cast": {"A": {"name": "Ann"}},
    "scripts": [
      {
        "hat": {"on": "scene", "name": "One"},
        "body": [{"op": "say", "who": "A", "text": "Hi!"}]
      }
    ]
  },
  "assets": {
    "characters": {
      "A": {
        "kind": "drawn",
        "png": "data:image/png;base64,aGVsbG8="
      }
    },
    "sounds": {}
  }
}

What the check says: assets.characters.A.png: Character A's picture could not be read (that is not an image this renderer can read (Unsupported image type)).

input_hat_in_video

Warning A move starts a script with key or click, which fire only in the block editor, never in a video.

How to fix it: In a video nobody presses a key or clicks: start it with "when it starts" or "when the scene starts" instead.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "cat"}, "at": {"x": 0.5}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": {
            "v": 1,
            "kind": "behaviour",
            "scripts": [
              {
                "hat": {"on": "key"},
                "body": [{"op": "hop", "amp": 30}]
              }
            ]
          },
          "for": 1
        },
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: The "key" hat in A's move fires only in the block editor, when someone presses a key; in a video it never fires.

invalid_program

Error The program does not validate, so it cannot be played.

How to fix it: Validate the program and fix the errors it lists (each names its block by its path), then play it again.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "nope"}]}]
}

What the check says: It does not validate, so it cannot be played: scripts[0].body[0]: unknown op "nope" (op_unknown).

job_unknown

Error There is no render with that job here: a job lives only while the tool that started it runs.

How to fix it: Start the render again with render_video.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

Only in the downloadable tool, not yet published: render_video

lag_negative

Warning A lag below 0 runs the wave from the tip toward the body.

How to fix it: Give a lag of 0 or more (0.08 s is the usual).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "swish", "lag": -0.1}]}]
}

What the check says: scripts[0].body[0].lag: a lag below 0 (-0.1 s) runs the wave from the tip toward the body

lag_slow

Warning A lag of more than 1 s for each segment is very slow.

How to fix it: Use a lag under 1 s (0.08 s is the usual).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "swish", "lag": 2}]}]
}

What the check says: scripts[0].body[0].lag: a lag of 2 s for each segment is very slow

line_cut

Warning A line is cut off before it ends, when its scene ends.

How to fix it: Give the line time to end: a wait after it, or pin the next scene later; a "stop all" ends lines too.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "together",
          "branches": [
            [
              {
                "op": "say",
                "who": "A",
                "text": "This is a long line that will not finish."
              }
            ],
            [{"op": "stopAll"}]
          ]
        }
      ]
    },
    {
      "hat": {"on": "scene", "name": "t"},
      "body": [{"op": "wait", "s": 1}]
    }
  ]
}

What the check says: A's line "This is a long line that will not finis…" is cut off at 0 s, when scene "s" ends.

look_colors_not_object

Warning A look's colors is not an object; the renderer uses its default colours.

How to fix it: Write colors as {"body": "#ffcf77", "skin": "#9e8a78", "acc": "#6a4c93"}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"colors": "#fff"}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.colors: must be {body, skin, acc}

look_colour_bad

Warning A colour is not written as one; the renderer uses its default.

How to fix it: Write a colour as # and 3 or 6 hex digits, like "#ffcf77".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"colors": {"body": "red"}}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.colors.body: must be a colour like "#ffcf77", not "red"

look_colour_outside_colors

Warning A colour is written straight in the look, where the renderer does not read it.

How to fix it: Move it into "colors": {"colors": {"body": "#ffcf77", "skin": "#9e8a78", "acc": "#6a4c93"}}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "dog", "skin": "#9e8a78"}}
  },
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look: "skin" is a colour: colours go in "colors" ({body, skin, acc}), where the renderer reads them

look_colour_unknown

Warning A colour slot is not one a character has; it is ignored.

How to fix it: Use the slots body, skin and acc (list_characters says what each one paints).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"colors": {"hair": "#fff"}}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.colors: unknown colour "hair" (the colours are body, skin, acc)

look_facing_bad

Warning A look's facing is neither 1 nor -1; the renderer takes the art as drawn.

How to fix it: Set the look's facing to 1 (the art faces right, or the front) or -1 (it faces left).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"facing": 0}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.facing: must be 1 (the art faces right, or the front) or -1 (it faces left)

look_field_unknown

Warning A look has a field the renderer does not use; it is ignored.

How to fix it: Use template, style, shape, look, proportions, colors, stretch, options and facing only.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "dog", "hat": "tall"}}
  },
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look: unknown field "hat"

look_given_twice

Warning A look gives both the studio's name and the engine's name for one thing (look and style, or proportions and shape); the engine's wins.

How to fix it: Keep one of the two: style (or look), shape (or proportions).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"look": "crayon", "style": "flat"}}
  },
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.look: is the studio's name for "style", which is given too and wins: keep one

look_name_not_text

Warning A name in a look (template, style, shape and so on) is not text; the renderer uses its own.

How to fix it: Give it as text: "template": "dog".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"template": 5}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.template: must be a name (a string)

look_not_object

Error A cast member's look is not an object.

How to fix it: Write the look as {"template": "dog", "style": "outlined", "colors": {"body": "#ffcf77"}}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": "flat"}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look: must be {template, style, shape, colors, facing}

look_options_not_object

Warning A look's options is not an object; it is ignored.

How to fix it: Write options as {"name": value}, the options list_characters gives for the template.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"options": [true]}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.options: must be {name: value}

look_outside_picture

Error A cast member's look names a picture from outside (an emoji, an image address, an avatar), which jabbertoon.com never fetches, so render_video refuses that character.

How to fix it: Draw it as one of the six ready-made characters instead ({"template": "dog"}), and leave the picture out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Ann",
      "look": {
        "template": "kid",
        "image": "https://example.com/ann.png"
      }
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.look.image: "image" names a picture from outside, which jabbertoon.com never fetches, so render_video refuses this character

Only in the downloadable tool, not yet published: render_video

look_stretch_bad

Warning A stretch is not a number more than 0; it is ignored.

How to fix it: Give each stretch as a number more than 0 (1 is as drawn).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"stretch": {"head": 0}}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.stretch.head: must be a number more than 0, not 0

look_stretch_field_unknown

Warning A look's stretch has a part other than head, body and legs; it is ignored.

How to fix it: Stretch only head, body and legs.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"stretch": {"arms": 2}}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.stretch: unknown field "arms" (stretch has head, body, legs)

look_stretch_not_object

Warning A look's stretch is not {head, body, legs}; it is ignored.

How to fix it: Write stretch as {"head": 1.2, "body": 1, "legs": 0.9} (1 is as drawn).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"look": {"stretch": 2}}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: cast.A.look.stretch: must be {head, body, legs}

mood_missing

Error A mood block does not say which mood.

How to fix it: Give "mood": happy, sad, angry, surprised or normal.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "mood", "who": "A"}]
    }
  ]
}

What the check says: scripts[0].body[0].mood: needs a mood, e.g. "happy"

move_block_in_scene

Error A scene uses a block that moves a character, which is a move's job.

How to fix it: Put the block in a move (a behaviour program) and start it with does {who, behaviour}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "move", "dx": 10}]
    }
  ]
}

What the check says: scripts[0].body[0]: "move" moves a character; in a scene, put it in a behaviour and use does {who, behaviour}

move_cut

Warning A move given a time (does … for N s) is cut off before it is done, when its scene ends.

How to fix it: A does with a for does not wait: put a wait after it, or give the scene time for the move to end.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "kid"}, "at": {"x": 0.3}},
    "B": {
      "look": {"template": "dog"},
      "at": {"x": 0.7, "facing": -1}
    }
  },
  "places": {"park": "meadow"},
  "scripts": [
    {
      "hat": {
        "on": "scene",
        "name": "One",
        "place": "park"
      },
      "body": [
        {"op": "say", "who": "A", "text": "Bye!"},
        {
          "op": "does",
          "who": "A",
          "behaviour": "c4c:beh:wave_hello",
          "for": 3
        }
      ]
    },
    {
      "hat": {
        "on": "scene",
        "name": "Two",
        "place": "park",
        "at": 3
      },
      "body": [
        {"op": "say", "who": "A", "text": "Hi again"},
        {
          "op": "exit",
          "who": "B",
          "to": "right",
          "over": 4
        }
      ]
    },
    {
      "hat": {
        "on": "scene",
        "name": "Three",
        "place": "park",
        "at": 5
      },
      "body": [
        {"op": "caption", "text": "The end", "for": 2}
      ]
    }
  ]
}

What the check says: A's move "c4c:beh:wave_hello" is cut off when scene "One" ends at 3 s: 2.4 of 3 s done.

move_id_bad

Error A does names a move that is not a pack id.

How to fix it: Give a move's id, like "c4c:beh:walk" (list_moves gives them all).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "does", "who": "A", "behaviour": "walk"},
        {
          "op": "does",
          "who": "B",
          "behaviour": {"id": "Walk"}
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].behaviour: "walk" is not a pack id like "c4c:beh:bounce"

move_version_not_text

Error A does gives a move's version that is not text.

How to fix it: Give the version as text, like "1.0.0", or leave it out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": {"id": "c4c:beh:walk", "version": 1}
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].behaviour.version: must be a string

move_wrong_body

Warning A character does a move that does not suit its body: it moves nothing on it, or it moves legs the character does not have.

How to fix it: Give this character a move made for its body (list_moves says what each move works on), or another character.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "look": {
        "template": "monster",
        "options": {"legs": 0}
      },
      "legs": 0,
      "at": {"x": 0.5}
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": "c4c:beh:walk",
          "for": 2
        },
        {"op": "wait", "s": 2}
      ]
    }
  ]
}

What the check says: A does walk at 0 s, a move of the legs, but has no legs: only its whole body moves.

name_of_a_character

Warning A scene reads "loud" or "talking", which belong to a character; a scene reads 0.

How to fix it: Read them in a move (a behaviour) that the scene starts with does.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "wait", "s": "=loud"}]
    }
  ]
}

What the check says: scripts[0].body[0].s: "loud" belongs to a character; a scene reads 0

name_unknown

Warning A formula uses a name that is not a setting, a variable or one the engine gives, so the move fails when it plays.

How to fix it: Use a name the program has (its settings and variables) or one the engine gives: t, tau, local, dur, loud, talking, random, pi, e.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "wave", "ch": "dy", "amp": "=wiggle * 3"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].amp: unknown name "wiggle" (param, var or builtin?)

node_missing

Error Making a video from Python is done by the jabbertoon command, which needs Node.js 22 or later, and neither the jabbertoon command nor npx was found.

How to fix it: Install Node.js 22 or later (https://nodejs.org/), which brings npx, then render again; or give render() the jabbertoon command you have, with cli= or JABBERTOON_CLI.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

node_too_old

Error This Node.js is older than the jabbertoon tool needs (22 or later).

How to fix it: Install Node.js 22 or later from https://nodejs.org/.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

not_a_cartoon

Error That is not something Jabbertoon can draw: it is not a cartoon, scene or move program, a cartoon pack, or a project file.

How to fix it: Give a cartoon program ({"v": 1, "kind": "cartoon", "cast": {...}, "scripts": [...]}), a cartoon pack, a .jabbertoon.json project (version 2), or a move program.

Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.

not_found

Error There is nothing of that name.

How to fix it: Use a name the tool lists (list_moves for a move).

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

not_json

Error That is not something a link can carry, so no link was made.

How to fix it: Give plain JSON values only: objects, lists, text, numbers, true, false and null.

Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.

not_supported_here

Error This door does not do that: it is done by the tool on your own computer (reading a file, playing the cartoon through).

How to fix it: Send the cartoon itself, or use the jabbertoon tool on your own computer.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

number_not_finite

Error A number is not finite (it is too big, or not a number at all).

How to fix it: Give an ordinary number.

An example that gets this code
{"v":1,"kind":"behaviour","vars":{"x":1e400},"scripts":[]}

What the check says: vars.x: not a finite number

offline

Error The tool runs with --offline, so the report was not sent.

How to fix it: Run the tool without --offline to send reports, or write to hello@jabbertoon.com.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

offstage

Warning A character is shown partly out of the frame (more than 2% of its width or its height past an edge, or a quarter of its face out of the picture) while not entering or leaving.

How to fix it: Place the character where all of it is in the picture, its face too: no more than 2% of its width or its height past an edge (the issue gives the places that keep it in when there are some: a dog or a cat, drawn wider than it is tall, needs more room from an edge than a person), its feet, y, near the ground at 0.92; or let it exit if it should leave. When its own move takes it out, the issue names the move.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "look": {"template": "dog"},
      "at": {"x": 0.5, "h": 1.15}
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "wait", "s": 1}]
    }
  ]
}

What the check says: A's face is out of the frame from 0 s to 1 s (at x 0.5, facing right; 64% of its face in the picture): it is out above the frame: give it a smaller size, or its feet (y) near the ground at 0.92.

op_unknown

Error A block's "op" is not one the language has.

How to fix it: Use a block the language has (the spec lists them; a scene uses say, does, caption, cut, enter, exit, place, mood and the control blocks).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "fly"}]}]
}

What the check says: scripts[0].body[0]: unknown op "fly"

option_unknown

Warning A cast member's look gives an option its character does not have, so it does nothing.

How to fix it: Use the character's own options (list_characters gives each one's), or leave the option out.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Blob",
      "look": {
        "template": "monster",
        "options": {"wings": 2}
      }
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.look.options: the monster has no option "wings", so it does nothing

option_value_unknown

Warning A look option has a value the character does not take, so the site reads it as one of the values it does take.

How to fix it: Use one of the values list_characters gives for that option.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Blob",
      "look": {
        "template": "monster",
        "options": {"eyes": 7}
      }
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.look.options.eyes: the monster's option "eyes" (Eyes) takes 2 (Two) or 1 (One), not 7, so the site reads it as "Two"

overlap

Warning Two characters stand over each other for half a second or more: one covers half or more of the other, one face covers half or more of the other face, or the one drawn in front (the later in the cast, in the order a link gives it) covers half or more of the face of the one behind.

How to fix it: Move one of them away from the other: the issue gives the place, and the smaller size when only a smaller one has room, that keeps them apart with all of each in the picture; or have one exit first. When a move carries one onto the other, the issue names it.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "person"}, "at": {"x": 0.5}},
    "B": {"look": {"template": "kid"}, "at": {"x": 0.52}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "wait", "s": 2},
        {"op": "place", "who": "B", "x": 0.8, "over": 0.5},
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: A and B stand over each other from 0 s to 2.167 s; placed at x 0.59, B stays clear of A with all of it in the picture.

own_move_not_a_move

Error A does was given a program of its own that is not a move.

How to fix it: Give the move "kind": "behaviour".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": {
            "v": 1,
            "kind": "scene",
            "scripts": []
          }
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].behaviour.kind: an inline behaviour needs kind "behaviour"

pack_invalid

Error A field of the pack's manifest is not right (its id, version, type, name, licence or another).

How to fix it: Fix the field named, as the pack format describes: https://jabbertoon.com/docs/packs/.

An example that gets this code
{
  "pack": 1,
  "id": "c4c:beh:wave_hello",
  "type": "behaviour",
  "version": "one",
  "name": "Wave hello",
  "description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
  "author": {"id": "you", "name": "You"},
  "license": "cc0",
  "remixable": true,
  "derived_from": [],
  "preview": {"moves": ["wave_hello"], "seconds": 6},
  "content_hash": "sha256:a7cc2f929a2014dc87c812a99f9156a9b5c4e09db56940506eff667f99f27463",
  "content": {
    "v": 1,
    "kind": "behaviour",
    "name": "wave_hello",
    "scripts": [
      {
        "body": [
          {"op": "mood", "mood": "happy"},
          {"op": "bob", "amp": 4, "every": 1.2},
          {
            "op": "setPart",
            "part": "right forearm",
            "deg": 20
          },
          {
            "op": "setPart",
            "part": "right arm",
            "deg": 150,
            "over": 0.35,
            "ease": "out"
          },
          {
            "op": "forever",
            "body": [
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": -40,
                "over": 0.2
              },
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": 40,
                "over": 0.2
              }
            ]
          }
        ]
      }
    ]
  }
}

What the check says: version: semver x.y.z

part_not_a_name

Error A block's "part" is not text.

How to fix it: Name the part as text: "right arm", "tail", "ears".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "setPart", "part": 5, "deg": 10}]}
  ]
}

What the check says: scripts[0].body[0].part: part name expected, got 5

part_not_drawn

Warning A block moves the neck, which no character draws, so it shows nothing.

How to fix it: Move the head or the torso instead.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "set", "to": {"part:neck": 10}}]}
  ]
}

What the check says: scripts[0].body[0].to.part:neck: no character draws a neck, so "part:neck" moves nothing

part_role_unknown

Warning A part channel names a part no character has, so nothing moves.

How to fix it: Use a part of the vocabulary: head, torso, hips, arm, forearm, hand, leg, shin, foot, tail, ear, wing, fin, claw, snout, nose, hair, hat, eye, brow.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "set", "to": {"part:elbow": 10}}]}
  ]
}

What the check says: scripts[0].body[0].to.part:elbow: no part is called "elbow": nothing draws "part:elbow"

part_unknown

Error A block names a part the language does not know.

How to fix it: Name a part like "right arm", "left leg", "tail", "ears", "head" or "body".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "setPart", "part": "elbow", "deg": 10},
        {"op": "letFollow", "after": "part:elbow"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].part: unknown part "elbow"

path_outside_folder

Error That file name would put the file outside the output folder.

How to fix it: Give a plain file name (letters, digits, spaces, dots, dashes), with no folder in it.

Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.

pinned_scene_squeezed

Warning A scene runs 0 s: the next scene's pinned start had passed when it began.

How to fix it: Pin the next scene later, or shorten what comes before this scene.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "a"},
      "body": [{"op": "wait", "s": 2}]
    },
    {
      "hat": {"on": "scene", "name": "b"},
      "body": [
        {"op": "say", "who": "A", "text": "Squeezed."}
      ]
    },
    {
      "hat": {"on": "scene", "name": "c", "at": 1},
      "body": [{"op": "wait", "s": 1}]
    }
  ]
}

What the check says: Scene "b" runs 0 s: the next scene's pinned start had passed when it began at 2 s.

place_entry_bad

Error A place is neither a background's name nor {background, grade}.

How to fix it: Write the place as "meadow" or {"background": "meadow", "grade": "bloom"}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "places": {"park": 5},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ]
}

What the check says: places.park: must be a background name or {background, grade}

place_needs_a_value

Error A place block gives none of x, y, h and facing.

How to fix it: Give at least one: {"op": "place", "who": "A", "x": 0.3}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "place", "who": "A"}]
    }
  ]
}

What the check says: scripts[0].body[0]: place needs at least one of x, y, h, facing

place_not_a_name

Error A place is not given as a name.

How to fix it: Give the place as text: a name of the places (or a background, like "meadow").

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "places": {"park": "meadow"},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "cut", "place": 5}]
    }
  ]
}

What the check says: scripts[0].body[0].place: must be a place name

place_unknown

Error A cut or a scene names a place the places do not have.

How to fix it: Use a name of the places, or add it to "places".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "places": {"park": "meadow"},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "cut", "place": "beach"}]
    }
  ]
}

What the check says: scripts[0].body[0].place: unknown place "beach" (places: park)

places_not_object

Error The places are not an object of places by name.

How to fix it: Write places as {"park": {"background": "meadow", "grade": "normal"}}.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"legs": 2}, "B": {"legs": 2}},
  "scripts": [
    {"hat": {"on": "scene", "name": "s"}, "body": []}
  ],
  "places": []
}

What the check says: places: must be {name: {background, grade}}

play_warning

Warning The player warned about something while it played the cartoon; the issue gives its words.

How to fix it: Read what the player says and change the block it names.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": {
            "v": 1,
            "kind": "behaviour",
            "scripts": [{"body": [{"op": "wait", "s": 1}]}]
          },
          "params": {"speed": 2}
        }
      ]
    }
  ]
}

What the check says: The player warns: does inline: the behaviour has no param "speed" (passed anyway).

point_field_unknown

Error A point has a field other than x and y.

How to fix it: Keep only x and y in the point.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "reach", "to": {"x": 1, "y": 2, "z": 3}}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].to: a point has x and y only, not "z"

point_needs_x_and_y

Error A point is missing x or y.

How to fix it: Give both x and y.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "reach", "to": {"x": 1}}]}]
}

What the check says: scripts[0].body[0].to: needs y

point_not_object

Error A reach "to" is not a point {x, y}.

How to fix it: Give the point as {"x": 80, "y": 300} (pixels from the feet, x toward the front).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "reach", "to": [1, 2]}]}]
}

What the check says: scripts[0].body[0].to: must be a point {x, y}, not [1,2]

program_kind_unknown

Error The program's "kind" is not one the language has.

How to fix it: Set "kind" to "cartoon" (scenes with a cast), "scene" (one scene) or "behaviour" (a move for one character).

An example that gets this code
{"v": 1, "kind": "film", "scripts": []}

What the check says: kind: unknown kind "film"

program_kind_wrong

Error The program's kind is not the one this file or pack holds: a cartoon holds a kind "cartoon" program, a scene pack a kind "scene" one.

How to fix it: Set the program's kind to the one named.

An example that gets this code
{
  "pack": 1,
  "id": "c4c:beh:wave_hello",
  "type": "behaviour",
  "version": "1.0.0",
  "name": "Wave hello",
  "description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
  "author": {"id": "you", "name": "You"},
  "license": "cc0",
  "remixable": true,
  "derived_from": [],
  "preview": {"moves": ["wave_hello"], "seconds": 6},
  "content_hash": "sha256:a7cc2f929a2014dc87c812a99f9156a9b5c4e09db56940506eff667f99f27463",
  "content": {
    "v": 1,
    "kind": "cartoon",
    "name": "wave_hello",
    "scripts": [
      {
        "body": [
          {"op": "mood", "mood": "happy"},
          {"op": "bob", "amp": 4, "every": 1.2},
          {
            "op": "setPart",
            "part": "right forearm",
            "deg": 20
          },
          {
            "op": "setPart",
            "part": "right arm",
            "deg": 150,
            "over": 0.35,
            "ease": "out"
          },
          {
            "op": "forever",
            "body": [
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": -40,
                "over": 0.2
              },
              {
                "op": "turnPart",
                "part": "right forearm",
                "deg": 40,
                "over": 0.2
              }
            ]
          }
        ]
      }
    ]
  }
}

What the check says: content.kind: must be "behaviour"

program_not_object

Error What was given is not a program: a program is a JSON object.

How to fix it: Give the program as an object: {"v": 1, "kind": "cartoon", "cast": {...}, "scripts": [...]}.

An example that gets this code
5

What the check says: program is not an object

program_scripts_not_list

Error The program's "scripts" is not a list.

How to fix it: Make "scripts" a list of scripts: [{"hat": {...}, "body": [...]}].

An example that gets this code
{"v": 1, "kind": "behaviour", "scripts": null}

What the check says: scripts: must be an array

program_version

Error The program's "v" is not 1, the only version of the language.

How to fix it: Set "v" to 1.

An example that gets this code
{"v": 2, "kind": "behaviour", "scripts": []}

What the check says: v: must be 1

reach_needs_target

Error A reach gives neither a point (to) nor a spot (at).

How to fix it: Give "to" a point {x, y} or "at" a spot: hip, head, chest or mouth.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "reach"}]}]
}

What the check says: scripts[0].body[0]: reach needs "to" (a point {x, y}) or "at" (a spot: hip, head, chest, mouth)

reach_not_a_limb

Error A reach or a let-go moves something that is not a hand or a foot.

How to fix it: Reach with a hand or a foot: "right hand", "left foot", "hands", "feet".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "reach", "part": "tail", "at": "hip"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].part: reach moves a hand or a foot (right hand, left foot, hands, feet), not "tail"

reach_offset_without_spot

Error A reach moves a point with dx or dy, which only move a spot.

How to fix it: Use dx and dy with "at" (a spot); a point is a place of its own.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "reach", "to": {"x": 1, "y": 2}, "dx": 0.1}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].dx: dx moves a spot: give it with "at" (a spot), not with a point

reach_to_and_at

Error A reach gives both a point (to) and a spot (at).

How to fix it: Give one: "to" a point {x, y}, or "at" a spot (hip, head, chest, mouth).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "op": "reach",
          "to": {"x": 1, "y": 2},
          "at": "hip"
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0]: give only one of to, at

render_failed

Error Drawing a frame failed.

How to fix it: Read the message: it names what could not be drawn. If it names the canvas library or a texture, install the package again (npm install) so that library is complete; otherwise send the code and the message (never the cartoon) with report_problem.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

report_not_sent

Error The report could not be sent to jabbertoon.com.

How to fix it: Try again later, or write to hello@jabbertoon.com.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

runtime_cap

Warning The render took longer than its time limit, so it was cut short: the result is partial.

How to fix it: Render a shorter part, a smaller size, or give it a longer time limit.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

say_needs_text

Error A say block has no words.

How to fix it: Give the line as text: "text": "Hello!".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "say", "who": "A", "text": "  "}]
    }
  ]
}

What the check says: scripts[0].body[0].text: say needs the words, as a string

scene_block_in_move

Error A move uses a scene block (say, does, caption, cut, enter, exit, place).

How to fix it: Use scene blocks in a program of kind "cartoon" or "scene"; a move moves one character.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "say", "who": "A", "text": "Hi"}]}
  ]
}

What the check says: scripts[0].body[0]: "say" is a scene block; use it in a program of kind "scene" or "cartoon"

scene_hat_conflict

Error Two scripts of one scene give it different places, moods or pinned starts.

How to fix it: Give the place, mood and "at" once, or the same in each script of the scene.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "a", "place": "x"},
      "body": []
    },
    {
      "hat": {"on": "scene", "name": "a", "place": "y"},
      "body": []
    }
  ]
}

What the check says: scripts[1].hat.place: scene "a" already has place "x"

scene_hat_field_ignored

Warning A scene hat has a field it does not take; it is ignored.

How to fix it: Keep only on, name, place, mood and at on a scene hat.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s", "colour": "red"},
      "body": []
    }
  ]
}

What the check says: scripts[0].hat: a scene hat ignores "colour"

scene_hat_invalid

Error The scene hats cannot be grouped into scenes as written.

How to fix it: Give every script of a cartoon a scene hat {"on": "scene", "name": "…"}, and give a scene's place, mood and "at" once.

Why there is no example: No program gets this code today. It is kept for a way of writing the scene hats that the checks may refuse in a later version, so that such a program gets a code of its own and never another one's.

scene_pinned_before_earlier

Warning A scene is pinned before an earlier scene's pinned start, so the scene before it is cut off at once and it starts late.

How to fix it: Pin the scenes in order: each "at" later than the one before.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "a", "at": 4},
      "body": []
    },
    {
      "hat": {"on": "scene", "name": "b", "at": 2},
      "body": []
    }
  ]
}

What the check says: scene "b": is pinned at 2 s, before an earlier scene's pinned start (4 s): the scene before it will be cut off at once (0 s) and it will start late

scene_program_one_scene

Error A scene program names more than one scene.

How to fix it: Make it a cartoon (kind "cartoon") to have several scenes, or give every script the same scene name.

An example that gets this code
{
  "v": 1,
  "kind": "scene",
  "cast": {},
  "scripts": [
    {"hat": {"on": "scene", "name": "a"}, "body": []},
    {"hat": {"on": "scene", "name": "b"}, "body": []}
  ]
}

What the check says: scripts[1].hat.name: a scene program is one scene ("a"), not "b"

scene_script_hat

Error A script of a scene program starts with a hat other than the scene's.

How to fix it: Start each script with the scene (no hat, or {"on": "scene"}); key and click are the block editor's.

An example that gets this code
{
  "v": 1,
  "kind": "scene",
  "cast": {},
  "scripts": [{"hat": {"on": "key"}, "body": []}]
}

What the check says: scripts[0].hat: a scene's scripts start with the scene (no hat, or {"on":"scene"}), not "key"

scene_start_bad

Error A scene's pinned start ("at") is not a time of 0 s or more.

How to fix it: Give "at" as seconds from the cartoon's start (a number, 0 or more).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s", "at": -2},
      "body": []
    }
  ]
}

What the check says: scripts[0].hat.at: must be a time in seconds (a number ≥ 0)

scene_unknown

Error The cartoon has no scene of that name.

How to fix it: Use one of the scene names the cartoon has (validate's summary lists them).

Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.

segments_bad

Error Segments is not a whole number from 1 to 16.

How to fix it: Give segments as a whole number from 1 to 16.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "swish", "segments": 40}]}]
}

What the check says: scripts[0].body[0].segments: must be a whole number from 1 to 16, not 40

segments_not_a_chain

Warning A block gives "segments" for a part that is not a chain; it moves whole, so segments does nothing.

How to fix it: Leave segments out, or use a chain part (tail, body, ears, hair).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "bend", "part": "head", "segments": 3}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].segments: the head is not a chain: it moves whole, so "segments" does nothing

server_error

Error The tool failed on its own side.

How to fix it: Try again; if it keeps failing, call report_problem.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

shape_unknown

Error A wave names a shape the language does not have.

How to fix it: Use sin, cos, abssin, possin, dampsin, square, saw or tri.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "wave", "ch": "dy", "shape": "zigzag"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].shape: unknown shape "zigzag"

side_unknown

Error An entrance or an exit names a side the stage does not have.

How to fix it: Use left, right, top or bottom.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "enter", "who": "A", "from": "up"},
        {"op": "exit", "who": "A", "to": "down"}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].from: must be one of left, right, top, bottom

size_not_positive

Error A character's size (h) is not more than 0.

How to fix it: Give h as a share of the stage's height more than 0: 0.5 is half the height.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "place", "who": "A", "h": 0}]
    }
  ]
}

What the check says: scripts[0].body[0].h: must be more than 0 (the height as a fraction of the stage height)

sound_not_placed

Error A recording in the project is not for any line of the cartoon, so it would not be heard.

How to fix it: Key each recording in assets.sounds by the line it belongs to: "line:<n>" (or "<n>"), n counting the lines (say blocks) from 0 in the order the cartoon speaks them; or pass allow_substitutes: true to make it without that recording (listed in the result).

An example that gets this code
{
  "format": "jabbertoon-project",
  "version": 2,
  "cartoon": {
    "v": 1,
    "kind": "cartoon",
    "cast": {
      "A": {"name": "Ann", "look": {"template": "kid"}}
    },
    "scripts": [
      {
        "hat": {"on": "scene", "name": "One"},
        "body": [{"op": "say", "who": "A", "text": "Hi!"}]
      }
    ]
  },
  "assets": {
    "characters": {},
    "sounds": {
      "line:5": {"mime": "audio/wav", "data": "UklGRg=="}
    }
  }
}

What the check says: assets.sounds.line:5: The recording "line:5" is not for any line: the cartoon has 1 line (0 to 0), so there is no line 5. It would not be heard, so nothing was made.

sound_unreadable

Error A sound in the project could not be read.

How to fix it: Give the sound as base64 audio (WAV, MP3, OGG or WebM) with its mime type, as the studio saves a recording; ffmpeg reads it.

An example that gets this code
{
  "format": "jabbertoon-project",
  "version": 2,
  "cartoon": {
    "v": 1,
    "kind": "cartoon",
    "cast": {
      "A": {"name": "Ann", "look": {"template": "kid"}}
    },
    "scripts": [
      {
        "hat": {"on": "scene", "name": "One"},
        "body": [{"op": "say", "who": "A", "text": "Hi!"}]
      }
    ]
  },
  "assets": {
    "characters": {},
    "sounds": {"line:0": {"mime": "audio/wav", "data": ""}}
  }
}

What the check says: assets.sounds.line:0: The recording "line:0" (line 0) has no sound in it: a recording is {"mime": ..., "data": "<base64>"}.

speed_given_twice

Error A block gives more than one of w, hz and every.

How to fix it: Give one speed: w (radians a second), hz (times a second) or every (seconds each time).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "wave", "ch": "dy", "w": 3, "every": 1}
      ]
    }
  ]
}

What the check says: scripts[0].body[0]: give only one of w, hz, every

speed_not_positive

Error A line's speed is not more than 0.

How to fix it: Give speed more than 0 (1 is the usual; 0.85 a little slower).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "say", "who": "A", "text": "Hi", "speed": 0}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].speed: must be more than 0

spot_unknown

Error A reach names a spot the body does not have.

How to fix it: Use one of the spots: hip, head, chest, mouth.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "reach", "at": "knee"}]}]
}

What the check says: scripts[0].body[0].at: unknown spot "knee" (spots: hip, head, chest, mouth)

spring_fast

Warning A spring faster than 6 a second swings further and settles differently than a real spring would.

How to fix it: Use hz of 6 or less for a close follow-through.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "letFollow", "hz": 9}]}]
}

What the check says: scripts[0].body[0].hz: a spring of 9 per second is faster than the 240-a-second follow-through follows closely: it swings further and settles differently than a real spring would (up to 6 per second follows within 1 px)

spring_not_positive

Error A spring's speed (hz) is not more than 0.

How to fix it: Give hz more than 0: how many times a second the spring swings back (2 is the usual).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "letFollow", "hz": 0}]}]
}

What the check says: scripts[0].body[0].hz: must be more than 0 (how many times a second the spring swings back)

spring_too_fast

Error A spring swings back more than 60 times a second.

How to fix it: Give hz of 60 or less (up to 6 follows closely).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {
          "op": "follow",
          "ch": "part:tail",
          "source": "dy",
          "hz": 90
        }
      ]
    }
  ]
}

What the check says: scripts[0].body[0].hz: must be at most 60 (the follow-through ticks 240 times a second), not 90

sync_bad

Error A wave's clock is neither "local" nor "start".

How to fix it: Use "local" (from when the block starts) or "start" (the move's own clock).

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "wave", "ch": "dy", "sync": "now"}]}
  ]
}

What the check says: scripts[0].body[0].sync: must be "local" or "start"

talks_offstage

Warning A character says a line while it is out of the picture (less than half of it in, and its face out) for most of the line.

How to fix it: Let the character enter (or place it) before its line, or give the line to someone on stage.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "say",
          "who": "A",
          "text": "Hi",
          "loud": true
        }
      ]
    }
  ]
}

What the check says: A says "Hi" at 0 s while out of the picture.

text_bad_indent

Error That line is indented to a level no line above it has.

How to fix it: Indent each block two spaces more than the line it belongs to, and keep the lines of one body at the same indent.

An example that gets this code
when it starts
    wait 1 s
  wait 2 s

What the check says: Line 3, column 3: that line is indented to a level no line above it has.

text_bad_json

Error The JSON after the block's name does not read as that block.

How to fix it: Check the JSON: names and text in double quotes, no comma after the last item, and "op" the same as the word before it; or write the block in words.

An example that gets this code
when it starts
  wave {"op":"hop"}

What the check says: Line 2, column 8: the JSON after the block's name does not read as that block (expected the JSON of a "wave" block (its "op" is "wave"); found "{\"op\":\"hop\"}").

text_bad_value

Error A value there cannot be read.

How to fix it: Write a number (0.5), a formula in brackets ((t * 2)), or text in double quotes ("Hello").

An example that gets this code
when it starts
  wait abc s

What the check says: Line 2, column 8: a value there cannot be read (expected a number, a (formula) or "text"; found "abc").

text_block_outside_script

Error A block line is not under a hat.

How to fix it: Put a hat line above it (when it starts in a move, scene "Name" in a cartoon) and indent the block two spaces under it.

An example that gets this code
move right 4

What the check says: Line 1, column 1: a block line is not under a hat.

text_branch_alone

Error A branch line (— 1:) is not under at the same time:.

How to fix it: Put each — 1:, — 2: … line (or - 1:, - 2: …) under an at the same time: line, indented two spaces.

An example that gets this code
when it starts
  — 1:
    wait 1 s

What the check says: Line 2, column 3: a branch line (— 1:) is not under at the same time:.

text_cast_field_unknown

Error That cast detail is not one the text knows.

How to fix it: Use pack, template, style, look, shape, proportions, legs (4 legs), at x … y … size … facing …, voice, colors body …, stretch, art faces, options or note, separated by " · " (or "|").

An example that gets this code
cartoon
cast: A
  A: template dog · wings 2
scene "s"
  A says "x"

What the check says: Line 3, column 21: that cast detail is not one the text knows (expected pack, template, style, look, shape, proportions, legs, at, voice, colors, stretch, art faces, options or note; found "wings").

text_cast_unknown_id

Error A cast detail line names an id the cast: line does not have.

How to fix it: Add the id to the cast: line (cast: A = Sunny, B = Grump), or fix the id at the start of the detail line.

An example that gets this code
cartoon
cast: A
  B: template dog
scene "s"
  A says "x"

What the check says: Line 3, column 3: a cast detail line names an id the cast: line does not have ("B").

text_child_not_allowed

Error That line is indented under a line that holds no lines.

How to fix it: Unindent it, or move it under a hat or a block that holds a body (for, until, repeat, forever, while, if, between, at the same time).

An example that gets this code
cartoon
places: park = meadow
  wait 1 s
scene "s"
  wait 1 s

What the check says: Line 3, column 3: that line is indented under a line that holds no lines.

text_else_alone

Error Else: is not right after a block at its indent.

How to fix it: Put else: at the same indent as its if …: line, right after the lines of the if.

An example that gets this code
when it starts
  else:
    wait 1 s

What the check says: Line 2, column 3: else: is not right after a block at its indent.

text_expected

Error The line reads well up to here, then has something else than the text expects.

How to fix it: Write the words the block takes at that place (the error says which), the way the Screenplay text section of the spec shows the block.

An example that gets this code
when it starts
  turn 30 radians

What the check says: Line 2, column 11: the line reads well up to here, then has something else than the text expects (expected "°", "in", "(" or the end of the line; found "radians").

text_form_remote_unsupported

Error The remote door reads a program as JSON only, not as screenplay text.

How to fix it: Send the program as JSON (the studio's paste box and the local tool read the text and give its JSON), or use the local tool, which reads the text itself.

Why there is no example: This code is about how a cartoon is sent, not about the cartoon. The online tools for AI assistants give it when a cartoon comes to them written as screenplay text instead of JSON; the checks in the studio and the block editor read the text themselves, so no program gets it there.

text_heading_late

Error A heading comes after a scene or a hat.

How to fix it: Move the heading (cast:, places:, settings:, variables:) above the first scene or hat.

An example that gets this code
cartoon
scene "s"
  wait 1 s
cast: A

What the check says: Line 4, column 1: a heading comes after a scene or a hat (cast).

text_heading_not_first

Error The cartoon line (or the scene program line) is not the first line of the text.

How to fix it: Make cartoon "Name" the first line: take out what is above it (a sentence, or a ``` line), or move the line to the top.

An example that gets this code
cast: A = Ann
cartoon "Beach day"
scene "One"
  A says "Hi!"

What the check says: Line 2, column 1: the cartoon line (or the scene program line) is not the first line of the text.

text_heading_twice

Error That heading is given twice.

How to fix it: Give each heading (cartoon, cast:, places:, settings:, variables:) once, at the top.

An example that gets this code
cartoon
cast: A
cast: B
scene "s"
  A says "x"

What the check says: Line 3, column 1: that heading is given twice (cast).

text_not_text

Error That is not text.

How to fix it: Give the screenplay text as a string.

An example that gets this code
5

What the check says: Line 1, column 1: that is not text.

text_program_not_alone

Error A program written as its JSON (program {…}) is the whole text, and a line is outside it.

How to fix it: Write the program either as one program {…} line of JSON or in the screenplay words, not both.

An example that gets this code
program {"v": 1, "kind": "behaviour", "scripts": [{"body": [{"op": "hop"}]}]}
when it starts
  wait 1 s

What the check says: Line 2, column 1: a program written as its JSON (program {…}) is the whole text, and this line is outside it.

text_unclosed_bracket

Error A bracket is not closed.

How to fix it: Close the bracket with ) on the same line: a formula, (t * 2), or the list at the end of a line, (happy, voice af_sky).

An example that gets this code
when it starts
  wait (t > 1

What the check says: Line 2, column 14: a bracket is not closed (expected a closing ")"; the line ends there).

text_unclosed_quote

Error A quote is not closed.

How to fix it: End the text with a double quote (") on the same line; write a quote inside text as \".

An example that gets this code
when it starts
  caption "hi

What the check says: Line 2, column 14: a quote is not closed (expected a closing quote ("); the line ends there).

text_unknown_line

Error That line is not a block, a hat or a heading the screenplay text knows.

How to fix it: Write the line the way the Screenplay text section of the spec shows it: in a scene, for example A says "Hello!" (happy), A does wave_hello or place A at x 0.3 in 1 s; in a move, turn 30° in 0.5 s.

An example that gets this code
cartoon "Oops"
scene "One"
  A trun 30°

What the check says: Line 3, column 3: that line is not a block, a hat or a heading the screenplay text knows ("A trun 30°").

texture_unavailable

Error A look's texture (Storybook's paper grain, Crayon's wax) cannot be drawn here, so the frame was not drawn without it.

How to fix it: Install the package again (npm install) so its canvas library is complete, or use a look without a texture (flat, outlined, soft, bold).

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

timeout

Error The request took longer than the online tools allow and was stopped.

How to fix it: Try again in a few seconds; if it happens again, send a smaller program, or check it with the tool on your own computer.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

too_large

Error The request (more than 256 KB) or its answer (more than 4 MB) is too large.

How to fix it: Send one program, pack or cartoon at a time, without data it does not need.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

turn_view_instant

Warning A turn of 0 s or less changes the view at once, without the squash.

How to fix it: Give the turn a time ("over": 0.24 is the usual), or use a view block for a change at once.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "turnView", "over": 0}]}]
}

What the check says: scripts[0].body[0].over: a turn of 0 s or less changes the view at once, without the squash

unknown_background

Error A scene or a cut is at a place whose background the studio does not have.

How to fix it: Use one of the studio's backgrounds: beach, meadow, classroom, stage, space or city; or give the place one on the places line (places: kitchen = classroom).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "kid"}, "at": {"x": 0.3}}
  },
  "scripts": [
    {
      "hat": {
        "on": "scene",
        "name": "Breakfast",
        "place": "kitchen"
      },
      "body": [
        {"op": "say", "who": "A", "text": "Good morning!"},
        {"op": "cut", "place": "meado"},
        {"op": "wait", "s": 1},
        {"op": "cut", "place": "beach"},
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: Scene "Breakfast" at 0 s is at "kitchen", which is not a background the studio has (beach, meadow, classroom, stage, space, city).

unknown_grade

Warning A scene, a place or a cut gives a grade (the picture's colouring) the studio does not have.

How to fix it: Use one of the scene grades: normal, angry, bloom, soft or sad.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "places": {
    "beach": {"background": "beach", "grade": "bright"}
  },
  "scripts": [
    {
      "hat": {
        "on": "scene",
        "name": "Swim",
        "place": "beach"
      },
      "body": [
        {
          "op": "say",
          "who": "A",
          "text": "Sunny!",
          "mood": "mad"
        },
        {
          "op": "say",
          "who": "A",
          "text": "Wow.",
          "mood": "Scared"
        },
        {
          "op": "say",
          "who": "A",
          "text": "Hm.",
          "mood": "hapy"
        }
      ]
    }
  ]
}

What the check says: Scene "Swim" at 0 s has the grade "bright", which is not one the studio has (normal, angry, bloom, soft, sad).

unknown_mood

Warning A line, a "looks" block or a move gives a mood that no face shows.

How to fix it: Use one of the moods a face shows: happy, sad, angry, surprised or normal.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {
      "body": [
        {"op": "mood", "mood": "smug"},
        {"op": "hop", "amp": 20}
      ]
    }
  ]
}

What the check says: This move has a "look" block with the mood "smug", which is not one a face shows (happy, sad, angry, surprised, normal).

unknown_move

Warning A character does a move the studio does not have; in the studio it idles instead.

How to fix it: Use a move the studio has (list_moves gives every one, with what it works on), such as walk, wave_hello or bounce.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "does",
          "who": "A",
          "behaviour": "c4c:beh:wave_helo",
          "for": 1
        },
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: A does wave_helo at 0 s, a move the studio does not have: the character idles instead.

unknown_pack

Error A cast member names a character pack Jabbertoon does not ship: the studio has no such character, and render_video refuses it.

How to fix it: Use one of the shipped character packs (c4c:char:person, c4c:char:kid, c4c:char:dog, c4c:char:cat, c4c:char:bird, c4c:char:monster), or draw a ready-made character with a look ({"look": {"template": "dog"}}).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"name": "Puff", "pack": "c4c:char:dragon"}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.pack: "c4c:char:dragon" is not one of the character packs shipped with Jabbertoon (c4c:char:person, c4c:char:kid, c4c:char:dog, c4c:char:cat, c4c:char:bird, c4c:char:monster): the studio has no such character, and render_video refuses it

Only in the downloadable tool, not yet published: render_video

unknown_shape

Warning A cast member's look names a body shape (look.shape) the site does not have, so it is drawn with the classic shape.

How to fix it: Use one of the three body shapes: classic, bighead or tall (list_looks gives them).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Rex",
      "look": {"template": "dog", "shape": "round"}
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.look.shape: "round" is not one of the three body shapes, so the site draws it with the classic shape

unknown_style

Warning A cast member's look names a style (look.style) the site does not have, so it is drawn in the page's own look.

How to fix it: Use one of the six looks: flat, outlined, soft, storybook, bold or crayon (list_looks gives them).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {
      "name": "Rex",
      "look": {"template": "dog", "style": "neon"}
    }
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "One"},
      "body": [{"op": "say", "who": "A", "text": "Hi!"}]
    }
  ]
}

What the check says: cast.A.look.style: "neon" is not one of the six looks, so the site draws it in the page's own look

unknown_template

Error A cast member's template (its kind of body) is not one the studio has.

How to fix it: Use one of the studio's templates: person, kid, dog, cat, bird or monster (list_characters gives them).

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {
    "A": {"look": {"template": "Dog"}, "at": {"x": 0.3}},
    "B": {"look": {"template": "dgo"}, "at": {"x": 0.7}}
  },
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {
          "op": "say",
          "who": "A",
          "text": "Woof.",
          "mood": "Happy"
        },
        {"op": "cut", "mood": "Bloom"},
        {"op": "wait", "s": 1}
      ]
    }
  ]
}

What the check says: A's template "Dog" is not one the studio has (person, kid, dog, cat, bird, monster).

unknown_tool

Error That tool is not one this door has.

How to fix it: Ask tools/list for the tools this door has (the tool on your own computer has preview and render_video too), and call one of them by its name.

Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.

Only in the downloadable tool, not yet published: preview, render_video

unknown_voice

Warning A character speaks in a voice the studio does not have.

How to fix it: Use one of the studio's voices (list_characters gives them), such as af_heart or am_puck.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"voice": "robot", "at": {"x": 0.4}}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "say", "who": "A", "text": "Beep."},
        {
          "op": "say",
          "who": "A",
          "text": "Boop.",
          "voice": "af_sky"
        }
      ]
    }
  ]
}

What the check says: A's voice "robot" is not one of the studio's voices.

unreadable

Error The checker could not read this at all: it is not the shape of anything Jabbertoon checks.

How to fix it: Give it the shape its format describes: a program https://jabbertoon.com/docs/language/, a pack or a character https://jabbertoon.com/docs/packs/.

Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.

value_not_number

Error A value that must be a number is neither a number nor a formula.

How to fix it: Give a number (0.5), or a formula as text starting with = ("=t * 2").

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "wait", "s": "two"}]}]
}

What the check says: scripts[0].body[0].s: expected a number or "=expression", got "two"

value_not_text

Error A value that must be text is not.

How to fix it: Give it as text in quotes.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [
        {"op": "say", "who": "A", "text": "Hi", "voice": 3}
      ]
    }
  ]
}

What the check says: scripts[0].body[0].voice: must be a string

variable_not_a_name

Error A variable block's "var" is not a name.

How to fix it: Give the variable's name as text: "var": "score".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [
    {"body": [{"op": "setVar", "var": 3, "value": 1}]}
  ]
}

What the check says: scripts[0].body[0].var: must be a name

variable_start_not_number

Error A variable starts at something other than a number.

How to fix it: Start each variable at a number ("vars": {"n": 0}); set it to a formula with a set block as the script runs.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "vars": {"n": "=1"},
  "scripts": []
}

What the check says: vars.n: a variable starts at a number, not "=1"

view_needs_to

Error A view block does not say which view.

How to fix it: Give "to": front, side or back.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "view"}]}]
}

What the check says: scripts[0].body[0]: view needs "to": front, side, back

view_unknown

Error A view block names a view the characters do not have.

How to fix it: Use front, side or back.

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "view", "to": "top"}]}]
}

What the check says: scripts[0].body[0].to: unknown view "top" (views: front, side, back)

voices_failed

Error The voices could not speak a line, so there is no speech.

How to fix it: Run "jabbertoon voices status" to check the install, or install them again.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

voices_not_installed

Error The voices are not installed on this machine, so there is no speech. Nothing is downloaded during a render.

How to fix it: Run "jabbertoon voices install" once (about 500 MB on disk: the voice engine and its 92 MB voice model, in a folder of your own), then render again; or render without voices.

Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.

wave_needs_channel

Error A wave does not say what it moves.

How to fix it: Give "ch", a channel like "dy" or "part:arm:1".

An example that gets this code
{
  "v": 1,
  "kind": "behaviour",
  "scripts": [{"body": [{"op": "wave", "amp": 5}]}]
}

What the check says: scripts[0].body[0]: wave needs "ch"

who_missing

Error A scene block does not say who.

How to fix it: Give "who", an id of the cast: "who": "A".

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "say", "text": "Hi"}]
    }
  ]
}

What the check says: scripts[0].body[0].who: needs "who": a cast id

who_not_in_cast

Error A scene block names someone who is not in the cast.

How to fix it: Use an id of the cast, or add the character to the cast.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "say", "who": "Q", "text": "x"}]
    }
  ]
}

What the check says: scripts[0].body[0].who: "Q" is not in the cast (empty)

window_end_unknown

Warning A between block counts back from the scene's end, which is known only when the next scene is pinned; here it is never reached.

How to fix it: Pin the next scene with "at", or give from and to as seconds from the scene's start.

An example that gets this code
{
  "v": 1,
  "kind": "cartoon",
  "cast": {"A": {"name": "Sunny"}, "B": {}},
  "scripts": [
    {
      "hat": {"on": "scene", "name": "s"},
      "body": [{"op": "window", "from": -1, "body": []}]
    }
  ]
}

What the check says: scripts[0].body[0]: a negative from/to counts back from the scene's end, which is known only when the next scene is pinned with "at"; in this scene it is never reached