Downloads for routine application updates have grown steadily while the visible feature set has changed modestly. The growth comes from what ships alongside the feature.
Applications now carry their own dependencies
Software used to rely on libraries installed centrally on the machine and shared between programs. That arrangement broke whenever two programs needed different versions of the same library.
The solution was to have each application bundle the exact versions it was built against, which removes the conflict and duplicates the code across every application on the system.
A single application therefore ships a rendering engine, a cryptography library and a runtime that a dozen other applications on the same device also ship.
Backwards compatibility is rarely removed
Old file formats, old protocols and old device support stay in the codebase because somewhere a user still depends on them, and breaking that user generates far more noise than the disk space saves.
Removing code also carries risk. The old path may be entangled with the new one, and the test coverage proving it can go safely often does not exist.
So the safe engineering decision at each individual moment is to add rather than delete, and the accumulation is the sum of many safe decisions.
Assets grew with screens
Interface artwork has to look correct on displays with very different pixel densities, which means shipping several resolutions of the same image or vector equivalents that render at any size.
Fonts follow the same pattern. Covering many writing systems in one package is far larger than covering one, and applications increasingly ship the whole set.
Sound, animation and onboarding video all add weight that is invisible in a feature list.
Delivery mechanics shape the number you see
Some platforms deliver only the changed portions of a package, so the download is smaller than the installed size. Others replace the whole application every time.
Where an update system verifies integrity by comparing whole files, a one-line change in a large bundled component can require sending that component again.
The reported download size is therefore as much a property of the update system as of the change itself.
The incentives do not favour shrinking
Storage and bandwidth have become cheap enough that size rarely blocks a release, so engineering effort goes to features and reliability instead.
Teams are measured on shipping, and a project to remove dead code produces no visible improvement while carrying a real chance of breaking something.
The cost lands on users with slow connections, metered data or older devices, which is a group that is largely invisible in the metrics that drive release decisions.