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

After GZIP compression these minified files vary in size:
Boot
  48776 bytes (47.6k)
CDN, direct link
Baidu
  42678 bytes (41.7k)
CDN, direct link
cdnjs
  42668 bytes (41.7k)
CDN, direct link
gzip -6 (default)
  42333 bytes (41.3k)
local copy
cdnhttps
  42317 bytes (41.3k)
CDN, direct link
unpkg
  42294 bytes (41.3k)
CDN, direct link
gzip -9
  42211 bytes (41.2k)
local copy
7zip -mx=9 -tgzip
  40841 bytes (39.9k)
local copy
libdeflate -12
  40817 bytes (39.9k)
local copy
pigz -11 -n
  40790 bytes (39.8k)
local copy
kzip -s0 -rn -b8
  40707 bytes (39.8k)
local copy
Zopfli
  40585 bytes (39.6k)
local copy
Zopfli (defluff)
  40583 bytes (39.6k)
local copy

perma-link to the smallest file on my server:
http://minime.stephan-brumme.com/files/d3/d3-3.0.8.min.js

You will automatically get the smallest D3 3.0.8 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 1709 bytes by using my D3 3.0.8 Zopfli version instead of the best available CDN (4.21% smaller than unpkg, 40585 vs. 42294 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 --mls128 --bsr40 --lazy --ohh

(found December 21, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 128  --mls128
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 2 more bytes (40583 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.0.8/d3.min.js --location | md5sum
65b8f41bbb8366cd54930c9d896a0563  -
curl --silent --compressed http://minime.stephan-brumme.com/files/d3/d3-3.0.8.min.zopfli.js.gz | md5sum
65b8f41bbb8366cd54930c9d896a0563  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.0.8/d3.min.js --location | sha1sum
5314073f48875981b416a17a61f358e56e1f8333  -
curl --silent --compressed http://minime.stephan-brumme.com/files/d3/d3-3.0.8.min.zopfli.js.gz | sha1sum
5314073f48875981b416a17a61f358e56e1f8333  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 48776 bytes 65b8f41bbb8366cd54930c9d896a0563 (invalid)
cdnjs 42668 bytes 65b8f41bbb8366cd54930c9d896a0563 (invalid)
cdnhttps 42317 bytes 65b8f41bbb8366cd54930c9d896a0563 December 24, 2015 @ 07:33
unpkg 42294 bytes 65b8f41bbb8366cd54930c9d896a0563 July 11, 2016 @ 16:32

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 42678 bytes 4faccd9e71a18175fc05c9ccd629dc09 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:

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
40585 bytes -3 bytes zopfli --i100000 --mls128 --bsr40 --lazy --ohh December 21, 2015 @ 12:09
40588 bytes -8 bytes zopfli --i10000 --mls128 --bsr40 --lazy --ohh November 23, 2015 @ 17:14
40596 bytes -3 bytes zopfli --i1000 --mls8 --bsr13 --lazy --ohh September 20, 2015 @ 16:22
40599 bytes -8 bytes zopfli --i1000 --mls16 --bsr15 --lazy --ohh September 20, 2015 @ 16:19
40607 bytes zopfli --i100 --mls16 --bsr7 --lazy --ohh September 18, 2015 @ 19:46

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

Most recent activity on March 5, 2017 @ 02:44.

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
40758 40749 40755 40674 40711 40701 40757 40757 40766 40782 40670 40689 40781 40775 40753
40750 40749 40757 40754 40749 40740 40742 40743 40753 40683 40783 40765 40786 40661 40779
40618 40647 40646 40645 40749 40750 40625 40756 40760 40781 40781 40774 40776 40664 40791
40759 40753 40752 40595 40753 40752 40752 40610 40751 40775 40782 40774 40784 40765 40765
40749 40679 40604 40749 40655 40752 40633 40756 40751 40782 40658 40651 40781 40774 40769
40631 40676 40748 40756 40754 40654 40622 40653 40664 40773 40781 40774 40776 40651 40651
40632 40700 40614 40698 40663 40628 40642 40625 40665 40783 40784 40773 40781 40757 40777
40596 40690 40623 40674 40621 40644 40602 40648 40684 40621 40629 40664 40789 40667 40656
40631 40633 40621 40687 40627 40665 40608 40651 40605 40784 40649 40651 40780 40692 40778
40628 40679 40593 40609 40645 40624 40648 40650 40773 40781 40773 40774 40777 40780 40778
40658 40623 40609 40636 40634 40635 40640 40643 40656 40642 40650 40638 40768 40649 40777
40624 40623 40619 40593 40681 40605 40648 40631 40756 40655 40771 40649 40782 40655 40788
40585 40593 40615 40606 40610 40622 40629 40628 40662 40781 40771 40773 40781 40650 40778
40624 40621 40596 40618 40605 40616 40651 40757 40648 40773 40770 40772 40781 40769 40791
40624 40624 40628 40695 40620 40623 40661 40756 40629 40781 40772 40663 40782 40658 40777
40660 40623 40635 40630 40611 40653 40616 40646 40683 40655 40649 40774 40777 40649 40774
40609 40627 40626 40621 40611 40627 40629 40758 40629 40781 40774 40774 40783 40664 40767
40606 40626 40626 40621 40662 40623 40627 40645 40631 40775 40775 40643 40782 40661 40770
40617 40622 40605 40620 40595 40629 40625 40639 40630 40774 40782 40686 40782 40651 40772
40760 40623 40621 40642 40642 40643 40622 40643 40658 40783 40772 40776 40779 40654 40773
40622 40623 40624 40619 40623 40657 40639 40646 40695 40775 40782 40646 40778 40659 40777
40761 40633 40625 40622 40646 40757 40621 40649 40677 40781 40651 40774 40783 40667 40767
40638 40683 40621 40648 40617 40653 40585 40644 40653 40773 40638 40647 40776 40664 40650

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 40604 bytes 100%
1,000 40596 bytes -8 bytes 100%
10,000 40588 bytes -8 bytes 100%
100,000 40585 bytes -3 bytes 0.58%
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
40792 bytes +207 bytes (+0.51%) +85 bytes
40801 bytes +216 bytes (+0.53%) +94 bytes
40789 bytes +204 bytes (+0.50%) +82 bytes
40802 bytes +217 bytes (+0.53%) +95 bytes
40801 bytes +216 bytes (+0.53%) +94 bytes
40827 bytes +242 bytes (+0.60%) +120 bytes
40820 bytes +235 bytes (+0.58%) +113 bytes
40802 bytes +217 bytes (+0.53%) +95 bytes
40707 bytes +122 bytes (+0.30%)

Non-DEFLATE Algorithms

Archivers based on completely different compression algorithms often produce superior results.
Unfortunately, browsers only support gzip compression at the moment.
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 32881 bytes -7704 bytes (-18.98%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 34705 bytes -5880 bytes (-14.49%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 36153 bytes -4432 bytes (-10.92%)
Brotli (Wikipedia) brotli brotli -q 11 36963 bytes -3622 bytes (-8.92%)
LZMA2 (Wikipedia) xz xz -9 37688 bytes -2897 bytes (-7.14%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 39245 bytes -1340 bytes (-3.30%)
ZSTD (Wikipedia) zstd zstd -19 39343 bytes -1242 bytes (-3.06%)

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 2017.
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