Skip to content

Instantly share code, notes, and snippets.

@aseba
Last active February 3, 2026 08:42
Show Gist options
  • Select an option

  • Save aseba/9b6ab3cb9033394096cdca3435d0f026 to your computer and use it in GitHub Desktop.

Select an option

Save aseba/9b6ab3cb9033394096cdca3435d0f026 to your computer and use it in GitHub Desktop.
Remotely.works Network Analysis Report - February 2026

Network Analysis Report

Generated: February 2, 2026
Scope: Network-accepted candidates who are open to opportunities
Total Candidates: 5,702


Executive Summary

The Remotely.works talent network consists of 5,702 candidates who are network-accepted and currently open to opportunities. The network is heavily weighted toward:

  • Senior engineering talent (IC4/IC5 = 84% of network)
  • Backend and Fullstack roles (combined 74% of role assignments)
  • JavaScript/React/AWS ecosystem (top 3 tech strengths)
  • Latin American talent (Brazil 49%, Argentina 11%, Mexico 10%)

1. Seniority Distribution

Seniority Count % of Network
IC4 3,217 56.42%
IC5 1,590 27.88%
IC3 481 8.44%
Unknown 137 2.40%
IC6 133 2.33%
Manager 82 1.44%
IC2 45 0.79%
Lead 8 0.14%
Director 7 0.12%
VP 1 0.02%
Partner 1 0.02%

Key Insight: IC4 (Senior) and IC5 (Staff) comprise 84% of the network. Junior talent (IC2/IC3) is scarce at only 9%.

-- Query: Seniority distribution
SELECT 
    COALESCE(ts_interview->>'seniority', 'unknown') as seniority,
    COUNT(*) as count,
    ROUND(COUNT(*)::numeric * 100 / SUM(COUNT(*)) OVER (), 2) as pct_of_network
FROM candidates 
WHERE status = 'network_accepted' 
  AND open_to_opportunities = true
  AND deleted_at IS NULL
GROUP BY ts_interview->>'seniority'
ORDER BY count DESC;

2. Role Distribution

By Role Kind

Kind Candidates % of Network
Engineering 5,091 89.28%
Other 589 10.33%
Design 212 3.72%

Note: Candidates can have multiple roles, so percentages sum to >100%

By Specific Role

Role Kind Count % of Network
Backend Engineer engineering 2,215 38.85%
Fullstack Engineer engineering 2,016 35.36%
Frontend Engineer engineering 930 16.31%
Mobile Engineer engineering 446 7.82%
QA Engineer engineering 297 5.21%
Data Engineer engineering 295 5.17%
DevOps Engineer engineering 280 4.91%
QA Analyst other 209 3.67%
Engineering Manager engineering 197 3.45%
UX/UI Designer design 166 2.91%
Data/BI Analyst other 136 2.39%
Machine Learning engineering 136 2.39%
Solutions Architect engineering 130 2.28%
Data Scientist engineering 129 2.26%
Product Designer design 106 1.86%
Customer Support Engineer engineering 90 1.58%
Project Manager other 85 1.49%
Product Manager other 80 1.40%
Other engineering 71 1.25%
Customer Success Specialist other 67 1.18%
Salesforce Engineer engineering 50 0.88%
Business Analyst other 20 0.35%
Security Engineer engineering 20 0.35%
Scrum Master engineering 19 0.33%
Game Engineer engineering 14 0.25%
Marketing Analyst other 13 0.23%
Account Executive other 5 0.09%
UX Researcher design 3 0.05%
Release Manager engineering 3 0.05%
Graphic Designer design 3 0.05%

Key Insight: Backend + Fullstack = 74% of the network. Design roles (UX/UI, Product Designer, Graphic Designer, UX Researcher) represent only 4.87% combined.

-- Query: Role distribution
SELECT 
    jor.name as role,
    jor.kind,
    COUNT(DISTINCT c.id) as candidate_count,
    ROUND(COUNT(DISTINCT c.id)::numeric * 100 / (
        SELECT COUNT(*) FROM candidates 
        WHERE status = 'network_accepted' AND open_to_opportunities = true AND deleted_at IS NULL
    ), 2) as pct_of_network
FROM candidates c
CROSS JOIN LATERAL unnest(c.roles) as role_id
JOIN job_opening_role jor ON jor.id = role_id
WHERE c.status = 'network_accepted' 
  AND c.open_to_opportunities = true
  AND c.deleted_at IS NULL
  AND jor.deleted_at IS NULL
GROUP BY jor.id, jor.name, jor.kind
ORDER BY candidate_count DESC;

3. Role × Seniority Matrix

Role IC2 IC3 IC4 IC5 IC6 Leadership Total
Backend Engineer 9 137 1,267 707 57 10 2,215
Fullstack Engineer 9 150 1,189 591 33 7 2,016
Frontend Engineer 9 83 582 230 8 1 930
Mobile Engineer 1 27 277 121 7 2 446
QA Engineer 0 27 179 81 2 3 297
Data Engineer 4 41 171 65 4 3 295
DevOps Engineer 0 27 137 99 11 1 280
QA Analyst 2 28 111 63 2 3 209
Engineering Manager 0 0 7 73 49 67 197
UX/UI Designer 2 16 97 42 2 3 166
Data/BI Analyst 1 21 84 23 0 1 136
Machine Learning 0 14 76 33 10 1 136
Solutions Architect 0 0 29 73 16 10 130
Data Scientist 0 19 78 23 4 1 129
Product Designer 1 2 48 50 2 2 106
Customer Support Engineer 12 19 47 10 0 2 90
Project Manager 0 10 45 17 3 10 85
Product Manager 0 7 25 19 7 11 80
Other 1 12 25 19 3 7 71
Customer Success Specialist 3 11 42 9 0 0 67
Salesforce Engineer 0 1 27 21 1 0 50
Business Analyst 0 4 12 2 0 1 20
Security Engineer 0 1 6 13 0 0 20
Scrum Master 0 0 8 6 2 1 19
Game Engineer 0 1 8 5 0 0 14
Marketing Analyst 3 2 8 0 0 0 13
Account Executive 0 0 0 0 0 0 5
Release Manager 0 0 1 1 1 0 3
UX Researcher 0 0 2 1 0 0 3
Graphic Designer 0 0 2 1 0 0 3

Leadership includes: lead, manager, director, vp, partner

-- Query: Role × Seniority matrix
SELECT 
    jor.name as role,
    SUM(CASE WHEN ts_interview->>'seniority' = 'IC2' THEN 1 ELSE 0 END) as IC2,
    SUM(CASE WHEN ts_interview->>'seniority' = 'IC3' THEN 1 ELSE 0 END) as IC3,
    SUM(CASE WHEN ts_interview->>'seniority' = 'IC4' THEN 1 ELSE 0 END) as IC4,
    SUM(CASE WHEN ts_interview->>'seniority' = 'IC5' THEN 1 ELSE 0 END) as IC5,
    SUM(CASE WHEN ts_interview->>'seniority' = 'IC6' THEN 1 ELSE 0 END) as IC6,
    SUM(CASE WHEN ts_interview->>'seniority' IN ('lead','manager','director','vp','partner') THEN 1 ELSE 0 END) as leadership,
    COUNT(DISTINCT c.id) as total
FROM candidates c
CROSS JOIN LATERAL unnest(c.roles) as role_id
JOIN job_opening_role jor ON jor.id = role_id
WHERE c.status = 'network_accepted' 
  AND c.open_to_opportunities = true
  AND c.deleted_at IS NULL
  AND jor.deleted_at IS NULL
GROUP BY jor.name
ORDER BY total DESC;

4. Tech Strengths (Top 100)

Based on ts_interview.tech_strengths field:

Rank Tech Strength Candidates % of Network
1 JavaScript 1,958 34.34%
2 AWS 1,830 32.09%
3 React 1,812 31.78%
4 TypeScript 1,498 26.27%
5 Python 1,495 26.22%
6 Node.js 1,290 22.62%
7 Java 1,255 22.01%
8 SQL 985 17.27%
9 PostgreSQL 888 15.57%
10 Docker 828 14.52%
11 C# 648 11.36%
12 MySQL 599 10.51%
13 Kubernetes 587 10.29%
14 MongoDB 546 9.58%
15 .NET 543 9.52%
16 Azure 539 9.45%
17 Angular 516 9.05%
18 Springboot 465 8.16%
19 GCP 436 7.65%
20 Vue.js 413 7.24%
21 Next.js 404 7.09%
22 PHP 399 7.00%
23 Jira 386 6.77%
24 Spring 382 6.70%
25 Kotlin 361 6.33%
26 Terraform 331 5.80%
27 Jenkins 315 5.52%
28 CI/CD 306 5.37%
29 Django 293 5.14%
30 Express 288 5.05%
31 SQL Server 283 4.96%
32 Go (Golang) 279 4.89%
33 CSS 267 4.68%
34 Figma 264 4.63%
35 Angular.js 263 4.61%
36 Postman 251 4.40%
37 GraphQL 248 4.35%
38 Selenium 239 4.19%
39 HTML 228 4.00%
40 Kafka 225 3.95%
41 Ruby on Rails 223 3.91%
42 .NET Core 221 3.88%
43 Laravel 218 3.82%
44 Cypress 205 3.60%
45 Redis 204 3.58%
46 React Native 204 3.58%
47 Oracle Database 198 3.47%
48 Nest.js 192 3.37%
49 Android 191 3.35%
50 Flask 190 3.33%
51 Redux 187 3.28%
52 Swift 183 3.21%
53 Ruby 183 3.21%
54 Git 181 3.17%
55 PowerBI 177 3.10%
56 FastAPI 165 2.89%
57 Linux 163 2.86%
58 Pandas 163 2.86%
59 iOS 156 2.74%
60 Airflow 150 2.63%
61 ASP.Net 147 2.58%
62 Databricks 146 2.56%
63 GitHub Actions 146 2.56%
64 DynamoDB 145 2.54%
65 Playwright 134 2.35%
66 ETL 134 2.35%
67 REST 123 2.16%
68 SCRUM 122 2.14%
69 Azure DevOps 122 2.14%
70 Confluence 120 2.10%
71 Jest 119 2.09%
72 Github 117 2.05%
73 AWS Lambda 115 2.02%
74 SalesForce 113 1.98%
75 Grafana 112 1.96%
76 NumPy 111 1.95%
77 LLMs 111 1.95%
78 Tableau 109 1.91%
79 Tensorflow 109 1.91%
80 Rest API 108 1.89%
81 Snowflake 108 1.89%
82 PySpark 103 1.81%
83 Microservices 102 1.79%
84 Datadog 98 1.72%
85 C++ 98 1.72%
86 ElasticSearch 98 1.72%
87 BigQuery 93 1.63%
88 PyTorch 93 1.63%
89 SwiftUI 88 1.54%
90 RabbitMQ 87 1.53%
91 Miro 87 1.53%
92 Ansible 87 1.53%
93 Flutter 85 1.49%
94 Agile Methodology 81 1.42%
95 Bash 81 1.42%
96 Firebase 81 1.42%
97 Apache Spark 80 1.40%
98 Scala 79 1.39%
99 scikit-learn 78 1.37%
100 Objective-C 75 1.32%

Key Insight: The network is dominated by the JavaScript/React ecosystem (34% JavaScript, 32% React) and cloud infrastructure (32% AWS, 9% Azure, 8% GCP). Python is strong at 26%, while Go is relatively underrepresented at 5%.

-- Query: Tech strengths distribution
SELECT 
    t.name as tech_strength,
    COUNT(DISTINCT c.id) as candidate_count,
    ROUND(COUNT(DISTINCT c.id)::numeric * 100 / (
        SELECT COUNT(*) FROM candidates 
        WHERE status = 'network_accepted' AND open_to_opportunities = true AND deleted_at IS NULL
    ), 2) as pct_of_network
FROM candidates c
CROSS JOIN LATERAL jsonb_array_elements_text(c.ts_interview->'tech_strengths') as strength_id
JOIN tags t ON t.id = strength_id::int
WHERE c.status = 'network_accepted' 
  AND c.open_to_opportunities = true
  AND c.deleted_at IS NULL
  AND t.deleted_at IS NULL
GROUP BY t.id, t.name
ORDER BY candidate_count DESC;

5. Experience Distribution

Experience Bucket Count % of Network
0-3 years 410 7.19%
4-5 years 658 11.54%
6-8 years 1,551 27.20%
9-10 years 1,055 18.50%
11-15 years 1,314 23.04%
15+ years 714 12.52%

Key Insight: 81% of candidates have 6+ years of experience. Early-career talent (0-5 years) represents only 19%.

-- Query: Experience distribution
SELECT 
    CASE 
        WHEN experience_years <= 3 THEN '0-3 years'
        WHEN experience_years <= 5 THEN '4-5 years'
        WHEN experience_years <= 8 THEN '6-8 years'
        WHEN experience_years <= 10 THEN '9-10 years'
        WHEN experience_years <= 15 THEN '11-15 years'
        ELSE '15+ years'
    END as experience_bucket,
    COUNT(*) as count,
    ROUND(COUNT(*)::numeric * 100 / SUM(COUNT(*)) OVER (), 2) as pct_of_network
FROM candidates 
WHERE status = 'network_accepted' 
  AND open_to_opportunities = true
  AND deleted_at IS NULL
GROUP BY 1
ORDER BY MIN(experience_years);

6. Geographic Distribution (Top 20)

Country Count % of Network
BR (Brazil) 2,795 49.02%
AR (Argentina) 645 11.31%
MX (Mexico) 552 9.68%
CO (Colombia) 441 7.73%
UY (Uruguay) 147 2.58%
Unknown 130 2.28%
PE (Peru) 104 1.82%
CR (Costa Rica) 95 1.67%
CL (Chile) 89 1.56%
DO (Dominican Republic) 85 1.49%
US (United States) 69 1.21%
BO (Bolivia) 68 1.19%
EC (Ecuador) 61 1.07%
ES (Spain) 51 0.89%
GT (Guatemala) 33 0.58%
PY (Paraguay) 31 0.54%
CA (Canada) 31 0.54%
PT (Portugal) 28 0.49%
VE (Venezuela) 26 0.46%
SV (El Salvador) 25 0.44%

Key Insight: Nearly half (49%) of the network is from Brazil. Top 4 countries (BR, AR, MX, CO) represent 78% of the network.

-- Query: Geographic distribution
SELECT 
    COALESCE(ts_interview->>'country', 'Unknown') as country,
    COUNT(*) as count,
    ROUND(COUNT(*)::numeric * 100 / SUM(COUNT(*)) OVER (), 2) as pct_of_network
FROM candidates 
WHERE status = 'network_accepted' 
  AND open_to_opportunities = true
  AND deleted_at IS NULL
GROUP BY ts_interview->>'country'
ORDER BY count DESC
LIMIT 20;

7. Last Touchpoint Analysis

A touchpoint is defined as communication FROM the candidate:

  • Email: Email received FROM the candidate (via messages table where from_id = candidate.user_id)
  • WhatsApp: Message received FROM the candidate (direction = 'received')
  • Recording: Interview/meeting recording associated with the candidate

Time Since Last Touchpoint

Bucket Count % of Network
Last 30 days 568 9.96%
31-90 days 414 7.26%
91-180 days 612 10.73%
181-365 days 1,031 18.07%
Over 1 year 2,781 48.75%
No touchpoint 299 5.24%

Key Insight: 54% of candidates (3,080) have not communicated in over a year or have no touchpoint record. Only 10% have had communication in the last 30 days.

-- Query: Last touchpoint analysis (emails FROM candidates)
WITH candidate_emails AS (
    SELECT c.id as candidate_id, MAX(m.date) as last_email_date
    FROM candidates c
    JOIN messages m ON m.candidate_id = c.id AND m.from_id = c.user_id AND m.kind = 'email'
    WHERE c.status = 'network_accepted' 
      AND c.open_to_opportunities = true
      AND c.deleted_at IS NULL AND m.deleted_at IS NULL
    GROUP BY c.id
),
candidate_whatsapp AS (
    SELECT t.candidate_id, MAX(m.created_at) as last_whatsapp_date
    FROM im_threads t
    JOIN im_messages m ON m.thread_id = t.id
    JOIN candidates c ON c.id = t.candidate_id
    WHERE c.status = 'network_accepted' 
      AND c.open_to_opportunities = true
      AND c.deleted_at IS NULL AND m.deleted_at IS NULL
      AND m.direction = 'received'
    GROUP BY t.candidate_id
),
candidate_recordings AS (
    SELECT r.candidate_id, MAX(r.started_at) as last_recording_date
    FROM recordings r
    JOIN candidates c ON c.id = r.candidate_id
    WHERE c.status = 'network_accepted' 
      AND c.open_to_opportunities = true
      AND c.deleted_at IS NULL AND r.deleted_at IS NULL
    GROUP BY r.candidate_id
),
all_touchpoints AS (
    SELECT 
        c.id as candidate_id,
        GREATEST(
            COALESCE(ce.last_email_date, '1970-01-01'::timestamp),
            COALESCE(cw.last_whatsapp_date, '1970-01-01'::timestamp),
            COALESCE(cr.last_recording_date, '1970-01-01'::timestamp)
        ) as last_touchpoint
    FROM candidates c
    LEFT JOIN candidate_emails ce ON ce.candidate_id = c.id
    LEFT JOIN candidate_whatsapp cw ON cw.candidate_id = c.id
    LEFT JOIN candidate_recordings cr ON cr.candidate_id = c.id
    WHERE c.status = 'network_accepted' 
      AND c.open_to_opportunities = true
      AND c.deleted_at IS NULL
),
bucketed AS (
    SELECT 
        CASE 
            WHEN last_touchpoint = '1970-01-01'::timestamp THEN 'No touchpoint'
            WHEN last_touchpoint >= NOW() - INTERVAL '30 days' THEN 'Last 30 days'
            WHEN last_touchpoint >= NOW() - INTERVAL '90 days' THEN '31-90 days'
            WHEN last_touchpoint >= NOW() - INTERVAL '180 days' THEN '91-180 days'
            WHEN last_touchpoint >= NOW() - INTERVAL '365 days' THEN '181-365 days'
            ELSE 'Over 1 year'
        END as touchpoint_bucket
    FROM all_touchpoints
)
SELECT touchpoint_bucket, COUNT(*) as count,
    ROUND(COUNT(*)::numeric * 100 / SUM(COUNT(*)) OVER (), 2) as pct_of_network
FROM bucketed
GROUP BY touchpoint_bucket;

Touchpoint Coverage by Type

Touchpoint Type Candidates with Record % of Network
Recording 4,104 71.94%
WhatsApp (from candidate) 3,803 66.66%
Email (from candidate) 3,518 61.67%

Most Recent Touchpoint Type

Most Recent Type Count % of Network
WhatsApp 3,131 54.88%
Recording 1,203 21.09%
Email 1,072 18.79%
None 299 5.24%

Stale Candidates by Role (Over 1 Year Since Touchpoint)

Role Stale Count Total in Role Stale %
Backend Engineer 1,345 2,214 60.7%
Fullstack Engineer 1,091 2,017 54.1%
Frontend Engineer 526 930 56.6%
Mobile Engineer 308 446 69.1%
DevOps Engineer 134 280 47.9%
Data Engineer 128 295 43.4%
QA Engineer 117 297 39.4%
Engineering Manager 107 197 54.3%
Data/BI Analyst 80 136 58.8%
Solutions Architect 72 130 55.4%
QA Analyst 71 210 33.8%
UX/UI Designer 61 166 36.7%
Data Scientist 51 129 39.5%
Machine Learning 51 136 37.5%
Other 49 71 69.0%

Key Insight: Mobile Engineers (69.1%), "Other" roles (69.0%), and Backend Engineers (60.7%) have the highest staleness rates. QA Analysts (33.8%) and UX/UI Designers (36.7%) are the most engaged.


8. Tech Stack Combinations Analysis

This section analyzes combinations of tech strengths to identify common patterns and gaps.

Top Tech Strength Pairs (Co-occurrence)

Skill 1 Skill 2 Count % of Network
JavaScript React 1,262 22.12%
JavaScript TypeScript 1,140 19.98%
React TypeScript 1,045 18.32%
Node.js React 910 15.95%
JavaScript Node.js 866 15.18%
Node.js TypeScript 797 13.97%
Python AWS 754 13.22%
React AWS 621 10.89%
JavaScript AWS 599 10.50%
AWS Docker 580 10.17%
PostgreSQL AWS 551 9.66%
TypeScript AWS 541 9.48%
Java Springboot 457 8.01%
AWS Kubernetes 452 7.92%
C# .NET 443 7.77%
Docker Kubernetes 403 7.06%
React Next.js 385 6.75%
Java Spring 371 6.50%
Django Python 281 4.93%

Key Insight: The React + Node.js + TypeScript stack dominates. Python + AWS is the strongest non-JavaScript pairing.

Frontend Framework Distribution (Frontend/Fullstack Roles)

Framework Candidates % of Frontend/Fullstack
React 1,631 67.59%
Angular 466 19.31%
Vue.js 393 16.29%
Next.js 384 15.91%
Angular.js 230 9.53%
Svelte 16 0.66%
Ember 7 0.29%

Key Insight: React dominates at 68%. Vue.js and Svelte are underrepresented compared to market demand.

Backend Language Distribution (Backend/Fullstack Roles)

Language Candidates % of Backend/Fullstack
Node.js 1,136 36.56%
Java 858 27.62%
Python 715 23.01%
C# 528 16.99%
.NET 478 15.38%
PHP 356 11.46%
Go (Golang) 229 7.37%
Ruby 153 4.92%
Elixir 61 1.96%
Scala 46 1.48%
Rust 25 0.80%

Key Insight: Go (7.4%), Rust (0.8%), and Elixir (2%) are significantly underrepresented given market demand.

Fullstack Stack Combinations (Frontend + Backend)

Frontend Backend Count % of Fullstack
React Node.js 778 38.57%
React Python 276 13.68%
React Java 224 11.11%
Next.js Node.js 210 10.41%
Vue.js Node.js 159 7.88%
Angular Node.js 158 7.83%
React C# 158 7.83%
React .NET 156 7.73%
React PHP 146 7.24%
Angular C#/.NET 125 6.20%
Vue.js PHP 114 5.65%
Angular Java 103 5.11%
React Ruby 78 3.87%
React Go 61 3.02%
Vue.js Python 63 3.12%
Vue.js Go 16 0.79%

Underrepresented Fullstack Combos:

Combination Count Notes
Vue.js + Go 16 High demand, very rare
Next.js + Go 10 Modern stack, scarce
Svelte + Any 9 Emerging framework, almost none
React + Rust 7 Cutting-edge, extremely rare
Angular + Python 43 Enterprise combo, limited

Backend Engineer Language Breakdown

Language Count % of Backend
Java 734 33.15%
Node.js 620 28.00%
Python 545 24.62%
C# 419 18.93%
.NET 384 17.34%
PHP 248 11.20%
Go (Golang) 205 9.26%
Kotlin 161 7.27%
Ruby 129 5.83%
Elixir 50 2.26%
Scala 38 1.72%
Rust 19 0.86%

Mobile Engineer Platform Breakdown

Technology Count % of Mobile
Kotlin 181 40.58%
Swift 174 39.01%
Android 165 37.00%
iOS 145 32.51%
Java 142 31.84%
React Native 88 19.73%
SwiftUI 88 19.73%
Objective-C 68 15.25%
Flutter 61 13.68%
Jetpack Compose 16 3.59%

Key Insight: Native development (Kotlin/Swift) dominates. Flutter (13.7%) is underrepresented given its growing popularity.

Cloud + Infrastructure Combinations (DevOps/Backend/Architect Roles)

Cloud Infrastructure Count % of Infra Roles
AWS Docker 441 17.65%
AWS Kubernetes 369 14.77%
AWS Terraform 244 9.76%
AWS Jenkins 140 5.60%
GCP Kubernetes 135 5.40%
GCP Docker 130 5.20%
GCP Terraform 98 3.92%
Azure Docker 97 3.88%
Azure Kubernetes 91 3.64%
AWS GitHub Actions 84 3.36%

Key Insight: AWS dominates cloud. GCP and Azure combinations are significantly less common.

Data/ML Stack (Data Roles)

Technology Count % of Data Roles
Python 493 88.35%
SQL 368 65.95%
Airflow 141 25.27%
Databricks 138 24.73%
PowerBI 134 24.01%
Pandas 131 23.48%
ETL 105 18.82%
Tensorflow 102 18.28%
PySpark 96 17.20%
Snowflake 95 17.03%
PyTorch 84 15.05%
Tableau 84 15.05%
BigQuery 78 13.98%
LLMs 73 13.08%
scikit-learn 71 12.72%
DBT 61 10.93%

Key Insight: Python + SQL is the foundation (88%/66%). Modern data stack (DBT, Snowflake, Databricks) has good representation. LLM expertise (13%) is growing.


Summary of Identified Gaps

Gap Category Specific Gap Current Supply
Frontend Frameworks Vue.js specialists 16.29%
Svelte 0.66%
Backend Languages Go (Golang) 7-9%
Rust <1%
Elixir ~2%
Fullstack Combos Vue.js + Go 16 people
Vue.js + Python 63 people
Next.js + Go 10 people
Svelte + anything 9 people
Mobile Flutter 13.68%
Cloud GCP expertise ~5-7%
Azure expertise ~4%

9. 2025 Job Demand vs Candidate Supply Gap Analysis

This section analyzes 677 job openings that were open at some point during 2025 and compares their requirements against the current candidate supply.

2025 Job Overview

  • Total jobs open during 2025: 677
  • Status: 637 closed, 34 published, 6 draft

Role Demand vs Supply

Role Jobs 2025 Candidates Candidates/Job Gap Assessment
Fullstack Engineer 208 (30.7%) 2,017 9.7 ⚠️ Moderate
Backend Engineer 186 (27.5%) 2,214 11.9 ✅ Good
Frontend Engineer 113 (16.7%) 930 8.2 ⚠️ Moderate
QA Engineer 46 (6.8%) 297 6.5 ⚠️ Tight
Mobile Engineer 38 (5.6%) 446 11.7 ✅ Good
DevOps Engineer 37 (5.5%) 280 7.6 ⚠️ Moderate
Data Engineer 28 (4.1%) 295 10.5 ✅ Good
Machine Learning 17 (2.5%) 136 8.0 ⚠️ Moderate
QA Analyst 13 (1.9%) 210 16.2 ✅ Good
Data Scientist 12 (1.8%) 129 10.8 ✅ Good
UX/UI Designer 12 (1.8%) 166 13.8 ✅ Good
Product Designer 9 (1.3%) 106 11.8 ✅ Good
Engineering Manager 8 (1.2%) 197 24.6 ✅ Good
Solutions Architect 7 (1.0%) 130 18.6 ✅ Good
Product Manager 6 (0.9%) 81 13.5 ✅ Good

Seniority Demand vs Supply

Seniority Jobs 2025 % Demand Candidates % Supply Candidates/Job Gap
IC5 272 40.2% 1,590 27.9% 5.8 ⚠️ Tight
IC4 233 34.4% 3,221 56.5% 13.8 ✅ Surplus
IC6 107 15.8% 133 2.3% 1.2 🔴 Critical
Lead 64 9.5% 8 0.1% 0.1 🔴 Critical
IC3 46 6.8% 480 8.4% 10.4 ✅ Good
Manager 33 4.9% 82 1.4% 2.5 ⚠️ Tight
IC2 10 1.5% 45 0.8% 4.5 ⚠️ Moderate

Key Insight: IC6 and Lead seniorities are critically undersupplied. Demand heavily favors IC5 (40%) but supply is concentrated at IC4 (57%).

Skill/Stack Demand vs Supply

Skill Jobs 2025 Candidates Candidates/Job Gap
React 187 (36%) 1,814 9.7 ⚠️ Moderate
Python 162 (31%) 1,495 9.2 ⚠️ Moderate
Node.js 98 (19%) 1,291 13.2 ✅ Good
TypeScript 95 (18%) 1,498 15.8 ✅ Good
JavaScript 71 (14%) 1,960 27.6 ✅ Surplus
AWS 40 (8%) 1,829 45.7 ✅ Surplus
Go (Golang) 30 (6%) 279 9.3 ⚠️ Moderate
Java 29 (6%) 1,256 43.3 ✅ Surplus
Vue.js 28 (5%) 413 14.8 ✅ Good
Next.js 24 (5%) 404 16.8 ✅ Good
LLMs 21 (4%) 111 5.3 🔴 Tight
Django 22 (4%) 293 13.3 ✅ Good
PostgreSQL 16 (3%) 891 55.7 ✅ Surplus
OpenAI 12 (2%) 52 4.3 🔴 Critical
LangChain 11 (2%) 56 5.1 🔴 Tight
GenAI 11 (2%) 23 2.1 🔴 Critical
Flutter 11 (2%) 85 7.7 ⚠️ Tight
Playwright 14 (3%) 134 9.6 ⚠️ Moderate
RAG 7 (1%) 34 4.9 🔴 Critical

Critical Gaps: Role + Seniority Combinations

These combinations have < 2 candidates per job - critical supply shortage:

Role Seniority Jobs 2025 Candidates Gap
Fullstack Engineer IC6 48 33 🔴 0.7/job
Backend Engineer IC6 41 57 🔴 1.4/job
Backend Engineer Lead 23 1 🔴 0.0/job
Fullstack Engineer Lead 22 0 🔴 0.0/job
Frontend Engineer IC6 17 8 🔴 0.5/job
Machine Learning IC5 17 33 🔴 1.9/job
Backend Engineer Manager 14 7 🔴 0.5/job
Machine Learning IC6 13 10 🔴 0.8/job
Fullstack Engineer Manager 12 6 🔴 0.5/job
QA Engineer Lead 10 0 🔴 0.0/job
QA Engineer IC6 9 2 🔴 0.2/job
DevOps Engineer IC6 9 11 🔴 1.2/job
Frontend Engineer Lead 8 0 🔴 0.0/job
Machine Learning Lead 7 0 🔴 0.0/job
Data Engineer IC6 6 4 🔴 0.7/job
Data Scientist IC6 6 4 🔴 0.7/job

AI/ML Skills Gap (High-Growth Market)

Skill Jobs 2025 Candidates Candidates/Job Assessment
LLMs 21 111 5.3 🔴 Tight
OpenAI 12 52 4.3 🔴 Critical
LangChain 11 56 5.1 🔴 Tight
GenAI 11 23 2.1 🔴 Critical
RAG 7 34 4.9 🔴 Critical
Anthropic 3 4 1.3 🔴 Critical
PyTorch 3 93 31.0 ✅ Surplus
Tensorflow 1 109 109.0 ✅ Surplus
scikit-learn 2 78 39.0 ✅ Surplus

Key Insight: Traditional ML skills (PyTorch, Tensorflow, scikit-learn) have good supply. Generative AI skills (LLMs, OpenAI, LangChain, GenAI, RAG) are critically undersupplied with only 2-5 candidates per job.


Summary: Top Priority Gaps to Address

Priority Gap Type Specific Gap Severity
1 Seniority IC6 (Principal) - only 133 candidates for 107 jobs 🔴 Critical
2 Seniority Lead - only 8 candidates for 64 jobs 🔴 Critical
3 Seniority Manager - only 82 candidates for 33 jobs ⚠️ Tight
4 AI Skills GenAI - 23 candidates for 11 jobs 🔴 Critical
5 AI Skills OpenAI - 52 candidates for 12 jobs 🔴 Critical
6 AI Skills LangChain - 56 candidates for 11 jobs 🔴 Tight
7 AI Skills RAG - 34 candidates for 7 jobs 🔴 Critical
8 Role+Level Fullstack IC6 - 33 for 48 jobs 🔴 Critical
9 Role+Level Backend Lead - 1 for 23 jobs 🔴 Critical
10 Role+Level ML IC5/IC6 - 43 for 30 jobs 🔴 Critical

10. Salary Analysis: Budget vs Expectations

This section analyzes candidate salary expectations against job budgets to identify where salary mismatches reduce effective supply.

Candidate Salary Expectations by Seniority

Seniority Candidates Avg Salary Median P25 P75
Director 7 $183,686 $180,000 $132,500 $230,000
IC6 133 $104,245 $100,000 $80,000 $120,000
Manager 81 $99,243 $96,000 $72,000 $120,000
Lead 8 $96,375 $77,500 $57,000 $117,000
IC5 1,587 $87,480 $84,000 $70,000 $100,000
IC4 3,215 $72,778 $72,000 $60,000 $84,000
IC3 478 $51,693 $48,000 $36,000 $60,000
IC2 45 $33,682 $30,000 $24,000 $38,400

Job Budget by Seniority (2025 Jobs)

Seniority Jobs Avg Min Avg Max Median Max
Director 4 $97,500 $127,500 $117,500
IC6 107 $68,950 $99,411 $100,000
Manager 33 $70,242 $99,697 $100,000
Lead 64 $67,234 $96,406 $100,000
IC5 272 $62,233 $87,829 $89,200
IC4 233 $59,471 $86,262 $80,000
IC3 46 $38,620 $55,348 $57,000
IC2 10 $23,650 $36,100 $32,500

Salary Mismatch by Seniority

Seniority Candidates Median Job Budget Median Ask Within Budget % Affordable % Priced Out
IC4 3,215 $80,000 $72,000 2,250 70.0% 17.5%
IC5 1,587 $89,200 $84,000 926 58.3% 20.9%
IC3 478 $57,000 $48,000 303 63.4% 18.2%
IC6 133 $100,000 $100,000 76 57.1% 19.5%
Manager 81 $100,000 $96,000 48 59.3% 22.2%
IC2 45 $32,500 $30,000 27 60.0% 28.9%
Director 7 $117,500 $180,000 1 14.3% 71.4%

Key Insight: Directors are almost entirely priced out (71%). IC5 and Manager levels have ~20% priced out, reducing effective supply.

Salary Mismatch by Role

Role Candidates Job Budget (Median) Candidate Ask (Median) Gap % Affordable
Backend Engineer 2,201 $96,000 $75,000 -$21,000 80.2% ✅
Fullstack Engineer 2,000 $90,000 $74,400 -$15,600 74.1%
Frontend Engineer 922 $90,000 $72,000 -$18,000 76.5%
Mobile Engineer 443 $90,000 $76,000 -$14,000 72.9%
DevOps Engineer 276 $100,000 $80,000 -$20,000 79.0%
Data Engineer 292 $95,500 $72,000 -$23,500 79.8% ✅
Machine Learning 135 $100,000 $84,000 -$16,000 81.5% ✅
Engineering Manager 196 $100,000 $100,000 $0 53.1% ⚠️
Solutions Architect 129 $100,000 $96,000 -$4,000 66.7%
Product Designer 105 $60,000 $65,000 +$5,000 47.6% 🔴
QA Engineer 295 $70,000 $60,000 -$10,000 64.4%
QA Analyst 209 $55,000 $48,000 -$7,000 67.5%

Key Insight: Product Designers are the only role where candidates ask MORE than typical budgets (+$5k gap, only 48% affordable).

Effective Supply: Raw vs Affordable (Critical Combinations)

When accounting for salary, the effective supply drops significantly:

Role Seniority Jobs Budget (P75) Raw Supply Affordable Raw/Job Affordable/Job
Backend Engineer Lead 23 $120,000 1 1 0.0 🔴 0.0
Frontend Engineer IC6 17 $120,000 8 5 0.5 🔴 0.3
Backend Engineer Manager 14 $120,000 7 5 0.5 🔴 0.4
Fullstack Engineer Manager 12 $120,000 6 5 0.5 🔴 0.4
Fullstack Engineer IC6 48 $120,000 33 22 0.7 🔴 0.5
Machine Learning IC6 13 $120,000 10 9 0.8 🔴 0.7
Backend Engineer IC6 41 $120,000 57 46 1.4 🔴 1.1
Machine Learning IC5 17 $120,000 33 29 1.9 ⚠️ 1.7
QA Engineer IC5 24 $82,750 81 66 3.4 ⚠️ 2.8
Data Engineer IC5 15 $100,000 65 52 4.3 ⚠️ 3.5
Frontend Engineer IC5 44 $100,000 228 165 5.2 ⚠️ 3.8
Fullstack Engineer IC5 111 $100,000 589 444 5.3 ⚠️ 4.0

Salary-adjusted reality:

  • Fullstack IC6: 33 total → only 22 affordable (0.5/job)
  • Backend IC5: 704 total → only 577 affordable (6.6/job)
  • Frontend IC5: 228 total → only 165 affordable (3.8/job)

Candidates "Priced Out" (Asking Above P75 Budget)

Role + Seniority Total Affordable Priced Out % Lost
Fullstack Engineer IC4 1,187 936 251 21.1%
Backend Engineer IC4 1,267 1,017 250 19.7%
Fullstack Engineer IC5 589 444 145 24.6%
Backend Engineer IC5 704 577 127 18.0%
Frontend Engineer IC4 582 477 105 18.0%
Mobile Engineer IC4 277 198 79 28.5%
Frontend Engineer IC5 228 165 63 27.6%
Mobile Engineer IC5 121 78 43 35.5%

Key Insight: Mobile Engineers at IC5 level have the highest "priced out" rate (35.5%), followed by Frontend IC5 (27.6%).

Salary Distribution by Seniority

Seniority <$50k $50-70k $70-90k $90-110k $110-130k $130k+
IC4 473 991 1,051 481 137 82
IC5 80 277 569 398 148 115
IC3 248 143 66 14 7 0
IC6 3 10 35 36 23 26
Manager 6 11 20 14 13 17
IC2 40 3 2 0 0 0

Summary: Salary-Adjusted Gap Analysis

Priority Role + Seniority Jobs Raw Supply Affordable Affordable/Job Issue
1 Backend Lead 23 1 1 🔴 0.0 No candidates at any price
2 Fullstack Lead 22 0 0 🔴 0.0 No candidates at any price
3 Frontend IC6 17 8 5 🔴 0.3 Salary + supply gap
4 Backend Manager 14 7 5 🔴 0.4 Salary + supply gap
5 Fullstack Manager 12 6 5 🔴 0.4 Salary + supply gap
6 Fullstack IC6 48 33 22 🔴 0.5 Salary reduces supply 33%
7 ML IC6 13 10 9 🔴 0.7 Tight even at budget
8 Backend IC6 41 57 46 🔴 1.1 Salary reduces supply 19%
9 ML IC5 17 33 29 ⚠️ 1.7 Tight
10 Fullstack IC5 111 589 444 ⚠️ 4.0 25% priced out

11. Data Quality Notes

  • Candidates without roles: 20 candidates have no roles assigned
  • Unknown seniority: 137 candidates (2.4%) have no seniority data
-- Query: Candidates without roles
SELECT COUNT(*) as no_roles_count
FROM candidates 
WHERE status = 'network_accepted' 
  AND open_to_opportunities = true
  AND deleted_at IS NULL
  AND (roles IS NULL OR array_length(roles, 1) IS NULL);

Appendix: All Tech Strengths

The network includes candidates with 1,469 distinct tech strengths. The full list is available in the database query results.


Report generated from platform database. All queries filter for status = 'network_accepted' AND open_to_opportunities = true AND deleted_at IS NULL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment