Choose a version:
26% The original file has 633626 bytes (618.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 165718 bytes (161.8k, 26%).

After GZIP compression these minified files vary in size:
gzip -6 (default)
  55840 bytes (54.5k)
local copy
gzip -9
  55789 bytes (54.5k)
local copy
libdeflate -12
  53131 bytes (51.9k)
local copy
7zip -mx=9 -tgzip
  53114 bytes (51.9k)
local copy
zultra
  53055 bytes (51.8k)
local copy
pigz -11 -n
  53042 bytes (51.8k)
local copy
kzip -s0 -rn -b1
  53030 bytes (51.8k)
local copy
Zopfli
  52936 bytes (51.7k)
local copy
Zopfli (defluff)
  52935 bytes (51.7k)
local copy

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

You will automatically get the smallest Dojo 1.12.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

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 --i1000000 --mb8 --mls64 --bsr40 --lazy --ohh

(found March 17, 2022)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 64  --mls64
block splitting recursion 40  --bsr40
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

Even Smaller Files Thanks To Defluff

Zopfli's output can be further optimized by the defluff tool.
In this particular case, defluff saves 1 more byte (52935 bytes).

Verify file integrity

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

MD5:
curl --silent --compressed https://download.dojotoolkit.org/release-1.12.3/dojo.js --location | md5sum
ed783c706a5ff45b4be8dc4228d8d275  -
curl --silent --compressed https://minime.stephan-brumme.com/files/dojo/dojo-1.12.3.min.zopfli.js.gz | md5sum
ed783c706a5ff45b4be8dc4228d8d275  -

SHA1:
curl --silent --compressed https://download.dojotoolkit.org/release-1.12.3/dojo.js --location | sha1sum
fa9816c81fa81f135d3cdb066ae871e332cc3c3d  -
curl --silent --compressed https://minime.stephan-brumme.com/files/dojo/dojo-1.12.3.min.zopfli.js.gz | sha1sum
fa9816c81fa81f135d3cdb066ae871e332cc3c3d  -

Other Versions

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

1.17.3, 1.17.2, 1.17.1, 1.17.0,
1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16.0,
1.15.6, 1.15.5, 1.15.4, 1.15.3, 1.15.2, 1.15.1, 1.15.0,
1.14.9, 1.14.8, 1.14.7, 1.14.6, 1.14.5, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14.0,
1.13.10, 1.13.9, 1.13.8, 1.13.7, 1.13.6, 1.13.5, 1.13.4, 1.13.3, 1.13.2, 1.13.1, 1.13.0,
1.12.11, 1.12.10, 1.12.9, 1.12.8, 1.12.7, 1.12.6, 1.12.5, 1.12.4, 1.12.3, 1.12.2, 1.12.1,
1.11.13, 1.11.12, 1.11.11, 1.11.10, 1.11.9, 1.11.8, 1.11.7, 1.11.6, 1.11.5, 1.11.4, 1.11.3, 1.11.2, 1.11.1, 1.11.0,
1.10.10, 1.10.9, 1.10.8, 1.10.7, 1.10.6, 1.10.5, 1.10.4, 1.10.3, 1.10.2, 1.10.1, 1.10.0,
1.9.11, 1.9.10, 1.9.9, 1.9.8, 1.9.7, 1.9.6, 1.9.5, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9.0,
1.8.14, 1.8.13, 1.8.12, 1.8.11, 1.8.10, 1.8.9, 1.8.8, 1.8.7, 1.8.6, 1.8.5, 1.8.4, 1.8.3, 1.8.2, 1.8.1, 1.8.0,
1.7.12, 1.7.11, 1.7.10, 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.5, 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.6.0,
1.5.6, 1.5.5, 1.5.4, 1.5.3, 1.5.2, 1.5.1, 1.5.0,
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.3, 1.3.2, 1.3.1, 1.3.0,
1.2.3, 1.2.2

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

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
52936 bytes -1 byte zopfli --i1000000 --mls64 --bsr40 --lazy --ohh March 17, 2022 @ 17:20
52937 bytes -4 bytes zopfli --i100000 --mls8 --bsr23 --lazy --ohh November 29, 2017 @ 07:29
52941 bytes -1 byte zopfli --i100000 --mls8 --bsr12 --lazy --ohh November 29, 2017 @ 07:27
52942 bytes -2 bytes zopfli --i10000 --mls8 --bsr12 --lazy --ohh November 28, 2017 @ 14:41
52944 bytes -3 bytes zopfli --i10000 --mls2 --bsr25 --lazy --ohh November 28, 2017 @ 14:35
52947 bytes -5 bytes zopfli --i10000 --mls4 --bsr14 --lazy --ohh November 28, 2017 @ 14:30
52952 bytes -1 byte zopfli --i1000 --mls4 --bsr14 --lazy --ohh November 28, 2017 @ 12:59
52953 bytes -2 bytes zopfli --i1000 --mls8 --bsr15 --lazy --ohh November 28, 2017 @ 12:56
52955 bytes zopfli --i100 --mls256 --bsr8 --lazy --ohh November 28, 2017 @ 12:49

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

Most recent activity on March 18, 2022 @ 18:00.

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, 100,000 or 1,000,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
52945 52945 52946 52947 52946 52949 52950 52951 52949 52960 52966 52947 52958 52983 52973
52945 52945 52950 52955 52961 52950 52949 52944 52949 52953 52955 52949 52956 52962 52958
52949 52944 52946 52946 52956 52949 52948 52944 52952 52952 52974 52952 52952 52962 52954
52983 52987 52986 52961 52943 52952 52948 52948 52955 52950 52972 52954 52953 52976 52955
52945 52979 52943 52947 52946 52963 52949 52944 52955 52951 52958 52956 52955 52957 52958
52937 52981 52947 52948 52948 52948 52938 52945 52953 52955 52957 52954 52953 52960 52955
52979 52980 52945 52960 52962 52949 52948 52943 52953 52951 52973 52945 52951 52963 52954
52950 52977 52945 52952 52951 52960 52948 52943 52950 52956 52958 52954 52953 52962 52957
52945 52943 52941 52961 52950 52947 52948 52949 52954 52953 52956 52947 52957 52963 52957
52944 52980 52948 52946 52948 52951 52948 52945 52952 52955 52956 52954 52952 52962 52954
52945 52947 52982 52950 52948 52948 52948 52951 52954 52953 52971 52953 52954 52966 52971
52944 52980 52941 52952 52946 52944 52938 52946 52955 52950 52971 52957 52953 52974 52954
52945 52981 52943 52984 52949 52944 52947 52943 52952 52955 52954 52954 52953 52967 52955
52945 52980 52942 52947 52947 52967 52947 52954 52955 52952 52958 52947 52967 52961 52955
52944 52978 52941 52944 52944 52948 52948 52945 52948 52953 52972 52954 52958 52964 52953
52947 52982 52943 52946 52961 52949 52948 52944 52946 52971 52956 52951 52961 52963 52954
52947 52945 52943 52945 52945 52948 52949 52954 52953 52953 52956 52949 52953 52953 52959
52978 52980 52941 52945 52945 52949 52948 52945 52953 52956 52974 52954 52958 52964 52955
52981 52981 52938 52946 52944 52943 52948 52949 52952 52955 52972 52953 52953 52966 52953
52947 52980 52937 52946 52951 52944 52943 52955 52952 52957 52957 52945 52952 52963 52952
52944 52982 52950 52945 52950 52944 52957 52954 52952 52953 52955 52955 52961 52962 52954
52944 52943 52943 52946 52948 52938 52948 52945 52946 52955 52956 52954 52954 52963 52955
52944 52980 52943 52946 52949 52936 52957 52944 52955 52953 52971 52954 52955 52960 52955

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 52955 bytes 100%
1,000 52952 bytes -3 bytes 100%
10,000 52942 bytes -10 bytes 100%
100,000 52937 bytes -5 bytes 4.64%
1,000,000 52936 bytes -1 byte 0.87%
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
53101 bytes +165 bytes (+0.31%) +71 bytes
53030 bytes +94 bytes (+0.18%)
53049 bytes +113 bytes (+0.21%) +19 bytes
53103 bytes +167 bytes (+0.32%) +73 bytes
53133 bytes +197 bytes (+0.37%) +103 bytes
53179 bytes +243 bytes (+0.46%) +149 bytes
53201 bytes +265 bytes (+0.50%) +171 bytes
53245 bytes +309 bytes (+0.58%) +215 bytes
53264 bytes +328 bytes (+0.62%) +234 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 38921 bytes -14015 bytes (-26.48%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 46455 bytes -6481 bytes (-12.24%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 47411 bytes -5525 bytes (-10.44%)
Brotli (Wikipedia) brotli brotli -q 11 48899 bytes -4037 bytes (-7.63%)
LZMA2 (Wikipedia) xz xz -9 49976 bytes -2960 bytes (-5.59%)
Zstandard (Wikipedia) zstd zstd -19 51551 bytes -1385 bytes (-2.62%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 51616 bytes -1320 bytes (-2.49%)

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.