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

After GZIP compression these minified files vary in size:
Boot
  58589 bytes (57.2k)
CDN
Baidu
  51659 bytes (50.4k)
CDN
cdnjs
  51645 bytes (50.4k)
CDN
unpkg
  51325 bytes (50.1k)
CDN
gzip -6 (default)
  51256 bytes (50.1k)
local copy
gzip -9
  51085 bytes (49.9k)
local copy
libdeflate -12
  49429 bytes (48.3k)
local copy
7zip -mx=9 -tgzip
  49335 bytes (48.2k)
local copy
zultra
  49261 bytes (48.1k)
local copy
pigz -11 -n
  49142 bytes (48.0k)
local copy
kzip -s0 -rn -b8
  49091 bytes (47.9k)
local copy
Zopfli
  49030 bytes (47.9k)
local copy
Zopfli (defluff)
  49029 bytes (47.9k)
local copy

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

You will automatically get the smallest D3 3.4.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 2295 bytes by using my D3 3.4.0 Zopfli version instead of the best available CDN (4.68% smaller than unpkg, 49030 vs. 51325 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 --mls32768 --bsr7 --lazy --ohh

(found December 22, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 32768  --mls32768
block splitting recursion 7  --bsr7
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 (49029 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.4.0/d3.min.js --location | md5sum
848de6ea8b1311f0159f94bd3fad98ce  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.4.0.min.zopfli.js.gz | md5sum
848de6ea8b1311f0159f94bd3fad98ce  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.4.0/d3.min.js --location | sha1sum
2c1db1801670cc1566ecf003379c7741ce451a6c  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.4.0.min.zopfli.js.gz | sha1sum
2c1db1801670cc1566ecf003379c7741ce451a6c  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 58589 bytes 848de6ea8b1311f0159f94bd3fad98ce (invalid)
cdnjs 51645 bytes 848de6ea8b1311f0159f94bd3fad98ce (invalid)
unpkg 51325 bytes 848de6ea8b1311f0159f94bd3fad98ce July 11, 2016 @ 16:31

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 51659 bytes 54d00746db36fbaac65b715cba1ca919 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
49030 bytes -12 bytes zopfli --i100000 --mls32768 --bsr7 --lazy --ohh December 22, 2015 @ 11:39
49042 bytes -6 bytes zopfli --i10000 --mls32768 --bsr7 --lazy --ohh October 13, 2015 @ 20:38
49048 bytes -3 bytes zopfli --i1000 --mls32768 --bsr19 --lazy --ohh September 21, 2015 @ 20:27
49051 bytes zopfli --i100 --mls32768 --bsr19 --lazy --ohh September 21, 2015 @ 11:00

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

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
49259 49321 49247 49247 49312 49312 49197 49228 49233 49236 49316 49161 49314 49192 49184
49107 49112 49089 49115 49091 49061 49133 49161 49164 49159 49160 49157 49314 49194 49310
49099 49124 49122 49136 49101 49083 49180 49161 49165 49150 49307 49173 49307 49164 49313
49135 49095 49053 49117 49113 49156 49157 49183 49131 49158 49148 49178 49309 49165 49030
49114 49092 49111 49123 49124 49144 49107 49170 49085 49158 49166 49173 49307 49166 49156
49103 49074 49111 49147 49062 49105 49150 49168 49150 49153 49160 49167 49314 49160 49104
49112 49079 49106 49127 49094 49106 49158 49167 49134 49088 49173 49170 49309 49176 49101
49105 49091 49104 49120 49096 49104 49152 49148 49145 49170 49160 49165 49305 49162 49035
49109 49215 49105 49102 49112 49087 49151 49171 49132 49159 49155 49165 49313 49149 49033
49107 49098 49107 49103 49116 49102 49148 49165 49132 49092 49172 49170 49314 49179 49054
49116 49215 49107 49096 49108 49096 49147 49167 49134 49097 49151 49162 49309 49166 49049
49114 49217 49084 49117 49108 49118 49145 49170 49129 49173 49182 49159 49309 49171 49082
49099 49076 49091 49091 49118 49102 49153 49167 49136 49168 49151 49162 49305 49167 49073
49090 49215 49115 49139 49115 49102 49158 49165 49146 49091 49155 49165 49314 49169 49046
49115 49193 49090 49102 49106 49099 49162 49169 49131 49171 49162 49172 49305 49151 49051
49101 49081 49059 49114 49108 49080 49151 49175 49136 49172 49153 49175 49306 49165 49035
49055 49212 49090 49099 49136 49100 49130 49171 49131 49095 49177 49169 49314 49167 49068
49111 49092 49103 49115 49098 49097 49159 49171 49132 49168 49157 49162 49314 49165 49069
49113 49109 49098 49224 49078 49103 49140 49162 49137 49102 49158 49177 49315 49164 49069
49114 49101 49098 49188 49112 49102 49154 49169 49130 49097 49151 49162 49306 49166 49101
49110 49106 49111 49117 49134 49107 49158 49176 49153 49096 49154 49171 49314 49154 49033
49110 49092 49084 49112 49111 49102 49157 49169 49139 49072 49159 49174 49315 49164 49073
49113 49089 49095 49101 49119 49105 49165 49171 49130 49168 49154 49169 49315 49158 49047

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 49051 bytes 100%
1,000 49048 bytes -3 bytes 100%
10,000 49042 bytes -6 bytes 100%
100,000 49030 bytes -12 bytes 1.74%
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
49339 bytes +309 bytes (+0.63%) +248 bytes
49340 bytes +310 bytes (+0.63%) +249 bytes
49325 bytes +295 bytes (+0.60%) +234 bytes
49272 bytes +242 bytes (+0.49%) +181 bytes
49208 bytes +178 bytes (+0.36%) +117 bytes
49205 bytes +175 bytes (+0.36%) +114 bytes
49107 bytes +77 bytes (+0.16%) +16 bytes
49130 bytes +100 bytes (+0.20%) +39 bytes
49091 bytes +61 bytes (+0.12%)

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 39083 bytes -9947 bytes (-20.29%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 41517 bytes -7513 bytes (-15.32%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 42543 bytes -6487 bytes (-13.23%)
Brotli (Wikipedia) brotli brotli -q 11 44202 bytes -4828 bytes (-9.85%)
LZMA2 (Wikipedia) xz xz -9 44944 bytes -4086 bytes (-8.33%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 46826 bytes -2204 bytes (-4.50%)
Zstandard (Wikipedia) zstd zstd -19 47380 bytes -1650 bytes (-3.37%)

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.