Choose a version:
45% The original file has 462670 bytes (451.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 208023 bytes (203.1k, 45%).

After GZIP compression these minified files vary in size:
Boot
  79403 bytes (77.5k)
CDN
cdnjs
  69791 bytes (68.2k)
CDN
gzip -6 (default)
  69249 bytes (67.6k)
local copy
gzip -9
  69041 bytes (67.4k)
local copy
libdeflate -12
  66447 bytes (64.9k)
local copy
7zip -mx=9 -tgzip
  65982 bytes (64.4k)
local copy
zultra
  65884 bytes (64.3k)
local copy
kzip -s0 -rn -b8
  65675 bytes (64.1k)
local copy
pigz -11 -n
  65619 bytes (64.1k)
local copy
Zopfli
  65510 bytes (64.0k)
local copy
Zopfli (defluff)
  65507 bytes (64.0k)
local copy

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

You will automatically get the smallest D3 4.0.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 4281 bytes by using my D3 4.0.0 Zopfli version instead of the best available CDN (6.53% smaller than cdnjs, 65510 vs. 69791 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 --mls2048 --bsr25 --lazy --ohh

(found July 11, 2016)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 2048  --mls2048
block splitting recursion 25  --bsr25
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 3 more bytes (65507 bytes).

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.0.0/d3.zip --location | md5sum
a04d2a32b7cdedde6777b264db48666a  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-4.0.0.min.zopfli.js.gz | md5sum
a04d2a32b7cdedde6777b264db48666a  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v4.0.0/d3.zip --location | sha1sum
03737919bec64cc506d6756d388a3681f6b52dd0  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-4.0.0.min.zopfli.js.gz | sha1sum
03737919bec64cc506d6756d388a3681f6b52dd0  -

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 79403 bytes a04d2a32b7cdedde6777b264db48666a July 3, 2016 @ 05:46
cdnjs 69791 bytes a04d2a32b7cdedde6777b264db48666a July 1, 2016 @ 06:01

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
65510 bytes -5 bytes zopfli --i100000 --mls2048 --bsr25 --lazy --ohh July 11, 2016 @ 19:26
65515 bytes -7 bytes zopfli --i10000 --mls2048 --bsr25 --lazy --ohh July 11, 2016 @ 18:03
65522 bytes -30 bytes zopfli --i1000 --mls2048 --bsr25 --lazy --ohh July 11, 2016 @ 17:56
65552 bytes zopfli --i100 --mls2048 --bsr25 --lazy --ohh July 11, 2016 @ 17:33

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
65869 65890 65740 65737 65788 65737 65656 65743 65671 65614 65722 65774 65783 65685 65835
65653 65869 65759 65766 65796 65773 65668 65662 65537 65557 65591 65582 65623 65591 65699
65540 65778 65722 66207 65547 65541 65725 65631 65582 65551 65562 65533 65648 65652 65701
65706 65714 65751 65720 66244 66231 65661 65654 65640 65668 65523 65576 65700 65527 65682
65720 65718 65723 66211 66219 65724 65726 65648 65563 65527 65527 65524 65574 65567 65670
66215 66214 65716 65717 65717 65717 65663 65550 65542 65563 65514 65534 65596 65592 65674
65719 66259 65682 65718 65674 65723 65669 65632 65541 65547 65522 65530 65570 65681 65676
65709 65709 65705 65706 65650 65731 65673 65636 65545 65522 65521 65528 65557 65524 65679
66232 66228 65688 65706 65653 65648 65717 65636 65528 65547 65570 65530 65654 65579 65652
66233 66235 65720 65708 65542 65721 65720 65632 65639 65547 65540 65540 65656 65687 65679
65718 65719 65724 65727 65653 65725 65567 65574 65539 65542 65546 65537 65678 65587 65676
65707 65706 65721 65639 65638 65635 65643 65640 65649 65549 65522 65535 65672 65583 65686
65711 65708 65709 65719 65645 65723 65719 65632 65536 65577 65570 65570 65651 65678 65644
65715 66257 65698 65707 65650 65719 65714 65640 65641 65553 65557 65538 65680 65601 65649
65717 66227 65724 65723 65651 65728 65720 65637 65536 65541 65528 65545 65666 65615 65684
65707 65711 65710 65711 65654 66206 66207 65640 65543 65551 65529 65637 65587 65523 65681
65712 65706 65717 65696 65655 65718 65646 65632 65543 65553 65512 65635 65695 65592 65677
65710 65708 65721 65719 65648 65652 65721 65630 65521 65553 65531 65524 65565 65596 65653
66231 66235 65705 65705 65653 66209 65708 65629 65528 65552 65520 65529 65682 65667 65673
65715 65711 65717 65720 65710 65728 65718 65631 65536 65521 65514 65528 65559 65670 65655
65713 65714 65721 65713 65651 65729 65717 65632 65644 65524 65510 65533 65608 65691 65679
65730 65731 65735 65745 65719 65710 65718 65535 65538 65551 65520 65524 65558 65586 65667
65724 65709 65711 65715 65656 65723 65720 65534 65535 65546 65535 65564 65625 65568 65664

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 65552 bytes 100%
1,000 65522 bytes -30 bytes 100%
10,000 65515 bytes -7 bytes 100%
100,000 65510 bytes -5 bytes 1.16%
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
65740 bytes +230 bytes (+0.35%) +65 bytes
67179 bytes +1669 bytes (+2.55%) +1504 bytes
66683 bytes +1173 bytes (+1.79%) +1008 bytes
66289 bytes +779 bytes (+1.19%) +614 bytes
65786 bytes +276 bytes (+0.42%) +111 bytes
65791 bytes +281 bytes (+0.43%) +116 bytes
65726 bytes +216 bytes (+0.33%) +51 bytes
65737 bytes +227 bytes (+0.35%) +62 bytes
65675 bytes +165 bytes (+0.25%)

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 51992 bytes -13518 bytes (-20.64%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 58358 bytes -7152 bytes (-10.92%)
LZMA2 (Wikipedia) xz xz -9 58796 bytes -6714 bytes (-10.25%)
Brotli (Wikipedia) brotli brotli -q 11 59063 bytes -6447 bytes (-9.84%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 59736 bytes -5774 bytes (-8.81%)
Zstandard (Wikipedia) zstd zstd -19 64040 bytes -1470 bytes (-2.24%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 65621 bytes +111 bytes (+0.17%)

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.