by codeswithroh
A Claude Code skill that grounds AI-generated UI in real reference images and a persistent per-developer taste profile, instead of generic AI-slop defaults.
# Add to your Claude Code skills
git clone https://github.com/codeswithroh/tastemakerLast scanned: 7/25/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-07-25T06:21:16.920Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}tastemaker is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by codeswithroh. A Claude Code skill that grounds AI-generated UI in real reference images and a persistent per-developer taste profile, instead of generic AI-slop defaults. It has 77 GitHub stars.
Yes. tastemaker passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/codeswithroh/tastemaker" and add it to your Claude Code skills directory (see the Installation section above).
tastemaker is primarily written in Python. It is open-source under codeswithroh on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh tastemaker against similar tools.
No comments yet. Be the first to share your thoughts!
Tastemaker is a skill for coding agents. Native support: Claude Code (recommended), Windsurf, and Gemini CLI. You install it once and forget it. Whenever you ask your agent to build or style a UI, tastemaker steps in and gives it a real design system to work from, instead of the generic defaults every model reaches for.
It is plain Markdown and small Python scripts. Everything runs on your machine. There is no hosted backend, no account, and no API key. Design memory is local too: project choices live in .tastemaker/style-lock.md and .tastemaker/decisions.log; durable personal preferences live in ~/.tastemaker/profile.md.
One prompt, build a landing page for a coffee subscription, built twice: once with no skill, once with tastemaker installed. Same request, unchanged, both times.
Left is the indigo-gradient, letter-in-a-box-logo, emoji-icon default most agents reach for. Right is the same prompt with tastemaker: a palette generated fresh for the project's mood, real fetched icons, a constructed mark, and motion, in one pass. Both are real, live pages, not mockups or screenshots.
Ask any model to build a UI and you tend to get the same thing: an indigo to purple gradient, a soft shadow card, a generic hero. This is not a prompting problem. It happens because the model has to invent taste from a text description, with nothing real to ground it and no memory of what you actually like.
Tastemaker fixes this with four ideas, not a bigger catalog of canned options to pick from:
check_contrast.py --matrix computes every pairing and says which may carry text, which may carry a border, and which may carry neither. So the constraint produces variety instead of sameness, and a rule that runs is different in kind from a rule you wrote down, because it returns the same answer no matter how confident anyone felt.Yes, partly, and it is worth being straight about where the line is.
If you say "lock these decisions as a design bible and use it as our anchor," you get the decisions written down in the current context. For keeping three screens consistent inside one chat, that genuinely works, and you do not need this skill for it.
Here is what that does not give you:
.tastemaker/style-lock.md and .tastemaker/decisions.log to your repo, then promotes durable resolved preferences into ~/.tastemaker/profile.md. Project decisions survive the conversation, and real keep/reject patterns can carry into the next project.check_contrast.py --matrix is a computation. It does not care how good the palette looked to you, and it returns the same verdict every time. That is the difference between an intention and a constraint.extract_palette.py reads the actual pixel values.Short version: a conversation gives you the decision. This gives you the decision plus something that enforces it after you have stopped paying attention.
Worth separating these two clearly, because it is easy to let one stand in for the other, and this project has been guilty of that.
Verified (a computation, not taste). Contrast and readability. check_contrast.py runs real WCAG math over the palette and reports pass or fail. This is accessibility, not aesthetics. A palette that clears every ratio can still be ugly. The reason it belongs here anyway is that it catches a class of failure your eyes genuinely cannot: contrast is a calculation, and looking at a color confidently is not running it. Early hand-picked palette drafts for two moods failed that check on the first pass, and only the script caught it. That failure is the reason color is generated against the contract now instead of hand-tuned and hoped.
Judgment (heuristics and memory, not proof). Everything that is actually taste: the reference extraction, the mood-to-palette matching, the accumulated profile, and the anti-slop checklist. These are informed defaults and accumulated preference. They are not verified, and this README should not imply they are. They get better with your references and your rejections, not with more math.
Do not read the contrast script as evidence that the design is good. Read it as evidence that the design is legible, which is a smaller and more checkable claim.
Claude Code plugin (recommended):
/plugin marketplace add codeswithroh/tastemaker
/plugin install tastemaker@codeswithroh
Manual install, for Claude Code without the plugin system, or for Windsurf: clone the repo, then copy or symlink the skills/tastemaker folder specifically (not the whole repo) into your tool's skills directory:
git clone https://github.com/codeswithroh/tastemaker /tmp/tastemaker
cp -r /tmp/tastemaker/skills/tastemaker ~/.claude/skills/tastemaker
Using Windsurf? Same copy, into
.windsurf/skills/instead. Windsurf reads the nativeSKILL.mdformat directly,references/and all.
Gemini CLI: one command, no manual copying. Gemini CLI reads the native SKILL.md format directly too, references/, scripts/, and the vendored ideagram/ sub-skill included, verified with a real local install, not assumed from the file-format similarity to Claude Code:
gemini skills install https://github.com/codeswithroh/tastemaker --path skills/tastemaker
This installs tastemaker (and ideagram, its vendored illustration sub-skill) globally for Gemini CLI, byte-for-byte identical to the source. First run in a project may ask you to trust the folder before workspace-scoped skills activate; global installs (the default here) don't need that.
Cursor: not a straight copy, and currently degraded even then. Cursor doesn't read SKILL.md natively; it needs conversion to its own .mdc rule format (via a tool like openskills), and that conversion strips out supporting directories entirely. Since nearly all of tastemaker's actual mechanism lives in references/ (the palette contract, macrostructure catalog, anti-slop gates) and scripts/ (the palette generator, contrast checker), a Cursor install currently loses the parts that make tastemaker work, not just a cosmetic difference. Verified against Cursor's actual conversion behavior rather than assumed from the plugin-format similarity to Claude Code. Until Cursor ships native SKILL.md support with subdirectories intact, don't expect full functionality there.
Restart your agent, th