A portable theme design system rooted in the atmosphere and visual culture of Huế, Việt Nam.
One versioned token contract → many hosts. Editor, terminal, and API-client themes are all generated from the same source of truth.
| Mood | Appearance | Feel |
|---|---|---|
| Huế Mưa | dark | deep charcoal, rain silver, muted jade |
| Huế Hương | dark | river green, dusk blue, incense gold |
| Huế Cung | light | ivory paper, imperial lacquer, royal purple |
Explore them in the interactive gallery: bun run dev (Vite + React, in apps/gallery).
Every theme below is generated from the token contract, so the three moods stay identical across hosts.
| Host | Package | Get it |
|---|---|---|
| Neovim / LazyVim | packages/nvim-plugin |
crafts69guy/hue-nvim · lazy.nvim |
| tmux | packages/tmux-plugin |
crafts69guy/hue-tmux · TPM |
| Ghostty | packages/terminal-themes |
theme file (theme = hue-mua) |
| Fish / Tide | packages/fish-themes |
sourceable Fish theme files |
| Yaak | packages/yaak-plugin |
sideload / plugin registry |
| Inkdrop | packages/hue-*-theme |
3 unified Inkdrop v6 packages with Mermaid colors |
| herdr + tuicr | packages/herdr-plugin |
herdr plugin install — themes herdr and the tuicr review TUI |
Three layers, each with a single responsibility:
flowchart LR
P["Primitive tokens<br/>(authored colors)"] --> S["Semantic roles<br/>(stable contract)"]
S --> A["Adapters"]
A --> N["Neovim"]
A --> T["tmux"]
A --> G["Ghostty"]
A --> F["Fish / Tide"]
A --> Y["Yaak"]
- Primitive — authored colors with cultural metadata, per mood, in DTCG format.
- Semantic — stable roles (
surface.canvas,status.notice,syntax.keyword, …) declared once in a versioned, validated contract. - Adapters — map semantic roles onto a host API without mutating source data. Each adapter declares which contract families it supports or explicitly omits.
The build validates every mood against the contract and WCAG AA contrast, then
writes the generated artifacts. See docs/architecture.md
for the full picture and docs/cultural-direction.md
for the design rationale.
packages/
tokens/ # source tokens + build — the single source of truth
nvim-plugin/ # generated Neovim colorscheme → hue-nvim
tmux-plugin/ # generated tmux TPM plugin → hue-tmux
terminal-themes/ # generated Ghostty theme files
fish-themes/ # generated Fish/Tide theme files
yaak-plugin/ # generated Yaak theme plugin
hue-*-theme/ # generated unified Inkdrop v6 packages
apps/
gallery/ # interactive mood gallery (Vite + React)
bun install
bun run dev # build tokens + run the galleryQuality gates (Biome is the single formatter/linter for TS, React, JS, JSON, CSS, HTML):
bun run format # apply Biome formatting/import-order fixes before CI
bun run format:check
bun run quality # biome check + token/gallery check + tests
bun run ci # the full non-mutating gate, incl. buildbun run ci starts with biome ci ., so formatting or import-order drift fails
before typechecks, tests, or builds run. After changing token adapters, run
bun run build first so generated artifacts are refreshed, then bun run format
and bun run ci.
Publish the generated Inkdrop packages:
bun run publish:inkdrop:dry-run
bun run publish:inkdropInkdrop packages target the v6 unified theme model: one package per mood covers the app UI, editor syntax, rendered Markdown preview, and Mermaid diagram colors.
Source tokens follow the Design Tokens Community Group format. Generated artifacts must not be edited by hand — change the tokens or adapters and rebuild.
The gallery bundles
PlemolJP Console NF v3.0.0
in Light (300) through Bold (700), under the SIL Open Font License 1.1. Its full
license sits beside the fonts in apps/gallery/public/fonts/PlemolJP-LICENSE.txt.