Angular Popularity Evolution

June 24, 2026 · View on GitHub

Did Angular's major architectural shifts — standalone components → signals → zoneless — bend its adoption trajectory? And how much of any movement is just (a) the whole npm ecosystem growing and (b) the post-ChatGPT "AI coding era," which has structurally favored React?

This repo answers that with normalized, share-based npm download time series for Angular vs React, Vue, Svelte, triangulated with GitHub stars, developer surveys, and AI-tooling signals, and run through a full causal stack — interrupted time series (ITS) + synthetic-control CausalImpact/BSTS

  • ruptures change-point detection.

Quick start

python3.12 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m ipykernel install --user --name angularstats --display-name "Python 3 (.venv)"

# regenerate + execute the notebook end-to-end (re-fetches, then caches to data/raw/)
.venv/bin/python src/build_notebook.py
.venv/bin/jupyter nbconvert --to notebook --execute --inplace \
  --ExecutePreprocessor.timeout=900 --ExecutePreprocessor.kernel_name=angularstats \
  notebooks/angular_popularity_analysis.ipynb

Then open notebooks/angular_popularity_analysis.ipynb (or the rendered reports/*.html).

Layout

PathWhat
notebooks/angular_popularity_analysis.ipynbThe analysis — acquisition → normalization → causal stack → findings
reports/*.htmlRendered notebook (no kernel needed to read)
src/config.pyPackages, verified Angular intervention dates, AI-era definition, eras
src/npm_fetch.pynpm download API (chunked, cached, curl-based)
src/github_fetch.pyGitHub stars/stats (sampled, cached)
src/processing.pyWeekly aggregation, STL, spike handling, normalization, CAGR
src/causal.pyITS (HAC), ruptures change-points, BSTS/CausalImpact, AI-era ramp
src/curated_data.pyState of JS / Stack Overflow / Web-Bench reference series (cited)
data/raw/Cached API responses (re-runs are offline)
figures/Generated charts
RESEARCH_NOTES.mdConsolidated source research + methodology rationale
FINDINGS.mdHeadline results from the latest run

Two environment notes baked into the code

  • Python HTTPS hangs ~120s/call here (IPv6-first connection timeout); all network goes through curl via subprocess, which is instant.
  • GitHub is unauthenticated (60 req/hr) — star history is sampled at low resolution. Set GITHUB_TOKEN for full resolution.

Headline caveats (read these before quoting any number)

  • A download ≠ a developer. npm counts are dominated by CI/CD/mirrors; npm does no bot filtering. Every result is normalized; absolute levels are never trusted.
  • Release effects are observational, not causal — the v16–v17 cluster is inseparable from the AI inflection by timing alone.
  • There is no AI-free counterfactual; only cross-framework differences are identified.