Contribute
A port is usually an afternoon of work: read the palette, emit a config, screenshot it. Chrome themes, editors, window managers, launchers — if it takes colors, we want it. Here's the path from idea to listed port.
Start from the JSON palette
One file per variant, every role named — slug → role → hex. This is the source of truth; build your emitter against it so your port regenerates when the family does.
curl -O https://raw.githubusercontent.com/celadon-theme/celadon-theme/main/ports/json/celadon.json
Map roles, not colors
Match Celadon roles to your app's slots by meaning: bg to the field, fg to body text, red to errors and deletions, green to success. If the app speaks ANSI, use the slot numbers and skip hexes entirely — the oh-my-posh port works this way.
Cover all four variants
Sky, powder, celadon, jade — one graded family, light to dark. A port that ships one variant leaves most rooms out.
Screenshot each variant
Same content in every shot, so the grading reads. A diff and some test output show the honest ANSI story better than a wall of syntax.
Open a PR or an issue
Flat-file ports (a config the user copies) go under ports/<app>/ in the hub repo as a PR. Ports a plugin manager installs from a repo root — Neovim, tmux — get their own repo under the org: open an issue and we'll set one up.
Ground rules
Do
- Read every hex from ports/json, by role
- Ship all four variants, same content in each
- Keep it colors-only — never set fonts or sizes
- Use ANSI slots instead of hexes when the app allows
- Include a screenshot per variant in your PR
Don't
- Hand-tune a hex, even one — fixes go through the generator
- Eyedrop colors from screenshots
- Swap accent meanings (red must stay red)
- Add colors the palette doesn't define
- Skip a variant because "nobody uses light"
Not up for building one?
Issues are the most useful thing right now — port requests, color problems, screenshots of Celadon in the wild. Flat-file ports are one small emitter each, so asking is usually enough.