PHP port of charmbracelet/freeze β
turn code or terminal output into an SVG screenshot. No ext-gd /
Imagick required; the output is plain text suitable for git diffs and
CI artifacts.
composer require sugarcraft/candy-freezeecho "function hello() { return 'world'; }" \
| candyfreeze --theme dracula --line-numbers > out.svg
candyfreeze input.php \
--theme tokyo-night --no-window --output screenshot.svgFlags:
--theme {dark|light|dracula|tokyo-night|nord}β colour palette.--padding Nβ content padding inside the frame.--no-windowβ drop the macOS-style traffic-light controls.--no-shadowβ drop the SVG drop-shadow filter.--no-borderβ drop the frame outline.--line-numbersβ render a left-gutter line counter.--border-radius Nβ corner radius of the frame.-o/--output <path>β write SVG to a file instead of stdout.
use SugarCraft\Freeze\SvgRenderer;
$svg = SvgRenderer::dracula()
->withLineNumbers(true)
->withWindow(true)
->withPadding(24)
->withLigatures(true)
->render($code);
file_put_contents('out.svg', $svg);ANSI input is honoured β SGR foreground colours (16 / 256 / 24-bit truecolor)
plus bold / italic / underline become <tspan> segments in the output.
Background colours are rendered as per-segment <rect> fills behind the text.
$svg = SvgRenderer::dark()->render("\x1b[31merror:\x1b[0m something broke");
// With background colour
$svg = SvgRenderer::dark()->render("\x1b[44m\x1b[37malert:\x1b[0m background highlight");Code editors render ligatures (β, >=, !==, etc.) when font-variant-ligatures: normal is set. Enable it explicitly:
$svg = SvgRenderer::dracula()
->withLigatures(true)
->render($code);LanguageDetector provides heuristic detection from content or filename:
use SugarCraft\Freeze\LanguageDetector;
// From content (shebang, then content signatures)
$lang = LanguageDetector::detect($code); // "php", "bash", "python", ...
// From filename extension
$lang = LanguageDetector::detectFromFilename('script.py'); // "python"
$lang = LanguageDetector::detectFromFilename('foo.php'); // "php"Detection sources (in priority order):
- Shebang β
#!/bin/bash,#!/usr/bin/env node,#!/usr/bin/env php, etc. - Filename extension β
.php,.py,.js,.rb,.sh,.sql,.html,.css, etc. - Content signatures β language-specific patterns (
namespace,<?php,def,const, etc.)
Returns "text" when no match is found.
SvgRenderer::dark(); // charm-ish #0d1117
SvgRenderer::light(); // #f6f8fa
SvgRenderer::dracula(); // #282a36
SvgRenderer::tokyoNight(); // #1a1b26
SvgRenderer::nord(); // #2e3440Build a custom theme via the Theme constructor β set background / foreground
/ border / shadow / line-number colour / window-control colours / font family
/ size / line height.
cd candy-freeze && composer install && vendor/bin/phpunit
