API & MCP
Everything a person can do on CRT & VHS Effect Generator, a program or AI agent can do with the same inputs and get the identical result.
HTTP API
POST https://fliplinecrtvhsfilter.usefulweb.app/api/v1/calculate– run CRT & VHS Effect GeneratorGET https://fliplinecrtvhsfilter.usefulweb.app/api/v1/tool– inputs, output schema, examples- OpenAPI 3.1: /openapi.json · /openapi.yaml
- Errors:
application/problem+json;422includes per-fielderrors.
CRT & VHS Effect Generator
Render a still or a short seeded loop with CRT scanlines, aperture-grille, shadow or slot masks, curvature and bloom, or VHS chroma bleed, tracking noise, head switching and line jitter. Optionally quantise to a retro palette first. Download PNG, animated GIF and APNG.
| Field | Type | Default | Description |
|---|---|---|---|
image (required) | file | — | Image (PNG, JPEG or WebP) |
effect | select (crt, vhs) | "crt" | Display effect |
resolution | select (custom, gb, cga, ega, c64-hires, c64-multicolor, nes, mac) | "custom" | Machine resolution |
width | integer | 320 | Working width (px) |
fit | select (cover, contain, stretch) | "cover" | Image fit for machine resolutions |
scale | integer | 3 | Output scale (whole pixels) |
scanlines | integer | 70 | Scanline strength (%) |
mask | select (none, aperture, shadow, slot) | "aperture" | Phosphor mask |
maskStrength | integer | 35 | Mask strength (%) |
curvature | integer | 30 | Screen curvature (%) |
bloom | integer | 35 | Bloom (%) |
bloomRadius | integer | 4 | Bloom radius (source pixels) |
vignette | integer | 30 | Vignette (%) |
crtNoise | integer | 10 | CRT grain (%) |
flicker | integer | 10 | Frame flicker (%) |
lumaBlur | integer | 40 | Luma softness (%) |
sharpen | integer | 35 | Edge ringing (%) |
chromaBleed | integer | 55 | Chroma bleed (%) |
chromaShift | number | 3 | Chroma delay (px at 640 px width) |
tapeSaturation | integer | 85 | Tape colour saturation (%) |
tracking | integer | 35 | Tracking error (%) |
trackingPosition | integer | 75 | Tracking band position (% of height) |
roll | number | 4 | Tracking roll per frame (% of height) |
headSwitch | integer | 45 | Head-switching noise (%) |
jitter | integer | 30 | Line jitter (%) |
tapeNoise | integer | 30 | Tape noise (%) |
seed | integer | 1977 | Noise seed |
frames | integer | 1 | Animation frames |
fps | integer | 12 | Animation frame rate (FPS) |
palette | select (none, mono, gb-green, gb-gray, cga-0-low, cga-0-high, cga-1-low, cga-1-high, cga-5-high, cga-16, ega-64, c64, nes, rgb-8, custom) | "none" | Retro palette |
customPalette | textarea | — | Custom palette (HEX list, GPL or JASC-PAL) |
dither | select (none, bayer2, bayer4, bayer8, blue-noise, floyd, atkinson, jarvis, stucki, burkes, sierra3, sierra2, sierra-lite) | "bayer4" | Dithering method |
strength | number | 100 | Dither strength (%) |
serpentine | boolean | true | Serpentine scanning for error diffusion |
match | select (srgb, redmean, linear) | "srgb" | Colour matching |
cells | select (none, c64-hires, c64-multicolor, nes) | "none" | Attribute cells |
brightness | number | 0 | Brightness |
contrast | number | 0 | Contrast |
gamma | number | 1 | Gamma |
saturation | number | 100 | Saturation (%) |
Every result contains
inputs (normalised, defaults applied), summary, result (validated against the published schema), units, assumptions, sources, warnings, computedAt and links.
MCP (Model Context Protocol)
- Streamable HTTP endpoint:
https://fliplinecrtvhsfilter.usefulweb.app/mcp– protocol revisions 2026-07-28 (stateless) and 2025-11-25 / 2025-06-18 / 2025-03-26 (initialize handshake). - Tools:
flipline_crt_vhs_filter - Local stdio connector:
node src/mcp-stdio.ts --tool=flipline-crt-vhs-filter
{
"mcpServers": {
"flipline-crt-vhs-filter": { "type": "http", "url": "https://fliplinecrtvhsfilter.usefulweb.app/mcp" }
}
}