Choose a version:
29% The original file has 203745 bytes (199.0k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 58794 bytes (57.4k, 29%).

After GZIP compression these minified files vary in size:
Boot
  26617 bytes (26.0k)
CDN
Baidu
  24044 bytes (23.5k)
CDN
cdnjs
  23980 bytes (23.4k)
CDN
gzip -6 (default)
  23902 bytes (23.3k)
local copy
gzip -9
  23870 bytes (23.3k)
local copy
libdeflate -12
  23264 bytes (22.7k)
local copy
7zip -mx=9 -tgzip
  22998 bytes (22.5k)
local copy
zultra
  22935 bytes (22.4k)
local copy
pigz -11 -n
  22892 bytes (22.4k)
local copy
kzip -s0 -rn -b3
  22885 bytes (22.3k)
local copy
Zopfli
  22848 bytes (22.3k)
local copy

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

You will automatically get the smallest AngularJS 0.9.3 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 1132 bytes by using my AngularJS 0.9.3 Zopfli version instead of the best available CDN (4.95% smaller than cdnjs, 22848 vs. 23980 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 --mls32768 --bsr23 --lazy --ohh

(found February 4, 2016)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 32768  --mls32768
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/0.9.3/angular-0.9.3.min.js --location | md5sum
bafc2d898aea59dde90681fc605a1ce4  -
curl --silent --compressed https://minime.stephan-brumme.com/files/angularjs/angular-0.9.3.min.zopfli.js.gz | md5sum
bafc2d898aea59dde90681fc605a1ce4  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 26617 bytes bafc2d898aea59dde90681fc605a1ce4 March 18, 2015 @ 10:05
cdnjs 23980 bytes bafc2d898aea59dde90681fc605a1ce4 March 28, 2014 @ 14:15

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 24044 bytes 2dda2dd1e442091a6dfb21c08a683a75 only whitespaces differ June 5, 2014 @ 10:05

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
22848 bytes -5 bytes zopfli --i100000 --mls32768 --bsr23 --lazy --ohh February 4, 2016 @ 14:16
22853 bytes -3 bytes zopfli --i10000 --mls32768 --bsr23 --lazy --ohh November 26, 2015 @ 10:54
22856 bytes -4 bytes zopfli --i1000 --mls32768 --bsr23 --lazy --ohh September 23, 2015 @ 23:58
22860 bytes -4 bytes zopfli --i1000 --mls4096 --bsr16 --lazy --ohh September 7, 2015 @ 21:51
22864 bytes -1 byte zopfli --i1000 --mls4096 --bsr10 --lazy --ohh September 7, 2015 @ 21:50
22865 bytes -3 bytes zopfli --i1000 --mls2048 --bsr9 --lazy --ohh September 7, 2015 @ 21:49
22868 bytes zopfli --i100 --mls4096 --bsr16 --lazy --ohh September 7, 2015 @ 17:01

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

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
22883 22879 22884 22875 22879 22884 22885 22891 22899 22901 22893 22890 22891 22900 22882
22871 22893 22870 22897 22893 22883 22880 22882 22880 22875 22873 22867 22866 22876 22878
22883 22876 22880 22882 22896 22876 22873 22876 22874 22872 22864 22880 22870 22877 22885
22869 22874 22871 22870 22862 22864 22881 22881 22887 22870 22862 22862 22882 22875 22874
22876 22864 22870 22871 22867 22866 22882 22880 22877 22872 22877 22878 22863 22881 22852
22872 22868 22873 22869 22876 22877 22877 22865 22876 22869 22861 22864 22860 22874 22880
22872 22871 22869 22869 22866 22864 22873 22867 22874 22874 22863 22862 22866 22875 22876
22880 22869 22868 22870 22873 22864 22874 22880 22873 22870 22865 22864 22871 22874 22878
22871 22865 22869 22870 22862 22866 22875 22863 22873 22869 22865 22865 22861 22881 22880
22874 22866 22874 22870 22870 22876 22872 22881 22878 22863 22865 22864 22862 22879 22877
22869 22865 22868 22869 22880 22865 22872 22882 22878 22869 22864 22864 22860 22877 22878
22876 22877 22873 22872 22862 22864 22874 22865 22874 22869 22864 22864 22861 22873 22878
22874 22874 22872 22869 22872 22872 22874 22867 22873 22873 22863 22856 22872 22881 22879
22873 22869 22868 22869 22872 22872 22872 22880 22876 22863 22865 22864 22861 22875 22880
22872 22875 22874 22869 22872 22864 22875 22872 22872 22875 22865 22865 22863 22883 22878
22869 22870 22872 22872 22874 22861 22876 22868 22872 22869 22865 22872 22870 22875 22877
22873 22876 22869 22879 22882 22871 22872 22862 22874 22878 22863 22864 22863 22875 22877
22869 22875 22873 22870 22872 22878 22878 22872 22871 22877 22864 22862 22860 22871 22884
22869 22868 22868 22870 22864 22873 22875 22871 22872 22875 22864 22873 22861 22871 22876
22870 22868 22869 22870 22861 22862 22875 22873 22872 22863 22862 22865 22871 22874 22848
22874 22865 22869 22868 22869 22864 22877 22871 22874 22864 22862 22865 22863 22875 22880
22869 22865 22876 22868 22874 22878 22873 22872 22871 22866 22864 22864 22861 22874 22877
22874 22871 22871 22873 22874 22876 22875 22872 22874 22862 22865 22866 22873 22876 22878

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 22866 bytes 100%
1,000 22856 bytes -10 bytes 100%
10,000 22853 bytes -3 bytes 100%
100,000 22848 bytes -5 bytes 0.87%
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
22941 bytes +93 bytes (+0.41%) +56 bytes
23346 bytes +498 bytes (+2.18%) +461 bytes
22941 bytes +93 bytes (+0.41%) +56 bytes
22885 bytes +37 bytes (+0.16%)
22900 bytes +52 bytes (+0.23%) +15 bytes
22910 bytes +62 bytes (+0.27%) +25 bytes
22923 bytes +75 bytes (+0.33%) +38 bytes
22954 bytes +106 bytes (+0.46%) +69 bytes
22989 bytes +141 bytes (+0.62%) +104 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 20047 bytes -2801 bytes (-12.26%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 20584 bytes -2264 bytes (-9.91%)
Brotli (Wikipedia) brotli brotli -q 11 21160 bytes -1688 bytes (-7.39%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 21650 bytes -1198 bytes (-5.24%)
LZMA2 (Wikipedia) xz xz -9 22436 bytes -412 bytes (-1.80%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 23047 bytes +199 bytes (+0.87%)
Zstandard (Wikipedia) zstd zstd -19 23111 bytes +263 bytes (+1.15%)

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.