Methodology
What this corpus is — and isn't
Design Drift tracks design hiring at ~300-500 growth-stage tech companies (Greenhouse + Ashby + Lever ATS APIs), augmented by a daily LinkedIn sample of new postings across ~20 design-title categories. The active corpus typically holds 1,500-3,000 design listings depending on the season and how many companies are currently hiring.
It is not"every design job in the world." LinkedIn alone has thousands of active design postings on any given US day; comprehensive scraping at that scale requires residential-proxy infrastructure beyond this project's budget. Our claim is more modest and more honest: a defensible, citable slice of the design hiring market, weighted toward US-headquartered, growth-stage tech.
Data sources
We ingest from five active pipes, in declining order of volume:
- LinkedIn via the Apify
valig/linkedin-jobs-scraperactor. Daily, US-only, last-24-hour window. ~20 title queries across product, UX, UI, design engineering, AI design, content, visual, brand, motion, research, leadership, and operations. Each query is wrapped in a boolean clause requiring an explicit work-mode tag (hybrid,remote, oronsite) to filter out part-time/spam noise. - Greenhouse public Job Board API (
boards-api.greenhouse.io). Direct ATS pull from a curated list of design-active companies. - Ashby public job board API (
jobs.ashbyhq.com). Same pattern. - Lever public posting API (
api.lever.co/v0/postings). Same pattern. Smaller footprint — most companies have migrated off Lever to Greenhouse or Ashby. - Dribbble Jobs RSS and WeWorkRemotely RSS for design-specific feed coverage of agencies, freelance, and remote-only roles.
The full curated company list is in src/lib/taxonomies/ats-companies.yaml. Companies that migrate ATS providers are marked active: false with a dated comment rather than deleted, so historical data remains attributable.
What counts as a "design" listing
Listings pass through isDesignRelevantTitle() in src/lib/scrapers/greenhouse-client.ts, which applies two filters:
- Inclusion: the title must contain at least one of ~25 design keywords (product/UX/UI/visual/brand/motion/interaction/service/content designer; design engineer; design lead/director/manager/head; UX researcher; design systems engineer; AI designer; growth designer; design ops).
- Exclusion:the title must NOT contain any of ~50 disqualifier keywords for physical engineering false positives — chip / IC / photonics / RTL / floorplan / mixed-signal / CAD / VLSI; civil / aerospace / mechanical / hydraulic / wastewater / roadway / construction / multi-disciplinary; defense / weapons / missile. The "design engineer" title in particular is the dominant entry point for chip-design and civil-engineering pollution; see commit
6ac33c1and2026-04-30filter expansion.
Canonicalization
Raw titles (e.g., "Sr. Product Designer, Growth") map to canonical role slugs via a curated taxonomy at src/lib/taxonomies/roles.ts. A second-pass enrichment with Claude Haiku assigns canonical role + seniority + remote posture; emerging titles that don't match any canonical role are queued in ProposedCanonical for human review.
Salary data
Salary figures come from two places: (a) structured compensation fields returned by some ATS providers (Ashby), and (b) regex extraction from listing text during enrichment. The listing's salaryRangeDisclosed flag distinguishes pay-transparency-tagged listings from inferred ones. Aggregate pages publish only when at least 5 listings disclose a range, and the sample size is always shown (n=X).
Cadence
The full pipeline runs daily at 06:00 UTC via Trigger.dev: scrape (Greenhouse → Ashby → Lever → Dribbble → WWR → LinkedIn), enrich (capped at 250 listings/run for Anthropic budget safety), aggregate, word rollup, drift alerts. Pages revalidate after aggregation via tag-based ISR. The dateModified on every page reflects the last aggregation run, not the last deploy.
Known limitations
- US-weighted. LinkedIn queries default to
location: "United States"; ATS company seeding skews US-headquartered. - Tech-heavy. Greenhouse/Ashby/Lever are software-industry ATSes. Visual designers, brand designers, motion designers, industrial/service/game designers, and in-house design at non-tech firms are systematically under-represented.
- Pay-transparency disclosure rate ~40-45% across the corpus; salary analysis pages are restricted to disclosed listings, so they describe the disclosing subset, not the whole market.
- Agency & freelance roles rely primarily on Dribbble + WWR, which are narrow proxies; agency hiring at scale is largely uncovered.
- Junior representation is thin. Roughly 4-5% of the corpus is junior-tagged, which likely reflects both (a) genuine market scarcity and (b) search-query bias toward senior titles. Treat junior cohort numbers as suggestive, not definitive.
- Seed data (Kaggle LinkedIn postings 2023-2024) is used only for historical word-frequency context; it is visibly separated from live data on all time-series charts and never enters salary or per-listing analysis.
Byline and AI disclosure
Data curation by Brian Tighe. Pipeline orchestration and analysis are assisted by Claude (Anthropic); all published conclusions are reviewed by the editor before going live.