Choose a version:
14% The original file has 774885 bytes (756.7k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 106194 bytes (103.7k, 14%).

After GZIP compression these minified files vary in size:
Boot
  44804 bytes (43.8k)
CDN
cdnjs
  39511 bytes (38.6k)
CDN
gzip -6 (default)
  39264 bytes (38.3k)
local copy
gzip -9
  39213 bytes (38.3k)
local copy
Yandex
  39204 bytes (38.3k)
CDN
jsdelivr
  39204 bytes (38.3k)
CDN
Google
  39201 bytes (38.3k)
CDN
7zip -mx=9 -tgzip
  38024 bytes (37.1k)
local copy
kzip -s0 -rn -b1
  38019 bytes (37.1k)
local copy
libdeflate -12
  38004 bytes (37.1k)
local copy
zultra
  38004 bytes (37.1k)
local copy
pigz -11 -n
  37985 bytes (37.1k)
local copy
Zopfli
  37949 bytes (37.1k)
local copy

perma-link to the smallest file on my server:
http://minime.stephan-brumme.com/files/angularjs/angular-1.2.20.min.js (or via HTTPS)

You will automatically get the smallest AngularJS 1.2.20 file, ETag caching is available and
if your browser doesn't support GZIP decompression then the uncompressed version will be sent.

Currently best Zopfli settings

Save 1252 bytes by using my AngularJS 1.2.20 Zopfli version instead of the best available CDN (3.30% smaller than Google, 37949 vs. 39201 bytes):
You can use my super-compressed files for whatever purpose you like as long as you respect the library's original license agreement.
There are no restrictions from my side - but please avoid hot-linking if you run a high-traffic website.

These command-line settings yielded the best compression ratio so far (Linux version of zopfli-krzymod):
zopfli --i100000 --mb8 --mls32 --bsr23 --lazy --ohh

(found November 28, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 32  --mls32
block splitting recursion 23  --bsr23
lazy matching in LZ77 yes  --lazy
optimized Huffman headers yes  --ohh
initial random W for iterations 1  --rw1
initial random Z for iterations 2  --rz2

Verify file integrity

After decompression, my uncompressed files are identical to the original ones:

MD5:
curl --silent --compressed https://code.angularjs.org/1.2.20/angular.min.js --location | md5sum
d6932521b46d4a74341c8c0b7d574f72  -
curl --silent --compressed https://minime.stephan-brumme.com/files/angularjs/angular-1.2.20.min.zopfli.js.gz | md5sum
d6932521b46d4a74341c8c0b7d574f72  -

SHA1:
curl --silent --compressed https://code.angularjs.org/1.2.20/angular.min.js --location | sha1sum
89bd1c3ea71433b7675321fdede5e2f2323e15a0  -
curl --silent --compressed https://minime.stephan-brumme.com/files/angularjs/angular-1.2.20.min.zopfli.js.gz | sha1sum
89bd1c3ea71433b7675321fdede5e2f2323e15a0  -

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 44804 bytes d6932521b46d4a74341c8c0b7d574f72 March 18, 2015 @ 10:30
cdnjs 39511 bytes d6932521b46d4a74341c8c0b7d574f72 July 19, 2014 @ 05:00
Yandex 39204 bytes d6932521b46d4a74341c8c0b7d574f72 June 11, 2015 @ 14:17
jsdelivr 39204 bytes d6932521b46d4a74341c8c0b7d574f72 August 7, 2014 @ 18:32
Google 39201 bytes d6932521b46d4a74341c8c0b7d574f72 July 11, 2014 @ 23:44

Note: only the MD5 hashes are shown to keep things simple.

Other Versions

Available AngularJS versions at minime.stephan-brumme.com:

1.8.2, 1.8.1, 1.8.0,
1.7.9, 1.7.8, 1.7.7, 1.7.6, 1.7.5, 1.7.4, 1.7.3, 1.7.2, 1.7.1, 1.7.0,
1.6.10, 1.6.9, 1.6.8, 1.6.7, 1.6.6, 1.6.5, 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.6.0,
1.5.11, 1.5.10, 1.5.9, 1.5.8, 1.5.7, 1.5.6, 1.5.5, 1.5.4, 1.5.3, 1.5.2, 1.5.1, 1.5.0,
1.4.14, 1.4.13, 1.4.12, 1.4.11, 1.4.10, 1.4.9, 1.4.8, 1.4.7, 1.4.6, 1.4.5, 1.4.4, 1.4.3, 1.4.2, 1.4.1, 1.4.0,
1.3.20, 1.3.19, 1.3.18, 1.3.17, 1.3.16, 1.3.15, 1.3.14, 1.3.13, 1.3.12, 1.3.11, 1.3.10, 1.3.9, 1.3.8, 1.3.7, 1.3.6, 1.3.5, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0,
1.2.32, 1.2.31, 1.2.30, 1.2.29, 1.2.28, 1.2.27, 1.2.26, 1.2.25, 1.2.24, 1.2.23, 1.2.22, 1.2.21, 1.2.20, 1.2.19, 1.2.18, 1.2.17, 1.2.16, 1.2.15, 1.2.14, 1.2.13, 1.2.12, 1.2.11, 1.2.10, 1.2.9, 1.2.8, 1.2.7, 1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0,
1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0,
1.0.8, 1.0.7, 1.0.6, 1.0.5, 1.0.4, 1.0.3, 1.0.2, 1.0.1, 1.0.0,
0.10.6, 0.10.5, 0.10.4, 0.10.3, 0.10.2, 0.10.1, 0.10.0,
0.9.19, 0.9.18, 0.9.17, 0.9.16, 0.9.15, 0.9.14, 0.9.13, 0.9.12, 0.9.11, 0.9.10, 0.9.9, 0.9.8, 0.9.7, 0.9.6, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0

The project site contains an overview how well these versions were compressed.
Other interesting projects are BackboneJS, Bootstrap, D3, Dojo, Ember, jQuery, Knockout, lodash, React, Socket.IO, ThreeJS, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
37949 bytes -1 byte zopfli --i100000 --mls32 --bsr23 --lazy --ohh November 28, 2015 @ 00:18
37950 bytes -2 bytes zopfli --i100000 --mls2048 --bsr14 --lazy --ohh November 27, 2015 @ 23:04
37952 bytes -2 bytes zopfli --i1000 --mls4096 --bsr6 --lazy --ohh September 7, 2015 @ 19:54
37954 bytes -2 bytes zopfli --i1000 --mls512 --bsr12 --lazy --ohh September 7, 2015 @ 19:52
37956 bytes zopfli --i100 --mls4096 --bsr6 --lazy --ohh September 7, 2015 @ 16:14

If there are multiple parameter sets yielding the same compressed size, only the first one found is shown.

Most recent activity on July 20, 2020 @ 12:47.

Heatmaps

This Zopfli heatmap visualizes how compression changes when modifying the --bsr and --mls parameter.
Cell's contents is the best filesize achieved (in bytes, hover with mouse over cells to see number of iterations).

Good parameters are green, bad are red. The best and worst are bold as well.
The brightness of the blue background color indicates how many iterations were processed:
10,000 or 100,000.
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
37954 37955 37954 37953 37953 37955 37953 37955 37953 37957 37973 37957 37956 37955 37954
37964 37965 37952 37955 37983 37973 37970 37972 37956 37956 37957 37959 37955 37954 37960
37960 37958 37957 37956 37956 37954 37955 37954 37954 37956 37953 37950 37953 37956 37958
37960 37950 37954 37949 37950 37949 37954 37969 37970 37970 37971 37968 37954 37953 37955
37958 37959 37955 37952 37950 37977 37970 37970 37955 37953 37972 37967 37953 37953 37949
37960 37971 37972 37964 37981 37972 37969 37969 37970 37969 37973 37967 37953 37954 37953
37956 37957 37955 37970 37959 37972 37970 37970 37970 37955 37955 37968 37950 37953 37953
37958 37953 37954 37955 37955 37955 37954 37953 37955 37953 37968 37968 37953 37953 37950
37956 37954 37949 37954 37950 37955 37954 37971 37953 37956 37969 37968 37954 37953 37954
37954 37953 37953 37949 37954 37956 37955 37954 37949 37956 37956 37953 37953 37953 37953
37980 37985 37981 37957 37960 37953 37954 37957 37953 37953 37950 37957 37953 37954 37950
37954 37954 37957 37957 37961 37960 37960 37953 37955 37952 37953 37967 37951 37956 37953
37981 37981 37978 37981 37961 37972 37968 37970 37971 37970 37971 37957 37951 37953 37979
37958 37980 37981 37950 37954 37978 37970 37970 37970 37973 37973 37967 37971 37956 37953
37956 37957 37954 37952 37954 37954 37971 37953 37972 37953 37954 37949 37952 37953 37949
37950 37954 37953 37950 37954 37956 37954 37954 37949 37952 37950 37954 37953 37953 37953
37958 37957 37952 37952 37954 37956 37954 37954 37949 37958 37953 37955 37954 37956 37950
37980 37981 37981 37977 37953 37954 37955 37969 37953 37957 37953 37953 37950 37954 37953
37979 37954 37955 37978 37961 37970 37972 37969 37971 37953 37972 37968 37953 37953 37955
37958 37957 37955 37953 37949 37956 37954 37954 37954 37953 37953 37968 37954 37953 37953
37958 37960 37955 37950 37949 37953 37954 37970 37949 37954 37972 37950 37953 37953 37953
37959 37956 37951 37980 37979 37972 37970 37969 37972 37954 37971 37953 37950 37953 37950
37958 37953 37953 37952 37954 37954 37954 37953 37949 37953 37953 37950 37951 37956 37953

Due to the Monte Carlo design of my search algorithm, not all parameters have reached the same number of iterations yet:
Iterations Min. Bytes Reduction Coverage
100 37956 bytes 100%
1,000 37952 bytes -4 bytes 100%
10,000 37951 bytes -1 byte 100%
100,000 37949 bytes -2 bytes 11.59%
1,000,000
10,000,000

KZIP has far less options available for tuning/optimization. I only played around with the number of blocks (parameter -n):
Blocks Min. Bytes Compared To Best Zopfli Compared To Best KZIP
38022 bytes +73 bytes (+0.19%) +3 bytes
38019 bytes +70 bytes (+0.18%)
38043 bytes +94 bytes (+0.25%) +24 bytes
38080 bytes +131 bytes (+0.35%) +61 bytes
38119 bytes +170 bytes (+0.45%) +100 bytes
38142 bytes +193 bytes (+0.51%) +123 bytes
38106 bytes +157 bytes (+0.41%) +87 bytes
38096 bytes +147 bytes (+0.39%) +77 bytes
38113 bytes +164 bytes (+0.43%) +94 bytes

Non-DEFLATE Algorithms

Archivers based on completely different compression algorithms often produce superior results.
Unfortunately, browsers only support gzip compression at the moment.
However, support for Brotli is constantly growing - but your browser doesn't support it.
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 30782 bytes -7167 bytes (-18.89%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 31970 bytes -5979 bytes (-15.76%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 33475 bytes -4474 bytes (-11.79%)
Brotli (Wikipedia) brotli brotli -q 11 34810 bytes -3139 bytes (-8.27%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 35845 bytes -2104 bytes (-5.54%)
LZMA2 (Wikipedia) xz xz -9 36244 bytes -1705 bytes (-4.49%)
Zstandard (Wikipedia) zstd zstd -19 37188 bytes -761 bytes (-2.01%)

Detailled Analysis

I wrote a DEFLATE decoder in Javascript. Click the button below to start a client-side analysis of the smallest gzipped files (may take a second):


Notes: pigz is a fast open source multi-threaded implementation of gzip written by one of the original authors of gzip.
However, when using compression level 11, pigz actually switches to the slower Zopfli algorithm and isn't multi-threaded anymore.
KrzyMOD's extensions to Zopfli offer the highest level of configuration and is therefore used for my brute-force search.
Ken Silverman wrote the closed-source KZIP compression program and Jonathon Fowler ported it to Linux.
Defluff was created by Joachim Henke; DeflOpt is a tool by Ben Jos Walbeehm.

website made by Stephan Brumme in 2015 and still improving in 2024.
all timestamps are displayed in central european time. see my changelog.
no flash, not even images or external css files - and everything squeezed into a single html file.
which was handsomely compressed before releasing it into the wild internet - obviously.

please visit my homepage and my blog, too.
email: minime (at) stephan-brumme.com

All trademarks are property of their respective owners. You know, the boring legal stuff.