This skill is the entry point for any React work that's framed as UX engineering (not pure data/logic). It sets the mental model, routes to specialized skills, and prevents the most common interview failure mode: writing code before deciding what "done" looks like.
When to use this skill (vs. jump straight to a sub-skill)
Invoke this orchestrator first when:
The brief is open-ended ("build X component", "make this landing page")
You're starting a build session for an interview or take-home
You need to decide what to optimize for before writing code
Skip to a sub-skill when:
The task is narrow and named (e.g. "fix this a11y issue" → react-a11y directly)
The 4 senior-engineer opening moves
Before writing a single line of JSX, do these in order:
1. Restate the brief in your own words
Out loud or as a comment at the top of the file:
// Brief: Build a pricing card component used on the marketing site.
// Must: 3 tiers, monthly/yearly toggle, CTA per tier, responsive.
// Implied: a11y, design tokens, hover/focus states, mobile-first.
Why this matters: in a "solo build + review" format, this comment becomes your narration anchor.
2. Identify the "UX Engineer signal map"
For any UI brief, at least three of these should be visible in your code by the end:
Semantic HTML — <button> not <div onClick>, <nav> for nav, real <form>
Accessibility — keyboard nav works, focus visible, labels associated, contrast
Component API — props are minimal, intent-revealing, typed
Responsive — works at 320px, 768px, 1280px without breaking
Design tokens — no magic numbers; spacing/colors via tokens or theme
States — hover, focus, active, disabled, loading, error, empty
Performance — no layout shift, no janky animation, no oversized images
Polish — micro-interactions, transitions, attention to spacing
If you only ship "it works", you're a mid-level. If you ship 5+ of the above visibly, you're senior.
3. Scope: MoSCoW the build
Write three lists before coding:
Must (will fail without): core happy path, the visible UI matching the brief
Should (will mention but maybe skip): error states, edge cases, one extra a11y polish
Won't (will explicitly call out in review): testing, theming abstraction, motion library
In the walkthrough, naming the "Won't"s is a senior signal. It shows you saw them and made a call.
4. Pick one "wow" detail (conditional — see Calibrate section below)
Choose ONE thing you'll over-invest in — the thing the reviewer will remember.
Good candidates for Netlify Marketing:
A keyboard-perfect interactive (combobox, tabs, carousel)
An accessibility detail nobody asks for (live region for form errors, skip link, prefers-reduced-motion)
A micro-interaction that respects motion preferences
A precisely-implemented design token system
Important: skip or downplay this step if the brief signals simplicity. See "Calibrate to the brief" below.
Calibrate to the brief — when simple beats clever
The "pick a wow detail" advice is calibrated for performative interviews (live coding, "impress us"). For deliverable interviews where the brief explicitly says things like:
"Keep it simple"
"We're not testing optimization or cleverness"
"Documentation is part of the evaluation"
"Don't worry about completeness"
...flip the strategy. Solid working code + clear documentation + 1–2 defensible decisions beats a flashy demo with rough edges.
The Netlify Senior UX Engineer technical project is in the second category. The recruiter said verbatim: "we're not looking for completeness and this is not a test of cleverness or optimization, so we encourage you to keep it simple. The goal of this project will be to allow you to write code, showcase your problem-solving skills, and demonstrate your ability to create clear documentation."
Translation: ship working, well-documented, well-considered code. Don't add a roving-tabindex tabs component if a <details>-based FAQ would deliver the brief.
Senior-signal recalibration for simplicity-signaled briefs
Cut your "wow" to zero or one. Don't over-invest visibly.
Invest the saved time in documentation (see the react-docs-writing skill).
Prefer native HTML + simple state over compound components and headless hooks (see react-html-platform).
Resist adding libraries. Each dep is a decision you'll have to defend.
Make 2–3 decisions you can clearly justify in the next-day review. That's senior signal — not the number of advanced patterns you used.
Senior-signal that stays the same for both kinds of briefs
Regardless of calibration:
Semantic HTML. Always.
Real <label>, real <button>, real <form>. Always.
Keyboard works, focus is visible, errors are announced. Always.
No magic numbers; every spacing/color is a token. Always.
TypeScript that types intent, not just shape. Always.
These are baseline; they're not the "wow." If they're missing, no calibration saves you.
Routing to specialized skills
Once you've done the 4 opening moves, the work routes naturally:
Building against a REST API (TanStack Query, fetch wrapper, normalization)
react-api-consumer
Multi-route SPA (data router, focus on route change, scroll restoration)
react-routing
Third-party media embeds (YouTube, SoundCloud, Vimeo, X-Frame-Options)
react-embeds
These can be invoked together — a pricing card touches design, a11y, styling, and marketing patterns simultaneously.
Polish phase — after the build, before the ship
The "wow detail" lives in the build. Polish is a different mode — production hardening of something that already works. Reach for these when the brief said "deploy this" or you're past MVP and entering the "make it shippable" stage.
Polish-phase routing
If the polish is about...
Load this skill
Tests (E2E, unit, a11y assertions, CI)
react-testing
Favicon, OG/Twitter card, social meta, theme-color
react-performance (Social + brand assets section)
README badges, Tests section, live demo link, deploy notes
react-docs-writing (Production-OSS extensions)
Known-quirks index for a specific API the app consumes
The API-specific skill (e.g. kratecms-api)
Looking up the canonical spec for OG / WCAG / manifest / theme-color
react-resources
Polish checklist (run before declaring "shipped")
Repo hygiene: LICENSE present, README is accurate, .gitignore doesn't leak .claude / .idea / test artifacts
Repo discoverability: GitHub topics set, homepage URL points at the live deploy
Social surface: favicon (SVG + apple-touch-icon), OG card (1200×630), Twitter Card, theme-color, canonical link
Test surface: at least one happy-path E2E spec + a "no console errors" spec; CI runs them on PR
Production deploy: deploy config in repo (netlify.toml / vercel.json), SPA fallback wired, long-cache on hashed assets
Deployed URL works: hard-navigate to a deep route, refresh — no 404 from the host
Production smoke: same E2E suite passes against the deployed URL (E2E_BASE_URL pattern)
No dev-only assumptions in production: no localhost hardcoded, no DDEV / dev-cert references, no console.log in shipped code
No TODO/FIXME that aren't tracked: either resolve, or file an issue and link to it from the code
This checklist is separate from the build-time "before done" checklist further down — it covers the production layer.
Static-first thinking — server components / SSG where possible, hydrate sparingly
Component reusability — pages share primitives; the right component fits the system
If you're given a choice and don't know the convention, bias toward: static, accessible, fast, restrained, reusable.
Frame work in user + business outcomes, not just craft
The JD emphasizes "strategic thinker," "human-centered," "conversion-focused." Don't just describe what you built — describe what user friction it removes or what business outcome it serves.
Bad framing: "I built a multi-step form."
Good framing: "I built a multi-step form because a single long form had 60% abandonment. Each step has one job, one CTA, and a progress indicator so the user can see the end."
Bad framing: "I used semantic HTML."
Good framing: "I started with semantic HTML — accessibility is a Netlify product value, and <button> ships keyboard behavior for free, which means I spend interview time on the hard parts."
Bad framing: "I added Framer Motion."
Good framing: "Motion guides the eye from the headline to the CTA. I gated it on prefers-reduced-motion so we don't trade conversion for inclusion."
Three frames to keep in your back pocket:
Conversion / friction — "This removes a click; this clarifies the next action."
Consistency / system — "This reuses the system's primitive; this would belong in the design system."
Inclusion / craft — "This works for keyboard, screen reader, low-vision; the craft level matches the brand."
AI-collaboration mindset (the JD explicitly wants this)
The JD calls out: "Growth mindset: curious, adaptable, and eager to explore new technologies, tools, and methods—including AI for code generation." That phrasing is rare — they're saying it on purpose.
Translation: don't be apologetic about using AI tools. If you used Claude / Copilot / etc. during the build, mention it confidently. Frame it as a senior engineer's force multiplier, not as a crutch.
What that sounds like in the walkthrough:
"I used Claude to scaffold the form a11y wiring quickly so I could spend the time on the validation UX and design-token integration."
"I leaned on AI for the boilerplate, then hand-edited the parts that needed real judgment — prop API, error copy, focus management."
"I treat AI like a fast pair: it drafts, I review and reject. The senior call is what to keep."
What NOT to say:
"I let Claude write it." (passive — sounds like you didn't own it)
"Sorry, this is AI-generated." (apologetic — they don't want that)
"I would have done it differently myself." (undermines your own output)
If they ask "what role did AI play?" have a real answer: where you used it, where you didn't, and why.
The senior-engineer "before done" checklist
Before you say "I'm finished" in the review:
Keyboard: I can tab through every interactive element in sensible order, and focus is always visible
Screen reader: every control has an accessible name (label, aria-label, or visible text)
Responsive: works at 320px wide without horizontal scroll
useEffect for things that aren't side effects (computing, transforming)
Inline arrow functions in render when memoization matters (rare — but call it out)
Magic numbers in CSS (margin: 17px)
Class names like red-button instead of button-primary
aria-label on something that already has a visible label
Animating width/height/top instead of transform
Forgetting prefers-reduced-motion
Forgetting loading="lazy" on below-the-fold images
Forgetting width/height on images (causes CLS)
When in doubt, articulate the tradeoff
The senior move when uncertain isn't to pick correctly — it's to make the tradeoff visible:
"I went with controlled input here because the parent needs the value for validation. If this were used in a form library context, I'd switch to uncontrolled with a ref to avoid the rerender."
"I'm using useMemo here because the filter runs on every keystroke against a 200-item list. For a 10-item list I wouldn't bother — the memo overhead would cost more than the recompute."
That's the senior-level signal: you saw the tradeoff, you made a call, you can defend it.
1---2name: react-senior-ux3description: Senior UX Engineer-level React orchestrator — opening moves, decision framework, and routing to specialized React skills (component design, a11y, styling, performance, marketing patterns, onboarding/docs, interview narration). Use when starting any React component build, UI feature, technical interview task, marketing-site work, product onboarding, or documentation site work. Triggers on "React", "component", "UX engineer", "interview build", "landing page", "onboarding", "docs site", or any prompt that mixes UI + code judgment.4---56# react-senior-ux — Orchestrator78This skill is the entry point for any React work that's framed as **UX engineering** (not pure data/logic). It sets the mental model, routes to specialized skills, and prevents the most common interview failure mode: writing code before deciding what "done" looks like.910## When to use this skill (vs. jump straight to a sub-skill)1112Invoke this orchestrator first when:13- The brief is open-ended ("build X component", "make this landing page")14- You're starting a build session for an interview or take-home15- You need to decide *what to optimize for* before writing code1617Skip to a sub-skill when:18- The task is narrow and named (e.g. "fix this a11y issue" → `react-a11y` directly)1920## The 4 senior-engineer opening moves2122Before writing a single line of JSX, do these in order:2324### 1. Restate the brief in your own words25Out loud or as a comment at the top of the file:26```27// Brief: Build a pricing card component used on the marketing site.28// Must: 3 tiers, monthly/yearly toggle, CTA per tier, responsive.29// Implied: a11y, design tokens, hover/focus states, mobile-first.30```31Why this matters: in a "solo build + review" format, this comment becomes your narration anchor.3233### 2. Identify the "UX Engineer signal map"34For any UI brief, **at least three** of these should be visible in your code by the end:35- **Semantic HTML** — `<button>` not `<div onClick>`, `<nav>` for nav, real `<form>`36- **Accessibility** — keyboard nav works, focus visible, labels associated, contrast37- **Component API** — props are minimal, intent-revealing, typed38- **Responsive** — works at 320px, 768px, 1280px without breaking39- **Design tokens** — no magic numbers; spacing/colors via tokens or theme40- **States** — hover, focus, active, disabled, loading, error, empty41- **Performance** — no layout shift, no janky animation, no oversized images42- **Polish** — micro-interactions, transitions, attention to spacing4344If you only ship "it works", you're a mid-level. If you ship 5+ of the above visibly, you're senior.4546### 3. Scope: MoSCoW the build47Write three lists before coding:48- **Must** (will fail without): core happy path, the visible UI matching the brief49- **Should** (will mention but maybe skip): error states, edge cases, one extra a11y polish50- **Won't** (will explicitly call out in review): testing, theming abstraction, motion library5152In the walkthrough, **naming the "Won't"s is a senior signal**. It shows you saw them and made a call.5354### 4. Pick one "wow" detail (conditional — see Calibrate section below)55Choose ONE thing you'll over-invest in — the thing the reviewer will remember.56Good candidates for Netlify Marketing:57- A keyboard-perfect interactive (combobox, tabs, carousel)58- An accessibility detail nobody asks for (live region for form errors, skip link, prefers-reduced-motion)59- A micro-interaction that respects motion preferences60- A precisely-implemented design token system6162**Important**: skip or downplay this step if the brief signals simplicity. See "Calibrate to the brief" below.6364## Calibrate to the brief — when simple beats clever6566The "pick a wow detail" advice is calibrated for **performative** interviews (live coding, "impress us"). For **deliverable** interviews where the brief explicitly says things like:6768- "Keep it simple"69- "We're not testing optimization or cleverness"70- "Documentation is part of the evaluation"71- "Don't worry about completeness"7273...flip the strategy. **Solid working code + clear documentation + 1–2 defensible decisions** beats a flashy demo with rough edges.7475The Netlify Senior UX Engineer technical project is in the second category. The recruiter said verbatim: *"we're not looking for completeness and this is not a test of cleverness or optimization, so we encourage you to keep it simple. The goal of this project will be to allow you to write code, showcase your problem-solving skills, and demonstrate your ability to create clear documentation."*7677Translation: ship working, well-documented, well-considered code. Don't add a roving-tabindex tabs component if a `<details>`-based FAQ would deliver the brief.7879### Senior-signal recalibration for simplicity-signaled briefs8081- **Cut your "wow" to zero or one.** Don't over-invest visibly.82- **Invest the saved time in documentation** (see the `react-docs-writing` skill).83- **Prefer native HTML + simple state over compound components and headless hooks** (see `react-html-platform`).84- **Resist adding libraries.** Each dep is a decision you'll have to defend.85- **Make 2–3 decisions you can clearly justify in the next-day review.** That's senior signal — not the number of advanced patterns you used.8687### Senior-signal that stays the same for both kinds of briefs8889Regardless of calibration:9091- **Semantic HTML.** Always.92- **Real `<label>`, real `<button>`, real `<form>`.** Always.93- **Keyboard works, focus is visible, errors are announced.** Always.94- **No magic numbers; every spacing/color is a token.** Always.95- **TypeScript that types intent, not just shape.** Always.9697These are baseline; they're not the "wow." If they're missing, no calibration saves you.9899## Routing to specialized skills100101Once you've done the 4 opening moves, the work routes naturally:102103| If the brief is about... | Load this skill |104|---|---|105| API design, reusability, compound patterns | `react-component-design` |106| Forms, modals, menus, anything interactive | `react-a11y` |107| Visual fidelity, responsive, motion, tokens | `react-styling` |108| Slow page, bundle, images, Core Web Vitals | `react-performance` |109| Hero, CTA, pricing, lead form, marketing page | `react-marketing-patterns` |110| Multi-step onboarding, empty state, docs page, code block, TOC | `react-onboarding-docs` |111| Preparing the verbal walkthrough | `react-interview-narration` |112| Building against a REST API (TanStack Query, fetch wrapper, normalization) | `react-api-consumer` |113| Multi-route SPA (data router, focus on route change, scroll restoration) | `react-routing` |114| Third-party media embeds (YouTube, SoundCloud, Vimeo, X-Frame-Options) | `react-embeds` |115116These can be invoked together — a pricing card touches design, a11y, styling, and marketing patterns simultaneously.117118## Polish phase — after the build, before the ship119120The "wow detail" lives in the build. **Polish** is a different mode — production hardening of something that already works. Reach for these when the brief said "deploy this" or you're past MVP and entering the "make it shippable" stage.121122### Polish-phase routing123124| If the polish is about... | Load this skill |125|---|---|126| Tests (E2E, unit, a11y assertions, CI) | `react-testing` |127| Favicon, OG/Twitter card, social meta, theme-color | `react-performance` (Social + brand assets section) |128| README badges, Tests section, live demo link, deploy notes | `react-docs-writing` (Production-OSS extensions) |129| Known-quirks index for a specific API the app consumes | The API-specific skill (e.g. `kratecms-api`) |130| Looking up the canonical spec for OG / WCAG / manifest / `theme-color` | `react-resources` |131132### Polish checklist (run before declaring "shipped")133134- [ ] **Repo hygiene**: LICENSE present, README is accurate, `.gitignore` doesn't leak `.claude` / `.idea` / test artifacts135- [ ] **Repo discoverability**: GitHub topics set, homepage URL points at the live deploy136- [ ] **Social surface**: favicon (SVG + apple-touch-icon), OG card (1200×630), Twitter Card, `theme-color`, canonical link137- [ ] **Test surface**: at least one happy-path E2E spec + a "no console errors" spec; CI runs them on PR138- [ ] **Production deploy**: deploy config in repo (`netlify.toml` / `vercel.json`), SPA fallback wired, long-cache on hashed assets139- [ ] **Deployed URL works**: hard-navigate to a deep route, refresh — no 404 from the host140- [ ] **Production smoke**: same E2E suite passes against the deployed URL (`E2E_BASE_URL` pattern)141- [ ] **No dev-only assumptions in production**: no `localhost` hardcoded, no DDEV / dev-cert references, no `console.log` in shipped code142- [ ] **No `TODO`/`FIXME` that aren't tracked**: either resolve, or file an issue and link to it from the code143144This checklist is *separate* from the build-time "before done" checklist further down — it covers the production layer.145146## Netlify Senior UX Engineer (Marketing) — explicit JD signals147148From the actual job description, the role spans:149- **Brand and product UX** — both marketing and in-product150- **Marketing campaigns, product launches, onboarding, and documentation** — wider than just landing pages151- **Growth campaigns and conversion-focused initiatives** — frame work in user/business outcomes152- **Design systems and open source** — value reusability and contribution mindset153- **Cross-disciplinary collaboration** — with designers, PMs, marketers (not just engineers)154- **AI for code generation** — explicit signal that AI-tooling fluency is desired155156Implicit technical values (Netlify-specific):157- **Core Web Vitals are not optional** — LCP < 2.5s, INP < 200ms, CLS < 0.1158- **Accessibility is table stakes** — they ship public surfaces to a savvy audience159- **Developer aesthetic** — clean type, generous whitespace, restrained color, sharp interactions160- **Static-first thinking** — server components / SSG where possible, hydrate sparingly161- **Component reusability** — pages share primitives; the right component fits the system162163If you're given a choice and don't know the convention, bias toward: **static, accessible, fast, restrained, reusable**.164165## Frame work in user + business outcomes, not just craft166167The JD emphasizes "strategic thinker," "human-centered," "conversion-focused." Don't just describe what you built — describe **what user friction it removes** or **what business outcome it serves**.168169Bad framing: "I built a multi-step form."170Good framing: "I built a multi-step form because a single long form had 60% abandonment. Each step has one job, one CTA, and a progress indicator so the user can see the end."171172Bad framing: "I used semantic HTML."173Good framing: "I started with semantic HTML — accessibility is a Netlify product value, and `<button>` ships keyboard behavior for free, which means I spend interview time on the hard parts."174175Bad framing: "I added Framer Motion."176Good framing: "Motion guides the eye from the headline to the CTA. I gated it on `prefers-reduced-motion` so we don't trade conversion for inclusion."177178Three frames to keep in your back pocket:1791. **Conversion / friction** — "This removes a click; this clarifies the next action."1802. **Consistency / system** — "This reuses the system's primitive; this would belong in the design system."1813. **Inclusion / craft** — "This works for keyboard, screen reader, low-vision; the craft level matches the brand."182183## AI-collaboration mindset (the JD explicitly wants this)184185The JD calls out: *"Growth mindset: curious, adaptable, and eager to explore new technologies, tools, and methods—**including AI for code generation**."* That phrasing is rare — they're saying it on purpose.186187Translation: **don't be apologetic about using AI tools.** If you used Claude / Copilot / etc. during the build, mention it confidently. Frame it as a *senior engineer's force multiplier*, not as a crutch.188189What that sounds like in the walkthrough:190- "I used Claude to scaffold the form a11y wiring quickly so I could spend the time on the validation UX and design-token integration."191- "I leaned on AI for the boilerplate, then hand-edited the parts that needed real judgment — prop API, error copy, focus management."192- "I treat AI like a fast pair: it drafts, I review and reject. The senior call is what to keep."193194What NOT to say:195- "I let Claude write it." (passive — sounds like you didn't own it)196- "Sorry, this is AI-generated." (apologetic — they don't want that)197- "I would have done it differently myself." (undermines your own output)198199If they ask "what role did AI play?" have a real answer: where you used it, where you didn't, and *why*.200201## The senior-engineer "before done" checklist202203Before you say "I'm finished" in the review:204205- [ ] Keyboard: I can tab through every interactive element in sensible order, and focus is always visible206- [ ] Screen reader: every control has an accessible name (label, aria-label, or visible text)207- [ ] Responsive: works at 320px wide without horizontal scroll208- [ ] States: hover, focus, active, disabled, loading, error, empty — anything missing is intentional209- [ ] No layout shift on load (images sized, fonts swap-safe)210- [ ] No console errors/warnings211- [ ] TypeScript: no `any`, no `@ts-ignore`212- [ ] Naming: every prop and component name reads like English213- [ ] One "wow" detail is present and intentional214215## Anti-patterns that signal mid-level216217Avoid these — interviewers notice:218- `<div onClick>` instead of `<button>`219- Manual prop drilling beyond 2 levels (use children/composition)220- `useState` for derived values (compute from props)221- `useEffect` for things that aren't side effects (computing, transforming)222- Inline arrow functions in render when memoization matters (rare — but call it out)223- Magic numbers in CSS (`margin: 17px`)224- Class names like `red-button` instead of `button-primary`225- `aria-label` on something that already has a visible label226- Animating `width`/`height`/`top` instead of `transform`227- Forgetting `prefers-reduced-motion`228- Forgetting `loading="lazy"` on below-the-fold images229- Forgetting `width`/`height` on images (causes CLS)230231## When in doubt, articulate the tradeoff232233The senior move when uncertain isn't to pick correctly — it's to **make the tradeoff visible**:234235> "I went with controlled input here because the parent needs the value for validation. If this were used in a form library context, I'd switch to uncontrolled with a ref to avoid the rerender."236237> "I'm using `useMemo` here because the filter runs on every keystroke against a 200-item list. For a 10-item list I wouldn't bother — the memo overhead would cost more than the recompute."238239That's the senior-level signal: **you saw the tradeoff, you made a call, you can defend it**.
Run npx skillmds@latest add jaballer/react-senior-ux in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Senior UX Engineer-level React orchestrator — opening moves, decision framework, and routing to specialized React skills (component design, a11y, styling, performance, marketing patterns, onboarding/docs, interview narration). Use when starting any React component build, UI feature, technical interview task, marketing-site work, product onboarding, or documentation site work. Triggers on "React", "component", "UX engineer", "interview build", "landing page", "onboarding", "docs site", or any prompt that mixes UI + code judgment. It is listed under Marketing & Growth on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
jaballer (@jaballer) published this skill. Their other Agent Skills are listed on their SkillMD profile.