FAQ
tastemaker is a Claude Code plugin with 2 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes tastemaker, ideagram. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add codeswithroh/tastemaker> /plugin install tastemaker@codeswithroh
Repo: codeswithroh/tastemaker
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, then just ask:
build a landing page for a coffee subscription
Tastemaker triggers on its own. It generates a palette, picks a matching type pairing, sources real assets, wires up motion, and builds. You do not invoke anything.
For the deterministic color extraction script you need Python 3 and Pillow (pip install Pillow). If Pillow is missing, it falls back to a vision based read instead of failing.
| Grounded in real pixels | Reference images become real color tokens through scripts/extract_palette.py, not a text guess. |
| Reference-led without user references | Cold starts create .tastemaker/reference-board.md: competitors, adjacent products, cultural sources, interface systems, anti-references, dials, and a direction contract. |
| A new palette every time, never reused | generate_palette.py builds a fresh palette per project: a base hue in the mood's range, a color-harmony rule for the accent, and per-role lightness solved so the contrast pairings clear their floors. Two similar prompts get two different, legible palettes, never the same one twice. |
| A contrast contract, not a one time check | check_contrast.py --matrix computes every pairing in the palette and reports which may carry text, which may carry a border, and which may carry neither. The generator satisfies this by construction, so a fresh palette is still a legible one. This buys readability, not taste. |
| Mechanical anti-slop scan | anti_slop_scan.py flags high-confidence tells such as generic purple gradients, gradient text, h-screen, dead links, missing alt text, placeholder copy, emoji icons, eyebrow spam, and transition-all. |
| Real illustrations | Each concept is matched to real illustrator grade art and recolored to your palette, not drawn from scratch by the model. |
| A real logo, not a letter in a box | A constructed geometric mark plus a full favicon set, readable down to 16px. |
| Motion by default | GSAP and ScrollTrigger reveals plus a sequenced hero, wired during the build and not left as a follow up. |
| Motion with restraint | audit_motion.py catches common craft failures such as transition: all, ease-in, scale(0), long UI timing, layout-property animation, ungated hover motion, and missing reduced-motion handling. |
| Better app screens | Screen-type guidance covers dashboards, app shells, data tables, forms, loading, empty, error, focus, pressed, and success states, so the skill does not only shine on landing pages. |
When you have no reference, tastemaker does not hand you a color picker, and it does not hand you a fixed color scheme to choose from either. It generates one, on the spot, for your project. A menu of five fixed options is still a menu: install the skill twice for two different products and you would get the same five outcomes. That is a smaller monoculture, not a solved one.
Instead, scripts/generate_palette.py classifies your app idea into a mood (premium, warm, technical, playful, or elegant, by keyword), then builds a genuinely new palette for it every run:
The proof is that the same mood produces different, and equally legible, output every time:
Run it yourself:
python3 scripts/generate_palette.py --mood technical
It prints the roles as hex, a live preview link, and the full contrast matrix, which pairing may carry text, which may only carry a border, and which is decorative, ready to paste straight into .tastemaker/style-lock.md. Pass --seed <n> to reproduce an exact result; omit it and every run is new. Fonts stay curated per mood (a real Google Font pairing, chosen for the mood's character, so there is no licensing question); only the color is generated.
Icons follow the same idea at a smaller scale: each mood maps to two candidate Iconify sets, not one, and fetch_icons.py picks between them per run the same way the palette generator picks a fresh hue โ so two "technical" projects aren't guaranteed the same Lucide icons any more than two "premium" projects are guaranteed the same palette.
What's still fixed, honestly: font pairing (5 curated pairs, one per mood) and illustration matching (each concept maps to the closest fit in a finite local unDraw library) are not generated the way color and icons now are. Two projects in the same mood can still land on the same font pairing, and two projects needing the same abstract concept (a "team collaboration" illustration, say) can match the same source SVG โ though the recolor itself differs, since it's tinted to that project's independently generated accent, not a shared default. This is a real, acknowledged limit, not a solved problem dressed up as one; widening either axis further is open work, not a claim already made good on.
1. Read the idea references, or the app concept itself
2. Build references quality bar, anti-references, design read, and dials
3. Lock the style palette and type, contrast checked, written to a lock file
4. Source assets photos, illustrations, icons, logo, favicons, in one pass
5. Pick libraries use proven primitives for hard UI behavior instead of hand-rolling
6. Build screens visual first, app states covered, motion and slop scans checked
7. Prototype variants when direction is uncertain
8. Remember taste what you keep rolls into a profile for the next project
The full workflow lives in SKILL.md. The reference files in references/ hold the deep material and are read only when a step needs them.
I wrote up why I built this and how it works:
Every AI built site looks the same, so I built a skill that locks taste before any code is written
Background writing that shaped tastemaker's rules: a real question, a real method (something measured, read, or tested), and a link to the PR that shipped the result. Not a restatement of a PR description as if it were independent research.
tastemaker/
โโโ .claude-plugin/ plugin + marketplace manifests (the plugin install path)
โโโ skills/tastemaker/ the actual skill, this is what gets installed
โ โโโ SKILL.md the workflow, read this first
โ โโโ references/ palettes, patterns, motion, asset sourcing, checklists
โ โโโ scripts/ palette generation, contrast check, extraction, asset fetch, recolor
โ โโโ assets/ GSAP motion starter and a dependency free fallback
โ โโโ ideagram/ vendored illustration-sourcing sub-skill
โโโ research/ background investigation behind the skill's rules
โโโ site/ the marketing site and live demo
Contributions are very welcome. Bug reports, new mood ranges or harmony rules for the generator, better docs, and new layout patterns all help.
Please read CONTRIBUTING.md before you start, and see the Code of Conduct. Good first issues are labeled good first issue.
If tastemaker saved you from one more indigo gradient, a star helps other builders find it.
tastemaker is free, MIT licensed, and built in the open. If it saves you time or makes something you ship look better, sponsoring helps keep the palette generator, the asset pipeline, and the pattern library maintained.
Want something tangible back, not just a thank-you? Unlock sponsor-exclusive Aesthetic Modes for $8/month: thin style-override layers on top of the same free engine (brutalist, glassmorphic, minimalist, soft/premium-calm, more added over time), each swapping in a specific, fully worked-out design language rather than just a different color. The core skill stays free forever; this is where the paid add-ons live. Modes may graduate into the free repo once they've funded a sponsor threshold, so early subscribers fund the next one, not just this one.
No community sponsors yet. The moment GitHub Sponsors gets its first backer, their avatar goes here.
tastemaker has no official token, coin, or crypto project. Any token using this project's name, logo, or branding is unaffiliated and not endorsed by the maintainer.
MIT. Use it freely, including in commercial work.
.claude-plugin/
marketplace.json
plugin.json
.github/
assets/
badges/
claude-code-skill.svg
license.svg
live-demo.svg
prs-welcome.svg
banner.svg
generator-variety.svg
FUNDING.yml
ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
preset_submission.yml
PULL_REQUEST_TEMPLATE.md
.gitignore
.tastemaker/
decisions.log
log.json
reference-board.md
style-lock.md
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
docs/
outreach/
sponsor-pitch.md
sponsor-targets.md
vercel-oss-application.md
positioning.md
LICENSE
netlify.toml
product-hunt-shots/
captures/
capabilities-section.png
compare-page.png
install-section.png
landing-hero.png
proof-section.png
workflow-section.png
final/
tastemaker-product-hunt-01-launch-poster.png
tastemaker-product-hunt-02-before-after.png
tastemaker-product-hunt-03-design-system.png
tastemaker-product-hunt-04-install.png
shot-gallery.html
README.md
research/
contrast-as-authored-vs-as-used.md
hallmark-architecture-study.md
non-latin-typography.md
README.md
section-spacing-measurement.md
SECURITY.md
site/
after.html
assets/
coffee/
coffee-outline-rounded.svg
hero-illustration.svg
local-shipping-outline-rounded.svg
mark-solstice.svg
nest-eco-leaf-outline-rounded.svg
icons/
arrow-up-right.svg
brain.svg
copy.svg
github.svg
image.svg
lock-keyhole.svg
monitor-play.svg
palette.svg
scan-search.svg
shield-check.svg
sparkles.svg
square-mouse-pointer.svg
mark-calmly.svg
mark-tastemaker.svg
modes/
brutalist.jpg
glassmorphic.jpg
minimalist.jpg
soft-calm.jpg
proof/
after-fold.png
before-fold.png
before.html
changelog.html
compare.html
demo.html
index.html
README.md
script.js
styles.css
skills/
tastemaker/
assets/
anime-starter.js
artifact-kit.css
artifact-kit.js
gsap-starter.js
reveal.css
reveal.js
ideagram/
assets/
primitives/
figure-pointing.svg
figure-sitting-desk.svg
figure-standing.svg
prop-chart-bar.svg
prop-document.svg
prop-envelope.svg
prop-lightbulb.svg
prop-rocket.svg
prop-shield.svg
prop-speech-bubble.svg
LICENSE
README.md
references/
composition-patterns.md
metaphor-library.md
prompt-template.md
qa-checklist.md
style-contract.md
style-dna.md
undraw-anatomy.md
scripts/
build_library_index.py
export_png.py
extract_component.py
recolor_svg.py
recolor_undraw.py
validate_assets.py
SKILL.md
references/
animation-guidelines.md
anti-slop-checklist.md
asset-curation.md
component-catalog.md
component-patterns.md
component-sourcing.md
diversification.md
hero-guidelines.md
illustration-sources.md
interface-quality-rules.md
library-selection.md
logo-sourcing.md
macrostructures.md
narrative-arc.md
prototype-variants.md
reference-intelligence.md
style-lock-format.md
style-tokens.md
taste-memory.md
tech-stack-guides.md
verbs/
audit.md
comps.md
study.md
scripts/
anti_slop_scan.py
audit_motion.py
check_contrast.py
export_favicons.py
extract_palette.py
fetch_icons.py
fetch_photos.py
generate_palette.py
recolor_svg.py
validate_assets.py
SKILL.md
web/
.gitignore
.oxlintrc.json
components.json
index.html
package-lock.json
package.json
public/
assets/
icons/
arrow-up-right.svg
brain.svg
copy.svg
github.svg
image.svg
lock-keyhole.svg
monitor-play.svg
palette.svg
scan-search.svg
shield-check.svg
sparkles.svg
square-mouse-pointer.svg
mark-tastemaker.svg
modes/
brutalist.jpg
glassmorphic.jpg
minimalist.jpg
soft-calm.jpg
proof/
after-fold.png
before-fold.png
favicon.svg
icons.svg
README.md
src/
App.tsx
components/
site/
Ambient.tsx
CompareReveal.tsx
Reveal.tsx
ui/
badge.tsx
button.tsx
card.tsx
separator.tsx
index.css
lib/
utils.ts
main.tsx
tsconfig.app.json
tsconfig.json
tsconfig.node.json
vite.config.tsยฉ 2026 Flowy ยท Free and open source
Built for Claude Code ยท Not affiliated with Anthropic
| High-risk UI can branch into real variants behind a picker, then promote the version that feels right. |
| Attribution free assets | Photos (Openverse), icons (Iconify), and illustrations all need no keys and no visible credit line. |
| Taste that compounds | .tastemaker/style-lock.md keeps project rules, .tastemaker/decisions.log records keep/reject evidence, and ~/.tastemaker/profile.md carries durable preferences into the next project. |