Ukraine IT labour-market demand, 2024–2026 - preliminary analysis

0 comments0 reviews

Metric: number of open vacancies / published postings (company demand). Job-seeker resume volumes are out of scope by design.

Generated 2026-09-24 from data/processed/observations.csv (every row carries its own source_url; see reports/market-analysis.xlsx).

Sources collected: Djinni, DOU (jobs.dou.ua), LinkedIn, robota.ua, work.ua.

sourcedimensionrowsfirst_periodlast_periodtotal
Djinnirole282026-09-242026-09-245496
Djinnirole_salary_only2642025-092026-0848705
Djinnirole_search192026-09-242026-09-242256
Djinnitech302026-09-242026-09-241911
Djinnitech_salary_only3122025-092026-0817710
Djinnitech_search212026-09-242026-09-24542
Djinnitotal1720242026-Q1382697
Djinnitotal_applies_only122025-092026-08167644
Djinnitotal_salary_only122025-092026-0878757
DOU (jobs.dou.ua)experience3242022-012026-06289971
DOU (jobs.dou.ua)region4862022-012026-06446759
DOU (jobs.dou.ua)role8512023-092026-09-24101071
DOU (jobs.dou.ua)role_derived742023-092026-09-2437787
DOU (jobs.dou.ua)role_search232026-09-242026-09-243280
DOU (jobs.dou.ua)tech6662023-092026-09-2439977
DOU (jobs.dou.ua)tech_search332026-09-242026-09-24997
DOU (jobs.dou.ua)total552022-Q12026-Q2507800
DOU (jobs.dou.ua)total_derived372023-092026-09-24148025
LinkedInrole_search232026-09-242026-09-2414563
LinkedInrole_search_windowed_30d22026-09-242026-09-241266
LinkedInrole_search_windowed_7d32026-09-242026-09-241358
LinkedInrole_search_windowed_90d12026-09-242026-09-24962
LinkedIntech_search342026-09-242026-09-2429538
LinkedIntech_search_windowed_30d82026-09-242026-09-245615
LinkedIntech_search_windowed_7d152026-09-242026-09-245195
LinkedIntech_search_windowed_90d62026-09-242026-09-245672
robota.uarole_search232026-09-242026-09-248806
robota.uatech_search332026-09-242026-09-241481
robota.uatotal352024-012026-Q24214891
robota.uatotal_derived102024-Q12026-Q23230342
work.uarole_search232026-09-242026-09-2415153
work.uarole_title10052026-09-242026-09-24103761
work.uatech_search332026-09-242026-09-243997
work.uatotal512023-092026-09-243927247

Dimension semantics (never mixed in one table): tech/role = the board's own categories; *_search = keyword-search counts for the same term list on every board; total = the board's published total; *_derived = arithmetic over categories with the formula in note.

sourcemetriclatest periodlatest valueyoy % (last 4Q vs prev 4Q)yoy %
DjinniDjinni vacancies online (all categories)2026-09-246697--
DjinniDjinni vacancies online (avg per month)2025-Q388708-
DjinniDjinni vacancies online (point-in-time / peak, as printed)2026-Q19130--
DjinniDjinni vacancies published per month (all categories)2024-Q410000--
DjinniDjinni vacancies published per quarter (all categories)2026-Q1280005-
DjinniDjinni vacancies published per year (all categories)202590000-12
DOU (jobs.dou.ua)DOU vacancies published per month (all categories)2026-086304--
DOU (jobs.dou.ua)DOU vacancies published per month - IT only (derived)2026-084141--
DOU (jobs.dou.ua)DOU vacancies published per quarter (all categories)2026-Q22110325-
DOU (jobs.dou.ua)DOU vacancies - IT only (derived)2026-09-243724--
DOU (jobs.dou.ua)DOU vacancies - all categories (incl. non-IT)2026-09-246080--
robota.uarobota.ua IT vacancies (live)2026-09-242506--
robota.uarobota.ua IT vacancies (live, board rubric)2026-09-243447--
robota.uarobota.ua vacancies published per month (all categories)2026-06113307--
robota.uarobota.ua vacancies published per quarter (all categories)2026-Q2337054-5-
work.uawork.ua IT vacancies (live)2026-09-245181--
work.uawork.ua vacancies per month (all categories)2026-0985444--
work.uawork.ua vacancies per week (all categories)2026-09-2264314--

DOU (jobs.dou.ua) - DOU vacancies published per month (all categories), sum of monthly published values by year:

yearmonths coveredvacancies (sum of months)avg per monthyoy % on months 01,02,03,04,05,06,07,08
20234156413,910-
202412600995,008-
202512785346,544-
20268574757,18413

work.ua - work.ua vacancies per month (all categories), sum of monthly published values by year:

yearmonths coveredvacancies (sum of months)avg per monthyoy % on months 01,02,03,04,05,06,07,08,09
2023428100670,252-
20241291047575,873-
202512104412787,011-
2026979871588,7460

robota.ua - robota.ua vacancies published per month (all categories), sum of monthly published values by year:

yearmonths coveredvacancies (sum of months)avg per monthyoy % on months 01,02,03,04,05,06
2024121277412106,451-
2025121316474109,706-
20266636456106,076-4

Cross-source check over the window both sources cover (2025-09 → 2026-08). Read this before quoting any single series as "the market":

series2025-092026-08change %
Djinni - vacancies with a published salary77665004-36
Djinni - vacancies that received applications1530311650-24
DOU - postings published (all categories)71936304-12

Djinni's two published series fall far more than DOU's postings in the same window, so the Djinni decline is at least partly Djinni-specific (its series cover subsets - salary-listed vacancies, vacancies that received applications) and must not be read as the whole market shrinking at that rate.

Djinni - board categories, 2026-09-24 (share = % of this table):

categoryvacanciesshare %
python36619
devops20211
react1679
c++1518
java1437
php1387
node.js1126
typescript1096
c#/.net1086
javascript1066
golang493
angular362
next.js322
vue302
unity241
react native221
1c211
kotlin201
unreal201
ruby131

DOU (jobs.dou.ua) - board categories, 2026-09-24 (share = % of this table):

categoryvacanciesshare %
python15520
node.js11214
c#/.net9212
c++8911
java8711
php709
golang354
sql273
salesforce213
android213
ios162
unity152
flutter111
rust111
react native91
scala41
ruby20
erlang00

DOU (jobs.dou.ua) - technology demand change, 2026 vs 2025 (matched periods only, max 12 shown each way):

categorymatched periods2025 avg2026 avgchange %
erlang940-92
ios94726-46
flutter92614-44
ruby92011-42
php9173109-37
react native93925-36
android94228-32
node.js9219170-23
unity91714-14
salesforce91614-12
c#/.net9155140-10
sql92926-10
python9194176-10
java9132122-8
golang95048-5
scala94526
c++9559166
rust94769

Each row: the board's latest value for that exact item, its share of the set, and the year-over-year change where the board publishes enough history (matched months).

brief itemsourcedimensionlatest periodvacanciesshare %yoy % (2026 vs 2025)
ReactDjinnitech_search2026-09-24101.9-
ReactDOU (jobs.dou.ua)tech_search2026-09-24676.7-
ReactLinkedIntech_search2026-09-247942.9-
Reactwork.uatech_search2026-09-24257.4-
ReactDjinnitech2026-09-241678.7-
AngularDjinnitech_search2026-09-2481.5-
AngularDOU (jobs.dou.ua)tech_search2026-09-24161.6-
AngularLinkedIntech_search2026-09-247242.6-
Angularwork.uatech_search2026-09-2451.5-
AngularDjinnitech2026-09-24361.9-
VueDjinnitech_search2026-09-2481.5-
VueDOU (jobs.dou.ua)tech_search2026-09-24101.0-
VueLinkedIntech_search2026-09-2410003.6-
Vuework.uatech_search2026-09-2482.4-
VueDjinnitech2026-09-24301.6-
Node.jsDjinnitech2026-09-241125.9-
Node.jsDOU (jobs.dou.ua)tech2026-09-2411214.4-22.7
Node.jsDjinnitech_search2026-09-24366.6-
Node.jsDOU (jobs.dou.ua)tech_search2026-09-2411211.2-
Node.jsLinkedIntech_search2026-09-247082.6-
Node.jswork.uatech_search2026-09-24175.0-
C# / .NETDjinnitech2026-09-241085.7-
C# / .NETDOU (jobs.dou.ua)tech2026-09-249211.8-10.2
C# / .NETDjinnitech_search2026-09-245510.2-
C# / .NETDOU (jobs.dou.ua)tech_search2026-09-24929.2-
C# / .NETLinkedIntech_search2026-09-245602.0-
C# / .NETwork.uatech_search2026-09-24267.7-
C# / .NETDOU (jobs.dou.ua)tech_search2026-09-24929.2-
C# / .NETLinkedIntech_search2026-09-249543.5-
C# / .NETwork.uatech_search2026-09-24288.3-
PythonDjinnitech2026-09-2436619.1-
PythonDOU (jobs.dou.ua)tech2026-09-2415519.9-9.5
PythonDjinnitech_search2026-09-2410519.4-
PythonDOU (jobs.dou.ua)tech_search2026-09-2415515.6-
PythonLinkedIntech_search2026-09-2410003.6-
Pythonwork.uatech_search2026-09-244814.2-
JavaDjinnitech2026-09-241437.5-
JavaDOU (jobs.dou.ua)tech2026-09-248711.2-7.5
JavaDjinnitech_search2026-09-247914.6-
JavaDOU (jobs.dou.ua)tech_search2026-09-24878.7-
JavaLinkedIntech_search2026-09-249393.4-
PHPDjinnitech2026-09-241387.2-
PHPDOU (jobs.dou.ua)tech2026-09-24709.0-37.4
PHPDjinnitech_search2026-09-24376.8-
PHPDOU (jobs.dou.ua)tech_search2026-09-24707.0-
PHPLinkedIntech_search2026-09-24970.3-
PHPwork.uatech_search2026-09-24257.4-
KotlinDjinnitech2026-09-24201.1-
KotlinDjinnitech_search2026-09-2491.7-
KotlinDOU (jobs.dou.ua)tech_search2026-09-2470.7-
KotlinLinkedIntech_search2026-09-2410003.6-
Kotlinwork.uatech_search2026-09-2410.3-
SwiftDOU (jobs.dou.ua)tech_search2026-09-2400.0-
SwiftLinkedIntech_search2026-09-247562.8-
FrontendDjinnirole2026-09-24310.6-
FrontendDOU (jobs.dou.ua)role2026-09-24662.1-41.4
FrontendDOU (jobs.dou.ua)role_search2026-09-24662.0-
FrontendLinkedInrole_search2026-09-241921.3-
Frontendwork.uarole_search2026-09-24344.6-
BackendDOU (jobs.dou.ua)role_derived2026-09-2465792.0-12.8
BackendDjinnirole2026-09-241152.1-
BackendDOU (jobs.dou.ua)role_search2026-09-241013.1-
BackendLinkedInrole_search2026-09-249126.3-
Backendwork.uarole_search2026-09-24415.5-
FullstackDjinnirole2026-09-242053.7-
FullstackDjinnirole_search2026-09-241958.6-
FullstackDOU (jobs.dou.ua)role_search2026-09-241735.3-
FullstackLinkedInrole_search2026-09-247765.3-
Fullstackwork.uarole_search2026-09-24192.5-
MobileDOU (jobs.dou.ua)role_derived2026-09-24578.0-39.3
MobileDjinnirole2026-09-242043.7-
MobileDOU (jobs.dou.ua)role2026-09-24571.9-39.3
MobileDOU (jobs.dou.ua)role_search2026-09-24511.6-
MobileLinkedInrole_search2026-09-24200013.7-

Technology keywords - counts on the term set every board carries (20 terms, sources: djinni, dou, linkedin, workua):

search termdjinnidoulinkedinworkua
Python1051551,000*48
.NET559256026
Node.js3611270817
C++228999026
JavaScript40271,000*26
PHP37709725
React106779425
SQL25151,000*25
Golang42357933
Ruby1122,000*0
Unity81629228
Scala342,000*0
Vue8101,000*8
Angular8167245
Kotlin971,000*1
WordPress11517414
Flutter8114127
Rust6115060
Laravel613696
React Native1391370

Share of that common term set, %%:

search termdjinnidoulinkedinworkua
Python22.720.26.616.6
.NET11.912.03.79.0
Node.js7.814.64.65.9
C++4.811.66.59.0
JavaScript8.63.56.69.0
PHP8.09.10.68.6
React2.28.75.28.6
SQL5.42.06.68.6
Golang9.14.65.21.0
Ruby2.40.313.10.0
Unity1.72.11.99.7
Scala0.60.513.10.0
Vue1.71.36.62.8
Angular1.72.14.71.7
Kotlin1.90.96.60.3
WordPress2.40.71.14.8
Flutter1.71.42.72.4
Rust1.31.43.30.0
Laravel1.31.70.52.1
React Native2.81.20.90.0

Role keywords - counts on the term set every board carries (9 terms, sources: djinni, dou, linkedin, workua):

search termdjinnidoulinkedinworkua
Business Analyst1851701,000*338
DevOps15716581759
Fullstack19517377619
Data Engineer19211560760
Machine Learning1183314541
Solution Architect332190516
QA Automation1116529010
Android162120111
iOS11321366

Share of that common term set, %%:

search termdjinnidoulinkedinworkua
Business Analyst18.215.619.365.0
DevOps15.415.115.811.3
Fullstack19.215.815.03.7
Data Engineer18.910.511.711.5
Machine Learning11.630.38.80.2
Solution Architect3.21.917.53.1
QA Automation10.95.95.61.9
Android1.61.93.92.1
iOS1.12.92.61.2

* = LinkedIn bucket (floored to the nearest thousand), an upper-bound floor, not an exact count. Shares are computed on the common term set only, so a board that lacks a term is not credited with it - raw counts are NOT comparable across boards. Keyword semantics differ per board: DOU's ?search= also matches category names (upper bound); work.ua contributes only terms its own engine filed under its IT sphere; robota.ua has no IT-scoped keyword search and is absent; LinkedIn floors counts at 1,000. Per-row details in note.

Djinni - board categories, 2026-09-24:

rolevacanciesshare %
other110620
pm59311
management58611
data_ai5109
support4598
qa4107
design3867
analytics3346
fullstack2054
mobile2044
security1944
embedded1563
qa_automation1212
backend1152
sysadmin862
frontend311

DOU (jobs.dou.ua) - board categories, 2026-09-24:

rolevacanciesshare %
data_ai47816
pm46215
analytics43114
qa29410
design2608
support2207
embedded2017
devops1655
security1655
management1585
sysadmin1274
frontend662
mobile572

DOU (jobs.dou.ua) - derived aggregates, 2026-09-24:

rolevacanciesshare %
backend65792
mobile578

DOU - experience level, share of that month's postings %:

experience level2024-012025-012026-06change pp (2026-06 vs 2024-01)
1-3 years30.829.327.6-3.2
3-5 years31.230.628.2-3.0
5+ years18.118.918.60.5
<1 year7.06.76.4-0.6
no experience1.82.53.21.4
unspecified11.112.016.04.9

DOU - location, share of that month's postings %:

location2024-012025-012026-06change pp (2026-06 vs 2024-01)
Івано-Франківськ2.01.71.5-0.5
Вінниця2.11.81.3-0.8
Дніпро3.62.62.2-1.4
Київ30.229.934.54.3
Львів9.28.08.6-0.6
Одеса1.81.21.80.0
Харків2.01.00.8-1.2
віддалено43.245.742.5-0.7
за кордоном6.08.26.90.9

DOU (jobs.dou.ua) (tech, 2026 vs 2025):

category2025 avg2026 avgchange %
c++559166
golang5048-5
java132122-8
python194176-10
sql2926-10
ios4726-46
flutter2614-44
ruby2011-42
php173109-37
react native3925-36

DOU (jobs.dou.ua) (role, 2026 vs 2025):

category2025 avg2026 avgchange %
embedded78156100
security7210950
management9913133
sysadmin9412332
support20524017
frontend289169-41
mobile15393-39
qa383364-5
design294280-5
devops181179-1
  1. Category taxonomies overlap - a posting can sit in several categories, so column sums exceed board totals; never present a summed category column as a market total.

  2. Two different measures coexist: total/tech/role rows from DOU trends count postings published in a month (a flow); live snapshot rows count vacancies open today. They are not comparable and are kept in separate periods.

  3. Coverage differs by source: DOU publishes machine-readable per-category history (2023-09 → 2026-08); Djinni exposes a 12-month per-category window plus an API snapshot; work.ua publishes a total series only (no per-technology history); robota.ua publishes aggregate quarterly/monthly totals; LinkedIn has no Ukraine history at all.

  4. Per-framework history (React/Angular/Vue) does not exist publicly on any board's category taxonomy - those are only measurable as current keyword snapshots. Treat framework-level trend claims as unsupported by this dataset.

  5. Live snapshots are point-in-time (2026-09-24) and move daily; the workbook records the collection date of every row.

  6. LinkedIn buckets any count ≥1000 (floor to thousand), so broad terms are floors rather than counts; windowed (7/30/90-day) rows are exact but measure a different window and live in *_windowed_7d/30d/90d dimensions. LinkedIn also falls back to loose/related matching when a term matches nothing (a nonsense keyword returned '3,000+'), so bucketed values are fuzzy-match floors.

  7. DOU ?search= matches category names as well as titles - keyword rows are an upper bound for DOU.

  8. General boards are cross-industry. work.ua and robota.ua cover every sector, so their keyword counts are only comparable with the IT boards when the board itself classifies the query under its IT sphere - e.g. work.ua sends 'Java' to the manufacturing sphere (27) and 'Security' to its security-guard category (9,389). Those rows are excluded from shares and listed in data/processed/out_of_scope_rows.csv; the IT-sphere counts (React 25, .NET 26, Python 48, C# 28, Node.js 17 at collection time) are used.

  9. Djinni tech_salary_only rows count only vacancies with a published salary range (a biased subset, ~5–8k/month) - useful as a trend shape, not as a market size.