Best for
- Use when building a colour system from scratch or expanding a limited brand palette for UI use.
dembrandt/dembrandt-skills/skills/algorithmic-color-palette/SKILL.md
Derive a full UI colour palette algorithmically from one or two brand colours. Darker and lighter variants for interactive states, desaturated greys from the brand hue for borders and backgrounds, and semantic colours that feel coherent with the brand rather than generic. Use when building a colour system from scratch or expanding a limited brand palette for UI use.
Decision brief
A brand palette of 2–3 colours is not enough for a UI. You need shades for states (hover, active, disabled), neutrals for backgrounds and borders, and semantic colours for status. Deriving these algorithmically from the brand colours produces a palette that feels coherent — ever…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/dembrandt/dembrandt-skills --skill "skills/algorithmic-color-palette"Inspect the Agent Skill "algorithmic-color-palette" from https://github.com/dembrandt/dembrandt-skills/blob/643a0b75f2bacc2d77dd6bae07601ab40128bb12/skills/algorithmic-color-palette/SKILL.md at commit 643a0b75f2bacc2d77dd6bae07601ab40128bb12. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
[ ] Are hover and active colours derived from the base by lightness adjustment, not chosen independently?
From each brand colour, generate at minimum three variants: base, darker (hover/active), lighter (tint/background).
Review the “Method: HSL adjustment” section in the pinned source before continuing.
Review the “Example: brand primary 133174 (hsl 224, 70%, 27%)” section in the pinned source before continuing.
If the brand has a green or teal, shift it toward a clearer success green:
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 93/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 47 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
A brand palette of 2–3 colours is not enough for a UI. You need shades for states (hover, active, disabled), neutrals for backgrounds and borders, and semantic colours for status. Deriving these algorithmically from the brand colours produces a palette that feels coherent — everything is visually related to the brand rather than pulled from a generic grey or a stock colour library.
Don't guess the seed colours — extract them (dembrandt engine, optional). If the brand already exists on the web, pull its real palette off the live site instead of eyeballing a hex:
get_color_palette(or theextract-designskill) returns the actual computed brand and neutral colours from the DOM, which you then expand with the methods below. Seeextract-designfor setup.
From each brand colour, generate at minimum three variants: base, darker (hover/active), lighter (tint/background).
base: hsl(H, S%, L%)
hover: hsl(H, S%, L% - 8%) ← darken by reducing lightness
active: hsl(H, S%, L% - 14%) ← darken further
tint: hsl(H, S%, L% + 40%) ← lighten significantly for backgrounds
subtle: hsl(H, S% * 0.3, L% + 45%) ← heavily desaturated, near-white
#133174 (hsl 224, 70%, 27%)--color-primary-subtle: hsl(224, 21%, 94%); /* background tint */
--color-primary-tint: hsl(224, 70%, 67%); /* light variant */
--color-primary: hsl(224, 70%, 27%); /* base */
--color-primary-hover: hsl(224, 70%, 19%); /* hover: -8% lightness */
--color-primary-active: hsl(224, 70%, 13%); /* active: -14% lightness */
If the brand has a green or teal, shift it toward a clearer success green:
--color-success-subtle: hsl(142, 20%, 94%);
--color-success: hsl(142, 60%, 35%);
--color-success-hover: hsl(142, 60%, 27%);
Generic greys (#666, #999, #eee) feel disconnected from the brand. Desaturating the brand hue produces greys that are subtly tinted — warm, cool, or neutral depending on the brand — and feel like they belong to the same palette.
Extreme contrast (pure black #000000 on pure white #FFFFFF) can cause "halation" and eye strain. To create a more comfortable reading experience:
#222222 or your grey-900 token) instead of pure black.#EEEEEE or your grey-50 token) is softer on the eyes than pure #FFFFFF.This "softened contrast" remains highly accessible (passing WCAG AA/AAA) but feels more professional and less harsh.
brand hue H
grey-900: hsl(H, 12%, 10%) ← near-black, text
grey-700: hsl(H, 10%, 30%) ← dark text, icons
grey-500: hsl(H, 8%, 50%) ← secondary text, placeholders
grey-300: hsl(H, 6%, 70%) ← disabled text, subtle labels
grey-200: hsl(H, 5%, 82%) ← borders, dividers
grey-100: hsl(H, 4%, 92%) ← input backgrounds, table stripes
grey-50: hsl(H, 3%, 96%) ← page background, subtle fills
#133174 (H = 224, blue-tinted)--color-grey-900: hsl(224, 12%, 10%); /* #16171f — slightly blue-black */
--color-grey-500: hsl(224, 8%, 50%); /* #7b7e8a — cool grey */
--color-grey-200: hsl(224, 5%, 82%); /* #cfd0d5 — cool light border */
--color-grey-50: hsl(224, 3%, 96%); /* #f4f4f6 — near-white with a hint of blue */
Compare to generic #f5f5f5 (no hue) — the brand-tinted version is subtly different but feels intentional.
Status colours (error, warning, success, info) should feel harmonious with the brand. To achieve cohesion, align their Saturation and Lightness to create a consistent "visual weight" across the status set.
| Semantic | Hue (H) | Saturation (S) | Lightness (L) |
|---|---|---|---|
| Error | 0–10 | Match Primary | Match Primary |
| Warning | 35–45 | Match Primary | Primary L - 10% |
| Success | 140–160 | Match Primary | Match Primary |
| Info | 210–230 | Match Primary | Match Primary |
The "Vibrancy" Rule: If the brand is muted (low saturation), the semantic colours should also be slightly muted. If the brand is neon/vibrant, the semantics should follow suit. Cohesion comes from shared intensity.
Standard UI elements require dedicated functional tokens beyond basic brand and semantic colours.
Focus indicators are critical for accessibility. Use a high-visibility colour that works on all backgrounds.
hsl(215, 95%, 50%).--color-focus.Text selection and list item highlights should be subtle and non-distracting.
--color-selection.Backdrops for modals or drawers need a neutral, semi-transparent colour.
grey-900 hue with an alpha channel.--color-overlay: hsla(H, 12%, 10%, 0.5);Loading states should be neutral and recessive.
grey-200 as the base and grey-100 as the shimmer highlight.--color-skeleton.Disabled elements must communicate unreachability.
grey-500 for text and grey-200 for backgrounds/borders.Premium UIs avoid pure black shadows. Use a very dark, desaturated brand hue.
hsla(H, 15%, 5%, alpha) where H is the brand hue.--color-shadow-base.--color-link, --color-link-visited.grey-200.:root {
/* Primary — derived from brand #133174 */
--color-primary-subtle: hsl(224, 21%, 94%);
--color-primary-tint: hsl(224, 70%, 67%);
--color-primary: hsl(224, 70%, 27%);
--color-primary-hover: hsl(224, 70%, 19%);
--color-primary-active: hsl(224, 70%, 13%);
/* Brand-tinted neutrals */
--color-grey-900: hsl(224, 12%, 10%);
--color-grey-700: hsl(224, 10%, 30%);
--color-grey-500: hsl(224, 8%, 50%);
--color-grey-300: hsl(224, 6%, 70%);
--color-grey-200: hsl(224, 5%, 82%);
--color-grey-100: hsl(224, 4%, 92%);
--color-grey-50: hsl(224, 3%, 96%);
/* Semantic */
--color-error: hsl(4, 72%, 44%);
--color-warning: hsl(38, 80%, 44%);
--color-success: hsl(142, 58%, 35%);
--color-info: hsl(224, 70%, 27%); /* = primary */
/* Semantic subtle backgrounds */
--color-error-subtle: hsl(4, 50%, 95%);
--color-warning-subtle: hsl(38, 60%, 95%);
--color-success-subtle: hsl(142, 40%, 95%);
/* Functional */
--color-focus: var(--color-primary);
--color-selection: hsl(224, 70%, 90%);
--color-overlay: hsla(224, 12%, 10%, 0.5);
--color-skeleton: var(--color-grey-200);
--color-shadow: hsla(224, 15%, 5%, 0.1);
/* Links */
--color-link: var(--color-primary);
--color-link-visited: hsl(244, 40%, 35%);
}
#666 / #eee?--color-focus token that meets accessibility contrast requirements?visited state derived algorithmically?| Anti-pattern | Problem | Fix |
|---|---|---|
| Pure black on pure white | High visual strain, "halation" | Use near-black (#222) and off-white (#EEE) |
| Grey borders next to colourful areas | Looks cheap and disconnected | Remove border or use a tinted/darker version of the adjacent colour |
| Randomly picked "Warning/Error" colours | Palette feels uncoordinated | Derive from brand HSL with visual weight alignment |
| Generic grey palette (#666, #999) | Lacks brand identity | Tint neutrals with a low-saturation version of the brand hue |
Frequently asked questions
A brand palette of 2–3 colours is not enough for a UI. You need shades for states (hover, active, disabled), neutrals for backgrounds and borders, and semantic colours for status. Deriving these algorithmically from the brand colours produces a palette that feels coherent — ever…
The source record exposes this install command: npx skills add https://github.com/dembrandt/dembrandt-skills --skill "skills/algorithmic-color-palette". Inspect the command and pinned source before running it.
Alternatives
aaron-he-zhu/aaron-marketing-skills
Use when the user asks to "build a win-back campaign", "re-engage lapsed subscribers", "run a re-permission / re-consent sweep", or "sunset my dead list"; produces a closed-loop reactivation program — a lapsed-cohort definition, a staged offer ladder, a re-consent (re-permission) capture step, and a sunset-confirm / suppression rule. Owns none of the SEND-N sub-item notes: engagement-decay / sunset is email-sequence-designer's and preference-center / frequency options is preference-frequency-man
respira-press/agent-skills-wordpress
Use when the user says 'build a design system for my site', 'extract design tokens', 'capture my brand', or 'build my style guide', or after a rebrand. Reads representative pages, theme files, and media to extract logo, colors, typography, spacing, and components, then writes a visible style-guide page.
MoizIbnYousaf/marketing-cli
Use when the user wants to generate an image or video via Higgsfield AI. Covers 30+ models: Soul V2, Seedance 2.0, Kling 3.0, Veo 3.1, GPT Image 2, Nano Banana 2. Also covers Marketing Studio — branded ad video/image with avatars and products. Use whenever: "generate an image", "make a video", "animate this photo", "image-to-video", "img2vid", "edit this image with AI", "produce a clip", "create an ad", "make a UGC video", "marketing video", "brand video", "TV spot", "import product from URL", "
JasonColapietro/suede-creator-skills
Suede-owned measurement discipline for tracking plans, event and conversion instrumentation, UTM and campaign-parameter hygiene, and verification of what actually fires. Use when setting up, auditing, or repairing analytics across web, product, paid, and lifecycle surfaces. NOT FOR: experiment design or significance decisions (use suede-ab-testing), campaign optimization (use suede-ads), attribution models, model comparison, or cross-tool reconciliation (use suede-attribution), or revenue-proces