Choose a version:
47% The original file has 468470 bytes (457.5k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 220104 bytes (214.9k, 47%).

After GZIP compression these minified files vary in size:
Boot
  84634 bytes (82.7k)
CDN
cdnjs
  74614 bytes (72.9k)
CDN
gzip -6 (default)
  74011 bytes (72.3k)
local copy
gzip -9
  73721 bytes (72.0k)
local copy
libdeflate -12
  70733 bytes (69.1k)
local copy
7zip -mx=9 -tgzip
  70514 bytes (68.9k)
local copy
zultra
  70195 bytes (68.5k)
local copy
kzip -s0 -rn -b6
  70097 bytes (68.5k)
local copy
pigz -11 -n
  70083 bytes (68.4k)
local copy
Zopfli
  70018 bytes (68.4k)
local copy

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

You will automatically get the smallest D3 4.11.0 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 4596 bytes by using my D3 4.11.0 Zopfli version instead of the best available CDN (6.56% smaller than cdnjs, 70018 vs. 74614 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 --i1000000 --mb8 --mls8 --bsr8 --lazy --ohh

(found October 5, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 8  --mls8
block splitting recursion 8  --bsr8
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://raw.githubusercontent.com/mbostock/d3/v4.11.0/d3.zip --location | md5sum
897061c6cde2a3a62e3d22019726114a  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-4.11.0.min.zopfli.js.gz | md5sum
897061c6cde2a3a62e3d22019726114a  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v4.11.0/d3.zip --location | sha1sum
8149f59767deedb6c3b224ce6a720a6ff25ccc95  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-4.11.0.min.zopfli.js.gz | sha1sum
8149f59767deedb6c3b224ce6a720a6ff25ccc95  -

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 84634 bytes 897061c6cde2a3a62e3d22019726114a October 11, 2017 @ 21:35
cdnjs 74614 bytes 897061c6cde2a3a62e3d22019726114a October 3, 2017 @ 19:49

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

Other Versions

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

6.7.0, 6.6.2, 6.6.1, 6.6.0, 6.5.0, 6.4.0, 6.3.1, 6.2.0, 6.1.1, 6.1.0, 6.0.0,
5.16.0, 5.15.1, 5.15.0, 5.14.2, 5.14.1, 5.14.0, 5.13.1, 5.13.0, 5.12.0, 5.11.0, 5.10.1, 5.10.0,
5.9.7, 5.9.6, 5.9.5, 5.9.4, 5.9.3, 5.9.2, 5.9.1, 5.9.0, 5.8.2, 5.8.1, 5.8.0, 5.7.0, 5.6.0, 5.5.0, 5.4.0, 5.3.0, 5.2.0, 5.1.0, 5.0.1, 5.0.0,
4.13.0, 4.12.2, 4.12.1, 4.12.0, 4.11.0, 4.10.2, 4.10.1, 4.10.0,
4.9.1, 4.9.0, 4.8.0, 4.7.4, 4.7.3, 4.7.2, 4.7.1, 4.7.0, 4.6.0, 4.5.0, 4.4.4, 4.4.3, 4.4.2, 4.4.1, 4.4.0, 4.3.0, 4.2.8, 4.2.7, 4.2.6, 4.2.5, 4.2.4, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.1, 4.1.0, 4.0.0,
3.5.17, 3.5.16, 3.5.15, 3.5.14, 3.5.13, 3.5.12, 3.5.11, 3.5.10, 3.5.9, 3.5.8, 3.5.7, 3.5.6, 3.5.5, 3.5.4, 3.5.3, 3.5.2, 3.5.1, 3.5.0, 3.4.13, 3.4.12, 3.4.11, 3.4.10, 3.4.9, 3.4.8, 3.4.6, 3.4.5, 3.4.4, 3.4.3, 3.4.2, 3.4.1, 3.4.0, 3.3.13, 3.3.12, 3.3.11, 3.3.10, 3.3.9, 3.3.8, 3.3.7, 3.3.6, 3.3.5, 3.3.4, 3.3.3, 3.3.2, 3.3.1, 3.3.0, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0

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

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
70018 bytes -4 bytes zopfli --i1000000 --mls8 --bsr8 --lazy --ohh October 5, 2017 @ 02:53
70022 bytes -7 bytes zopfli --i100000 --mls8 --bsr8 --lazy --ohh October 4, 2017 @ 14:22
70029 bytes -7 bytes zopfli --i10000 --mls8 --bsr8 --lazy --ohh October 4, 2017 @ 13:17
70036 bytes -9 bytes zopfli --i1000 --mls8 --bsr8 --lazy --ohh October 4, 2017 @ 11:49
70045 bytes -14 bytes zopfli --i1000 --mls256 --bsr16 --lazy --ohh October 4, 2017 @ 11:48
70059 bytes zopfli --i100 --mls16384 --bsr18 --lazy --ohh October 4, 2017 @ 10:41

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

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
70219 70316 70249 70244 70250 70235 70218 70267 70295 70272 70271 70313 70344 70306 70274
70127 70129 70493 70186 70485 70185 70477 70157 70109 70154 70229 70128 70242 70246 70265
70070 70083 70080 70062 70103 70090 70114 70068 70064 70117 70067 70069 70181 70114 70241
70121 70135 70085 70082 70090 70162 70065 70137 70066 70068 70080 70063 70176 70071 70094
70054 70054 70018 70073 70053 70061 70063 70051 70080 70089 70067 70056 70204 70108 70069
70096 70100 70063 70118 70128 70118 70077 70060 70043 70102 70081 70225 70160 70041 70081
70045 70070 70064 70072 70076 70059 70045 70063 70052 70074 70218 70220 70172 70212 70084
70052 70058 70063 70065 70091 70086 70044 70040 70055 70085 70044 70076 70099 70225 70078
70073 70070 70057 70082 70066 70091 70057 70054 70062 70051 70213 70046 70167 70211 70072
70048 70057 70066 70085 70070 70073 70025 70028 70065 70100 70065 70065 70203 70159 70079
70042 70045 70066 70088 70066 70071 70081 70045 70053 70063 70078 70210 70176 70126 70069
70046 70057 70065 70064 70075 70075 70052 70041 70057 70047 70056 70060 70202 70227 70075
70045 70046 70068 70085 70051 70049 70048 70039 70052 70044 70056 70201 70187 70046 70073
70058 70061 70088 70080 70048 70085 70045 70041 70044 70062 70229 70045 70173 70130 70147
70070 70056 70066 70068 70071 70048 70040 70041 70041 70061 70050 70064 70185 70037 70071
70127 70116 70067 70062 70051 70074 70040 70083 70043 70059 70065 70059 70192 70195 70092
70048 70051 70069 70063 70076 70131 70041 70043 70043 70064 70075 70062 70186 70123 70075
70045 70051 70083 70101 70076 70074 70042 70049 70037 70054 70049 70052 70177 70066 70086
70087 70086 70080 70080 70064 70085 70057 70037 70058 70065 70057 70055 70179 70062 70080
70069 70062 70084 70078 70078 70082 70060 70057 70056 70063 70047 70047 70182 70212 70090
70056 70060 70078 70079 70077 70093 70068 70058 70056 70064 70063 70041 70187 70052 70057
70066 70061 70082 70080 70067 70094 70066 70062 70044 70041 70049 70059 70191 70071 70078
70064 70088 70086 70079 70067 70091 70055 70056 70062 70079 70052 70213 70168 70055 70107

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 70059 bytes 100%
1,000 70036 bytes -23 bytes 100%
10,000 70029 bytes -7 bytes 100%
100,000 70022 bytes -7 bytes 0.87%
1,000,000 70018 bytes -4 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
70233 bytes +215 bytes (+0.31%) +136 bytes
71460 bytes +1442 bytes (+2.06%) +1363 bytes
71329 bytes +1311 bytes (+1.87%) +1232 bytes
70245 bytes +227 bytes (+0.32%) +148 bytes
70233 bytes +215 bytes (+0.31%) +136 bytes
70216 bytes +198 bytes (+0.28%) +119 bytes
70097 bytes +79 bytes (+0.11%)
70116 bytes +98 bytes (+0.14%) +19 bytes
70110 bytes +92 bytes (+0.13%) +13 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 - for example, your browser actually supports it !
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 55006 bytes -15012 bytes (-21.44%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 60667 bytes -9351 bytes (-13.36%)
LZMA2 (Wikipedia) xz xz -9 61956 bytes -8062 bytes (-11.51%)
Brotli (Wikipedia) brotli brotli -q 11 62025 bytes -7993 bytes (-11.42%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 62778 bytes -7240 bytes (-10.34%)
Zstandard (Wikipedia) zstd zstd -19 67300 bytes -2718 bytes (-3.88%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 68072 bytes -1946 bytes (-2.78%)

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.