Authoring

Cameras and panels

The six framing presets on one scene, plus room titles, dark panels, and silent bodies.

A panel’s camera sets how much of the figures and the backdrop you see. The presets are the six rungs Comic Chat used, and alternating between them is most of what makes a strip read like a comic rather than a row of identical portraits.

The six presets

Same two characters, same backdrop, six cameras.

One scene, six cameras
Open in playground →
Show all 6 panelsShow first panel only
strip.json
{
  "version": 1,
  "panels": [
    {
      "backdrop": "pastoral",
      "camera": "establishing",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"establishing\""
        }
      ]
    },
    {
      "backdrop": "pastoral",
      "camera": "wide",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"wide\""
        }
      ]
    },
    {
      "backdrop": "pastoral",
      "camera": "medium",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"medium\""
        }
      ]
    },
    {
      "backdrop": "pastoral",
      "camera": "over-shoulder",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"over-shoulder\""
        }
      ]
    },
    {
      "backdrop": "pastoral",
      "camera": "close-up",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"close-up\""
        }
      ]
    },
    {
      "backdrop": "pastoral",
      "camera": "reaction",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"reaction\""
        }
      ]
    }
  ]
}
strip.json
{
  "version": 1,
  "panels": [
    {
      "backdrop": "pastoral",
      "camera": "establishing",
      "bodies": [
        {
          "character": "dan",
          "emotion": {
            "angle": 0,
            "intensity": 0.6
          }
        },
        {
          "character": "anna",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "caption",
          "balloon": "caption",
          "text": "\"camera\": \"establishing\""
        }
      ]
    }
    // … 5 more panels
  ]
}
Preset Use it for
establishing A new location. Figures small, backdrop fully visible.
wide A location already seen. Both figures, backdrop incidental.
medium The default. Waist-up, room for balloons.
over-shoulder One speaker addressing another; the listener is close and partly cropped.
close-up One face, most of the frame, backdrop faint.
reaction Tight on the head, no balloon expected. A beat panel.

Tip

A three-panel strip that goes establishing → medium → reaction reads naturally: set the scene, have the conversation, land the beat.

Room title

roomTitle draws a small banner in the panel’s top-left. Use it for a place or a channel name.

Dark panels

dark: true paints the panel black and omits the figures; balloons still draw. Useful for “the lights go out” beats and for a caption-only panel that should not show a location.

Silent bodies

A body with no line in a panel is dropped from the stage by default, so a two-character strip can spend a panel on one of them without editing bodies. Set requested: true to keep a silent body on stage.

roomTitle, dark, requested
Open in playground →
Show all 3 panelsShow first panel only
strip.json
{
  "version": 1,
  "panels": [
    {
      "backdrop": "room8bs",
      "camera": "wide",
      "bodies": [
        {
          "character": "scotty",
          "emotion": {
            "angle": 0,
            "intensity": 0.5
          }
        },
        {
          "character": "tiki",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "scotty",
          "balloon": "speech",
          "text": "roomTitle labels the place."
        }
      ],
      "roomTitle": "The workshop"
    },
    {
      "backdrop": "room8bs",
      "camera": "medium",
      "bodies": [
        {
          "character": "scotty",
          "emotion": {
            "angle": 2.356194,
            "intensity": 0.7
          }
        },
        {
          "character": "tiki",
          "emotion": {
            "angle": 2.356194,
            "intensity": 0.7
          }
        }
      ],
      "speakers": [
        {
          "speaker": "scotty",
          "balloon": "speech",
          "text": "dark: true. The lights are out; the balloons stay."
        }
      ],
      "dark": true
    },
    {
      "backdrop": "room8bs",
      "camera": "medium",
      "bodies": [
        {
          "character": "scotty",
          "emotion": {
            "angle": 0,
            "intensity": 0.5
          }
        },
        {
          "character": "tiki",
          "emotion": {
            "angle": 1.570796,
            "intensity": 0.4
          },
          "requested": true
        }
      ],
      "speakers": [
        {
          "speaker": "scotty",
          "balloon": "speech",
          "text": "tiki has no line here, but requested: true keeps her on stage."
        }
      ]
    }
  ]
}
strip.json
{
  "version": 1,
  "panels": [
    {
      "backdrop": "room8bs",
      "camera": "wide",
      "bodies": [
        {
          "character": "scotty",
          "emotion": {
            "angle": 0,
            "intensity": 0.5
          }
        },
        {
          "character": "tiki",
          "emotion": {
            "angle": 0,
            "intensity": 0.4
          }
        }
      ],
      "speakers": [
        {
          "speaker": "scotty",
          "balloon": "speech",
          "text": "roomTitle labels the place."
        }
      ],
      "roomTitle": "The workshop"
    }
    // … 2 more panels
  ]
}