Design Taste Frontend
alisamadiii/Portfolio
Senior UI/UX Engineer. An agent skill from alisamadiii/Portfolio.
Encode Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great.
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install EliasOulkadi/shokunin emil-design-eng --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pack/skills/emil-design-eng .claude/skills/emil-design-eng && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .claude/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-engType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install EliasOulkadi/shokunin emil-design-eng --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.pack/skills/emil-design-eng .agents/skills/emil-design-eng && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .agents/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install EliasOulkadi/shokunin emil-design-eng --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.pack/skills/emil-design-eng .cursor/skills/emil-design-eng && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .cursor/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/EliasOulkadi/shokunin.git --path .pack/skills/emil-design-eng--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install EliasOulkadi/shokunin emil-design-eng --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.pack/skills/emil-design-eng .gemini/skills/emil-design-eng && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .gemini/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install EliasOulkadi/shokunin emil-design-engInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .github/skills && cp -r skills-src/.pack/skills/emil-design-eng .github/skills/emil-design-eng && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .github/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install EliasOulkadi/shokunin emil-design-eng --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.pack/skills/emil-design-eng .opencode/skills/emil-design-eng && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "emil-design-eng" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/emil-design-eng into .opencode/skills/emil-design-eng/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "emil-design-eng", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
emil-design-engEncode Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great.
Emil Design Eng is an agent skill from EliasOulkadi/shokunin. Encode Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great. From the creator of Sonner (13M+ weekly npm downloads), Vaul, animations.dev, and Linear's web team. Use when user wants to polish UI, audit animations, review component interactions, add micro-feedback, or elevate motion quality.
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: opencode
It sits in Frontend & Design, covering UI design. It works with npm. The repository describes itself as: 職人 Shokunin 62 AI agent skills for OpenCode, Claude Code, Cursor, Windsurf. ChromaDB memory, MCP servers, declarative self-updates. Multi-model, open source, zero cost. The licence is Apache-2.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4c68e5b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are css and javascript).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
animations.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
opencode
From compatibility in the SKILL.md frontmatter.
Emil Design Eng loads about 4.5k tokens when it runs. Until then it costs about 98 tokens; SKILL.md has 1,873 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from EliasOulkadi/shokunin at commit 4c68e5b, republished under its Apache-2.0 licence (© EliasOulkadi). 1,873 words, ~4,492 tokens.
.claude/skills/emil-design-eng/SKILL.md (or your agent's skills folder).When this skill is first invoked without a specific question, respond only with:
I'm ready to help you build interfaces that feel right, my knowledge comes from Emil Kowalski's design engineering philosophy — creator of Sonner (13M+ weekly downloads), Vaul, animations.dev, and Linear's web team. If you want to dive even deeper, check out Emil's course: animations.dev.
Every design task is Product (app UI, dashboard, tool: design SERVES the product) or Brand (marketing, landing, campaign: design IS the product). Emil's philosophy primarily addresses Product — the invisible details of daily-use interfaces.
| Register | Bar | Focus |
|---|---|---|
| Product | Earned familiarity. Users of Linear, Raycast, Stripe should trust it. | Tactile feedback, keyboard interactions, invisible correctness |
| Brand | Distinctiveness. Must stand out. | Motion as narrative, bolder durations, creative springs |
Apply the animation decision framework to both, but Product holds stricter duration limits.
Good taste is not personal preference. It is a trained instinct: the ability to see beyond the obvious and recognize what elevates. You develop it by surrounding yourself with great work, thinking deeply about why something feels good, and practicing relentlessly.
When building UI, don't just make it work. Study why the best interfaces feel the way they do. Reverse engineer animations. Inspect interactions. Be curious.
Most details users never consciously notice. That is the point. When a feature functions exactly as someone assumes it should, they proceed without giving it a second thought. That is the goal.
"All those unseen details combine to produce something that's just stunning, like a thousand barely audible voices all singing in tune." — Paul Graham
People select tools based on the overall experience, not just functionality. Good defaults and good animations are real differentiators. Beauty is underutilized in software. Use it as leverage to stand out.
When reviewing UI code, you MUST use a markdown table with Before | After | Why columns:
| Before | After | Why |
|---|---|---|
transition: all 300ms | transition: transform 200ms ease-out | Specify exact properties; avoid all |
transform: scale(0) | transform: scale(0.95); opacity: 0 | Nothing in the real world appears from nothing |
ease-in on dropdown | cubic-bezier(0.23, 1, 0.32, 1) | ease-in feels sluggish; strong ease-out gives instant feedback |
No :active state on button | transform: scale(0.97) on :active | Buttons must feel responsive to press |
transform-origin: center on popover | transform-origin: var(--radix-popover-content-transform-origin) | Popovers scale from trigger (modals stay centered) |
animate={{ x: 100 }} in Framer Motion | animate={{ transform: "translateX(100px)" }} | Framer Motion x/y NOT hardware-accelerated |
Before writing any animation code, answer these questions in order:
| Frequency | Decision |
|---|---|
| 100+ times/day (keyboard shortcuts, command palette toggle) | No animation. Ever. |
| Tens of times/day (hover effects, list navigation) | Remove or drastically reduce |
| Occasional (modals, drawers, toasts) | Standard animation |
| Rare/first-time (onboarding, celebrations) | Can add delight |
Never animate keyboard-initiated actions. Raycast has no open/close animation. Optimal.
Valid purposes: spatial consistency, state indication, feedback, preventing jarring changes, explanation. Not: "it looks cool" if the user sees it often.
| Scenario | Easing |
|---|---|
| Element entering | cubic-bezier(0.23, 1, 0.32, 1) — strong ease-out |
| Element exiting | cubic-bezier(0.4, 0, 1, 1) — ease-in |
| On-screen movement | cubic-bezier(0.77, 0, 0.175, 1) — strong ease-in-out |
| Constant motion | linear |
Never use ease-in for UI entering animations. A dropdown with ease-in at 300ms feels slower than ease-out at the same 300ms.
| Element | Duration |
|---|---|
| Button press feedback | 100-160ms |
| Tooltips, small popovers | 125-200ms |
| Dropdowns, selects | 150-250ms |
| Modals, drawers | 200-400ms |
| Stagger children | 30-80ms between items |
Rule: UI animations under 300ms.
:root {
--ease-out-strong: cubic-bezier(0.23, 1, 0.32, 1);
--ease-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1);
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like */
}.button {
transition: transform 160ms cubic-bezier(0.23, 1, 0.32, 1);
}
.button:active {
transform: scale(0.97);
}Every pressable element needs physical response. Scale: 0.95-0.98.
.popover {
transform-origin: var(--radix-popover-content-transform-origin);
}
.modal {
transform-origin: center; /* Modals stay centered */
}.tooltip {
transition: transform 125ms ease-out, opacity 125ms ease-out;
}
.tooltip[data-instant] {
transition-duration: 0ms;
}// Apple approach (recommended)
{ type: "spring", duration: 0.5, bounce: 0.2 }
// Mouse interaction with spring
const springX = useSpring(mouseX * 0.1, { stiffness: 100, damping: 10 })Keep bounce subtle (0.1-0.3). Avoid in most UI. Use for drag-to-dismiss.
.overlay {
clip-path: inset(0 100% 0 0);
transition: clip-path 200ms ease-out; /* release: fast */
}
.button:active .overlay {
clip-path: inset(0 0 0 0);
transition: clip-path 2s linear; /* press: slow and deliberate */
}.toast {
transition: opacity 400ms ease-out, transform 400ms ease-out;
@starting-style { opacity: 0; transform: translateY(100%); }
}transform and opacity. GPU-composited.transform string, not x/y. x/y use requestAnimationFrame. Drops frames under load.// NOT hardware-accelerated
<motion.div animate={{ x: 100 }} />
// Hardware-accelerated
<motion.div animate={{ transform: "translateX(100px)" }} />Exit must always be faster than enter:
.overlay { transition: clip-path 200ms ease-out; } /* exit: fast */
.button:active .overlay { transition: clip-path 2s linear; } /* enter: deliberate */.item {
opacity: 0;
transform: translateY(8px);
animation: fadeIn 300ms ease-out forwards;
}
.item:nth-child(1) { animation-delay: 0ms; }
.item:nth-child(2) { animation-delay: 50ms; }
.item:nth-child(3) { animation-delay: 100ms; }Keep delays 30-80ms. Total stagger < 400ms. Never block interaction.
ease-out at 200ms feels faster than ease-in at 200ms@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
@media (hover: hover) and (pointer: fine) {
.element:hover { transform: scale(1.05); }
}From building Sonner (13M+ weekly npm downloads):
<Toaster /> once, toast() from anywhere.transform and opacity animatedprefers-reduced-motion respected@media (hover: hover)transform-origin anchors to triggerscale(0.97) on :activetransform string over x/ytransition: all — exact propertiesscale(0) entriesBefore writing any animation code, inspect current state:
transition: all, ease-in on entering elements, animations on keyboard shortcuts, durations > 300ms for UIFor each interaction, answer in strict order:
cubic-bezier(0.23, 1, 0.32, 1). Exiting → cubic-bezier(0.4, 0, 1, 1). On-screen movement → cubic-bezier(0.77, 0, 0.175, 1).transform and opacity — GPU-compositedtransform: "translateX(100px)" as a string, never x: 100 (which uses requestAnimationFrame)transform-origin to trigger anchor for popovers, center for modalsscale(0.97) on :active, 160ms cubic-bezier(0.23, 1, 0.32, 1)--radix-popover-content-transform-origindata-instant)@media (prefers-reduced-motion: reduce) — set duration to 0.01ms@media (hover: hover) and (pointer: fine)transition: all, no ease-in on enter, no animation on keyboard actions, no scale(0) entries| Cause | Fix |
|---|---|
| Animation jank/stutter on low-end mobile devices | Reduce duration, lower stagger count, or disable entirely via prefers-reduced-motion. Animate only transform + opacity — never layout properties |
| Popover entry animates from wrong origin after scroll or resize | --radix-popover-content-transform-origin updates on reposition. Ensure the CSS variable is set dynamically by the popover library, not hardcoded. Verify after scroll |
Hold-to-delete clip-path animation doesn't trigger on iOS Safari touch | Touch events require explicit handling. Use touchstart/touchend alongside :active. Test clip-path transition on real iOS Safari — some versions have clipping bugs |
Framer Motion x/y drops frames on scroll-heavy pages | Replace <motion.div animate={{ x: 100 }} /> with <motion.div animate={{ transform: "translateX(100px)" }} />. The x/y shortcuts bypass GPU compositor |
@starting-style dialog/toast entry animation missing in production | Requires Chrome 117+ or Safari 17.2+. For broader support, use two-class approach (.toast + .toast-enter) toggled via JavaScript |
| Stagger animation blocks user interaction while items are appearing | Keep total stagger < 400ms. Items should be interactive as they appear — do not set pointer-events: none on parent during stagger |
Button :active scale not firing on iOS Safari | iOS suppresses :active by default on div/span. Use native <button> element or add touch-action: manipulation to get immediate touch feedback |
transform-origin on modal causes flicker when combined with backdrop | Modals must use transform-origin: center. If backdrop is animated separately, synchronize timing: both use same duration and easing curve |
| Pattern | Problem | Fix |
|---|---|---|
transition: all 300ms ease-in | Triggers expensive layout property transitions. ease-in on enter feels sluggish and laggy. all causes unintended side-effect transitions | Specify exact properties: transition: transform 200ms ease-out, opacity 200ms ease-out |
Entry animation from scale(0) or opacity: 0 with no intermediate state | Nothing in physics appears from total nothingness. Feels unnatural and jarring | Start from scale(0.95) with opacity: 0. Minimum visible scale >= 0.9 for UI. The element should feel like it's expanding into existence |
| Animating Cmd+K palette toggle, Escape to close, or any keyboard shortcut | Users trigger these 100+ times/day. Any delay, even 100ms, accumulates to significant daily friction | Zero animation. Instant state change. Raycast, Spotlight, VS Code Command Palette all do this correctly |
ease-in on dropdowns, tooltips, modals entering | Perceived as slower than ease-out at the exact same duration. Users interpret as interface lag | Always cubic-bezier(0.23, 1, 0.32, 1) (strong ease-out) for entering elements. The eye catches the fastest part first |
| Elastic/bounce easing on functional UI (buttons, toggles, form elements) | Distracting, feels toy-like, undermines professional credibility. Bounce reads as "trying too hard" | Reserve subtle spring (bounce: 0.2, duration: 0.5) for drag-to-dismiss and celebrations only. Never on standard UI transitions |
Animating width, height, top, left | Triggers layout recalculation on every frame. Runs on CPU, not GPU. Janky at any frame rate | transform: scale() instead of width/height. transform: translate() instead of top/left. Compositor-only properties always |
| Same duration and easing for enter and exit | Exit must feel faster. Users want elements to appear smoothly but disappear instantly so they can continue their task | Exit duration = 50-70% of enter duration. Use ease-in (starts fast, slows) on exit. Use ease-out (starts fast, slows) on enter |
Hero text reveal with animation-delay > 500ms | User has scrolled past before animation plays. Animation served zero purpose and just annoyed | Hero animations trigger on mount, not on scroll. If scroll-triggered, start when element top is 20% visible from viewport bottom |
© EliasOulkadi, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .pack/skills/emil-design-eng of EliasOulkadi/shokunin.
Open the folder on GitHubat commit 4c68e5b
Emil Design Eng next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Emil Design Eng this skillEliasOulkadi/shokunin | 114 | — | ~4.5k | Automated safety check: Pass | Apache-2.0 | |
| Design Taste Frontendalisamadiii/Portfolio | 180 | 6 repos | ~5.3k | Automated safety check: Pass | None | |
| Collaborating With Geminibkywksj/knowledge-base | 330 | — | ~1.5k | Automated safety check: Pass | Custom licence | |
| Tabler Dashboard UI Kittabler/tabler | 42k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Ant Design CLIant-design/antd-skill | 136 | — | ~2.2k | Automated safety check: Pass | MIT | |
| UI StylingOhh-889/skyroc | 795 | 13 repos | ~2.5k | Automated safety check: Pass | MIT |
alisamadiii/Portfolio
Senior UI/UX Engineer. An agent skill from alisamadiii/Portfolio.
bkywksj/knowledge-base
当用户明确点名要用 Google Gemini CLI 协同时使用此 Skill,把指定任务委托给 Gemini 执行并整合结果。
tabler/tabler
Creates admin dashboards and app pages with the Tabler UI kit on Bootstrap 5, using the published docs for real markup instead of guessed class names.
ant-design/antd-skill
Looks up antd component props, docs, demos and changelogs with the offline @ant-design/cli, and helps debug, migrate between versions and audit usage in a project.
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
lobehub/lobehub
Builds single-file interactive HTML prototypes rendered with the real LobeHub UI components and written as production-style React, so they can later be split into files.
EliasOulkadi/shokunin
Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…
EliasOulkadi/shokunin
Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…
EliasOulkadi/shokunin
PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…
EliasOulkadi/shokunin
Design database schemas with Prisma/Drizzle, PostgreSQL index strategy (B-tree, GIN, GiST, BRIN, Hash), query optimization (EXPLAIN ANALYZE), migration safety (expand/contract, zero-downtime), and…
EliasOulkadi/shokunin
Optimize Docker images with multi-stage builds, distroless bases, BuildKit cache mounts, multi-arch builds, compose watch, security hardening (non-root, seccomp, capabilities drop), and…
EliasOulkadi/shokunin
Design error handling, structured logging, and observability with OpenTelemetry (traces, metrics, logs), error classification, recovery patterns (retry with jitter, circuit breaker, bulkhead…
Works with
Categories
Encode Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great. Emil Design Eng is an agent skill from EliasOulkadi/shokunin. Encode Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great.
Emil Design Eng fits situations like: user wants to polish UI; audit animations; review component interactions; add micro-feedback.
Run `npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a claude-code`. Or copy the skill folder (.pack/skills/emil-design-eng in EliasOulkadi/shokunin) into .claude/skills/emil-design-eng in your project. Claude Code loads it when a task matches its description.
Run `npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a codex`. Or copy the skill folder (.pack/skills/emil-design-eng in EliasOulkadi/shokunin) into .agents/skills/emil-design-eng in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add EliasOulkadi/shokunin --skill emil-design-eng -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/emil-design-eng, .gemini/skills/emil-design-eng, .github/skills/emil-design-eng and .opencode/skills/emil-design-eng in your project.
SKILL.md names no scripts, command-line tools or credentials: Emil Design Eng is instructions for the agent only. Compatibility (from SKILL.md): opencode.
SKILL.md names 1 domain. As links in the text: animations.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Emil Design Eng is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Emil Design Eng: Design Taste Frontend (alisamadiii/Portfolio, 180 stars), Collaborating With Gemini (bkywksj/knowledge-base, 330 stars), Tabler Dashboard UI Kit (tabler/tabler, 42k stars) and Ant Design CLI (ant-design/antd-skill, 136 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
EliasOulkadi (a GitHub user) maintains it in EliasOulkadi/shokunin, which has 114 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.
Source: EliasOulkadi/shokunin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.