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

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`).

## 1. Sources, dimensions and coverage

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

| source | dimension | rows | first_period | last_period | total |
|---|---|---|---|---|---|
| Djinni | role | 28 | 2026-09-24 | 2026-09-24 | 5496 |
| Djinni | role_salary_only | 264 | 2025-09 | 2026-08 | 48705 |
| Djinni | role_search | 19 | 2026-09-24 | 2026-09-24 | 2256 |
| Djinni | tech | 30 | 2026-09-24 | 2026-09-24 | 1911 |
| Djinni | tech_salary_only | 312 | 2025-09 | 2026-08 | 17710 |
| Djinni | tech_search | 21 | 2026-09-24 | 2026-09-24 | 542 |
| Djinni | total | 17 | 2024 | 2026-Q1 | 382697 |
| Djinni | total_applies_only | 12 | 2025-09 | 2026-08 | 167644 |
| Djinni | total_salary_only | 12 | 2025-09 | 2026-08 | 78757 |
| DOU (jobs.dou.ua) | experience | 324 | 2022-01 | 2026-06 | 289971 |
| DOU (jobs.dou.ua) | region | 486 | 2022-01 | 2026-06 | 446759 |
| DOU (jobs.dou.ua) | role | 851 | 2023-09 | 2026-09-24 | 101071 |
| DOU (jobs.dou.ua) | role_derived | 74 | 2023-09 | 2026-09-24 | 37787 |
| DOU (jobs.dou.ua) | role_search | 23 | 2026-09-24 | 2026-09-24 | 3280 |
| DOU (jobs.dou.ua) | tech | 666 | 2023-09 | 2026-09-24 | 39977 |
| DOU (jobs.dou.ua) | tech_search | 33 | 2026-09-24 | 2026-09-24 | 997 |
| DOU (jobs.dou.ua) | total | 55 | 2022-Q1 | 2026-Q2 | 507800 |
| DOU (jobs.dou.ua) | total_derived | 37 | 2023-09 | 2026-09-24 | 148025 |
| LinkedIn | role_search | 23 | 2026-09-24 | 2026-09-24 | 14563 |
| LinkedIn | role_search_windowed_30d | 2 | 2026-09-24 | 2026-09-24 | 1266 |
| LinkedIn | role_search_windowed_7d | 3 | 2026-09-24 | 2026-09-24 | 1358 |
| LinkedIn | role_search_windowed_90d | 1 | 2026-09-24 | 2026-09-24 | 962 |
| LinkedIn | tech_search | 34 | 2026-09-24 | 2026-09-24 | 29538 |
| LinkedIn | tech_search_windowed_30d | 8 | 2026-09-24 | 2026-09-24 | 5615 |
| LinkedIn | tech_search_windowed_7d | 15 | 2026-09-24 | 2026-09-24 | 5195 |
| LinkedIn | tech_search_windowed_90d | 6 | 2026-09-24 | 2026-09-24 | 5672 |
| robota.ua | role_search | 23 | 2026-09-24 | 2026-09-24 | 8806 |
| robota.ua | tech_search | 33 | 2026-09-24 | 2026-09-24 | 1481 |
| robota.ua | total | 35 | 2024-01 | 2026-Q2 | 4214891 |
| robota.ua | total_derived | 10 | 2024-Q1 | 2026-Q2 | 3230342 |
| work.ua | role_search | 23 | 2026-09-24 | 2026-09-24 | 15153 |
| work.ua | role_title | 1005 | 2026-09-24 | 2026-09-24 | 103761 |
| work.ua | tech_search | 33 | 2026-09-24 | 2026-09-24 | 3997 |
| work.ua | total | 51 | 2023-09 | 2026-09-24 | 3927247 |


**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`.

## 2. Whole-market totals and their direction

| source | metric | latest period | latest value | yoy % (last 4Q vs prev 4Q) | yoy % |
|---|---|---|---|---|---|
| Djinni | Djinni vacancies online (all categories) | 2026-09-24 | 6697 | - | - |
| Djinni | Djinni vacancies online (avg per month) | 2025-Q3 | 8870 | 8 | - |
| Djinni | Djinni vacancies online (point-in-time / peak, as printed) | 2026-Q1 | 9130 | - | - |
| Djinni | Djinni vacancies published per month (all categories) | 2024-Q4 | 10000 | - | - |
| Djinni | Djinni vacancies published per quarter (all categories) | 2026-Q1 | 28000 | 5 | - |
| Djinni | Djinni vacancies published per year (all categories) | 2025 | 90000 | - | 12 |
| DOU (jobs.dou.ua) | DOU vacancies published per month (all categories) | 2026-08 | 6304 | - | - |
| DOU (jobs.dou.ua) | DOU vacancies published per month - IT only (derived) | 2026-08 | 4141 | - | - |
| DOU (jobs.dou.ua) | DOU vacancies published per quarter (all categories) | 2026-Q2 | 21103 | 25 | - |
| DOU (jobs.dou.ua) | DOU vacancies - IT only (derived) | 2026-09-24 | 3724 | - | - |
| DOU (jobs.dou.ua) | DOU vacancies - all categories (incl. non-IT) | 2026-09-24 | 6080 | - | - |
| robota.ua | robota.ua IT vacancies (live) | 2026-09-24 | 2506 | - | - |
| robota.ua | robota.ua IT vacancies (live, board rubric) | 2026-09-24 | 3447 | - | - |
| robota.ua | robota.ua vacancies published per month (all categories) | 2026-06 | 113307 | - | - |
| robota.ua | robota.ua vacancies published per quarter (all categories) | 2026-Q2 | 337054 | -5 | - |
| work.ua | work.ua IT vacancies (live) | 2026-09-24 | 5181 | - | - |
| work.ua | work.ua vacancies per month (all categories) | 2026-09 | 85444 | - | - |
| work.ua | work.ua vacancies per week (all categories) | 2026-09-22 | 64314 | - | - |


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

| year | months covered | vacancies (sum of months) | avg per month | yoy % on months 01,02,03,04,05,06,07,08 |
|---|---|---|---|---|
| 2023 | 4 | 15641 | 3,910 | - |
| 2024 | 12 | 60099 | 5,008 | - |
| 2025 | 12 | 78534 | 6,544 | - |
| 2026 | 8 | 57475 | 7,184 | 13 |


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

| year | months covered | vacancies (sum of months) | avg per month | yoy % on months 01,02,03,04,05,06,07,08,09 |
|---|---|---|---|---|
| 2023 | 4 | 281006 | 70,252 | - |
| 2024 | 12 | 910475 | 75,873 | - |
| 2025 | 12 | 1044127 | 87,011 | - |
| 2026 | 9 | 798715 | 88,746 | 0 |


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

| year | months covered | vacancies (sum of months) | avg per month | yoy % on months 01,02,03,04,05,06 |
|---|---|---|---|---|
| 2024 | 12 | 1277412 | 106,451 | - |
| 2025 | 12 | 1316474 | 109,706 | - |
| 2026 | 6 | 636456 | 106,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":


| series | 2025-09 | 2026-08 | change % |
|---|---|---|---|
| Djinni - vacancies with a published salary | 7766 | 5004 | -36 |
| Djinni - vacancies that received applications | 15303 | 11650 | -24 |
| DOU - postings published (all categories) | 7193 | 6304 | -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.

## 3. Technology stack demand


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

| category | vacancies | share % |
|---|---|---|
| python | 366 | 19 |
| devops | 202 | 11 |
| react | 167 | 9 |
| c++ | 151 | 8 |
| java | 143 | 7 |
| php | 138 | 7 |
| node.js | 112 | 6 |
| typescript | 109 | 6 |
| c#/.net | 108 | 6 |
| javascript | 106 | 6 |
| golang | 49 | 3 |
| angular | 36 | 2 |
| next.js | 32 | 2 |
| vue | 30 | 2 |
| unity | 24 | 1 |
| react native | 22 | 1 |
| 1c | 21 | 1 |
| kotlin | 20 | 1 |
| unreal | 20 | 1 |
| ruby | 13 | 1 |


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

| category | vacancies | share % |
|---|---|---|
| python | 155 | 20 |
| node.js | 112 | 14 |
| c#/.net | 92 | 12 |
| c++ | 89 | 11 |
| java | 87 | 11 |
| php | 70 | 9 |
| golang | 35 | 4 |
| sql | 27 | 3 |
| salesforce | 21 | 3 |
| android | 21 | 3 |
| ios | 16 | 2 |
| unity | 15 | 2 |
| flutter | 11 | 1 |
| rust | 11 | 1 |
| react native | 9 | 1 |
| scala | 4 | 1 |
| ruby | 2 | 0 |
| erlang | 0 | 0 |


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

| category | matched periods | 2025 avg | 2026 avg | change % |
|---|---|---|---|---|
| erlang | 9 | 4 | 0 | -92 |
| ios | 9 | 47 | 26 | -46 |
| flutter | 9 | 26 | 14 | -44 |
| ruby | 9 | 20 | 11 | -42 |
| php | 9 | 173 | 109 | -37 |
| react native | 9 | 39 | 25 | -36 |
| android | 9 | 42 | 28 | -32 |
| node.js | 9 | 219 | 170 | -23 |
| unity | 9 | 17 | 14 | -14 |
| salesforce | 9 | 16 | 14 | -12 |
| c#/.net | 9 | 155 | 140 | -10 |
| sql | 9 | 29 | 26 | -10 |
| python | 9 | 194 | 176 | -10 |
| java | 9 | 132 | 122 | -8 |
| golang | 9 | 50 | 48 | -5 |
| scala | 9 | 4 | 5 | 26 |
| c++ | 9 | 55 | 91 | 66 |
| rust | 9 | 4 | 7 | 69 |

## 3b. Read-out for the stacks and roles named in the brief

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 item | source | dimension | latest period | vacancies | share % | yoy % (2026 vs 2025) |
|---|---|---|---|---|---|---|
| React | Djinni | tech_search | 2026-09-24 | 10 | 1.9 | - |
| React | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 67 | 6.7 | - |
| React | LinkedIn | tech_search | 2026-09-24 | 794 | 2.9 | - |
| React | work.ua | tech_search | 2026-09-24 | 25 | 7.4 | - |
| React | Djinni | tech | 2026-09-24 | 167 | 8.7 | - |
| Angular | Djinni | tech_search | 2026-09-24 | 8 | 1.5 | - |
| Angular | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 16 | 1.6 | - |
| Angular | LinkedIn | tech_search | 2026-09-24 | 724 | 2.6 | - |
| Angular | work.ua | tech_search | 2026-09-24 | 5 | 1.5 | - |
| Angular | Djinni | tech | 2026-09-24 | 36 | 1.9 | - |
| Vue | Djinni | tech_search | 2026-09-24 | 8 | 1.5 | - |
| Vue | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 10 | 1.0 | - |
| Vue | LinkedIn | tech_search | 2026-09-24 | 1000 | 3.6 | - |
| Vue | work.ua | tech_search | 2026-09-24 | 8 | 2.4 | - |
| Vue | Djinni | tech | 2026-09-24 | 30 | 1.6 | - |
| Node.js | Djinni | tech | 2026-09-24 | 112 | 5.9 | - |
| Node.js | DOU (jobs.dou.ua) | tech | 2026-09-24 | 112 | 14.4 | -22.7 |
| Node.js | Djinni | tech_search | 2026-09-24 | 36 | 6.6 | - |
| Node.js | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 112 | 11.2 | - |
| Node.js | LinkedIn | tech_search | 2026-09-24 | 708 | 2.6 | - |
| Node.js | work.ua | tech_search | 2026-09-24 | 17 | 5.0 | - |
| C# / .NET | Djinni | tech | 2026-09-24 | 108 | 5.7 | - |
| C# / .NET | DOU (jobs.dou.ua) | tech | 2026-09-24 | 92 | 11.8 | -10.2 |
| C# / .NET | Djinni | tech_search | 2026-09-24 | 55 | 10.2 | - |
| C# / .NET | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 92 | 9.2 | - |
| C# / .NET | LinkedIn | tech_search | 2026-09-24 | 560 | 2.0 | - |
| C# / .NET | work.ua | tech_search | 2026-09-24 | 26 | 7.7 | - |
| C# / .NET | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 92 | 9.2 | - |
| C# / .NET | LinkedIn | tech_search | 2026-09-24 | 954 | 3.5 | - |
| C# / .NET | work.ua | tech_search | 2026-09-24 | 28 | 8.3 | - |
| Python | Djinni | tech | 2026-09-24 | 366 | 19.1 | - |
| Python | DOU (jobs.dou.ua) | tech | 2026-09-24 | 155 | 19.9 | -9.5 |
| Python | Djinni | tech_search | 2026-09-24 | 105 | 19.4 | - |
| Python | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 155 | 15.6 | - |
| Python | LinkedIn | tech_search | 2026-09-24 | 1000 | 3.6 | - |
| Python | work.ua | tech_search | 2026-09-24 | 48 | 14.2 | - |
| Java | Djinni | tech | 2026-09-24 | 143 | 7.5 | - |
| Java | DOU (jobs.dou.ua) | tech | 2026-09-24 | 87 | 11.2 | -7.5 |
| Java | Djinni | tech_search | 2026-09-24 | 79 | 14.6 | - |
| Java | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 87 | 8.7 | - |
| Java | LinkedIn | tech_search | 2026-09-24 | 939 | 3.4 | - |
| PHP | Djinni | tech | 2026-09-24 | 138 | 7.2 | - |
| PHP | DOU (jobs.dou.ua) | tech | 2026-09-24 | 70 | 9.0 | -37.4 |
| PHP | Djinni | tech_search | 2026-09-24 | 37 | 6.8 | - |
| PHP | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 70 | 7.0 | - |
| PHP | LinkedIn | tech_search | 2026-09-24 | 97 | 0.3 | - |
| PHP | work.ua | tech_search | 2026-09-24 | 25 | 7.4 | - |
| Kotlin | Djinni | tech | 2026-09-24 | 20 | 1.1 | - |
| Kotlin | Djinni | tech_search | 2026-09-24 | 9 | 1.7 | - |
| Kotlin | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 7 | 0.7 | - |
| Kotlin | LinkedIn | tech_search | 2026-09-24 | 1000 | 3.6 | - |
| Kotlin | work.ua | tech_search | 2026-09-24 | 1 | 0.3 | - |
| Swift | DOU (jobs.dou.ua) | tech_search | 2026-09-24 | 0 | 0.0 | - |
| Swift | LinkedIn | tech_search | 2026-09-24 | 756 | 2.8 | - |
| Frontend | Djinni | role | 2026-09-24 | 31 | 0.6 | - |
| Frontend | DOU (jobs.dou.ua) | role | 2026-09-24 | 66 | 2.1 | -41.4 |
| Frontend | DOU (jobs.dou.ua) | role_search | 2026-09-24 | 66 | 2.0 | - |
| Frontend | LinkedIn | role_search | 2026-09-24 | 192 | 1.3 | - |
| Frontend | work.ua | role_search | 2026-09-24 | 34 | 4.6 | - |
| Backend | DOU (jobs.dou.ua) | role_derived | 2026-09-24 | 657 | 92.0 | -12.8 |
| Backend | Djinni | role | 2026-09-24 | 115 | 2.1 | - |
| Backend | DOU (jobs.dou.ua) | role_search | 2026-09-24 | 101 | 3.1 | - |
| Backend | LinkedIn | role_search | 2026-09-24 | 912 | 6.3 | - |
| Backend | work.ua | role_search | 2026-09-24 | 41 | 5.5 | - |
| Fullstack | Djinni | role | 2026-09-24 | 205 | 3.7 | - |
| Fullstack | Djinni | role_search | 2026-09-24 | 195 | 8.6 | - |
| Fullstack | DOU (jobs.dou.ua) | role_search | 2026-09-24 | 173 | 5.3 | - |
| Fullstack | LinkedIn | role_search | 2026-09-24 | 776 | 5.3 | - |
| Fullstack | work.ua | role_search | 2026-09-24 | 19 | 2.5 | - |
| Mobile | DOU (jobs.dou.ua) | role_derived | 2026-09-24 | 57 | 8.0 | -39.3 |
| Mobile | Djinni | role | 2026-09-24 | 204 | 3.7 | - |
| Mobile | DOU (jobs.dou.ua) | role | 2026-09-24 | 57 | 1.9 | -39.3 |
| Mobile | DOU (jobs.dou.ua) | role_search | 2026-09-24 | 51 | 1.6 | - |
| Mobile | LinkedIn | role_search | 2026-09-24 | 2000 | 13.7 | - |

## 4. The same keyword measured on every board (current snapshot)


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

| search term | djinni | dou | linkedin | workua |
|---|---|---|---|---|
| Python | 105 | 155 | 1,000* | 48 |
| .NET | 55 | 92 | 560 | 26 |
| Node.js | 36 | 112 | 708 | 17 |
| C++ | 22 | 89 | 990 | 26 |
| JavaScript | 40 | 27 | 1,000* | 26 |
| PHP | 37 | 70 | 97 | 25 |
| React | 10 | 67 | 794 | 25 |
| SQL | 25 | 15 | 1,000* | 25 |
| Golang | 42 | 35 | 793 | 3 |
| Ruby | 11 | 2 | 2,000* | 0 |
| Unity | 8 | 16 | 292 | 28 |
| Scala | 3 | 4 | 2,000* | 0 |
| Vue | 8 | 10 | 1,000* | 8 |
| Angular | 8 | 16 | 724 | 5 |
| Kotlin | 9 | 7 | 1,000* | 1 |
| WordPress | 11 | 5 | 174 | 14 |
| Flutter | 8 | 11 | 412 | 7 |
| Rust | 6 | 11 | 506 | 0 |
| Laravel | 6 | 13 | 69 | 6 |
| React Native | 13 | 9 | 137 | 0 |


**Share of that common term set, %%:**

| search term | djinni | dou | linkedin | workua |
|---|---|---|---|---|
| Python | 22.7 | 20.2 | 6.6 | 16.6 |
| .NET | 11.9 | 12.0 | 3.7 | 9.0 |
| Node.js | 7.8 | 14.6 | 4.6 | 5.9 |
| C++ | 4.8 | 11.6 | 6.5 | 9.0 |
| JavaScript | 8.6 | 3.5 | 6.6 | 9.0 |
| PHP | 8.0 | 9.1 | 0.6 | 8.6 |
| React | 2.2 | 8.7 | 5.2 | 8.6 |
| SQL | 5.4 | 2.0 | 6.6 | 8.6 |
| Golang | 9.1 | 4.6 | 5.2 | 1.0 |
| Ruby | 2.4 | 0.3 | 13.1 | 0.0 |
| Unity | 1.7 | 2.1 | 1.9 | 9.7 |
| Scala | 0.6 | 0.5 | 13.1 | 0.0 |
| Vue | 1.7 | 1.3 | 6.6 | 2.8 |
| Angular | 1.7 | 2.1 | 4.7 | 1.7 |
| Kotlin | 1.9 | 0.9 | 6.6 | 0.3 |
| WordPress | 2.4 | 0.7 | 1.1 | 4.8 |
| Flutter | 1.7 | 1.4 | 2.7 | 2.4 |
| Rust | 1.3 | 1.4 | 3.3 | 0.0 |
| Laravel | 1.3 | 1.7 | 0.5 | 2.1 |
| React Native | 2.8 | 1.2 | 0.9 | 0.0 |


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

| search term | djinni | dou | linkedin | workua |
|---|---|---|---|---|
| Business Analyst | 185 | 170 | 1,000* | 338 |
| DevOps | 157 | 165 | 817 | 59 |
| Fullstack | 195 | 173 | 776 | 19 |
| Data Engineer | 192 | 115 | 607 | 60 |
| Machine Learning | 118 | 331 | 454 | 1 |
| Solution Architect | 33 | 21 | 905 | 16 |
| QA Automation | 111 | 65 | 290 | 10 |
| Android | 16 | 21 | 201 | 11 |
| iOS | 11 | 32 | 136 | 6 |


**Share of that common term set, %%:**

| search term | djinni | dou | linkedin | workua |
|---|---|---|---|---|
| Business Analyst | 18.2 | 15.6 | 19.3 | 65.0 |
| DevOps | 15.4 | 15.1 | 15.8 | 11.3 |
| Fullstack | 19.2 | 15.8 | 15.0 | 3.7 |
| Data Engineer | 18.9 | 10.5 | 11.7 | 11.5 |
| Machine Learning | 11.6 | 30.3 | 8.8 | 0.2 |
| Solution Architect | 3.2 | 1.9 | 17.5 | 3.1 |
| QA Automation | 10.9 | 5.9 | 5.6 | 1.9 |
| Android | 1.6 | 1.9 | 3.9 | 2.1 |
| iOS | 1.1 | 2.9 | 2.6 | 1.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`.

## 5. Development areas (roles)


**Djinni - board categories, 2026-09-24:**

| role | vacancies | share % |
|---|---|---|
| other | 1106 | 20 |
| pm | 593 | 11 |
| management | 586 | 11 |
| data_ai | 510 | 9 |
| support | 459 | 8 |
| qa | 410 | 7 |
| design | 386 | 7 |
| analytics | 334 | 6 |
| fullstack | 205 | 4 |
| mobile | 204 | 4 |
| security | 194 | 4 |
| embedded | 156 | 3 |
| qa_automation | 121 | 2 |
| backend | 115 | 2 |
| sysadmin | 86 | 2 |
| frontend | 31 | 1 |


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

| role | vacancies | share % |
|---|---|---|
| data_ai | 478 | 16 |
| pm | 462 | 15 |
| analytics | 431 | 14 |
| qa | 294 | 10 |
| design | 260 | 8 |
| support | 220 | 7 |
| embedded | 201 | 7 |
| devops | 165 | 5 |
| security | 165 | 5 |
| management | 158 | 5 |
| sysadmin | 127 | 4 |
| frontend | 66 | 2 |
| mobile | 57 | 2 |


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

| role | vacancies | share % |
|---|---|---|
| backend | 657 | 92 |
| mobile | 57 | 8 |

## 6. Seniority mix and location of demand (DOU, monthly)


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

| experience level | 2024-01 | 2025-01 | 2026-06 | change pp (2026-06 vs 2024-01) |
|---|---|---|---|---|
| 1-3 years | 30.8 | 29.3 | 27.6 | -3.2 |
| 3-5 years | 31.2 | 30.6 | 28.2 | -3.0 |
| 5+ years | 18.1 | 18.9 | 18.6 | 0.5 |
| <1 year | 7.0 | 6.7 | 6.4 | -0.6 |
| no experience | 1.8 | 2.5 | 3.2 | 1.4 |
| unspecified | 11.1 | 12.0 | 16.0 | 4.9 |


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

| location | 2024-01 | 2025-01 | 2026-06 | change pp (2026-06 vs 2024-01) |
|---|---|---|---|---|
| Івано-Франківськ | 2.0 | 1.7 | 1.5 | -0.5 |
| Вінниця | 2.1 | 1.8 | 1.3 | -0.8 |
| Дніпро | 3.6 | 2.6 | 2.2 | -1.4 |
| Київ | 30.2 | 29.9 | 34.5 | 4.3 |
| Львів | 9.2 | 8.0 | 8.6 | -0.6 |
| Одеса | 1.8 | 1.2 | 1.8 | 0.0 |
| Харків | 2.0 | 1.0 | 0.8 | -1.2 |
| віддалено | 43.2 | 45.7 | 42.5 | -0.7 |
| за кордоном | 6.0 | 8.2 | 6.9 | 0.9 |

## 7. What is growing and what is shrinking


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

| category | 2025 avg | 2026 avg | change % |
|---|---|---|---|
| c++ | 55 | 91 | 66 |
| golang | 50 | 48 | -5 |
| java | 132 | 122 | -8 |
| python | 194 | 176 | -10 |
| sql | 29 | 26 | -10 |
| ios | 47 | 26 | -46 |
| flutter | 26 | 14 | -44 |
| ruby | 20 | 11 | -42 |
| php | 173 | 109 | -37 |
| react native | 39 | 25 | -36 |


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

| category | 2025 avg | 2026 avg | change % |
|---|---|---|---|
| embedded | 78 | 156 | 100 |
| security | 72 | 109 | 50 |
| management | 99 | 131 | 33 |
| sysadmin | 94 | 123 | 32 |
| support | 205 | 240 | 17 |
| frontend | 289 | 169 | -41 |
| mobile | 153 | 93 | -39 |
| qa | 383 | 364 | -5 |
| design | 294 | 280 | -5 |
| devops | 181 | 179 | -1 |

## 8. Limitations (read before using the numbers)

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.

## 9. Suggested next steps

- Re-run `src/collect_live_dou.py` (and the other collectors) weekly; snapshots accumulate into a first-party history for the snapshot-only sources.

- Add per-keyword polling for React/Angular/Vue/Kotlin/Swift if framework-level trend analysis is required by the roadmap.

- Reconcile the three DOU series (trends, per-month category tables, article CSVs): small revisions exist between them (see `data/raw/dou/reconciliation.csv`).
