Docs

Skin format (skin.json)

A Terminal Candy skin is just a folder with two files. This page is the full reference — everything the Skin Builder writes, documented so you can hand-author or generate skins.

my-skin/
├── skin.json              ← manifest (required)
└── frame@2x.png           ← device image (required)

Install location: ~/Library/Application Support/Terminal Candy/skins/

The @2x suffix matters — macOS uses it to infer point-vs-pixel density. An 800×1300-pixel image is treated as a 400×650-point device.

The PNG

Example manifest

{
  "name": "My Device",
  "author": "Your Name",
  "version": "1.0",
  "category": "retro",

  "frame": {
    "image": "frame@2x.png",
    "width": 400,
    "height": 650
  },

  "viewport": {
    "x": 50,
    "y": 80,
    "width": 300,
    "height": 180,
    "cornerRadius": 6
  },

  "palette": {
    "foreground": "#00FF41",
    "background": "#050505",
    "cursor": "#00FF41"
  },

  "buttons": [
    { "label": "MSG", "x": 40, "y": 340, "width": 70, "height": 50 },
    { "label": "", "x": 120, "y": 340, "width": 70, "height": 50 }
  ],

  "keys": [
    { "key": "q", "x": 20, "y": 420, "width": 32, "height": 32 },
    { "key": "space", "x": 120, "y": 500, "width": 180, "height": 30 },
    { "key": "shift", "x": 20, "y": 470, "width": 48, "height": 30, "shape": "circle" }
  ],

  "effects": {
    "scanlines": true,
    "scanlineIntensity": 0.3,
    "glow": true,
    "glowIntensity": 0.4,
    "curvature": false,
    "curvatureAmount": 0.15
  }
}

Coordinate system

All coordinates are logical pointsframe.width / frame.height define the point space, origin top-left. viewport.y = 80 means 80 points from the top of the device, not the window.

Field reference

FieldRequiredNotes
nameyesShown in the skin picker
authorno
versionnoYour own versioning
categorynoFree-form string (e.g. retro, military)
frame.imageyesPNG path, relative to the skin folder
frame.width/heightyesLogical points (pixels ÷ 2 for @2x)
viewport.x/y/width/heightyesRect where the terminal renders
viewport.cornerRadiusnoDefault 4. Clips terminal corners.
viewport.cornersnoFour per-corner offsets (TL, TR, BR, BL). Non-zero values pull corners off the rect, producing an arbitrary quadrilateral for angled/tilted screens.
viewport.cornerRadiinoFour per-corner radii (TL, TR, BR, BL), 0–20 pt. Omitted = uniform cornerRadius.
palette.foregroundyesHex — terminal text color
palette.backgroundyesHex — terminal background
palette.cursornoHex — defaults to foreground
buttons[]no0–4 clickable rects. More than 4 are ignored.
buttons[].labelyesEmpty string = button is painted into the PNG; Terminal Candy only tracks clicks
keys[]noReactive keys — each pulses when the matching key is pressed
keys[].keyyesLowercase char ("w") or special: space, return, tab, delete, escape, shift, cmd, option, ctrl, up, down, left, right
keys[].shapeno"rect" (default) or "circle"
effectsnoDefault effects when the skin loads; users can override in Settings

Tips

Sharing

Publish straight from the Skin Builder with Share to Community… — details in the Skin Builder guide. Or keep it local: any valid folder dropped into the skins directory just works.