Skip to content

Examples

Inspect a .lines file

$ vexy-lines-cli info artwork.lines
{'caption': 'Landscape', 'version': '4.0', 'dpi': 300,
 'width_mm': 210.0, 'height_mm': 148.0,
 'groups': 2, 'layers': 5, 'fills': 8,
 'has_source_image': True, 'has_preview_image': True}

JSON output for scripting:

$ vexy-lines-cli info artwork.lines --json-output
{
  "caption": "Landscape",
  "version": "4.0",
  "dpi": 300,
  ...
}

Browse the layer tree

$ vexy-lines-cli file-tree artwork.lines
group: Background
  layer: Sky
    fill: Blue gradient [linear]
    fill: Cloud texture [scribble]
  layer: Ground
    fill: Grass [wave]
group: Foreground
  layer: Tree [hidden]
    fill: Bark [handmade]
    fill: Leaves [fractals]

Extract embedded images

# Source image (the original photo)
$ vexy-lines-cli extract-source artwork.lines
{'status': 'ok', 'output': 'artwork-src.jpg'}

# Preview image (the rendered thumbnail)
$ vexy-lines-cli extract-preview artwork.lines
{'status': 'ok', 'output': 'artwork-preview.png'}

Batch extract previews

$ vexy-lines-cli batch-convert --input-dir ./artwork/ --output-dir ./thumbnails/ --what preview --format jpg
{'total': 42, 'successes': 40, 'failures': 2, 'output_dir': './thumbnails/'}

Export to PDF

Single file:

$ vexy-lines-cli export artwork.lines --format pdf

Entire directory:

$ vexy-lines-cli export ./artwork/ --format svg --output ./exports/

Preview without exporting:

$ vexy-lines-cli export ./artwork/ --dry-run

Force re-export with longer timeouts:

$ vexy-lines-cli export ./artwork/ --force --timeout-multiplier 2.5

Style transfer

Apply one style to a folder of photos:

$ vexy-lines-cli style-transfer --style watercolor.lines --input-dir ./photos/ --output-dir ./styled/
{'total': 10, 'successes': 10, 'failures': 0, 'output_dir': './styled/'}

Interpolate between two styles across the sequence:

$ vexy-lines-cli style-transfer \
    --style soft.lines --end-style bold.lines \
    --input-dir ./frames/ --output-dir ./animated/

The first image gets soft.lines, the last gets bold.lines, and everything in between is a linear blend.

Style video

$ vexy-lines-cli style-video --style sketch.lines --input clip.mp4 --output styled.mp4
{'status': 'ok', 'input': 'clip.mp4', 'output': 'styled.mp4',
 'width': 1920, 'height': 1080, 'fps': 30.0, 'total_frames': 150}

With style interpolation across the video:

$ vexy-lines-cli style-video \
    --style start.lines --end-style end.lines \
    --input clip.mp4 --output morphing.mp4

AI rename layers & fills

Preview the names without writing anything:

$ vexy-lines-cli ai-rename road-12.lines --dry-run
fill 31: 'Linear' -> 'foreground-road-surface'  (foreground road surface)
fill 32: 'Blended' -> 'car-on-road'  (red car on road)
fill 40: 'Layer 2' -> 'top-sky-bridge'  (distant bridge in sky)
layer 12: 'Layer' -> 'road-and-car'
layer 18: 'Layer 2' -> 'sky-and-bridge'
(dry run -- nothing written)

Run for real (writes road-12-renamed.lines beside the input):

$ vexy-lines-cli ai-rename road-12.lines
...
output: road-12-renamed.lines

Point at a specific endpoint/models and write to a chosen path:

$ vexy-lines-cli ai-rename road-12.lines road-12-named.lines \
    --llm-api-url http://127.0.0.1:1234/v1 \
    --llm-model-vision my-vision-model --llm-model my-text-model

The command auto-launches the app and talks to an OpenAI-compatible /v1 endpoint, configured from the environment (VEXY_LINES_LLM_API_URL, VEXY_LINES_LLM_API_KEY, VEXY_LINES_LLM_MODEL_VISION, VEXY_LINES_VLM_MODEL) or via the --llm-* flags. See the full guide and the Layers Panel help article.

MCP status check

$ vexy-lines-cli mcp-status
{'status': 'ok', 'server_info': {'width_mm': 210.0, ...}}

MCP bridge for Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "vexy-lines-cli": {
      "command": "vexy-lines-mcp"
    }
  }
}

Now Claude can open, edit, render, and export Vexy Lines documents directly.

Python scripting

from vexy_lines_cli import VexyLinesCLI

cli = VexyLinesCLI()

# Inspect
info = cli.info("artwork.lines")
print(f"{info['caption']}: {info['layers']} layers, {info['fills']} fills")

# Export
stats = cli.export("./artwork/", format="pdf", verbose=True)
print(f"Exported {stats['success']} files in {stats['total_time']:.1f}s")