The first three posts in this series used Hacker News: hiring posts, job seekers and launches. This one leaves HN and counts installs. The npm registry publishes daily download counts for every package, so I pulled 46 months for the main cross-platform mobile toolchains that ship through npm: react-native, expo, @capacitor/core, @nativescript/core and cordova. I added react as a control, because a rise in all of them at once says something about npm and not about mobile.
The three big toolchains grew 11 to 23 times in raw counts, and the control grew 9.6 times. Expo is the one that gained against it.
What the counts say
Monthly downloads in millions, from the npm downloads API. October 2026 covers 1 to 28 October only.
| Month | react (control) | react-native | expo | @capacitor/core | cordova | @nativescript/core |
|---|---|---|---|---|---|---|
| 2023-01 | 76.4 | 5.1 | 1.7 | 1.5 | 0.25 | 0.03 |
| 2024-01 | 96.7 | 8.1 | 2.4 | 1.6 | 0.25 | 0.06 |
| 2025-01 | 119.1 | 10.6 | 3.9 | 1.6 | 0.16 | 0.05 |
| 2026-01 | 275.4 | 18.9 | 10.5 | 4.7 | 0.14 | 0.07 |
| 2026-09 | 730.6 | 55.3 | 38.2 | 18.5 | 0.25 | 0.10 |
| 2026-10 (1 to 28) | 666.0 | 51.9 | 39.5 | 19.4 | 0.23 | 0.09 |
From January 2023 to September 2026 the multiples are: react 9.6, react-native 10.8, expo 22.7, @capacitor/core 12.1, @nativescript/core 3.1, cordova 1.0.
The same data as a share of react downloads in the same month:
| Month | react-native | expo | @capacitor/core |
|---|---|---|---|
| 2023-01 | 6.70% | 2.21% | 2.00% |
| 2024-10 (React Native peak) | 10.12% | 3.17% | 1.48% |
| 2026-04 (React Native low) | 5.53% | 3.45% | 1.77% |
| 2026-09 | 7.57% | 5.23% | 2.53% |
| 2026-10 (1 to 28) | 7.80% | 5.93% | 2.91% |
Four readings.
Absolute counts mostly measure npm. react itself rose 9.6 times. Per day, its downloads were 26% higher in March 2026 than in February 2026, and a smaller step shows in react-native (+18%). I did not investigate why. Anything that installs packages on a schedule would show up here, so I would not read 10 times more downloads as 10 times more developers.
Expo is the clear relative gainer. Against react, its share went from 2.2% to 5.2% in September 2026 and 5.9% in October. Against react-native the ratio went from 0.33 to 0.69 and 0.76. Expo apps also depend on react-native, so the two series overlap and I did not measure by how much.
React Native's share of react swung, then recovered. Its share of react rose to a peak of 10.1% in October 2024, fell to 5.5% in April 2026 and recovered to 7.8%. That is a swing of nearly a factor of two inside two years, in both directions, and the end point is above where it started.
Capacitor grew slightly faster than the control, Cordova and NativeScript lost ground against it. @capacitor/core grew 12.1 times against 9.6 for react, with a share between 1.3% and 2.9%. cordova stayed between 0.14 and 0.25 million a month for the whole window, which is a share of 0.3% falling to 0.03%. @nativescript/core is tiny: 0.03 million to 0.10 million, 3.1 times against 9.6 for the control.
What this does and does not say
Package installs are not apps shipped or developers employed. The HN hiring posts showed React Native holding its place while native iOS and Android fell, and the Show HN counts showed React Native and Flutter losing share of launch titles. Install counts do not settle that. They say cross-platform JavaScript tooling is installed far more than in 2023 and Expo is growing faster than the rest of it. They do not say who is hired to use it.
Limits
- Download counts include everything that fetches a tarball: developers, CI runs, mirrors and automated installs. I cannot separate them.
-
reactis a control for npm-wide growth, but it also serves the web, so it is an imperfect one. - One npm package is not a whole framework.
@capacitor/coreis the core of Capacitor, not all its plugins. - Flutter, Kotlin Multiplatform and native Swift do not ship through npm. This post says nothing about them.
- October 2026 is 28 days. Shares are unaffected by that; the absolute row is not comparable to a full month.
- I ran the script twice and the two result sets were identical. The API data may be revised later by npm.
Method
import json, urllib.request, urllib.parse, time, datetime, collections
PKGS = ['react-native', 'expo', '@capacitor/core', '@nativescript/core', 'cordova', 'react']
def get(u):
for i in range(8):
try:
r = json.load(urllib.request.urlopen(u, timeout=40))
time.sleep(2)
return r
except Exception: time.sleep(15 * (i + 1))
raise SystemExit('fail ' + u)
def monthly(pkg, start, end):
out = collections.Counter()
d = start
while d <= end:
e = min(d + datetime.timedelta(days=89), end)
u = f'https://api.npmjs.org/downloads/range/{d}:{e}/{urllib.parse.quote(pkg, safe="@")}'
for r in get(u)['downloads']:
out[r['day'][:7]] += r['downloads']
d = e + datetime.timedelta(days=1)
return out
start, end = datetime.date(2023, 1, 1), datetime.date(2026, 10, 28)
rows = {p: monthly(p, start, end) for p in PKGS}
for m in sorted(rows['react']):
print(m, {p: rows[p][m] for p in PKGS})
The API rate-limits quickly, hence the pause and backoff. Data retrieved 2026-10-30.
What I take from it
If you choose a cross-platform stack today, npm installs say Expo is where the growth is relative to React Native itself, and Capacitor is growing a little faster than react. What I did not measure: downloads of Flutter's pub.dev packages, app store listings, or what the installs build. Does the Expo share match what you see in your own projects?
Top comments (0)