Choose a version:
46% The original file has 308782 bytes (301.5k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 143524 bytes (140.2k, 46%).

After GZIP compression these minified files vary in size:
Boot
  56163 bytes (54.8k)
CDN
Baidu
  49066 bytes (47.9k)
CDN
cdnjs
  49056 bytes (47.9k)
CDN
gzip -6 (default)
  48655 bytes (47.5k)
local copy
unpkg
  48585 bytes (47.4k)
CDN
gzip -9
  48468 bytes (47.3k)
local copy
7zip -mx=9 -tgzip
  46891 bytes (45.8k)
local copy
libdeflate -12
  46886 bytes (45.8k)
local copy
zultra
  46854 bytes (45.8k)
local copy
pigz -11 -n
  46849 bytes (45.8k)
local copy
kzip -s0 -rn -b6
  46700 bytes (45.6k)
local copy
Zopfli
  46601 bytes (45.5k)
local copy
Zopfli (defluff)
  46600 bytes (45.5k)
local copy

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

You will automatically get the smallest D3 3.2.4 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 1984 bytes by using my D3 3.2.4 Zopfli version instead of the best available CDN (4.26% smaller than unpkg, 46601 vs. 48585 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 --mls512 --bsr13 --lazy --ohh

(found December 21, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 512  --mls512
block splitting recursion 13  --bsr13
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 (46600 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/v3.2.4/d3.min.js --location | md5sum
315ac687c55c29404168cc2d731d60b4  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.2.4.min.zopfli.js.gz | md5sum
315ac687c55c29404168cc2d731d60b4  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.2.4/d3.min.js --location | sha1sum
5d089e61886cdbb1f53670ae57a92f7b1553533c  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.2.4.min.zopfli.js.gz | sha1sum
5d089e61886cdbb1f53670ae57a92f7b1553533c  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 56163 bytes 315ac687c55c29404168cc2d731d60b4 (invalid)
cdnjs 49056 bytes 315ac687c55c29404168cc2d731d60b4 (invalid)
unpkg 48585 bytes 315ac687c55c29404168cc2d731d60b4 July 11, 2016 @ 16:32

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 49066 bytes f307494590e3f18f6a6bfd0c917e7deb only whitespaces differ (invalid)

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
46601 bytes -7 bytes zopfli --i100000 --mls512 --bsr13 --lazy --ohh December 21, 2015 @ 15:51
46608 bytes -7 bytes zopfli --i10000 --mls512 --bsr13 --lazy --ohh November 23, 2015 @ 17:37
46615 bytes -4 bytes zopfli --i1000 --mls512 --bsr13 --lazy --ohh September 20, 2015 @ 04:37
46619 bytes zopfli --i100 --mls512 --bsr13 --lazy --ohh September 18, 2015 @ 20:58

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

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
46799 46800 46799 46805 46645 46653 46814 46810 46799 46710 46738 46790 46812 46743 46792
46807 46807 46687 46750 46761 46748 46819 46794 46795 46680 46715 46799 46814 46709 46808
46733 46812 46731 46621 46670 46751 46640 46745 46734 46622 46812 46794 46807 46704 46807
46791 46760 46804 46677 46652 46738 46755 46709 46748 46810 46811 46809 46783 46694 46787
46815 46806 46715 46645 46636 46634 46756 46756 46664 46619 46811 46789 46809 46699 46797
46669 46753 46812 46699 46645 46737 46758 46768 46790 46680 46695 46809 46798 46791 46799
46740 46727 46739 46750 46740 46768 46741 46755 46732 46812 46755 46726 46790 46717 46796
46667 46751 46817 46710 46759 46746 46751 46723 46756 46670 46692 46809 46786 46692 46792
46811 46801 46747 46698 46780 46756 46747 46646 46734 46626 46692 46800 46790 46796 46794
46746 46757 46804 46740 46662 46687 46683 46665 46601 46627 46695 46789 46796 46701 46799
46803 46794 46749 46683 46642 46765 46755 46764 46740 46622 46693 46788 46813 46696 46796
46723 46756 46768 46749 46764 46741 46746 46751 46768 46622 46749 46746 46814 46702 46794
46703 46696 46788 46742 46746 46741 46745 46743 46764 46622 46694 46803 46797 46688 46798
46678 46667 46809 46682 46794 46735 46786 46743 46745 46654 46696 46780 46790 46798 46795
46788 46693 46813 46699 46643 46757 46791 46795 46804 46631 46699 46781 46793 46694 46797
46671 46679 46768 46636 46641 46738 46746 46743 46797 46625 46696 46800 46797 46688 46795
46764 46762 46766 46741 46741 46746 46736 46739 46744 46651 46698 46732 46785 46697 46800
46745 46735 46744 46742 46745 46757 46762 46756 46774 46622 46764 46730 46790 46696 46800
46746 46733 46692 46635 46661 46736 46753 46743 46749 46627 46694 46750 46793 46706 46792
46666 46740 46755 46701 46657 46742 46746 46743 46733 46753 46696 46790 46796 46695 46800
46722 46744 46714 46744 46750 46739 46748 46744 46754 46621 46696 46749 46790 46699 46799
46787 46785 46734 46772 46752 46742 46757 46751 46728 46624 46691 46732 46809 46679 46797
46712 46742 46704 46703 46647 46738 46736 46758 46761 46624 46693 46630 46797 46696 46792

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 46619 bytes 100%
1,000 46615 bytes -4 bytes 100%
10,000 46608 bytes -7 bytes 100%
100,000 46601 bytes -7 bytes 0.29%
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
46818 bytes +217 bytes (+0.47%) +118 bytes
46829 bytes +228 bytes (+0.49%) +129 bytes
46817 bytes +216 bytes (+0.46%) +117 bytes
46784 bytes +183 bytes (+0.39%) +84 bytes
46805 bytes +204 bytes (+0.44%) +105 bytes
46758 bytes +157 bytes (+0.34%) +58 bytes
46700 bytes +99 bytes (+0.21%)
46729 bytes +128 bytes (+0.27%) +29 bytes
46726 bytes +125 bytes (+0.27%) +26 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 37464 bytes -9137 bytes (-19.61%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 39694 bytes -6907 bytes (-14.82%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 40306 bytes -6295 bytes (-13.51%)
Brotli (Wikipedia) brotli brotli -q 11 42220 bytes -4381 bytes (-9.40%)
LZMA2 (Wikipedia) xz xz -9 42960 bytes -3641 bytes (-7.81%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 44827 bytes -1774 bytes (-3.81%)
Zstandard (Wikipedia) zstd zstd -19 45018 bytes -1583 bytes (-3.40%)

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.