Skip to main content
Version: main

paletty

Fetches a curated terminal palette from paletty.dev's public JSON API and returns it as a tinct palette. Each paletty palette comes with a complete ANSI 16-colour set plus core background/foreground/cursor/selection slots; the plugin maps the conventional roles (background, foreground, danger, success, warning, info, notification) onto sensible defaults and surfaces paletty's is_dark metadata as a theme hint so the categoriser doesn't have to guess.

Installation

Via the official plugin repository

tinct plugins install paletty

Build from source

cd contrib/plugins/input/paletty
go build -ldflags "-X main.Version=0.1.0" -o tinct-plugin-paletty
install -m 0755 tinct-plugin-paletty ~/.local/bin/

Verify

which tinct-plugin-paletty
tinct-plugin-paletty --plugin-info | jq .

The plugin uses tinct's go-plugin RPC protocol and is discovered automatically once it's on $PATH.

Quick start

# By URL — paste from your browser
tinct generate -i paletty \
--plugin-arg palette=https://paletty.dev/p/MDRHC0lqRj/midnight-a \
-o ghostty

# By palette ID
tinct generate -i paletty --plugin-arg palette=MDRHC0lqRj -o ghostty

Configuration / credentials

No credentials are required — paletty.dev exposes its palette catalogue via a public read-only API. The plugin needs network access to reach https://paletty.dev; behind a corporate proxy, set HTTPS_PROXY in the environment that runs tinct.

The plugin accepts either a paletty palette ID (e.g. MDRHC0lqRj) or a full paletty.dev URL — IDs are extracted from URLs of the form /p/<id>/<slug> or /api/palettes/<id>.

Default role mapping

Paletty palettes ship 16 ANSI slots plus core entries. By default the plugin pins these roles:

Tinct rolePaletty key
backgroundcore.background
foregroundcore.foreground
dangeransi.normal.1 (red)
successansi.normal.2 (green)
warningansi.normal.3 (yellow)
infoansi.normal.4 (blue)
notificationansi.normal.5 (magenta)

The remaining ANSI slots (cyan/white, bright variants, cursor/selection) are still added to the palette so tinct's categoriser can draw accents from them. Pin specific accents explicitly via the map arg:

tinct generate -i paletty \
--plugin-arg palette=MDRHC0lqRj \
--plugin-arg map='{"accent1":"ansi.normal.6","accent2":"ansi.bright.5"}' \
-o kitty

Available paletty keys

The full schema returned by GET /api/palettes/{id}:

  • core.background, core.foreground
  • core.cursor, core.cursorText
  • core.selectionBackground, core.selectionForeground
  • ansi.normal.0ansi.normal.7
  • ansi.bright.0ansi.bright.7

Any of these can appear on the right-hand side of a map entry.

Flags

This plugin uses --plugin-arg key=value rather than dedicated CLI flags:

ArgumentTypeDefaultDescription
palettestring(required)paletty.dev palette ID or full URL
timeoutduration10sHTTP timeout for the fetch
base_urlstringhttps://paletty.devOverride the base URL (advanced/testing)
mapJSON object(none)Extra role → paletty-key mappings merged on top of the defaults

Output

A palette of up to 22 colours (the full paletty palette in deterministic key order), with the default role mapping applied via tinct's protocol 0.3.0 role-hint mechanism. The theme hint is derived from paletty's is_dark field — override with --theme dark or --theme light if you disagree with the source's grading.

This plugin does not provide a wallpaper. Combine it with the image or google-genai input plugins (running in a separate invocation) if you want a wallpaper alongside the palette.

Troubleshooting

plugin-arg 'palette' is required

Pass either a palette ID or a paletty.dev URL via --plugin-arg palette=…. IDs are alphanumeric tokens of 6–32 characters; URLs of the form https://paletty.dev/p/<id>/<slug> and https://paletty.dev/api/palettes/<id> both work.

invalid paletty palette reference

The argument didn't match the expected ID pattern or URL shape. Open the palette page in your browser and copy the URL directly — the ID lives in the path segment after /p/.

HTTP 404 Not Found

The palette ID doesn't exist on paletty.dev, or the palette was deleted. Confirm the ID by loading https://paletty.dev/api/palettes/<id> in a browser; a 404 from that endpoint is the upstream confirming the palette is gone.

Network errors / timeouts

The plugin enforces a 10-second HTTP timeout by default. Raise it for slow links:

tinct generate -i paletty \
--plugin-arg palette=MDRHC0lqRj \
--plugin-arg timeout=30s \
-o ghostty

If your network blocks paletty.dev outright, fall back to the built-in remote-json input plugin and point it at the JSON endpoint directly — see Related plugins below.

  • remote-json — generic JSON-from-URL palette source; works against paletty.dev's API if you'd rather not install a dedicated plugin.
  • image — extract a palette from an image instead of fetching a curated one.