Choose a version:
24% The original file has 375088 bytes (366.3k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 89269 bytes (87.2k, 24%).

After GZIP compression these minified files vary in size:
Boot
  35016 bytes (34.2k)
CDN
Baidu
  30529 bytes (29.8k)
CDN
cdnjs
  30520 bytes (29.8k)
CDN
gzip -6 (default)
  30422 bytes (29.7k)
local copy
gzip -9
  30384 bytes (29.7k)
local copy
Sina
  30372 bytes (29.7k)
CDN
libdeflate -12
  29065 bytes (28.4k)
local copy
7zip -mx=9 -tgzip
  29023 bytes (28.3k)
local copy
kzip -s0 -rn -b1
  29012 bytes (28.3k)
local copy
zultra
  28972 bytes (28.3k)
local copy
pigz -11 -n
  28953 bytes (28.3k)
local copy
Zopfli
  28869 bytes (28.2k)
local copy
Zopfli (defluff)
  28868 bytes (28.2k)
local copy

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

You will automatically get the smallest Dojo 1.4.1 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 1503 bytes by using my Dojo 1.4.1 Zopfli version instead of the best available CDN (5.21% smaller than Sina, 28869 vs. 30372 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 --mls64 --bsr30 --lazy --ohh

(found December 1, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 64  --mls64
block splitting recursion 30  --bsr30
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 (28868 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.4.1/dojo.js --location | md5sum
52547c83649d153a0b2be9149195fbeb  -
curl --silent --compressed https://minime.stephan-brumme.com/files/dojo/dojo-1.4.1.min.zopfli.js.gz | md5sum
52547c83649d153a0b2be9149195fbeb  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 35016 bytes 52547c83649d153a0b2be9149195fbeb March 19, 2015 @ 15:30
cdnjs 30520 bytes 52547c83649d153a0b2be9149195fbeb February 8, 2015 @ 14:45
Sina 30372 bytes 52547c83649d153a0b2be9149195fbeb April 25, 2019 @ 14:07

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 30529 bytes 6b66b2b71e2c145b141d52061c6396cb only whitespaces differ January 7, 2015 @ 10:16

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

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
28869 bytes -4 bytes zopfli --i100000 --mls64 --bsr30 --lazy --ohh December 1, 2015 @ 15:06
28873 bytes -4 bytes zopfli --i10000 --mls64 --bsr30 --lazy --ohh September 24, 2015 @ 11:49
28877 bytes -9 bytes zopfli --i1000 --mls64 --bsr30 --lazy --ohh September 24, 2015 @ 11:46
28886 bytes zopfli --i100 --mls64 --bsr30 --lazy --ohh September 24, 2015 @ 11:09

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

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
28938 28937 28950 28948 28942 28969 28954 28953 28960 28959 28959 28954 28968 28953 28954
28924 28950 28938 28942 28921 28912 28921 28930 28937 28938 28942 28958 28955 28959 28952
28916 28922 28916 28920 28926 28913 28922 28945 28934 28957 28934 28960 28969 28958 28954
28923 28924 28933 28931 28943 28925 28917 28922 28944 28921 28926 28960 28959 28957 28956
28920 28922 28914 28928 28923 28925 28919 28923 28925 28920 28920 28921 28956 28957 28953
28933 28924 28920 28918 28929 28915 28917 28909 28942 28955 28929 28952 28938 28956 28949
28925 28914 28922 28924 28919 28928 28917 28916 28933 28959 28934 28950 28952 28960 28953
28925 28917 28913 28919 28938 28921 28916 28915 28920 28912 28931 28952 28959 28957 28953
28919 28915 28918 28926 28917 28910 28918 28920 28926 28920 28928 28950 28956 28950 28953
28914 28910 28916 28913 28905 28915 28921 28920 28921 28947 28892 28895 28955 28952 28950
28906 28909 28905 28911 28909 28922 28914 28919 28925 28952 28945 28950 28900 28957 28956
28902 28914 28937 28917 28909 28909 28915 28923 28920 28905 28942 28959 28957 28958 28962
28910 28904 28906 28911 28920 28912 28923 28907 28924 28908 28929 28950 28940 28957 28957
28911 28928 28909 28907 28925 28917 28917 28923 28928 28915 28922 28949 28957 28956 28956
28918 28894 28896 28923 28909 28914 28920 28912 28927 28911 28939 28950 28896 28957 28960
28918 28916 28928 28918 28910 28929 28926 28931 28930 28954 28950 28954 28957 28951 28949
28896 28896 28888 28909 28918 28921 28914 28924 28914 28912 28932 28953 28959 28957 28952
28917 28921 28925 28917 28909 28893 28919 28906 28931 28914 28917 28952 28937 28951 28955
28896 28896 28929 28889 28907 28923 28919 28930 28940 28918 28910 28959 28900 28951 28950
28927 28909 28907 28920 28906 28918 28919 28912 28914 28922 28956 28960 28901 28957 28956
28906 28910 28931 28909 28920 28911 28918 28917 28924 28907 28911 28896 28895 28950 28955
28926 28918 28911 28908 28908 28869 28914 28935 28925 28905 28922 28962 28898 28951 28951
28909 28907 28910 28912 28914 28913 28917 28930 28927 28906 28906 28954 28966 28951 28948

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 28886 bytes 100%
1,000 28877 bytes -9 bytes 100%
10,000 28873 bytes -4 bytes 100%
100,000 28869 bytes -4 bytes 0.58%
1,000,000 28869 bytes 0.29%
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
29015 bytes +146 bytes (+0.51%) +3 bytes
29012 bytes +143 bytes (+0.50%)
29049 bytes +180 bytes (+0.62%) +37 bytes
29020 bytes +151 bytes (+0.52%) +8 bytes
29041 bytes +172 bytes (+0.60%) +29 bytes
29031 bytes +162 bytes (+0.56%) +19 bytes
29023 bytes +154 bytes (+0.53%) +11 bytes
29035 bytes +166 bytes (+0.58%) +23 bytes
29073 bytes +204 bytes (+0.71%) +61 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 22986 bytes -5883 bytes (-20.38%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 25767 bytes -3102 bytes (-10.75%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 26625 bytes -2244 bytes (-7.77%)
Brotli (Wikipedia) brotli brotli -q 11 26840 bytes -2029 bytes (-7.03%)
LZMA2 (Wikipedia) xz xz -9 27712 bytes -1157 bytes (-4.01%)
Zstandard (Wikipedia) zstd zstd -19 28465 bytes -404 bytes (-1.40%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 28587 bytes -282 bytes (-0.98%)

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.