Frame screenshots and screen recordings in Apple device bezels (device mockups). macOS only.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Bezelbub wraps your screenshots and screen recordings in realistic Apple device bezels β iPhone, iPad, Mac, and Apple TV β producing pixel-perfect device mockups as framed images and videos. It ships three ways:
bezelbub CLI (brew install cwooddgr/tap/bezelbub): frame a screenshot in an iPhone bezel from the command line, add a device frame to a screen recording, or export a transparent HEVC-with-alpha video (plus a VP9/WebM copy for Chrome/Firefox) β designed for scripts, CI, and AI agents. Jump to the CLI docs.BezelbubKit, for embedding the framing engine in your own tools.Download the latest macOS release (DMG)
.mov), for compositing device-framed video over any web page or presentationbezelbub)bezelbub is a command-line tool that composites Apple device bezels onto screenshots and screen recordings β no GUI, no interactive prompts β so shell scripts, CI pipelines, and AI agents can generate device mockups. Every input is a flag with a sensible default, output is available as JSON, and errors go to stderr with distinct nonzero exit codes and concrete suggestions (valid ids, matching devices, nearest screen sizes), so a failed call tells the caller how to fix the next one.
Install via Homebrew:
frame is the default subcommand, so bezelbub --input shot.png works too.
Omit --device and the CLI detects the device from the input's pixel dimensions. iPhones and iPads match by exact screen resolution (Β±1px); display devices (Macs, iMac, Apple TV) match by aspect ratio, so screenshots taken at any scaled resolution still work and are rescaled to the bezel's screen. Detection succeeds when exactly one device matches; if several share the resolution, the error lists the candidates so you can re-run with --device <id>, and if none match, the nearest devices by aspect ratio are suggested. bezelbub devices --input <path> (or --dimensions WxH) answers "which devices fit this input" without framing anything.
--background transparent on a video input exports HEVC with an alpha channel in a QuickTime .mov instead of MP4 β a device-framed screen recording with a fully transparent background, ready to composite over anything. HEVC-with-alpha plays in Safari and Apple frameworks (AVFoundation, AppKit/UIKit) only; Chrome and Firefox don't decode it.
For those browsers, add --webm to also write a VP9/WebM copy that keeps the alpha channel. The CLI renders a temporary ProRes 4444 master and feeds that to ffmpeg (which must be on your PATH) β deliberately not the HEVC .mov, because ffmpeg builds older than 8.0 cannot decode HEVC's alpha layer and silently produce an opaque WebM. (ffmpeg 8+ decodes HEVC alpha correctly, but the ProRes bridge works on any build.) Serve both files, with the .mov listed first:
The order matters: Safari can play VP9/WebM but drops its alpha channel, so a WebM-first listing renders the transparency as an opaque black background in Safari. Listed .mov-first, Safari takes the HEVC-alpha .mov, while Chrome and Firefox skip video/quicktime (which they can't play) and fall through to the WebM.
An explicit --output for a transparent export must end in .mov; the WebM lands beside it with a .webm extension.
frame options:
| Flag | Meaning |
|---|---|
--input, -i | Input screenshot (PNG/JPEG/HEIC) or video (.mov/.mp4/.m4v, routed by extension). Required. |
--device, -d | Device id (see bezelbub devices). Omit to auto-detect from pixel size. |
--color, -c | Color name or id, case-insensitive. Defaults to the device's default color. |
--orientation | portrait | landscape | auto (default: infer from the input's aspect). |
--background | Hex color (#RRGGBB / #RRGGBBAA) or transparent. Default: transparent for images, black for video. transparent on video switches to HEVC-with-alpha .mov. |
--output-size | Scale preserving the bezel's aspect: a width (1920), exact WxH (must match the aspect), or a percentage (50%). Limits: 16β16,384 px images, 16β7,680 px video. |
--output, -o | Output path. Default: <input>-framed.png / .mp4 / .mov beside the input. |
--webm | Also write a VP9/WebM copy with alpha (video + --background transparent only; needs ffmpeg on PATH). |
--json | Machine-readable JSON result on stdout instead of a text summary. |
devices lists the full catalog (ids, display names, colors, orientations, screen sizes), or filters to the devices matching an --input file or bare --dimensions. Filtering always exits 0 β an empty matches array is the signal, with nearest (by aspect ratio) filled in when nothing matches.
frame --json emits one object:
kind is "image" or "video"; video results add "transparent": true|false and, when --webm ran, the "webm" output path. devices --json emits an array of {id, displayName, defaultColor, colors, landscapeOnly, hasPortraitBezel, screenWidth, screenHeight}; with --input/--dimensions it emits {width, height, matches, nearest} using the same device objects (nearest is filled only when matches is empty).
Stable and distinct, so scripts can branch on failure type instead of parsing stderr:
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Invalid flag value (e.g. malformed --background or --output-size) |
| 2 | Unknown, ambiguous, or undetectable device (stderr lists candidates) |
| 3 | Unknown color (stderr lists the device's valid colors) |
| 4 | Input image or video unreadable |
| 5 | Compositing or video export failed |
| 6 | Output could not be written |
| 7 | --webm conversion failed (ffmpeg missing from PATH or errored) |
| 64 | Malformed arguments (standard EX_USAGE) |
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/bezelbub-mcp)<a href="https://allmcps.com/mcp/bezelbub-mcp"><img src="https://allmcps.com/api/badge/bezelbub-mcp?style=directory" alt="Bezelbub MCP on AllMCPs" /></a>