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

After GZIP compression these minified files vary in size:
Boot
  44564 bytes (43.5k)
CDN
cdnjs
  39222 bytes (38.3k)
CDN
gzip -6 (default)
  38993 bytes (38.1k)
local copy
gzip -9
  38935 bytes (38.0k)
local copy
Yandex
  38930 bytes (38.0k)
CDN
jsdelivr
  38930 bytes (38.0k)
CDN
Google
  38926 bytes (38.0k)
CDN
7zip -mx=9 -tgzip
  37759 bytes (36.9k)
local copy
kzip -s0 -rn -b0
  37749 bytes (36.9k)
local copy
libdeflate -12
  37730 bytes (36.8k)
local copy
zultra
  37716 bytes (36.8k)
local copy
pigz -11 -n
  37699 bytes (36.8k)
local copy
Zopfli
  37673 bytes (36.8k)
local copy

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

You will automatically get the smallest AngularJS 1.2.17 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 1253 bytes by using my AngularJS 1.2.17 Zopfli version instead of the best available CDN (3.33% smaller than Google, 37673 vs. 38926 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 --i10000 --mb8 --mls4 --bsr7 --lazy --ohh

(found October 14, 2015)
Description Value Parameter
iterations 10000  --i10000
maximum blocks 8  --mb8
maximum length score 4  --mls4
block splitting recursion 7  --bsr7
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.17/angular.min.js --location | md5sum
85a8b1ee78eba832cba9bc46289c6a2a  -
curl --silent --compressed https://minime.stephan-brumme.com/files/angularjs/angular-1.2.17.min.zopfli.js.gz | md5sum
85a8b1ee78eba832cba9bc46289c6a2a  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 44564 bytes 85a8b1ee78eba832cba9bc46289c6a2a March 18, 2015 @ 10:27
cdnjs 39222 bytes 85a8b1ee78eba832cba9bc46289c6a2a July 19, 2014 @ 06:15
Yandex 38930 bytes 85a8b1ee78eba832cba9bc46289c6a2a June 11, 2015 @ 14:17
jsdelivr 38930 bytes 85a8b1ee78eba832cba9bc46289c6a2a August 7, 2014 @ 18:32
Google 38926 bytes 85a8b1ee78eba832cba9bc46289c6a2a June 6, 2014 @ 23:51

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
37673 bytes -1 byte zopfli --i10000 --mls4 --bsr7 --lazy --ohh October 14, 2015 @ 02:36
37674 bytes -3 bytes zopfli --i10000 --mls512 --bsr8 --lazy --ohh September 9, 2015 @ 17:05
37677 bytes -1 byte zopfli --i1000 --mls4096 --bsr13 --lazy --ohh September 7, 2015 @ 20:09
37678 bytes -13 bytes zopfli --i1000 --mls512 --bsr11 --lazy --ohh September 7, 2015 @ 20:06
37691 bytes zopfli --i100 --mls2048 --bsr2 --lazy --ohh September 7, 2015 @ 16:12

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:52.

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
37676 37675 37675 37678 37677 37676 37676 37675 37675 37690 37676 37680 37681 37686 37678
37682 37682 37682 37682 37679 37678 37678 37705 37680 37676 37684 37680 37681 37687 37681
37676 37678 37678 37676 37681 37675 37676 37691 37681 37681 37676 37679 37676 37687 37679
37674 37673 37676 37678 37677 37675 37673 37676 37676 37682 37686 37705 37676 37686 37675
37677 37676 37675 37677 37682 37680 37676 37674 37674 37680 37698 37675 37676 37686 37677
37675 37676 37675 37678 37678 37675 37679 37676 37675 37679 37699 37701 37676 37686 37676
37676 37676 37675 37676 37683 37702 37675 37701 37676 37680 37702 37678 37676 37686 37674
37675 37678 37675 37674 37675 37675 37678 37674 37674 37679 37698 37701 37676 37685 37675
37675 37675 37675 37677 37675 37675 37676 37674 37674 37676 37697 37678 37676 37685 37674
37677 37676 37675 37677 37677 37677 37676 37676 37679 37680 37685 37675 37676 37687 37675
37678 37673 37676 37678 37675 37675 37676 37679 37676 37675 37683 37679 37676 37686 37675
37676 37673 37681 37680 37690 37675 37675 37676 37675 37682 37677 37701 37676 37686 37674
37677 37678 37704 37677 37681 37702 37702 37696 37704 37697 37698 37701 37675 37686 37675
37677 37677 37675 37674 37677 37676 37676 37702 37706 37702 37698 37704 37675 37686 37674
37681 37676 37675 37674 37675 37675 37676 37674 37676 37674 37684 37675 37675 37687 37676
37675 37675 37676 37677 37681 37680 37679 37674 37676 37679 37678 37675 37675 37686 37674
37681 37675 37675 37674 37681 37680 37675 37675 37676 37682 37675 37676 37676 37685 37674
37677 37678 37674 37675 37676 37681 37680 37702 37690 37676 37678 37678 37676 37685 37674
37674 37675 37676 37676 37677 37675 37680 37673 37676 37678 37676 37704 37675 37685 37676
37674 37675 37676 37674 37681 37680 37682 37675 37675 37680 37683 37707 37676 37686 37674
37673 37673 37675 37675 37677 37676 37676 37674 37675 37674 37696 37676 37676 37686 37675
37675 37675 37675 37675 37675 37675 37676 37702 37675 37680 37699 37680 37676 37685 37675
37675 37675 37675 37674 37675 37676 37681 37674 37674 37676 37678 37678 37675 37686 37676

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 37685 bytes 100%
1,000 37677 bytes -8 bytes 100%
10,000 37673 bytes -4 bytes 100%
100,000 37673 bytes 3.19%
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
37749 bytes +76 bytes (+0.20%)
37750 bytes +77 bytes (+0.20%) +1 byte
37767 bytes +94 bytes (+0.25%) +18 bytes
37799 bytes +126 bytes (+0.33%) +50 bytes
37835 bytes +162 bytes (+0.43%) +86 bytes
37796 bytes +123 bytes (+0.33%) +47 bytes
37786 bytes +113 bytes (+0.30%) +37 bytes
37809 bytes +136 bytes (+0.36%) +60 bytes
37830 bytes +157 bytes (+0.42%) +81 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 30548 bytes -7125 bytes (-18.91%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 31726 bytes -5947 bytes (-15.79%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 33206 bytes -4467 bytes (-11.86%)
Brotli (Wikipedia) brotli brotli -q 11 34576 bytes -3097 bytes (-8.22%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 35562 bytes -2111 bytes (-5.60%)
LZMA2 (Wikipedia) xz xz -9 36024 bytes -1649 bytes (-4.38%)
Zstandard (Wikipedia) zstd zstd -19 36930 bytes -743 bytes (-1.97%)

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.