{"slug":"frontend-developer","snapshot":{"role":"frontend","label":"Frontend Developer","degree":[{"count":427,"share":62.1,"value":"none_mentioned"},{"count":165,"share":24,"value":"required"},{"count":81,"share":11.8,"value":"or_equivalent"},{"count":15,"share":2.2,"value":"preferred"}],"salary":{"markets":[{"n":282,"p25":165000,"p75":222000,"median":197000,"country":"US","coverage":73.8,"currency":"USD","medianMax":225000,"medianMin":160000,"bySeniority":[{"n":113,"p25":173000,"p75":215000,"level":"senior","median":200000},{"n":48,"p25":205000,"p75":255000,"level":"staff","median":225000}]}],"coverage":47.2,"minSample":30},"skills":[{"slug":"react","label":"React","share":86.9,"margin":2.5,"category":"framework","requiredShare":83.6},{"slug":"typescript","label":"TypeScript","share":80.2,"margin":3,"category":"language","requiredShare":78.1},{"slug":"javascript","label":"JavaScript","share":54.4,"margin":3.7,"category":"language","requiredShare":52.9},{"slug":"web-performance","label":"Web performance","share":44.2,"margin":3.7,"category":"quality","requiredShare":42},{"slug":"css","label":"CSS","share":41.1,"margin":3.7,"category":"language","requiredShare":39.4},{"slug":"ux-collab","label":"Working with designers / UX","share":35.6,"margin":3.6,"category":"design","requiredShare":34.7},{"slug":"accessibility","label":"Accessibility (WCAG)","share":33.9,"margin":3.5,"category":"quality","requiredShare":31.7},{"slug":"testing","label":"Automated testing","share":33.6,"margin":3.5,"category":"testing","requiredShare":31.8},{"slug":"design-systems","label":"Design systems","share":32.7,"margin":3.5,"category":"design","requiredShare":28.6},{"slug":"code-review","label":"Code review","share":31.8,"margin":3.5,"category":"practice","requiredShare":31.5},{"slug":"html","label":"HTML","share":30.7,"margin":3.4,"category":"language","requiredShare":30.5},{"slug":"mentoring","label":"Mentoring","share":30.7,"margin":3.4,"category":"practice","requiredShare":29.5},{"slug":"system-design","label":"Architecture / system design","share":30.1,"margin":3.4,"category":"practice","requiredShare":29.5},{"slug":"ci-cd","label":"CI/CD","share":28.3,"margin":3.4,"category":"practice","requiredShare":22.8},{"slug":"responsive-design","label":"Responsive design","share":27.2,"margin":3.3,"category":"design","requiredShare":26.5},{"slug":"ai-tools","label":"AI coding tools","share":26.3,"margin":3.3,"category":"ai","requiredShare":23.7},{"slug":"rest","label":"REST APIs","share":24.3,"margin":3.2,"category":"api","requiredShare":22.4},{"slug":"nextjs","label":"Next.js","share":23.3,"margin":3.2,"category":"meta-framework","requiredShare":20.1},{"slug":"state-management","label":"State management","share":21.9,"margin":3.1,"category":"state","requiredShare":21.2},{"slug":"git","label":"Git","share":20.8,"margin":3,"category":"practice","requiredShare":18.8},{"slug":"aws","label":"AWS","share":19.2,"margin":2.9,"category":"cloud","requiredShare":11},{"slug":"observability","label":"Monitoring & analytics","share":18.9,"margin":2.9,"category":"quality","requiredShare":17.3},{"slug":"node","label":"Node.js","share":17.3,"margin":2.8,"category":"backend","requiredShare":13.2},{"slug":"agile","label":"Agile / Scrum","share":17.3,"margin":2.8,"category":"practice","requiredShare":15},{"slug":"sql","label":"SQL / databases","share":16.7,"margin":2.8,"category":"backend","requiredShare":11.9},{"slug":"e2e","label":"End-to-end testing (Cypress, Playwright)","share":16.6,"margin":2.8,"category":"testing","requiredShare":14},{"slug":"graphql","label":"GraphQL","share":15.6,"margin":2.7,"category":"api","requiredShare":14.4},{"slug":"python","label":"Python","share":15,"margin":2.7,"category":"backend","requiredShare":9.6},{"slug":"llm-apps","label":"Building LLM features","share":14.8,"margin":2.7,"category":"ai","requiredShare":12.2},{"slug":"data-viz","label":"Data visualisation","share":14.4,"margin":2.6,"category":"graphics","requiredShare":10},{"slug":"angular","label":"Angular","share":14.1,"margin":2.6,"category":"framework","requiredShare":13.1},{"slug":"jest","label":"Jest / Vitest","share":13.2,"margin":2.5,"category":"testing","requiredShare":11.2},{"slug":"websockets","label":"WebSockets / real-time","share":12.6,"margin":2.5,"category":"api","requiredShare":9.3},{"slug":"docker","label":"Docker / containers","share":12.5,"margin":2.5,"category":"cloud","requiredShare":7.7},{"slug":"tailwind","label":"Tailwind CSS","share":12.4,"margin":2.5,"category":"styling","requiredShare":10},{"slug":"vue","label":"Vue","share":12.2,"margin":2.4,"category":"framework","requiredShare":11.2},{"slug":"api-design","label":"API design","share":11.9,"margin":2.4,"category":"api","requiredShare":9.9},{"slug":"redux","label":"Redux","share":11.5,"margin":2.4,"category":"state","requiredShare":10.3},{"slug":"webpack","label":"Webpack","share":11.3,"margin":2.4,"category":"build","requiredShare":10.2},{"slug":"caching","label":"Redis / caching","share":11,"margin":2.3,"category":"backend","requiredShare":9.2},{"slug":"figma","label":"Figma","share":9.9,"margin":2.2,"category":"design","requiredShare":8.3},{"slug":"kubernetes","label":"Kubernetes","share":9.6,"margin":2.2,"category":"cloud","requiredShare":6},{"slug":"java","label":"Java / Kotlin (backend)","share":9.3,"margin":2.2,"category":"backend","requiredShare":5.7},{"slug":"vite","label":"Vite","share":9,"margin":2.1,"category":"build","requiredShare":8.1},{"slug":"ssr","label":"Server-side rendering","share":8.7,"margin":2.1,"category":"meta-framework","requiredShare":6.7},{"slug":"tanstack-query","label":"TanStack Query","share":8.1,"margin":2,"category":"state","requiredShare":6.8},{"slug":"react-native","label":"React Native","share":8,"margin":2,"category":"mobile","requiredShare":6.1},{"slug":"gcp","label":"Google Cloud","share":7.8,"margin":2,"category":"cloud","requiredShare":4.4},{"slug":"sass","label":"Sass / SCSS","share":7.7,"margin":2,"category":"styling","requiredShare":6.4},{"slug":"storybook","label":"Storybook","share":7.1,"margin":1.9,"category":"testing","requiredShare":4.9},{"slug":"micro-frontends","label":"Micro-frontends","share":7,"margin":1.9,"category":"meta-framework","requiredShare":4.2},{"slug":"webgl","label":"WebGL / 3D / Canvas","share":6.7,"margin":1.9,"category":"graphics","requiredShare":4.4},{"slug":"component-libraries","label":"Component libraries (MUI, Radix…)","share":6.5,"margin":1.8,"category":"styling","requiredShare":4.4},{"slug":"edge","label":"Vercel / Netlify / edge","share":6.3,"margin":1.8,"category":"cloud","requiredShare":4.8},{"slug":"bundlers","label":"Other bundlers (esbuild, Rollup…)","share":5.8,"margin":1.7,"category":"build","requiredShare":5.5},{"slug":"testing-library","label":"Testing Library","share":5.7,"margin":1.7,"category":"testing","requiredShare":4.8},{"slug":"monorepo","label":"Monorepos (Nx, Turborepo)","share":5.5,"margin":1.7,"category":"build","requiredShare":4.2},{"slug":"seo","label":"SEO","share":5.5,"margin":1.7,"category":"quality","requiredShare":4.8},{"slug":"azure","label":"Azure","share":5.5,"margin":1.7,"category":"cloud","requiredShare":2.8},{"slug":"zustand","label":"Zustand","share":5.4,"margin":1.7,"category":"state","requiredShare":4.9},{"slug":"nosql","label":"NoSQL (MongoDB, DynamoDB…)","share":5.4,"margin":1.7,"category":"backend","requiredShare":3.8},{"slug":"go","label":"Go","share":4.8,"margin":1.6,"category":"backend","requiredShare":2.9},{"slug":"web-security","label":"Web security","share":4.8,"margin":1.6,"category":"quality","requiredShare":3.5},{"slug":"css-in-js","label":"CSS-in-JS","share":4.8,"margin":1.6,"category":"styling","requiredShare":4.1},{"slug":"browser-internals","label":"Browser internals / DOM","share":4.8,"margin":1.6,"category":"quality","requiredShare":4.7},{"slug":"iac","label":"Infrastructure as code (Terraform)","share":4.5,"margin":1.6,"category":"cloud","requiredShare":2.3},{"slug":"auth","label":"Authentication (OAuth, SSO)","share":4.4,"margin":1.5,"category":"backend","requiredShare":3.1},{"slug":"data-pipelines","label":"Data pipelines (Spark, Airflow, ETL)","share":4.2,"margin":1.5,"category":"backend","requiredShare":3.1},{"slug":"messaging","label":"Message queues / event streaming","share":4.2,"margin":1.5,"category":"backend","requiredShare":2},{"slug":"distributed-systems","label":"Distributed systems","share":4.2,"margin":1.5,"category":"backend","requiredShare":3.3},{"slug":"spa","label":"Single-page apps","share":4.1,"margin":1.5,"category":"meta-framework","requiredShare":3.8},{"slug":"i18n","label":"Internationalisation","share":4.1,"margin":1.5,"category":"quality","requiredShare":3.3},{"slug":"linux","label":"Linux","share":3.9,"margin":1.5,"category":"backend","requiredShare":3.2},{"slug":"dotnet","label":".NET / C#","share":3.8,"margin":1.4,"category":"backend","requiredShare":2.9},{"slug":"animation","label":"Animation","share":3.6,"margin":1.4,"category":"design","requiredShare":2.2},{"slug":"microservices","label":"Microservices","share":3.5,"margin":1.4,"category":"backend","requiredShare":3.1},{"slug":"rxjs","label":"RxJS","share":3.2,"margin":1.3,"category":"state","requiredShare":2.8},{"slug":"rust","label":"Rust","share":2.6,"margin":1.2,"category":"backend","requiredShare":2.3},{"slug":"ruby","label":"Ruby / Rails","share":2.5,"margin":1.2,"category":"backend","requiredShare":1.3},{"slug":"cpp","label":"C++","share":2.5,"margin":1.2,"category":"backend","requiredShare":1.7},{"slug":"concurrency","label":"Concurrency / multithreading","share":2.5,"margin":1.2,"category":"backend","requiredShare":2.2},{"slug":"electron","label":"Electron / desktop","share":2.3,"margin":1.1,"category":"mobile","requiredShare":1.6},{"slug":"pwa","label":"Progressive web apps","share":2.3,"margin":1.1,"category":"meta-framework","requiredShare":1.3},{"slug":"mobx","label":"MobX","share":2.2,"margin":1.1,"category":"state","requiredShare":2},{"slug":"svelte","label":"Svelte","share":1.9,"margin":1,"category":"framework","requiredShare":1.7},{"slug":"jquery","label":"jQuery","share":1.7,"margin":1,"category":"framework","requiredShare":1.7},{"slug":"wasm","label":"WebAssembly","share":1.7,"margin":1,"category":"graphics","requiredShare":1},{"slug":"search","label":"Search (Elasticsearch)","share":1.5,"margin":0.9,"category":"backend","requiredShare":1},{"slug":"web-components","label":"Web Components","share":1.5,"margin":0.9,"category":"framework","requiredShare":1.2},{"slug":"serverless","label":"Serverless","share":1.3,"margin":0.8,"category":"cloud","requiredShare":0.7},{"slug":"php","label":"PHP","share":1.2,"margin":0.8,"category":"backend","requiredShare":1},{"slug":"css-modules","label":"CSS Modules","share":1,"margin":0.7,"category":"styling","requiredShare":0.7},{"slug":"pinia","label":"Pinia / Vuex","share":0.9,"margin":0.7,"category":"state","requiredShare":0.7},{"slug":"astro","label":"Astro","share":0.9,"margin":0.7,"category":"meta-framework","requiredShare":0.7},{"slug":"nuxt","label":"Nuxt","share":0.7,"margin":0.6,"category":"meta-framework","requiredShare":0.6},{"slug":"elixir","label":"Elixir / Erlang","share":0.6,"margin":0.6,"category":"backend","requiredShare":0.6},{"slug":"flutter","label":"Flutter","share":0.6,"margin":0.6,"category":"mobile","requiredShare":0.4},{"slug":"remix","label":"Remix","share":0.6,"margin":0.6,"category":"meta-framework","requiredShare":0.1},{"slug":"scala","label":"Scala","share":0.3,"margin":0.4,"category":"backend","requiredShare":0.3},{"slug":"ember","label":"Ember.js","share":0.3,"margin":0.4,"category":"framework","requiredShare":0.3},{"slug":"gatsby","label":"Gatsby","share":0.1,"margin":0.3,"category":"meta-framework","requiredShare":0.1},{"slug":"trpc","label":"tRPC","share":0.1,"margin":0.3,"category":"api","requiredShare":0}],"sources":["Greenhouse","Lever","Ashby"],"postings":{"raw":944,"unique":688,"companies":463},"countries":[{"count":357,"share":51.9,"value":"US"},{"count":58,"share":8.4,"value":"IN"},{"count":53,"share":7.7,"value":"CA"},{"count":31,"share":4.5,"value":"GB"},{"count":25,"share":3.6,"value":"unknown"},{"count":17,"share":2.5,"value":"PL"},{"count":15,"share":2.2,"value":"ES"},{"count":14,"share":2,"value":"DE"},{"count":13,"share":1.9,"value":"FR"},{"count":13,"share":1.9,"value":"KR"},{"count":11,"share":1.6,"value":"NL"},{"count":11,"share":1.6,"value":"SG"}],"crawledAt":"2026-11-13","seniority":[{"count":262,"share":38.1,"value":"senior"},{"count":252,"share":36.6,"value":"none"},{"count":98,"share":14.2,"value":"staff"},{"count":30,"share":4.4,"value":"lead"},{"count":20,"share":2.9,"value":"mid"},{"count":15,"share":2.2,"value":"junior"},{"count":11,"share":1.6,"value":"intern"}],"workplace":[{"count":262,"share":38.1,"value":"none"},{"count":154,"share":22.4,"value":"hybrid"},{"count":151,"share":21.9,"value":"remote"},{"count":121,"share":17.6,"value":"onsite"}],"experience":{"median":5,"buckets":[{"count":277,"share":40.3,"value":"none"},{"count":117,"share":17,"value":"5"},{"count":69,"share":10,"value":"8+"},{"count":67,"share":9.7,"value":"3"},{"count":47,"share":6.8,"value":"4"},{"count":42,"share":6.1,"value":"2"},{"count":31,"share":4.5,"value":"6"},{"count":20,"share":2.9,"value":"7"},{"count":16,"share":2.3,"value":"1"},{"count":2,"share":0.3,"value":"0"}],"statedShare":59.7},"generatedAt":"2026-11-13","extractVersion":"skills-v0.8"},"validation":{"labelled":400,"salaryAudit":{"checked":120,"correct":117},"skillRecall":95,"rolePrecision":92,"skillPrecision":97},"assessmentRole":"frontend","stack":{"path":"/careers/frontend-developer/tech-stack","core":{"label":"React","share":86.8},"picks":[{"label":"TypeScript","share":86.3},{"label":"Next.js","share":28.8},{"label":"REST APIs","share":21.2},{"label":"AWS","share":18.5},{"label":"Node.js","share":16.3},{"label":"Tailwind CSS","share":15.3},{"label":"End-to-end testing (Cypress, Playwright)","share":15.3}],"pickMin":15},"license":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/","credit":"Coursecrit, https://coursecrit.com/careers/frontend-developer","attributions":["Company list: LastRound AI ATS Company Directory (https://datahub.io/lastroundai-hiring-data/lastroundai-hiring-data/ats-directory), CC BY 4.0","Job postings: public job boards on Greenhouse, Lever and Ashby. Only aggregate counts are published, never posting text."]}}