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

After GZIP compression these minified files vary in size:
Boot
  53556 bytes (52.3k)
CDN
Baidu
  46730 bytes (45.6k)
CDN
cdnjs
  46718 bytes (45.6k)
CDN
gzip -6 (default)
  46429 bytes (45.3k)
local copy
unpkg
  46297 bytes (45.2k)
CDN
gzip -9
  46243 bytes (45.2k)
local copy
zultra
  44750 bytes (43.7k)
local copy
7zip -mx=9 -tgzip
  44723 bytes (43.7k)
local copy
libdeflate -12
  44716 bytes (43.7k)
local copy
kzip -s0 -rn -b8
  44644 bytes (43.6k)
local copy
pigz -11 -n
  44503 bytes (43.5k)
local copy
Zopfli
  44436 bytes (43.4k)
local copy
Zopfli (defluff)
  44433 bytes (43.4k)
local copy

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

You will automatically get the smallest D3 3.1.3 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 1861 bytes by using my D3 3.1.3 Zopfli version instead of the best available CDN (4.19% smaller than unpkg, 44436 vs. 46297 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 3 more bytes (44433 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.1.3/d3.min.js --location | md5sum
cc1d491c02ea030b19c7088e528a08e6  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.1.3.min.zopfli.js.gz | md5sum
cc1d491c02ea030b19c7088e528a08e6  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.1.3/d3.min.js --location | sha1sum
783abdee62caf0a6761109dd039a1b32a9838f4e  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.1.3.min.zopfli.js.gz | sha1sum
783abdee62caf0a6761109dd039a1b32a9838f4e  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 53556 bytes cc1d491c02ea030b19c7088e528a08e6 (invalid)
cdnjs 46718 bytes cc1d491c02ea030b19c7088e528a08e6 (invalid)
unpkg 46297 bytes cc1d491c02ea030b19c7088e528a08e6 July 11, 2016 @ 16:32

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 46730 bytes c59568709f89f593dd11817c99137a46 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
44436 bytes -9 bytes zopfli --i100000 --mls512 --bsr13 --lazy --ohh December 21, 2015 @ 12:44
44445 bytes -4 bytes zopfli --i10000 --mls512 --bsr13 --lazy --ohh November 23, 2015 @ 17:16
44449 bytes -6 bytes zopfli --i1000 --mls512 --bsr13 --lazy --ohh September 20, 2015 @ 13:28
44455 bytes zopfli --i100 --mls512 --bsr13 --lazy --ohh September 18, 2015 @ 20:10

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

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
44631 44620 44622 44620 44622 44623 44552 44639 44616 44615 44623 44639 44636 44629 44634
44554 44565 44541 44597 44617 44519 44602 44590 44646 44547 44525 44603 44632 44603 44607
44531 44519 44543 44523 44549 44459 44515 44479 44469 44463 44504 44477 44643 44640 44625
44622 44482 44543 44533 44528 44506 44501 44540 44459 44448 44521 44610 44626 44611 44526
44493 44495 44536 44525 44572 44514 44514 44498 44506 44456 44466 44542 44631 44642 44643
44502 44484 44515 44505 44572 44502 44495 44515 44590 44447 44461 44579 44631 44640 44641
44488 44480 44616 44529 44538 44502 44490 44600 44597 44448 44474 44495 44632 44641 44625
44508 44538 44541 44518 44538 44501 44514 44513 44448 44448 44480 44469 44629 44639 44625
44544 44486 44567 44495 44493 44506 44489 44521 44470 44449 44469 44518 44644 44642 44625
44490 44486 44618 44536 44524 44493 44477 44533 44436 44449 44465 44476 44636 44641 44625
44510 44515 44619 44511 44530 44495 44505 44511 44595 44450 44513 44509 44632 44641 44624
44519 44494 44538 44536 44521 44504 44498 44517 44583 44452 44520 44576 44632 44641 44626
44505 44520 44617 44511 44523 44508 44498 44512 44637 44446 44621 44633 44635 44641 44639
44493 44482 44512 44534 44535 44508 44498 44520 44637 44458 44466 44622 44642 44643 44626
44487 44489 44514 44509 44532 44500 44501 44636 44504 44451 44465 44498 44632 44642 44599
44493 44505 44622 44501 44610 44503 44498 44516 44594 44449 44465 44584 44637 44535 44626
44506 44513 44537 44518 44534 44502 44502 44519 44593 44448 44509 44577 44632 44640 44624
44485 44481 44513 44517 44535 44524 44494 44520 44586 44449 44475 44470 44642 44630 44634
44623 44626 44617 44529 44613 44479 44504 44522 44449 44448 44507 44622 44641 44639 44625
44510 44487 44511 44504 44531 44498 44501 44513 44455 44453 44521 44469 44641 44629 44634
44486 44482 44514 44517 44528 44507 44499 44508 44593 44448 44464 44581 44631 44641 44624
44499 44490 44539 44614 44530 44500 44501 44516 44595 44449 44485 44483 44642 44625 44631
44497 44475 44537 44533 44513 44517 44503 44503 44452 44449 44463 44589 44630 44640 44625

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 44455 bytes 100%
1,000 44449 bytes -6 bytes 100%
10,000 44445 bytes -4 bytes 100%
100,000 44436 bytes -9 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
44659 bytes +223 bytes (+0.50%) +15 bytes
44666 bytes +230 bytes (+0.52%) +22 bytes
44661 bytes +225 bytes (+0.51%) +17 bytes
44670 bytes +234 bytes (+0.53%) +26 bytes
44706 bytes +270 bytes (+0.61%) +62 bytes
44726 bytes +290 bytes (+0.65%) +82 bytes
44698 bytes +262 bytes (+0.59%) +54 bytes
44648 bytes +212 bytes (+0.48%) +4 bytes
44644 bytes +208 bytes (+0.47%)

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 35664 bytes -8772 bytes (-19.74%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 37774 bytes -6662 bytes (-14.99%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 38327 bytes -6109 bytes (-13.75%)
Brotli (Wikipedia) brotli brotli -q 11 40289 bytes -4147 bytes (-9.33%)
LZMA2 (Wikipedia) xz xz -9 40988 bytes -3448 bytes (-7.76%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 42749 bytes -1687 bytes (-3.80%)
Zstandard (Wikipedia) zstd zstd -19 42910 bytes -1526 bytes (-3.43%)

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.