Apply the user's web development stack and standards to any frontend/web work — building a website, web app, web visualization, dashboard, component, or static site, and choosing how to run, host, or add a backend. Lightweight, Core-Web-Vitals-first, and accessible (WCAG AA) by default; web components + Web Awesome; modern CSS, never Tailwind; Svelte/Astro/Preact only when a framework is truly needed, never React; Vite/http-server; GitHub Pages via Actions; 11ty for static sites; AWS Lambda + DynamoDB for backend. Invoke at the START of web work, before choosing tools or scaffolding.
Install
npx skillscat add mayor-s-office-of-innovation/good-neighbor-app/web-dev Install via the SkillsCat registry.
Web development standards
These are the user's standing preferences for all web work. Apply them by default. If a request seems to require violating one (e.g. "use React"), stop and confirm before proceeding — don't silently comply or silently override.
1. Performance is the top constraint
- Every build must be able to pass Core Web Vitals (LCP, INP, CLS). Treat this as a hard requirement, not a nice-to-have.
- Ship the least code possible. Prefer zero-dependency solutions. Every dependency must earn its place — if you can do it with the platform, do that instead.
- Before adding any dependency, state in one line why the web platform can't do it. If you can't, don't add it.
2. Accessibility is the other hard requirement
- Target WCAG 2.2 AA. Treat it as a release gate, not a polish pass — a peer to performance, not an afterthought.
- Semantic HTML first — real headings, landmarks, lists, and buttons; reach for ARIA only to fill gaps the platform can't express, never to paper over non-semantic markup.
- Every non-text visual needs a text alternative —
altfor meaningful images, anaria-labelor visually-hidden description for charts/visualizations/icon-only controls, and labels for every form control. - Never encode meaning in color alone — pair color with text, shape, or a label; keep text contrast ≥ 4.5:1 (≥ 3:1 for large text and UI elements).
- Keyboard-operable with visible focus — everything interactive is reachable and operable by keyboard, in a logical tab/reading order, with a clear focus indicator (don't remove outlines without replacing them).
- Respect user settings — honor
prefers-reduced-motion(gate non-essential animation), don't disable zoom, and use relative units so text scales. - Verify before shipping: a keyboard-only pass and an accessibility-tree + contrast check.
3. Frameworks: avoid by default
- Default to no framework. Use the web platform directly (see §4).
- When a framework is genuinely warranted (real app-scale state/routing/SSR needs), the only acceptable choices are Svelte, Astro, or Preact.
- Never use React. Not Next.js, not CRA, not React under any wrapper. This is absolute.
4. Use the web platform; web components are the component model
- Reach for native web platform APIs first (Custom Elements, Shadow DOM, templates,
<dialog>, popover API,fetch, view transitions, form-associated elements, etc.). - The component model is Web Components (Custom Elements). Build reusable UI as web components rather than pulling in a framework's component system.
- Progressive enhancement and semantic HTML by default.
5. Component library: Web Awesome
- Web Awesome is the preferred component library — framework-agnostic web components (the Shoelace successor from the Font Awesome team), which fits §4 perfectly. Use it for ready-made components instead of hand-rolling or pulling another kit.
- Package & install:
npm i @awesome.me/webawesome(package name@awesome.me/webawesome). - It ships its own AI resources in
node_modulesafter install (see https://webawesome.com/docs/ai) — use these instead of guessing component APIs:- Agent Skill (recommended; Claude Code-compatible): a progressively-loaded skill directory inside
node_modules/@awesome.me/webawesome/. After installing, locate it (e.g.find node_modules/@awesome.me/webawesome -iname 'SKILL.md') and use it for component props/events/slots/theming. - llms.txt (fallback): a single-file complete API reference, also generated into
node_moduleson build. Attach/paste it when the agent skill isn't auto-loaded. - Note: there is no hosted llms.txt and no MCP — these are install-time artifacts, so install the package first.
- Agent Skill (recommended; Claude Code-compatible): a progressively-loaded skill directory inside
- Never guess Web Awesome component APIs — pull them from the shipped agent skill or llms.txt.
6. CSS: do it in CSS
- Never do in JavaScript what CSS can do. Layout, transitions, animations, theming, responsive behavior, scroll effects, state-driven styling (
:has(), container queries,:checked, etc.) belong in CSS. - Use modern CSS features when they fit: nesting, container queries,
:has(), cascade layers, custom properties,color-mix(), view transitions, subgrid, logical properties,clamp()/fluid type. - Never use Tailwind. Use plain modern CSS (custom properties + nesting), or CSS modules / scoped styles where a tool provides them. No utility-class frameworks.
7. Running locally
- Use Vite for anything needing a dev server/bundling, or
http-serverfor plain static files. Pick the lighter of the two that does the job. - Don't run package-install commands yourself. The user runs
npm install/npm i <pkg>themselves — print the exact command and wait for them to run it before continuing.
8. Static sites
- When a static-site generator is warranted, use 11ty (Eleventy). (Astro is also fine per §3 if a component-driven build is wanted.)
9. Hosting & deployment
- Host on GitHub Pages.
- Deploy via a GitHub Actions workflow (build → publish to Pages). Set this up as part of the work, don't leave deployment manual.
10. Backend / data (only when actually needed)
- Default to static / client-side — add a backend only when the task truly requires server-side logic or persistence.
- When it does: AWS Lambda for compute and DynamoDB for data. Don't reach for a heavier stack without confirming.
Quick decision checklist
- Can this be static + client-side? → yes: no backend.
- Can the platform do it without a dependency? → yes: no dependency.
- Can CSS do it without JS? → yes: do it in CSS.
- Do I actually need a framework? → only if yes, pick Svelte / Astro / Preact (never React).
- Components? → web components, prefer Web Awesome.
- Run with Vite or http-server; host on GitHub Pages via Actions.
- Sanity-check the result against Core Web Vitals and WCAG AA (keyboard pass, contrast, text alternatives).